giovedì 26 ottobre 2017
Sessione Rocrail
Piccolo video dimostrativo di una breve sessione di circolazione in modalità automatica con Rocrail, con gestione dei segnali luminosi e degli itinerari
domenica 17 settembre 2017
FEEDBACK CON ARDUINO NANO
Arduino come si sa è una piattaforma estremamente diffusa, ha il vantaggio di aver costi molto contenuti e si presta ad applicazioni più disparate; ovviamente non mancano quelle che coinvolgono il modellismo ferroviario. Ho trovato in rete un’ interessante applicazione proposta da un utente del forum RocRail per realizzare un modulo feedback veramente a basso costo e dalla minima complessità hardware e software.
L’ idea parte dal fatto che RocRail accetta una gran quantità di centrali e fra queste c’ è anche la centrale Marklin CS2. Questa centrale ha fra le interfacce gestite anche quella dei sensori S88 e può essere connessa sia in seriale che in ethernet al PC. Nel progetto proposto, Arduino emula questa centrale connessa in seriale leggendo lo stato dei pin e inviandolo a RocRail come se fosse, appunto, una CS2. Più difficile a dirsi che a farsi 😉
Arduino mette a disposizione circa 19 pin, sufficienti per la gestione di una media stazione nascosta ma potrebbero essere pochi per un plastico casalingo, soprattutto se concentrati in un solo punto. Per questo ho modificato il codice trovato in rete in modo da poter prevedere schede satellite collegate tramite il bus I2C, così da espandere la capacità in termini di lettura di pin. Queste schedine sono basate sul chip PCF8574, hanno 8 pin I/O e un costo che va dagli 80€cent a 1,5€. Alla fine si hanno a disposizione 14 pin di I/O direttamente sulla scheda Arduino e il bus I2C per la connessione di schedine esterne.
Lo schema di principio è il seguente:
Per l’esperimento ho utilizzato Arduino Nano, ovviamente la soluzione si adatta anche alle altre versioni.
Come schedina satellite ho provato quella in foto che ha il vantaggio di avere i connettori I2C “entra/esci” facilitando quindi il cablaggio, ma ce ne sono altre che possono essere utilizzate, come ad esempio quelle che pilotano i display LCD.
Come schedina satellite ho provato quella in foto che ha il vantaggio di avere i connettori I2C “entra/esci” facilitando quindi il cablaggio, ma ce ne sono altre che possono essere utilizzate, come ad esempio quelle che pilotano i display LCD.
Ogni schedina ha tre jumper per scegliere l’ indirizzo che dovrà presentare sul bus I2C, ovviamente in caso di più schede queste dovranno avere indirizzi differenti.
Occorre fare attenzione alla versione del chip, gli indirizzi sono differenti a seconda che si tratti di PCF8574 e PCF8574A. Le tabelle seguenti indicano gli indirizzi per i le due versioni.
Sul numero massimo di schede ci sono alcune considerazioni elettriche da fare: il bus I2C è nato per comunicazioni all’ interno dello stesso sistema, spesso sulla stessa scheda, ma comunque per distanze ravvicinate. Infatti i driver normalmente hanno una capacità di 400pf che equivalgono a qualche metro di cavo, quindi all’ interno di 2-3 metri di cavo possiamo avere due tre schede senza problemi. Oltre è necessario che il bus sia “potenziato” con un vero e proprio booster capace di raggiungere qualche decina di metri. Allo studio ci sono soluzioni; in figura la connessione fisica del bus I2C:
In foto le varie board connesse usate per lo sviluppo del codice. Si vede Arduino Nano montato su una scheda con terminal boards. Arduino e schede satellite sono connesse ad un rilevatore di corrente a 4 ingressi.
Il codice è composto da una parte iniziale dove sono dichiarate le variabili di ambiente, poi la parte eseguibile dove inizialmente (setup) il programma cerca sul bus I2C se ci sono schede, una volta memorizzati gli indirizzi viene inviato lo stato iniziale dei pin a RocRail. A questo punto ciclicamente viene letto lo stato dei pin e confrontato con lo stato precedente, se questo è cambiato (dopo aver campionato tre volte lo stato a distanza di 10 mS) viene inviato un messaggio a RocRail. Il software ha poi un periodo di debouncing settabile tramite la variabile “interval” (1sec) per evitare sfarfallamenti.
Non c’ è bisogno di installare librerie esterne o di terze parti (a parte la libreria Wired per gestire I2C che fa parte dell’ambiente standard dell’ IDE), il codice è veramente semplice e parla da sé.
La scheda di default invia i dati con indirizzo bus 1 (modificabile cambiando il valore della variabile bus_addr), i pin residenti su Arduino sono numerati da 1 a 14 secondo la tabella seguente.
Address
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
Arduino Pin
|
A1
|
A2
|
A3
|
D12
|
D9
|
D8
|
D7
|
D6
|
D5
|
D4
|
D3
|
D2
|
D10
|
D11
|
La sequenza dei pin può essere cambiata a piacimento variando l’ ordine dei pin nel codice alla riga:
int sense[num_sensors] = {A1, A2, A3, 12, 9, 8, 7, 6, 5, 4, 3, 2, 10, 11};
A seguire saranno conteggiati i pin delle schede satellite, se presenti: se ad esempio ci sono 2 schede connesse, scheda A con indirizzo 57 (dec) e scheda B con indirizzo 60, ai pin della scheda A verranno assegnati indirizzi da 15 a22 e quelli della scheda B da 23 a 30. Lo stato dei pin è normalmente alto (+5V).
La connessione ad un sensore esterno, ad esempio un rivelatore di corrente, è semplice:
Allo stesso modo avviene la connessione ai pin delle schede satellite.
Il messaggio inviato a RocRail è conforme al protocollo seguito dalla centrale Marklin CS2 consultabile qui, esso è composto da 13 bytes ed ha la seguente struttura:
Prio
|
Command
|
Resp.
|
Hash
|
DLC
|
Byte0
|
Byte 1
|
Byte 2
|
Byte 3
|
Byte 4
|
Byte 5
|
Byte 6
|
Byte 7
| |
2+2bit
|
8 bit
|
1 bit
|
16 bit
|
4 bit
|
8 bit
|
8 bit
|
8 bit
|
8 bit
|
8 bit
|
8 bit
|
8 bit
|
8 bit
| |
tx_msg0/tx_msg1
|
tx_msg2
|
tx_msg3
|
tx_msg4
|
tx_msg5
|
tx_msg6
|
tx_msg7
|
tx_msg8
|
tx_msg9
|
tx_msg10
|
tx_msg11
|
tx_msg12
| ||
num bytes
|
bus number
|
num_sensor
|
sens_value
| ||||||||||
0
|
35
|
59
|
121
|
8
|
0
|
1
|
0
|
X
|
0
|
X
|
0
|
0
| |
La configurazione della centrale in RocRail è anch’ essa semplice. Dalla schermata in cui si configura la centrale:
Occorre aggiungere una centrale del tipo MCS2 la cui configurazione è indicata in figura:
Ricordate di selezionare il tipo di comunicazione “Serial” e baudrate 500000. Nel campo “Interface ID” va indicato un nome che poi va riferito nella configurazione dei sensori, è importante inoltre indicare correttamente la porta di comunicazione “Device” (COM per Windows, /dev/ttyXXX per i sistemi Linux) cui è connesso Arduino.
Questo il link per scaricare l'ultima release dello sketch che include queste nuove funzioni:
- risposta alla richiesta dello stato dei sensori "start of the day"
- il Led 13 acceso indica la corretta connessione di schede satelliti I2C
Questo il link per scaricare l'ultima release dello sketch che include queste nuove funzioni:
- risposta alla richiesta dello stato dei sensori "start of the day"
- il Led 13 acceso indica la corretta connessione di schede satelliti I2C
A presto!
sabato 22 ottobre 2016
Arduino, Loconet e Feedback
La flessibilità del sistema di sviluppo di Arduino ormai è arcinota, anche in campo fermodellistico con l'avvento dei sistemi digitali, le possibilià date da queste piccole schedine sono pressochè infinite. I miei esperimenti questa volta si sono rivolti verso il bus Loconet, ormai uno standard defacto per l'interconnessione di sistemi per la gestione di un plastico di medio/grandi dimensioni.
Il bus Loconet
Il bus Loconet fu sviluppato inizialmente da Digitrax. Loconet è un'architettura di rete basata su CSMA/CD (Carrier Sense Multiple Access/Collision Detect), similare per funzionamento fisico alla classica Ethernet.
Carrier Sense significa che ogni nodo connesso alla rete riesce a leggere il pacchetto in transito sulla rete stessa, ogni nodo riesce a stabilire se la rete è occupata o meno. Multiple access significa che ogni nodo può generare o ricevere pacchetti, quindi niente polling o master/slave.
Collision Detect significa che quando due nodi tentano di strasmettere allo stesso tempo creando una collisione possono risolvere la situazione in autonomia ritrasmettendo i pacchetti.
Loconet è ottimizzata per avere meno di una collisione ogni 300 messaggi al 100% di sfruttamento della rete, meno di quanto Ethernet permetta.
I collegamenti al bus avvengono mediante spine e cavi RJ12 medante lo schema sottostante
Come si può osservare i segnali trasportati dal cavo sono ridondanti e speculari. I segnali di Rail Sync trasportano il segnale DCC ognuno in opposizione di fase all'altro. per eventuali dispositivi che lo necessitassero, ad esempio i booster.In questo caso si parla di bus Loconet-B Se questo segnale non è necesario su questi pin e' possibile trasportare una tensione di alimentazione per alimentare i dispositivi, tipicamente 12VDC. In questo caso si parla di Loconet-T.
Arduino e Loconet
In nostro soccorso vengono in soccorso di nuovo le librerie MRWWA scaricabili e consultabili all'indirizzo https://github.com/mrrwa, le quali contengono un intero framework per gestire al meglio la rete Loconet. L'idea è quella di realizzare una scheda ad 8 ingressi da utilizzare come feedback o altro da collegare al bus. La scelta è caduta su Arduino Nano, data la compattezza e la relativa economicità. Per maggiori informazioni consultare la scheda a questo indirizzo. https://www.arduino.cc/en/Main/ArduinoBoardNano. Volutamente questa versione non contiene nessun tipo di sensore, che dovrà essere implementato esternamente. In futuro sicuramente prevederò però una scheda con già i sensori integrati.
Innanzitutto occorre realizzare una piccola interfaccia per poter permettere al nostro Arduino di leggere e trasmettere i segnali disponibili su bus Loconet. Di seguito lo schema elettrico della scheda.
Da notare la presenza di un jumper per selezionare l'alimentazione da bus Loconet oppure esterna mediante i morsetti. In questo caso si raccomanda di utilizzare tensioni di alimentazione compatibili con la scheda Arduino Micro quindi da 7 a 12V DC.
AGGIORNAMENTO:
Ho realizzato una nuova board con una sezione di alimentazione stabilizzata per l'alimentazione d Arduino in modo da non stressare in modo anomalo il suo stabilizzatore interno.
AGGIORNAMENTO:
Ho realizzato una nuova board con una sezione di alimentazione stabilizzata per l'alimentazione d Arduino in modo da non stressare in modo anomalo il suo stabilizzatore interno.
Di seguito il PCB, come si può notare abbastanza compatto.
Una volta terminato il montaggio questo dovrebbe essere il risultato finale.
ATTENZIONE
Giustamente mi è stato fatto notare che la il NANO in foto è inserito al contrario di come dovrebbe essere. In effetti la foto è riferita alla primissima versione del PCB quando venivano usati gli ingressi analogici. Appena possibile verrà pubblicata la foto corretta. In ogni caso se avete la board con revisione 2.0 o superiore LA PORTA USB DEL NANO DEVE ESSERE ORIENTATA VERSO IL BORDO DEL PCB.
Si ringrazia per il testing e per la realizzazione del prototipo di interfaccia Pietro Russo e Alessandro B.
Si ringrazia inoltre Atonino (Antogar) per lo sviluppo dello Sketch da caricare su Arduino.
Di seguito i link per scaricare i files:
Schema elettrico formato EAGLE Download VERSIONE 4.0
PCB formato EAGLE Download VERSIONE 4.0
Di seguito i link per scaricare i files:
Schema elettrico formato EAGLE Download VERSIONE 4.0
PCB formato EAGLE Download VERSIONE 4.0
Sketch da caricare in Arduino Download VERSIONE 4.0
Un breve video per dimostrare il funzionamento sia su PC che collegata ad una Intellibox.
A presto!
Un breve video per dimostrare il funzionamento sia su PC che collegata ad una Intellibox.
A presto!
domenica 8 novembre 2015
Segnale a portale in scala N di Alex LaTorre
Di seguito un breve video del bellissimo segnale a portale in scala N realizzato da Alessandro LaTorre in alpacca fotoincisa, con led a tre colori molto realistici. Il segnale è stato poi verniciato e leggermente invecchiato e sporcato. Buona visione.
venerdì 30 gennaio 2015
Rocrail e Raspberry Pi - Script per display
Nel precedente articolo abbiamo impostato le funzionalità di base per far funzionare un display LCD con la Raspberry Pi. A questo punto abbiamo bisogno di un "qualcosa" che ottenga informazioni da Rocrail e lo visualizzi correttamente sul display, Inoltre dovrà monitorare lo stato dei pulsanti ed alla pressione di uno di essi impostare le azioni di conseguenza.
Naturalmente lo script è scritto in Phyton, linguaggio multipiattaforma e di facile apprendimento. A questo punto è sufficiente scaricare lo script e copiarlo in una directory a scelta, io consiglio
Di seguito il link per scaricare lo script. Il listato è liberamente scaricabile e modificabile a patto di riportare sempre il banner iniziale e di riportare sempre la fonte se linkato in altri siti WEB. Nella stessa cartella dello script andranno copiati anche due moduli delle librerie Adafruit scaricati precedentemente e pi esattamente i due moduli con i seguenti nomi
Adafruit_CharLCDPlate.py
Adafruit_I2C.py
Il codice sorgente è disponibile su GitHub
All'interno del repository di GitHub troverete anche numerosi script per la gestione della RocPi
Una volta scaricato il tutto copiate lo script rocpilcd in /etc/init.d e aggiornate gli script di avvio con
Lo script verrà avviato in automatico al boot del sistema operativo.
Naturalmente lo script è scritto in Phyton, linguaggio multipiattaforma e di facile apprendimento. A questo punto è sufficiente scaricare lo script e copiarlo in una directory a scelta, io consiglio
\home\pi\scripts
Di seguito il link per scaricare lo script. Il listato è liberamente scaricabile e modificabile a patto di riportare sempre il banner iniziale e di riportare sempre la fonte se linkato in altri siti WEB. Nella stessa cartella dello script andranno copiati anche due moduli delle librerie Adafruit scaricati precedentemente e pi esattamente i due moduli con i seguenti nomi
Adafruit_CharLCDPlate.py
Adafruit_I2C.py
Il codice sorgente è disponibile su GitHub
RocPiLCD Repository completo
rocpilcd.py Sorgente Python
rocpilcd Script per init.d
All'interno del repository di GitHub troverete anche numerosi script per la gestione della RocPi
Una volta scaricato il tutto copiate lo script rocpilcd in /etc/init.d e aggiornate gli script di avvio con
sudo chmod 755 /etc/init.d/roccontrol
sudo update-rc.d rocpilcdl defaults
Lo script verrà avviato in automatico al boot del sistema operativo.
CONSIDERAZIONI SULLO SCRIPT
Il programma Python è in grado di leggere lo stato di tensione ai binari e stato della modalità automatica, ovviamente è possibile integrare queste informazioni con le innumerevoli messe a disposizione del server mediante lo Scripting RCP (Rocrail Client Protocol), per maggiori informazioni fare riferimento al Wrapper, contenente tutti i riferimenti sl protocollo.
Sulla shield sono presenti anche 5 pulsanti, attualmente vengono utilizzati i primi 3 per ,nell'ordine, abilitare o disabilitare la tensione ai binari, abilitare o disabilitare la modalità automatica, Freno di emergenza (EBREAK).
Ovviamente questa è una base di partenza e il tutto può essere ampliato a piacimento. Di seguito il codice sorgente ed un breve video sul risultato finale
Buon divertimento!
Iscriviti a:
Post (Atom)










