DCC shield per Arduino

luca 25/09/2017 10

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:

(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

10 Comments »

  1. mario 17/10/2017 at 16:36 - Reply
  2. Gianni Barbotti 04/02/2018 at 15:55 - Reply

    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?

    • luca 06/02/2018 at 08:51 - Reply

      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!

  3. Simon 16/02/2018 at 15:04 - Reply

    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/

    • luca 16/02/2018 at 16:20 - Reply

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

  4. Riccardo 09/03/2018 at 23:11 - Reply

    Ma poi lo shield va collegato al booster?

    • luca 12/03/2018 at 09:07 - Reply

      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.

  5. Andrea 25/08/2018 at 15:42 - Reply

    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

    • luca 27/08/2018 at 08:39 - Reply

      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.

Leave A Response »

Fare clic qui per annullare la risposta.

Questo sito usa i cookie per poterti offrire una migliore esperienza di navigazione maggiori informazioni

Questo sito utilizza i cookie per fonire la migliore esperienza di navigazione possibile. Continuando a utilizzare questo sito senza modificare le impostazioni dei cookie o clicchi su "Accetta" permetti al loro utilizzo.

Chiudi