lunedì 17 giugno 2013

Ancora Arduino e Xpressnet

Nel precedente post ho tentato di interfacciare Arduino con RocRail per poter utilizzare gli ingressi come ingressi di retroazione.
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