domenica 17 settembre 2017

FEEDBACK CON ARDUINO NANO



Arduino come si sa è una piattaforma estremamente diffusa, ha il vantaggio di aver costi molto contenuti e si presta ad applicazioni più disparate; ovviamente non mancano quelle che coinvolgono il modellismo ferroviario. Ho trovato in rete un’ interessante applicazione proposta da un utente del forum RocRail per realizzare un modulo feedback veramente a basso costo e dalla minima complessità hardware e software.
L’ idea parte dal fatto che RocRail accetta una gran quantità di centrali e fra queste c’ è anche la centrale Marklin CS2. Questa centrale ha fra le interfacce gestite anche quella dei sensori S88 e può essere connessa sia in seriale che in ethernet al PC. Nel progetto proposto, Arduino emula questa centrale connessa in seriale leggendo lo stato dei pin e inviandolo a RocRail come se fosse, appunto, una CS2. Più difficile a dirsi che a farsi 😉
Arduino mette a disposizione circa 19 pin, sufficienti per la gestione di una media stazione nascosta ma potrebbero essere pochi per un plastico casalingo, soprattutto se concentrati in un solo punto. Per questo ho modificato il codice trovato in rete in modo da poter prevedere schede satellite collegate tramite il bus I2C, così da espandere la capacità in termini di lettura di pin. Queste schedine sono basate sul chip PCF8574, hanno 8 pin I/O e un costo che va dagli 80€cent a 1,5€. Alla fine si hanno a disposizione 14 pin di I/O direttamente sulla scheda Arduino e il bus I2C per la connessione di schedine esterne.
Lo schema di principio è il seguente:



Per l’esperimento ho utilizzato Arduino Nano, ovviamente la soluzione si adatta anche alle altre versioni. Come schedina satellite ho provato quella in foto che ha il vantaggio di avere i connettori I2C “entra/esci” facilitando quindi il cablaggio, ma ce ne sono altre che possono essere utilizzate, come ad esempio quelle che pilotano i display LCD.
Ogni schedina ha tre jumper per scegliere l’ indirizzo che dovrà presentare sul bus I2C, ovviamente in caso di più schede queste dovranno avere indirizzi differenti.
Occorre fare attenzione alla versione del chip, gli indirizzi sono differenti a seconda che si tratti di PCF8574 e PCF8574A. Le tabelle seguenti indicano gli indirizzi per i le due versioni.



Sul numero massimo di schede ci sono alcune considerazioni elettriche da fare: il bus I2C è nato per comunicazioni all’ interno dello stesso sistema, spesso sulla stessa scheda, ma comunque per distanze ravvicinate. Infatti i driver normalmente hanno una capacità di 400pf che equivalgono a qualche metro di cavo, quindi all’ interno di 2-3 metri di cavo possiamo avere due tre schede senza problemi. Oltre è necessario che il bus sia “potenziato” con un vero e proprio booster capace di raggiungere qualche decina di metri. Allo studio ci sono soluzioni; in figura la connessione fisica del bus I2C:
 In foto le varie board connesse usate per lo sviluppo del codice. Si vede Arduino Nano montato su una scheda con terminal boards. Arduino e schede satellite sono connesse ad un rilevatore di corrente a 4 ingressi.

Il codice è composto da una parte iniziale dove sono dichiarate le variabili di ambiente, poi la parte eseguibile dove inizialmente (setup) il programma cerca sul bus I2C se ci sono schede, una volta memorizzati gli indirizzi viene inviato lo stato iniziale dei pin a RocRail. A questo punto ciclicamente viene letto lo stato dei pin e confrontato con lo stato precedente, se questo è cambiato (dopo aver campionato tre volte lo stato a distanza di 10 mS) viene inviato un messaggio a RocRail. Il software ha poi un periodo di debouncing settabile tramite la variabile “interval” (1sec) per evitare sfarfallamenti.
Non c’ è bisogno di installare librerie esterne o di terze parti (a parte la libreria Wired per gestire I2C che fa parte dell’ambiente standard dell’ IDE), il codice è veramente semplice e parla da sé.
La scheda di default invia i dati con indirizzo bus 1 (modificabile cambiando il valore della variabile bus_addr), i pin residenti su Arduino sono numerati da 1 a 14 secondo la tabella seguente.

Address
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Arduino Pin
A1
 A2
 A3
D12
D9
D8
D7
D6
D5
D4
D3
D2
D10
D11
La sequenza dei pin può essere cambiata a piacimento variando l’ ordine dei pin nel codice alla riga:
int sense[num_sensors] = {A1, A2, A3, 12, 9, 8, 7, 6, 5, 4, 3, 2, 10, 11};
A seguire saranno conteggiati i pin delle schede satellite, se presenti: se ad esempio ci sono 2 schede connesse, scheda A con indirizzo 57 (dec) e scheda B con indirizzo 60, ai pin della scheda A verranno assegnati indirizzi da 15 a22 e quelli della scheda B da 23 a 30. Lo stato dei pin è normalmente alto (+5V).
La connessione ad un sensore esterno, ad esempio un rivelatore di corrente, è semplice:

Allo stesso modo avviene la connessione ai pin delle schede satellite.
Il messaggio inviato a RocRail è conforme al protocollo seguito dalla centrale Marklin CS2 consultabile qui, esso è composto da 13 bytes ed ha la seguente struttura:
Prio
Command
Resp.
Hash
DLC
Byte0
Byte 1
Byte 2
Byte 3
Byte 4
Byte 5
Byte 6
Byte 7
2+2bit
8 bit
1 bit
16 bit
4 bit
8 bit
8 bit
8 bit
8 bit
8 bit
8 bit
8 bit
8 bit
tx_msg0/tx_msg1
tx_msg2
tx_msg3
tx_msg4
tx_msg5
tx_msg6
tx_msg7
tx_msg8
tx_msg9
tx_msg10
tx_msg11
tx_msg12





num bytes

bus number

num_sensor

sens_value


0
35

59
121
8
0
1
0
X
0
X
0
0

La configurazione della centrale in RocRail è anch’ essa semplice. Dalla schermata  in cui si configura la centrale:




Occorre aggiungere una centrale del tipo MCS2 la cui configurazione è indicata in figura:


Ricordate di selezionare il tipo di comunicazione “Serial” e baudrate 500000. Nel campo “Interface ID” va indicato un nome che poi va riferito nella configurazione dei sensori, è importante inoltre indicare correttamente la porta di comunicazione “Device” (COM per Windows, /dev/ttyXXX per i sistemi Linux) cui è connesso Arduino.

Questo il link per scaricare l'ultima release dello sketch che include queste nuove funzioni:
- risposta alla richiesta dello stato dei sensori "start of the day"
- il Led 13 acceso indica la corretta connessione di schede satelliti I2C

A presto!


7 commenti:

  1. Ho letto con estremo interesse il PDF di Antonino Gargiulo e da giorni seguo in rete le opportunità offerte dalle schede Arduino per il DCC. Mi chiedevo, quindi , se è possibile che quanto progettato nell'articolo di Antonino Gargiulo, sia trasferibile su un sistema DCC Lenz LZV100 + LH100 + TRAINCONTROLLER + decoder dcc per i motori dei deviatoi + decoder segnali luminosi, conservando gli automatismi che TrainController consente, ovvero l'impostazione automatica della posizione dei deviatoi, quindi l'avvio o meno dei motori o servo, quando si avvia un autotrain di TrainController. Oppure le posizioni dei deviatoi e i colori dei segnali sono attivabili solo mediante pulsanti? Se potesse rispondermi le sarei molto grato.

    RispondiElimina
  2. Ciao Gianni,
    Non ho capito in che modo vorresti utilizzare il modulo, ovvero se in relazione alla posizione dei deviatoi oppure come modulo feedback per rilevare la posizione dei treni.
    In ogni caso il progetto presentato è relativo all'utilizzo di arduino con il sw Rocrail, nulla vieta di utilizzarlo con altri sw purché sia prevista la centrale Maerklin CS2 con interfaccia seriale. Purtroppo non ho Tranicontroller e non posso verificare.
    Saluti

    RispondiElimina
  3. Ciao Antonino,
    Grazie per la risposta. Non mi sono spiegato bene, l'uso che avrei voluto fare del modulo era orientato alla gestione dei deviatoi e segnali. Purtroppo non ho una centralina Maerklin. Soprattutto però devo ancora chiarirmi le idee di come poter gestire i servo per deviatoi es i segnali con Arduino accoppiato ad una centrale Lenz LZV100 o Digitrax DCS 100 escludendo così i decoder DCC. Grazie comunque della disponibilità.

    RispondiElimina
    Risposte
    1. Gianni mi spiego meglio: nel progetto presentato ArduinoNano simula la centrale Maerklin CS2, ovvero parla con il PC attraverso la porta USB emulando il comportamento di una centrale Maerklin che rileva i sensori di presenza S88 come se questa fosse connessa ad una porta seriale.
      Detto ciò, per verificare se il progetto possa esserti utile in qualche modo, occorre verificare se Traincontroller può comunicare con questa centrale Maerklin attraverso la porta seriale.
      Spero di aver chiarito
      saluti

      Elimina
    2. Ciao Antonino,
      Tra le interfacce-sistemi-DCC con cui TrainController comunica c'è anche l'unità Maerklin Central Station 2 oltre alle Maerklin CS1, 6023, 6050/6051 CS3. TranController per le unità CS1,CS2 e CS3 richiede un indirizzo IP affinchè possa connettersi, mentre per le 6023, 6050/6051 chiede la porta COM con un range che va da 1 a 256.
      Il mio armamento è a due rotaie (binari e deviatoio Roco) ed i sistemi di feedback occupazione binario nel tracciato gestito con la Lenz LZV100 sono le schede RS8 di Paco (Feedback module with 8 occupancy detectors link
      http://usuaris.tinet.cat/fmco/PpP_en.html) e per il piccolo tracciato gestito con Digitrax DCS 100 uso moduli Loconet ad otto vie. Sono vincolato a questo hardware. Ti ringrazio per il chiarimento.
      Un saluto.
      Gianni.

      Elimina
  4. OK, allora questo progetto non può esserti utile visto che Traincontroller prevede solo l' interfaccia ethernet per la cenbtrale Marklin.
    Però, visto che hai la centrale Digitrax con bus loconet, se vuoi provare ad usare Arduino in ambito fermodellistico puoi dare un'occhiata all'articolo pubblicato in ottobre --> http://ilplasticomodulare.blogspot.dk/2016/10/ in cui ArduinoNano insieme ad un circuito esterno funge da modulo feedback con interfaccia Loconet.
    saluti

    RispondiElimina
  5. Ciao Antonino,
    Grazie per il suggerimento , ma non mi sarei mai fatto sfuggire l'articolo che avevo già letto e salvato sul mio PC con relative download di schemi e software. Sto aspettando che mi arrivi una interfaccia Arduino-PC per il DCC trovata qui : https://www.dccinterface.com/product/arduino-model-railway-dcc-interface/ il cui link l'ho trovato in uno dei commenti di un post di questo forum. Aspetto che mi arrivi, ieri è stato spedito e spero che mi arrivi entro la prossima settimana per fare le necessarie prove. Grazie di nuovo. Ti terrò informato quando avrò del materiale interessante.
    Un saluto.
    Gianni.

    RispondiElimina