Il progetto è semplice, esso si basa su quanto già descritto nell' articolo precedente:
il circuito permette di azionare gli scambi con indirizzo da 1 a 30 con una coppia di pulsanti normalmente aperti. La connessione dei pulsanti ai connettori P4 e P5 o P6 permetterà di individuare l' indirizzo dello scambio e la modalità di azionamento, dritto o deviato.
I connettori P5 e P6 rappresentano i comando per dritto (P5 - Straight) e deviato (P6 - Diverged) e ogni contatto è relativo alla prima, seconda e terza decina. Il connettore P4 invece conta le unità.
Con un esempio facciamo prima: per comandare lo scambio 7 dritto, collego il pulsante fra il primo contatto del connettore P5 - Straight (dritto) e il settimo contatto del connettore delle decine, per comandare lo scambio 14 deviato, collego il pulsante fra il secondo contatto del connettore P6 - Diverged (deviato) e il quarto contatto del connettore delle decine, infine per comandare lo scambio 20 in dritto collego il pulsante fra il pin 2 di P5 e il pin 10 di P4... credo adesso sia chiaro.
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, con più pin a disposizione il numero di scambi da comandare può aumentare considerevolmente.
Come negli altri progetti inerenti all' interfaccia Xpressnet© ho fatto uso delle librerie di Philipp Gahtow (http://pgahtow.de) al quale vanno i miei ringraziamenti e che possono essere scaricate a questo indirizzo
Se non già installata installare anche la libreria Keypad disponibile nel gestore librerie standard di Arduino.
Nel codice l' indirizzo della periferica Xpressnet è codificato in una definizione fissa:
#define XNetAddress 29 //Adress on XpressNet bus
Lo scketch ha commentate le righe per la seriale di servizio usate per il debug.
Decommentare queste righe se necessario per avere una visualizzazione sul terminale seriale.
Se si desidera utilizzare il debug sulla seriale di servizio è necessario dotarsi di un adattare Seriale USB con chip FTDI o similari da collegare ai pin 11 e 12
In questo caso i dispositivi comandabili diventano 24 e non piu' 30.
Il funzionamento dello sketch è molto semplice, in effetti c' è la scansione continua di due tastiere associate ai pin dei connettori P4-P5 e P4-P6, viene rilevata la pressione di un tasto ed inviato un comndo di attivazione/disattivazione dello scambio associato al pulsante premuto.
Lo schema ha un pulsante collegato al pin A0 per usi futuri, così come il bus I2C (display ?) e due pin A6 e A7 che possono essere associati (nello sketch) ad itinerari precablati.
Il funzionamento dello sketch è molto semplice, in effetti c' è la scansione continua di due tastiere associate ai pin dei connettori P4-P5 e P4-P6, viene rilevata la pressione di un tasto ed inviato un comndo di attivazione/disattivazione dello scambio associato al pulsante premuto.
Lo schema ha un pulsante collegato al pin A0 per usi futuri, così come il bus I2C (display ?) e due pin A6 e A7 che possono essere associati (nello sketch) ad itinerari precablati.
Per scaricare lo sketch in Arduino è necessario rimuoverlo dalla scheda in quanto la seriale di default è collegata al MAX485 il quale non permette di effettuare regolarmente il download.
Anche per questo progetto ho realizzato un PCB dall'ormai mio consueto fornitore cinese, le piastre sono arrivate in 4 settimane e sono di ottima qualità.
Di seguito i link per la realizzazione del progetto
Per chi fosse interessato ai files gerber per la realizzazione del PCB ne faccia richiesta tramite il modulo di contatto del blog in Home Page, riceverete un link ai files necessari.
Ciao.
RispondiEliminaGraziue per il progetto è interessantissimo!
Sto però impazzendo con questo progetto. L ho semplificato ai fini di test in modo da chiudere e aprire uno scambio in maniera ciclica. Il problema è che appena connetto alla porta slave il multimouse mi fa err13. Questo errore è dovuto alla 0resenza di più master.. Ovvero sembra che il 'quadro scambi' si comporti come un master sulla xpressnet e non come slave. Ti è per caso capitato anche a te? Ti ringrazio per l aiuto perché ci sto impazzendo!
Di seguito lo sketch ipersemplificato. La libreria usata è quella
RispondiEliminain http://sourceforge.net/projects/pgahtow/files/Arduino%20%28v1.0%29%20libaries/XpressNet.zip
#include "XpressNet.h"
XpressNetClass XpressNet;
#define XNetAddress 25 //Adress on XpressNet bus
#define XNetSRPin 5 //Max485 Busdriver Send/Receivepin - DO NOT CHANGE!
byte address_offset = 0;
byte address_switch;
void setup() {
flashled ();
XpressNet.start(XNetAddress, XNetSRPin); //Initialisierung XNet-Bus
}
void loop() {
delay(1000);
XpressNet.receive();
delay(1000);
address_switch = 0 ;
XpressNet.setTrntPos(0, address_switch + address_offset, B1000); //set output straight active
delay(2000);
XpressNet.setTrntPos(0, address_switch + address_offset, B0000);// set output straight inactive
delay(2000);
}
Buongiorno David, grazie per il commento. Che centrale DCC utilizzi?
RispondiEliminaUtlizzo il Multimouse agganciato al suo booster + questo sketch collegato all'ingresso slave del booster
RispondiEliminaCiao David,
Eliminaallora, hai un po' troppo semplificato lo sketch. Ad esempio non puoi eliminare la dichiarazione della costante
#define interval 8500
poi non si deve usare la funzione delay() in quanto mette in halt il processore e di fatto blocca il bus. La funzione XpressNet.receive(); deve essere eseguita il più velocemente possibile.
Per far fare ad Arduino il lavoro occorre usare la funzione millis(), ho elaborato uno sketch che farebbe al caso tuo (non ho potuto provarlo sul plastico però) ma confido nel suo corretto funzionamento.
Questo commento è stato eliminato dall'autore.
EliminaA proposito verifica che il circuito che hai realizzato sia coerente con la dichiarazione:
Elimina#define XNetSRPin 5 //Max485 Busdriver Send/Receivepin - DO NOT CHANGE!
ovvero che t abbia collegato D5 di Arduino ai pin 2 e 3 del MAX485
Provo a pubblicare lo sketch in più parti perchè supera il limite massimo di caratteri consentiti...
Elimina#include
EliminaXpressNetClass XpressNet;
#define XNetAddress 29 //Adress on XpressNet bus
#define XNetSRPin 5 //Max485 Busdriver Send/Receivepin - DO NOT CHANGE!
#define interval 8500 // Parametro interno alla libreria - NON CANCELLARE
boolean ledState = 0, switchState = 0;
int address_offset = 3;
int address_switch;
int long temporizzatore = 0;
const int nflash = 5; // set number of flashes for led on pin 13
const int flashduration = 60; // duration of flash pulse
void flashled () {
Eliminafor (int a = 0; a<nflash; a++) {
ledState = !ledState;
digitalWrite (13, ledState);
delay (flashduration);
}
digitalWrite (13, LOW);
ledState = 0;
}
// INIT
void setup() {
flashled ();
XpressNet.start(XNetAddress, XNetSRPin); //Initialisierung XNet-Bus
}
void loop() {
EliminaXpressNet.receive();
if ( (millis() - temporizzatore) > 2000) {
temporizzatore = millis();
switchState = !switchState;
if (switchState) {
XpressNet.setTrntPos(0, address_switch + address_offset, B1000);
flashled ();
}
else {
XpressNet.setTrntPos(0, address_switch + address_offset, B0000);
flashled ();
}
}
}
ERR13 indica che il mmouse è in modalità slave e non trova master nel bus Xpressnet. Verifica che il mmouse sia collegato nella porta master con un cavo Rj12 a 6 conduttori, e non 4, questo è molto importante. Ovviamente i due dispositivi non devono avere lo stesso indirizzo. Collegando il solo mmouse funziona regolarmente?
RispondiEliminaCiao Ragazzi. Grazie dell'aiuto. Ho eliminato l'errore ERR13.
RispondiEliminaPurtroppo anche cosi non riesco. Ho provato a usare un altro arduino come "sniffer" di segnale DCC (vedi progetto decoder dcc arduino)e vedo sempre FF 0 FF ovvero nessun messaggio viene trasmesso.
Mi viene un dubbio: ma è normale che i pin TX e RX NON lampeggino durante la trasmissione serial a MAX485?
No, non è normale.
EliminaCome ho avuto modo di dire in uno dei miei commenti, nello sketch che tu hai postato il pin di controllo del MAX485 è indicato come D5:
#define XNetSRPin 5 //Max485 Busdriver Send/Receivepin - DO NOT CHANGE!
mentre nel mio schema (e nello sketch pubblicato) il pin è D2:
#define XNetSRPin 2 //Max485 Busdriver Send/Receivepin - DO NOT CHANGE!
tale pin di controllo va collegato alla coppia di pin (2 e 3) del MAX485: nel tuo circuito montato, quale pin di Arduino hai usato ?
Come hai eliminato l' ERR13: hai cambiato cavo ? hai usato lo sketch che ho postato io ?
Allora:
RispondiEliminaRelativamente a ERR13 ho fatto un inversione dei pin A e B al cavo che va allo slave.
QUindi il cavo che collega questo dispositivo allo slave del booster Roco e': GND-A-B-Vcc da una parte e GND-B-A-VCC dall'altra (supposto il cavo a 4 poli). Interessante capire come comportarsi per uno slòave aggiuntivo.. SArà il mio prossimo espoerimento.
Relaivamente alla trasmissione.. era problema di Arduino (usavo una versione col processore DIP cambiuandolo ha funzionato).
Ho risolto anche un problema sul turnout: https://www.h0-modellbahnforum.de/t343805f19606-Tastenstellpult-am-Xpressnet.html qui trovate delle info per risolvere problemi di compatibilità con Lenz e Roco. Sono ai test finali, vi aggiorno!
Bene. Per quanto riguarda lo sketch, hai usato la tua versione con la funzione delay() ?
EliminaSi in realtà si, anche con la delay funziona; ho impostato l'iterval.
RispondiEliminaVi confermo che ora il colloquio sia con Il Multimouse che con il decoder DCC Arduino funziona perfettamente.
Next step: verificare che il colloquio con un Sinottico-XpressNet configurato come secondo Slave funzioni.
Bene! ricorda di cambiare l' indirizzo Xnet nello sketch:
Elimina#define XNetAddress 29 //Adress on XpressNet bus
ciao!
Benissimo!
RispondiEliminavorrei provare a costruire il modulo ma non capisco alcune cose.....vorrei far almentare arduino dai 12 v del cavo expressnet inserendolo in vin e questo mi sembra di vederlo nello schema dei collegamenti, non capisco i due connettori vicino a vin e gnd che si trovano a detra,a sinistra di quei 2 ci sono 2 connessioni segnate con A e B, oltre che nel max 845 dove vanno anche?
RispondiElimina