DCC shield per Arduino

luca 25/09/2017 1

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

One Comment »

  1. mario 17/10/2017 at 16:36 - Reply

Leave A Response »

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