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.
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…
decoder DCC installato all’interno di una locomotiva
Anche per controllare scambi e accessori sono disponibili appositi decoder:
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:
Ho progettato con Eagle un semplice shield che realizza una interfaccia optoisolata per collegare Arduino al bus DCC:
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:
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:
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:
Il terzo parametro consente di modificare il comportamento della libreria:
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.
Conosci ?
http://www.dccinterface.com/
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?
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!
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/
thanks, they don’t publish the schematics but from the photos it seems very similar to my design
Ma poi lo shield va collegato al booster?
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.
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
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.
Ciao Luca,
Complimenti per lavoro e descrizione.
E’ possibile acquistare il PCB?
Ciao
Fiorenzo
Ciao Fiorenzo, ti scrivo via mail…
Ciao Luca, avrei la stessa richiesta di Fiorenzo.
Mi sai dire qualcosa?
Grazie
Eugenio
Olá Luca.
Eu montei um DCC Booster e não estou conseguindo instalar o programa do Arduino. Onde obtenho o “BoosterBoard.h” ?
Hi Jose, all the files are in my Github repository
Olá Luca.
Todos os arquivos que eu instalei do seu repositório Github estão dando erro. Qual a razão disto acontecer ?
Jose, it’s quite hard to guess your problem without additional details: which file, which error… If you prefer, open an issue on Github to track the problem