martedì 15 settembre 2020

Un pannello di controllo per scambi per sistemi Xpressnet© con Arduino Nano

Facendo seguito all' articolo in cui ho descritto come pilorare gli scambi con Arduino Nano in un sistema basato sul protocollo Xpressnet©, ho sviluppato il progetto descritto in questo articolo che permette di realizzare un quadro comandi per scambi motorizzati dotati di decoder DCC per accessori.
Il progetto è semplice, esso si basa su quanto già descritto nell' articolo precedente:




il circuito permette di azionare gli scambi con indirizzo da 1 a 30 con una coppia di pulsanti normalmente aperti. La connessione dei pulsanti ai connettori P4 e P5 o P6 permetterà di individuare l' indirizzo dello scambio e la modalità di azionamento, dritto o deviato.
I connettori P5 e P6 rappresentano i comando per dritto (P5 - Straight) e deviato (P6 - Diverged) e ogni contatto è relativo alla prima, seconda e terza decina. Il connettore P4 invece conta le unità.

Con un esempio facciamo prima: per comandare lo scambio 7 dritto, collego il pulsante fra il primo contatto del connettore P5 - Straight (dritto) e il settimo contatto del connettore delle decine, per comandare lo scambio 14 deviato, collego il pulsante fra il secondo contatto del connettore P6 - Diverged (deviato) e il quarto contatto del connettore delle decine, infine per comandare lo scambio 20 in dritto collego il pulsante fra il pin 2 di P5 e il pin 10 di P4... credo adesso sia chiaro.

Il progetto utilizza un Arduino Nano, data la semplicità del codice, esso è facilmente applicabile ad Arduino Uno o meglio ancora (vista la quantità di pin) Arduino Mega, con più pin a disposizione il numero di scambi da comandare può aumentare considerevolmente.
Come negli altri progetti inerenti all' interfaccia Xpressnet© ho fatto uso delle librerie di Philipp Gahtow (http://pgahtow.de) al quale vanno i miei ringraziamenti e che possono essere scaricate a questo indirizzo 


Se non già installata installare anche la libreria Keypad disponibile nel gestore librerie standard di Arduino.

Nel codice l' indirizzo della periferica Xpressnet è codificato in una definizione fissa:

#define XNetAddress 29 //Adress on XpressNet bus

che ha valore 29, se si hanno altre periferiche con lo stesso indirizzo sul bus Xnet, questo valore va cambiato.

Lo scketch ha commentate le righe per la seriale di servizio usate per il debug.
Decommentare queste righe se necessario per avere una visualizzazione sul terminale seriale.
Se si desidera utilizzare il debug sulla seriale di servizio è necessario dotarsi di un adattare Seriale USB con chip FTDI o similari da collegare ai pin 11 e 12
In questo caso i dispositivi comandabili diventano 24 e non piu' 30.

Il funzionamento dello sketch è molto semplice, in effetti c' è la scansione continua di due tastiere associate ai pin dei connettori P4-P5 e P4-P6, viene rilevata la pressione di un tasto ed inviato un comndo di attivazione/disattivazione dello scambio associato al pulsante premuto.
Lo schema ha  un pulsante collegato al pin A0 per usi futuri, così come il bus I2C (display ?) e due pin A6 e A7 che possono essere associati (nello sketch) ad itinerari precablati.

Per scaricare lo sketch in Arduino è necessario rimuoverlo dalla scheda in quanto la seriale di default è collegata al MAX485 il quale non permette di effettuare regolarmente il download.

Anche per questo progetto ho realizzato un PCB dall'ormai mio consueto fornitore cinese, le piastre sono arrivate in 4 settimane e sono di ottima qualità.
Di seguito una foto del prototipo che ho montato. La versione del PCB che vedete è antecedente allo schema postato ma funzionalmente non ha alcuna differenza.

Il circuito montato e cablato con Arduino Nano


A presto!

Di seguito i link per la realizzazione del progetto




Per chi fosse interessato ai files gerber per la realizzazione del PCB ne faccia richiesta tramite il modulo di contatto del blog in Home Page, riceverete un link ai files necessari.

20 commenti:

  1. Ciao.
    Graziue per il progetto è interessantissimo!
    Sto però impazzendo con questo progetto. L ho semplificato ai fini di test in modo da chiudere e aprire uno scambio in maniera ciclica. Il problema è che appena connetto alla porta slave il multimouse mi fa err13. Questo errore è dovuto alla 0resenza di più master.. Ovvero sembra che il 'quadro scambi' si comporti come un master sulla xpressnet e non come slave. Ti è per caso capitato anche a te? Ti ringrazio per l aiuto perché ci sto impazzendo!

    RispondiElimina
  2. Di seguito lo sketch ipersemplificato. La libreria usata è quella
    in http://sourceforge.net/projects/pgahtow/files/Arduino%20%28v1.0%29%20libaries/XpressNet.zip

    #include "XpressNet.h"
    XpressNetClass XpressNet;
    #define XNetAddress 25 //Adress on XpressNet bus
    #define XNetSRPin 5 //Max485 Busdriver Send/Receivepin - DO NOT CHANGE!



    byte address_offset = 0;
    byte address_switch;


    void setup() {


    flashled ();

    XpressNet.start(XNetAddress, XNetSRPin); //Initialisierung XNet-Bus

    }

    void loop() {
    delay(1000);
    XpressNet.receive();
    delay(1000);
    address_switch = 0 ;

    XpressNet.setTrntPos(0, address_switch + address_offset, B1000); //set output straight active

    delay(2000);

    XpressNet.setTrntPos(0, address_switch + address_offset, B0000);// set output straight inactive

    delay(2000);



    }

    RispondiElimina
  3. Buongiorno David, grazie per il commento. Che centrale DCC utilizzi?

    RispondiElimina
  4. Utlizzo il Multimouse agganciato al suo booster + questo sketch collegato all'ingresso slave del booster

    RispondiElimina
    Risposte
    1. Ciao David,
      allora, hai un po' troppo semplificato lo sketch. Ad esempio non puoi eliminare la dichiarazione della costante
      #define interval 8500
      poi non si deve usare la funzione delay() in quanto mette in halt il processore e di fatto blocca il bus. La funzione XpressNet.receive(); deve essere eseguita il più velocemente possibile.
      Per far fare ad Arduino il lavoro occorre usare la funzione millis(), ho elaborato uno sketch che farebbe al caso tuo (non ho potuto provarlo sul plastico però) ma confido nel suo corretto funzionamento.

      Elimina
    2. Questo commento è stato eliminato dall'autore.

      Elimina
    3. A proposito verifica che il circuito che hai realizzato sia coerente con la dichiarazione:
      #define XNetSRPin 5 //Max485 Busdriver Send/Receivepin - DO NOT CHANGE!
      ovvero che t abbia collegato D5 di Arduino ai pin 2 e 3 del MAX485

      Elimina
    4. Provo a pubblicare lo sketch in più parti perchè supera il limite massimo di caratteri consentiti...

      Elimina
    5. #include
      XpressNetClass XpressNet;

      #define XNetAddress 29 //Adress on XpressNet bus
      #define XNetSRPin 5 //Max485 Busdriver Send/Receivepin - DO NOT CHANGE!
      #define interval 8500 // Parametro interno alla libreria - NON CANCELLARE

      boolean ledState = 0, switchState = 0;
      int address_offset = 3;
      int address_switch;

      int long temporizzatore = 0;

      const int nflash = 5; // set number of flashes for led on pin 13
      const int flashduration = 60; // duration of flash pulse

      Elimina
    6. void flashled () {
      for (int a = 0; a<nflash; a++) {
      ledState = !ledState;
      digitalWrite (13, ledState);
      delay (flashduration);
      }
      digitalWrite (13, LOW);
      ledState = 0;
      }
      // INIT

      void setup() {

      flashled ();
      XpressNet.start(XNetAddress, XNetSRPin); //Initialisierung XNet-Bus
      }

      Elimina
    7. void loop() {

      XpressNet.receive();

      if ( (millis() - temporizzatore) > 2000) {
      temporizzatore = millis();
      switchState = !switchState;
      if (switchState) {
      XpressNet.setTrntPos(0, address_switch + address_offset, B1000);
      flashled ();
      }
      else {
      XpressNet.setTrntPos(0, address_switch + address_offset, B0000);
      flashled ();
      }
      }

      }

      Elimina
  5. ERR13 indica che il mmouse è in modalità slave e non trova master nel bus Xpressnet. Verifica che il mmouse sia collegato nella porta master con un cavo Rj12 a 6 conduttori, e non 4, questo è molto importante. Ovviamente i due dispositivi non devono avere lo stesso indirizzo. Collegando il solo mmouse funziona regolarmente?

    RispondiElimina
  6. Ciao Ragazzi. Grazie dell'aiuto. Ho eliminato l'errore ERR13.
    Purtroppo anche cosi non riesco. Ho provato a usare un altro arduino come "sniffer" di segnale DCC (vedi progetto decoder dcc arduino)e vedo sempre FF 0 FF ovvero nessun messaggio viene trasmesso.
    Mi viene un dubbio: ma è normale che i pin TX e RX NON lampeggino durante la trasmissione serial a MAX485?

    RispondiElimina
    Risposte
    1. No, non è normale.
      Come ho avuto modo di dire in uno dei miei commenti, nello sketch che tu hai postato il pin di controllo del MAX485 è indicato come D5:

      #define XNetSRPin 5 //Max485 Busdriver Send/Receivepin - DO NOT CHANGE!

      mentre nel mio schema (e nello sketch pubblicato) il pin è D2:

      #define XNetSRPin 2 //Max485 Busdriver Send/Receivepin - DO NOT CHANGE!

      tale pin di controllo va collegato alla coppia di pin (2 e 3) del MAX485: nel tuo circuito montato, quale pin di Arduino hai usato ?

      Come hai eliminato l' ERR13: hai cambiato cavo ? hai usato lo sketch che ho postato io ?

      Elimina
  7. Allora:
    Relativamente a ERR13 ho fatto un inversione dei pin A e B al cavo che va allo slave.
    QUindi il cavo che collega questo dispositivo allo slave del booster Roco e': GND-A-B-Vcc da una parte e GND-B-A-VCC dall'altra (supposto il cavo a 4 poli). Interessante capire come comportarsi per uno slòave aggiuntivo.. SArà il mio prossimo espoerimento.
    Relaivamente alla trasmissione.. era problema di Arduino (usavo una versione col processore DIP cambiuandolo ha funzionato).
    Ho risolto anche un problema sul turnout: https://www.h0-modellbahnforum.de/t343805f19606-Tastenstellpult-am-Xpressnet.html qui trovate delle info per risolvere problemi di compatibilità con Lenz e Roco. Sono ai test finali, vi aggiorno!

    RispondiElimina
    Risposte
    1. Bene. Per quanto riguarda lo sketch, hai usato la tua versione con la funzione delay() ?

      Elimina
  8. Si in realtà si, anche con la delay funziona; ho impostato l'iterval.
    Vi confermo che ora il colloquio sia con Il Multimouse che con il decoder DCC Arduino funziona perfettamente.
    Next step: verificare che il colloquio con un Sinottico-XpressNet configurato come secondo Slave funzioni.

    RispondiElimina
    Risposte
    1. Bene! ricorda di cambiare l' indirizzo Xnet nello sketch:

      #define XNetAddress 29 //Adress on XpressNet bus

      ciao!

      Elimina
  9. vorrei provare a costruire il modulo ma non capisco alcune cose.....vorrei far almentare arduino dai 12 v del cavo expressnet inserendolo in vin e questo mi sembra di vederlo nello schema dei collegamenti, non capisco i due connettori vicino a vin e gnd che si trovano a detra,a sinistra di quei 2 ci sono 2 connessioni segnate con A e B, oltre che nel max 845 dove vanno anche?

    RispondiElimina