DCC shield per Arduino

by luca
13 comments

Oltre alla passione per l’elettronica, nel mio (poco) tempo libero sto realizzando insieme all’amico Davide un plastico ferroviario in scala H0, occupandomi in particolare della parte di controllo digitale di locomotive, scambi e accessori.

Davide si occupa a livello professionale di realizzazione di plastici architettonici e ferroviari. Potete seguire i suoi lavori e i progressi del nostro plastico sulla pagina Facebook o sul sito web ad esso dedicato.

Lo standard de facto per il controllo digitale di un plastico ferroviario si chiama DCC (Digital Command Control) ed è un protocollo di comunicazione definito dalla National Model Railroad Association americana. Le specifiche tecniche di tale protocollo sono disponibili sul sito della NMRA stessa.

Il controllo delle locomotive avviene inviando, tramite le rotaie, appositi comandi a dei moduli (detti decoder) inseriti all’interno della locomotiva: in base ai comandi ricevuti i decoder controllano il motore della locomotiva, le luci e in alcuni casi anche suoni, generatore di fumo…

dcc-01

decoder DCC installato all’interno di una locomotiva

 Anche per controllare scambi e accessori sono disponibili appositi decoder:

dcc-02

decoder DCC per scambi di Esu

Grazie al lavoro di Alex Shepherd e di altri sviluppatori, è disponibile una libreria per Arduino in grado ricevere e interpretare comandi DCC.

La libreria può essere installata tramite il Library Manager dell’IDE:

dcc-03

Ho progettato con Eagle un semplice shield che realizza una interfaccia optoisolata per collegare Arduino al bus DCC:

dcc-04

La libreria NmraDcc richiede che il segnale DCC sia collegato ad un pin di Arduino che supporti gli interrupts. Visto che Arduino Uno dispone dei pin 2 e 3 con tale caratteristica, ho incluso un jumper che consente di scegliere il pin da utilizzare:

dcc-05

I files Eagle per realizzare lo shield sono disponibili su Github; nello stesso repository è disponibile anche un programma di esempio, che cambia l’intensità luminosa e il colore di un led in base alla velocità e alla direzione della locomotiva con id 10:

[youtube id=”9P8VJvbLKmE” width=”600″ height=”350″]

(sottotitoli in italiano disponibili)

L’uso della libreria è molto semplice. Per prima cosa indichiamo il pin da utilizzare:

Dcc.pin(0, 2, 1);

Il primo parametro rappresenta il numero di interrupt, il secondo il pin a cui è collegato il segnale DCC e il terzo lo stato della resistenza di pullup interna (1 significa abilitata). Per la corrispondenza tra pin e numero di interrupt fate riferimento alla documentazione ufficiale:

dcc-06

Quindi inizializziamo la libreria:

Dcc.init(MAN_ID_DIY, 10, 0, 0);

I primi due parametri indicano il produttore del decoder e la sua versione. La NMRA mantiene un elenco di produttori e ha riservato il valore 0x0D (costante MAN_ID_DIY) per decoder opensource o DIY:

dcc-07

Il terzo parametro consente di modificare il comportamento della libreria:

dcc-08

mentre l’ultimo indica l’indirizzo EEPROM a partire dal quale la libreria memorizzerà i propri dati.

Perché la libreria sia in grado di decodificare i pacchetti in ingresso, è importante richiamare il metodo process() all’interno del loop:

Dcc.process();

Se viene ricevuto un comando di cambio velocità/direzione per una loco, la libreria esegue la funzione di callback notifyDccSpeed:

void notifyDccSpeed( uint16_t Addr, DCC_ADDR_TYPE AddrType, uint8_t Speed, 
 DCC_DIRECTION Dir, DCC_SPEED_STEPS SpeedSteps ) {

nella quale è presente il codice di controllo del led.

dccshield-02 dccshield-01

Related Posts

13 comments

mario 17 ottobre 2017 - 16:36 Reply
lucadentella.it – DCC, decoder accessori per led 25 novembre 2017 - 14:32

[…] aver realizzato uno shield per interfacciare Arduino ad un bus DCC, vediamo oggi come realizzare un semplice decoder […]

Reply
Gianni Barbotti 4 febbraio 2018 - 15:55

Ciao Luca, mi piacerebbe far azionare i servo da programmi quali RocRail o TrainController i quali gestiscono i protocolli di molte centrali digitali. Per fissare le idee ti chiedo se può essere possibile che dallo schema del tracciato visualizzato dal software tipo TrainController (o RocRail), modificando lo stato di un deviatoio col classico click del mouse, questo comando possa essere trasmesso, per mezzo della tua interfaccia qupresentata, ad Arduino e quindi alla scheda scheda 16-Channel 12 bit PWM Servo che azionerà il servo. Sono già in possesso dei seguenti sistemi DCC : Lenz LZV100+LI101F e Digitrax DCS 100 + PR3. Sono settimane che cerco di dare una risposta a questo quesito e mi pare di essere arrivato a bussare alla porta giusta per avere una risposta definitiva. Grazie in anticipo se avrai il tempo di rispondermi.
Nel caso di risposta affermativa, come posso reperire la shield già montata od in kit e con quali protocolli funziona?

Reply
luca 6 febbraio 2018 - 08:51

ciao Gianni. Si, ti confermo che quello che vuoi fare è proprio realizzare un “decoder accessori” che, rispondendo ai comandi DCC ricevuti dalla centrale (eventualmente “prodotti” da un software quale TC o Rocrail), esegua azioni quali muovere un servocomando. Non ho in vendita lo shield ma ho qualche avanzo del primo batch quindi posso mandarti il PCB… contattami dal sito!

Reply
Simon 16 febbraio 2018 - 15:04

these guys sell them either as a board, a kit or fully assembled

https://www.dccinterface.com/product/arduino-uno-model-railway-dcc-interface-shield/

Reply
luca 16 febbraio 2018 - 16:20

thanks, they don’t publish the schematics but from the photos it seems very similar to my design

Reply
Riccardo 9 marzo 2018 - 23:11

Ma poi lo shield va collegato al booster?

Reply
luca 12 marzo 2018 - 09:07

ciao riccardo, lo shield funziona come un “dispositivo” DCC, quindi va collegato al segnale DCC. Questo può provenire da un booster, direttamente dalla centrale, preso dalle rotaie… dipende dal layout del tuo plastico.

Reply
Andrea 25 agosto 2018 - 15:42

Ciao Luca,
complimenti per il bel lavoro.
Vorrei sapere se hai portato ancora avanti il progetto.
Mi piacerebbe capire se pensi sia possibile creare una specie di dialogo bidirezionale per sapere dove è il convoglio.
grazie

Andrea

Reply
luca 27 agosto 2018 - 08:39

ciao Andrea, lo shield funziona e l’ho utilizzato in diversi altri progetti. Sto per pubblicare la versione nuova che consente anche di leggere le CV. Per conoscere la posizione dei treni, normalmente si utilizzando sensori di “feedback” appositi su un bus diverso (S88, XpressNet, Loconet…) a seconda poi della centralina/software che vuoi utilizzare. Esiste effettivamente anche il DCC “bidirezionale” ma richiede l’utilizzo di booster e centraline appositi.

Reply
Fiorenzo 28 dicembre 2018 - 07:46

Ciao Luca,

Complimenti per lavoro e descrizione.
E’ possibile acquistare il PCB?

Ciao
Fiorenzo

Reply
luca 28 dicembre 2018 - 14:11

Ciao Fiorenzo, ti scrivo via mail…

Reply
Eugenio Depaulis 21 febbraio 2019 - 09:03

Ciao Luca, avrei la stessa richiesta di Fiorenzo.
Mi sai dire qualcosa?
Grazie

Eugenio

Reply

Rispondi a Simon Cancel Reply

venti − 20 =