lunedì 23 dicembre 2019

Controlliamo gli scambi con Arduino su Xpressnet

Dopo la pubblicazione del palmare Multiloco per sistemi Xpressnet©, molti mi hanno chiesto di dotare lo stesso della capacità di poter pilotare gli scambi.
L' esigenza del palmare multi loco, come ho avuto modo di spiegare nel primo articolo, è nata dal fatto di poter avere a disposizione i comandi "basic" a portata di mano per controllare più di una loco, su plastici medio piccoli, senza alcuna navigazione in menù o combinazioni di tasti.
Dotare il Palmare Multiloco della funzionalità di comando scambi avrebbe un pò fatto venir meno questo principio per cui ho preferito venire incontro alle esigenze di qualche amico pensando ad un progetto ex-novo, ovvero un Arduino che avesse la possibilità di pilotare gli scambi tramite una serie di pulsanti.
Il progetto che verrà descritto quindi è un controllore di scambi per sistemi basati sul protocollo Lenz Xpressnet©, qualcosa di simile a quanto già progettato e pubblicato da Paco Canada con il suo "XTCO".
Il progetto utilizza un Arduino Nano, data la semplicità del codice, esso è facilmente applicabile ad Arduino Uno o meglio ancora (vista la quantità di pin) Arduino Mega.
Anche in questo caso ho fatto uso delle librerie di Philipp Gahtow (http://pgahtow.de) che ancora una volta è stato molto disponibile nel fornire supporto e al quale vanno i miei ringraziamenti.

Lo schema è il seguente:

Schema di connessione


Lo schema riporta solo 4 degli 8 pulsanti che sono stati configurati nello sketch, esso rappresenta effettivamente il prototipo che ho realizzato per le prove.
Per connettersi al bus Xpressnet© è stata utilizzata l' interfaccia del palmare Multiloco con qualche lieve modifica per aggiungere un LED che indica la presenza della tensione 5V:






Lo sketch da caricare su Arduino è molto semplice, in pratica viene letto in loop lo stato dei pulsanti e quando viene rilevata la pressione di uno di questi cambia lo stato dello scambio ad esso associato.




Ogni pulsante quindi agisce da "toggle" per lo scambio cui è stato associato: premendo il pulsante lo scambio cambia stato, da corretto tracciato va in deviato o viceversa. La scelta di un solo pulsante per scambio (e non due pulsanti associati alle due condizioni, "corretto tracciato" e "deviato") è stata fatta per avere un numero sufficiente di scambi pilotabili da Arduino Nano che mette a disposizione un discreto numero di pin I/O (D3-D13 digitali, A0-A7 Analogici). Lo scketch proposto configura 8 pin come input:
int turnout_pin[num_turnout] = { 3, 4, 5, 6, 7, 8, 9, 10};

questa riga di codice elenca i pin associati ai pulsanti. Nulla vieta di aggiugere altri pin, occorre però ricordarsi anche di aggiornare la variabile di configurazione che indica il numero di scambi gestiti da Arduino:

#define num_turnout 8


Ad ogni scambio va poi associato un indirizzo che corrisponde all' indirizzo del decoder cui è connesso il motore dello scambio stesso.

E' necessario fare una premessa: in ambito DCC, ci sono diversi modi di gestire l' indirizzamento dei decoder accessori (PADA, MADA etc), quello utilizzato dipende dalle varie centraline in commercio o autoscostruite che fanno parte del nostro impianto. Un'ottima spiegazione è riportata nella wiki del noto software Rocrail© di Robert Versluis (link).
In pratica può capitare che uno stesso decoder sia visto con indirizzi diversi a seconda del dispositivo che lo piloti: ad esempio nel mio impianto, che è equipaggiato con la centralina NanoX di Paco Canada, uno stesso scambio ha indirizzi diversi se viene comandato dall' XTCO di Paco Canada o dal software RocRail© tramite interfaccia PC.

Nello sviluppo dello sketch, utilizzando le librerie di Philipp Gahtow, ho riscontrato ancora una differenza: per muovere lo scambio programmato con indirizzo 2, ho dovuto indicare come indirizzo 5 e così via per tutti gli altri: esiste una differenza di "3" costante. Probabilmente ciò avviene perchè i vari costruttori/programmatori interpretano gli indirizzi di partenza da 0 o da 1 con logiche e principi diversi. L'unica cosa è... provare!

Fatta questa premessa, l' indirizzo associato ai vari pulsanti/pin è contenuto nella variabile:

int turnout_pin[num_turnout] =  { 3, 4, 5, 6, 7, 8, 9, 10};
int turnout_add[num_turnout] = { 1, 2, 3, 4, 5, 6, 7,  8}; 

l' array che contiene gli indirizzi segue quello che indica i pin, al pin 3 è associato l' indirizzo 1, al pin 4 indirizzo 2 etc.
Per ovviare alla differenza di indirizzi che si può avere fra l' indirizzo del decoder e l'indirizzo che effettivamente viene inviato dallo sketch alla centralina è stata utilizzata la variabile:

int address_offset = 3;

tale valore viene somamto all' indirizzo programmato nella variabile turnout_add[num_turnout] e può essere cambiata a seconda delle esigenze. Come ho anticipato, occorre fare delle prove per definire l' esatto valore della variabile "address_offset".

Arduino Nano dispone di una sola porta seriale e nel progetto descritto in questo articolo essa è utilizzata per scambiare messaggi sul bus Xpressnet tramite il chip MAX485. Allo stesso tempo però tale interfaccia è quella utilizzata da Arduino per caricare gli sketch da PC, poichè il MAX 485 se connesso ad Arduino non permette a questi di colloquiare con il PC tramite la porta USB, occorre disconnetterlo ogni volta che vogliamo caricare un nuovo sketch sul nostro Arduino Nano.

Questa una foto del prototipo realizzato:












mercoledì 4 dicembre 2019

Custodia per palmare Multiloco XpressNet con stampa 3D



Definite le funzionalità tecniche del palmare è ora di progettare una degna custodia per tutta l'elettronica.
Per questo ho deciso di sfruttare le potenzialità della stampa 3D con tecnologia FDM, economica e flessibile. Dato che non ho trovato nulla che mi soddisfacesse nel cloud già pronto ho deciso di progettare l'enclosure ex novo.
Per la realizzazione del disegno 3d ho utilizzato Autodesk Fusion 360, software molto potente di modellazione 3D che, per usi personali ed altre situazioni è gratuito. Consiglio di leggere i termini di licenza per verificare se ricadete nell'utilizzo gratuito del software.

Per prima cosa ho disegnato un faceplate per verificare le finestre di alloggiamento della tastiera e del display e per avere un'indicazione di massima degli ingombri. Lanciata la stampa i risultati non si fanno attendere.




Definito il posizionamento inizio a progettare la custodia, composta da due pezzi e con le apposite torrette di fissaggio per tutta l'elettronica.




Bottom con le torrette di fissaggio dell'elettronica
Elettronica in loco

Bottom con le finestrature per i componenti



I files .stl da stampare sono diponibili su Thingiverse cliccando sul collegamento qui sotto


martedì 19 marzo 2019

Palmare Xpressnet Multiloco - Aggiornamento

Nell'articolo precedente è stato presentato un Palmare Multiloco basato su Arduino Mega per sistemi digitali DCC Xpressnet© capace di controllare tre loco con tre manopole diverse e mettendo a disposizione i comandi essenziali, ovvero cambio dell' indirizzo DCC, direzione di marcia, luci. Oltre a ciò nella prima versione il palmare ha anche la funzione di lettura delle CV.

Il presente articolo descrive la nuova release software che aggiunge la funzionalità di scrittura delle CV.

Come descritto nell’articolo precedente, il palmare entra nella modalità “Service mode” premendo il tasto “D”. Il display mostrerà la schermata come in figura:
Per leggere una CV occorre ruotare la manopola dell’encoder 1 per selezionare il numero della CV da leggere e poi premere il pulsante dello stesso encoder per attivare l’operazione di lettura vera e propria.
Il valore letto sarà visualizzato come in figura.
Per scrivere una CV occorre ruotare la manopola dell’encoder 2 per selezionare il numero della CV da leggere e la manopola dell’encoder 3 per selezionare il valore da programmare, successivamente premere il pulsante dell’encoder 2 per attivare l’operazione di scrittura.
Il palmare visualizzerà il valore appena scritto nella riga dedicata alla lettura.
Premendo il tasto 'D' si torna alla schermata di controllo.

giovedì 21 febbraio 2019

Un palmare multi loco per sistemi Xpressnet con Arduino Mega


Il progetto descritto di seguito riguarda un palmare per sistemi digitali che utilizzano il protocollo Lenz Xpressnet© tipico dei sistemi Roco, basato su Arduino Mega.
L’ idea parte dall’esigenza dei poter avere sottomano il controllo di più loco, ciascuna con la classica manopola dedicata. Tutti i palmari infatti hanno un solo potenziometro o encoder, e per poter controllare più loco occorre sempre scorrere un menù o cambiare indirizzo. Questo palmare invece mette a disposizione tre manopole dedicate e 4 tasti per ogni loco per i controlli essenziali della marcia (cambio di indirizzo, velocità, stop loco, cambio direzione, luci) in maniera diretta, i comandi cioè sono sempre disponibili. E' possibile inoltre leggere le CV del decoder.
Il progetto prevede come anticipato l’utilizzo un Arduino Mega (ho usato un clone cinese con interfaccia seriale/USB basata sul chip CH340) a causa dell’elevato numero di I/O richiesti e per eventuali espansioni future, una tastiera 4x4, un display LCD a 4 righe e 20 colonne con interfaccia I2C, tre encoder rotativi e un semplice circuito di interfaccia per il bus RS485 per connettersi al bus Xpressnet©.
Il software è molto semplice e intuitivo, esso utilizza le librerie messe a disposizione di Philipp Gahtow sul suo sito internet http://pgahtow.de al quale rinnovo i ringraziamenti per il supporto. Lo sketch può essere facilmente modificato per aggiungere altre funzioni, inserire altri encoder etc. Le funzioni della libreria di Philipp sono di facile comprensione una volta lette le direttive del protocollo.
Lo schema dei collegamenti è il seguente:


Lo schema dell’interfaccia con il busRS485 si basa sul chip MAX485 (o equivalente), anch’ esso molto comune in rete, è indicato nella figura seguente:

Il circuito fornisce l’alimentazione ad Arduino e al display sfruttando la tensione +12V messa a disposizione dal bus Xpressnet©, i pin TX/RX vanno connessi all’ interfaccia seriale 1 di Arduino, il pin EN che abilita/disabilita la trasmissione al pin 25.
Le connessioni con la tastiera e con gli encoder sono indicate all’ interno dello sketch. 
Il codice come anticipato è molto semplice, dopo la parte di inizializzazione, il loop principale prevede ciclicamente le seguenti operazioni:
I tasti del tastierino 4x4 sono organizzati in modo che ogni colonna numerica è relativa a ciascuna delle tre loco controllate dal palmare, mentre le righe rispettivamente controllano l’indirizzo della loco (prime due righe), la direzione (terza riga) e le luci (quarta riga). Il tasto “A” agisce come Stop di emergenza togliendo tensione ai binari, con il tatìsto "D" si entra in Service Mode per la lettura delle CV:
Gli encoder regolano la velocità della loco, premendo la manopola a mo’ di pulsante (tutti gli encoder hanno la funzione “push-button”) la velocità passa istantaneamente a 0.

Allo start-up il display visualizza la scritta di benvenuto e la data/ora della compilazione del file caricato su Arduino, un modo per tener traccia della versione sw caricata. Successivamente vengono visualizzate le info delle loco controllate:


Per ogni loco sono visualizzate le seguenti info: indirizzo, direzione, stato delle luci e velocità. Sulla parte desta sono indicati gli step attualmente in uso e in basso lo stato di alimentazione dei binari.
Il palmare utilizza di default la modalità a 28 step, tuttavia allo start-up tenendo premuto il tasto “D” è possibile cambiare gli step, il software infatti visualizza la schermata seguente:


Agendo sui tasti “A” e “B” si possono scegliere le seguenti modalità:

0  – 14 step

1  – 27 step

2  – 28 step (default)

3  – 128 step

Una volta scelto il numero di step con cui operare, premendo il tasto “D” il palmare va nella modalità operativa. La scelta degli step non è memorizzata in EEPROM.
Il palmare permette anche la lettura delle CV se connesso alle centrali dotate di tale funzione (purtroppo il Lokmaus/Multimaus non forniscono feedback). Premendo il tasto “D” si entra in Service Mode:


Agendo sul encoder 1, si potrà scegliere la CV da leggere e premendo la manopola a mo’ di pulsante verrà visualizzato il valore della CV:
Una volta terminate le operazioni di lettura, premendo il tasto “D” si ritorna alla modalità operativa.
Ecco l' elenco dei componenti:
-  Arduino Mega (per il prototipo è stato usato un clone)
-  Display LCD 20x4 con interfaccia I2C come questo
-  Keypad 4x4  link
-  Encoder rotativo KY-040 link

Per l 'interfaccia con il bus Xpressnet, i componenti da assemblare sono i seguenti:
- Connettore RJ-12
- circuito integratro MAX485 o equivamente
- circuito integrato LM7805  (case TO220)
- 2 condensatori 100uF 25V
- 1 diodo 1N4004 o equivalente

Queste alcune foto della realizzazione del prototipo:




Aggiornamento 19/03/2019

Antonino ha aggiornato il suo palmare con una comodissima funzione per la scrittura delle CV, trasformando di fatto il palamre TriLok in una completa stazione DCC! Cliccate sul link qui sotto per leggere il post corrispondente.






A presto!