Si sa, l'appetito vien mangiando, quindi ho deciso di effettuare alcune prove per permettere ad Arduino di dialogare direttamente con una command station dotata di interfaccia Xpressnet. Nel mio caso la scelta è ricaduta sul Multimaus Roco dotato di booster 10764.
Una piccola considerazione sui layer più bassi del protocollo Xpressnet. Innanzitutto il layer fisico è costituito dallo standard EIA RS485, in modalità half duplex e configurazione master-slave, quindi la trasmissione può avvenire in modo bidirezionale da e verso il master ma non contemporanamente.
Il master è costituito dal multimaus Roco collegato alla presa "master" del booster e può esserne presente uno solo in tutta la rete. Gli slave possono essere fino a 31 e collegati in parallelo sulla presa Slave.
Dal sito Lenz è possibile scaricare la piedinatura del cavo di collegamento tra i nodi, tipicamente un RJ11 per gli slave (6P/4C) a 4poli, AeB del segnale RS485 e alimenatzione 12Vcc, oppure un RJ12 per il master (6P/6C) in quanto i due pin in più servono per trasportare il segnale DCC verso il booster.
Fonte: specifiche protocollo scaricabile dal sito LENZ |
Passando al layer successivo si nota che Xpressnet adotta una comunicazione a pacchetti con:
1 bit di start - 9bit di dati - 1 bit di stop - nessuna parità
con una velocità di 62,5 Kbps.
Questo è un problema con arduino e poi vedremo il perchè...
HARDWARE
Per quanto riguarda l'hardware ho realizzato il prototipo con un Arduino MEGA, in quanto innanzitutto dotato di 3 UART interne, a differenza degli altri Arduini (UNO, NANO) che ne hanno una sola, quindi è possibile sfruttare la seriale collegata al convertitore di serie come monitor di debug ed utilizzare la prima seriale per collegarci il convertitore RS232-RS485.
L'inrefaccia si realizza mediante un IC MAX485 oppure il più economico SN75176 terminando le linee A e B della RS485 con un resistore da 120Ohm e ricordandosi di collegare il negativo del bus al negativo di Arduino. (ATTENZIONE ALLA POLARITA' sulla spina RJ)
Come dicevo prima la trasmissione con Xpressnet prevede 8 bit di dati, mentre nel core di Arduino è prevista solo una trasmissione ad 8 bit. Per modificare questa limitazione ho utilizzato una modifica al core come descritto nel forum di Arduino e scaricabile da questo link
Una volta estratti i due file hardwareserial.cpp e hardwareserial.h vanno sostituti ai file omonimi in
Program%Files\Arduino\hardware\arduino\cores\arduino
A questo punto è necessario scaricare il codice sorgente dentro Aarduino e il gioco è fatto.
CLICCA QUI PER SCARICARE IL CODICE SORGENTE
(attualmente in fase beta appena pronto lo renderò disponibile)
Nel video seguente è possibile vedere come si riesca ad intergire con un Multimaus Roco visualizzando ed attiavndo lo stop di emergenza da tutti i dispositivi e ad attivare un deviatoio mediante due pulsanti su Arduino.
Si ringrazia Nicolas Zin per lo scheletro della struttura di comunicazione Xpressnet visionabile e scaricabile dal suo repository presso Github https://github.com/nzin/xpressnet_arduino