Raccolta dati a basso costo da sensori in DCC

Il sistema digitale (DCC) applicato al modellismo ferroviario.

Moderatore: roy67

Avatar utente
ho_master
Messaggi: 597
Iscritto il: mar nov 06, 2012 6:58 am
Nome: Antonello
Regione: Abruzzo
Città: Pescara
Età: 70
Stato: Non connesso
Contatta:

Raccolta dati a basso costo da sensori in DCC

Messaggio da ho_master » mar dic 20, 2016 9:32 pm

Sul plastico del Museo del Treno sono arrivato al momento della raccolta dati dai vari sensori sparsi lungo la linea per trasmetterli a Rocrail.

Il budget a disposizione e' limitatissimo quindi navigando navigando mi sono imbattuto in una soluzione molto semplice e che sembra funzionare molto bene.

Ho investito 12 Euro in una scheda Arduino Mega 2560 e in un'oretta per verificare il codice che vi allego: tutto qui! Arduino parla con Rocrail tramite un cavo USB e Rocrail vede la scheda come MCS2 controller sulla porta 'seriale' assegnata dal PC.

Come sensori utilizzo rilevatori ad infrarossi, sensolri Hall e rilevatori di assorbimento basati sul circuito di DCCWorld per l'occupazione del binario.

Immagine:
Immagine
48,6 KB

Se qualcuno volesse ulteriori spiegazioni sono qui per voi

Antonello

Codice: Seleziona tutto

/" This program try to implement a kind of sensor management using Arduino Mega 2560,
 sending the appropriate info directly to Rocrail by USB. Define an MCS2 controller in
 Rocrail. In the controller's properties select "serial" and the Arduino "comport".
 It is working with any micro switch or IR module, connected to Mega 2560 digital pins.
 With a minor modification you can include the 16 analogue pins as well. No any shield
 or other elements are needed. The idea is inspired by Bert Havinga and Joerg Pleumann "/

int a=6; //max 6; number of virtual sensor blocks
int b=8; //max 8; virtual sensor block's port
int sensors[7];	// status "matrix"
byte tx_msg[13]; // CAN message to transmit

void setup() {	
	Serial.begin(500000);	
	tx_msg[0] = 0;// prio			
	tx_msg[1] = 35;// command
	tx_msg[2] = 59;// highByte(hash)
	tx_msg[3] = 121;// lowByte(hash)
	tx_msg[4] = 8;// the number of data bytes in the payload			
	tx_msg[5] = 0;
	tx_msg[6] = 1;// bus number
	tx_msg[7] = 0;
	tx_msg[9] = 0;			
	tx_msg[11]= 0;
	tx_msg[12]= 0;
	for (int ap = 1; ap <= a; ap++) {	// read pin status and write to sensors variable
		for (int bp = 1; bp <= b; bp++) {
			pinMode(ap"b+bp-5, INPUT_PULLUP);
			bitWrite(sensors[ap],bp-1,digitalRead(ap"b+bp-5));
			tx_msg[8]=ap"b+bp-8;			     // sensor number
			tx_msg[10]=digitalRead(ap"b+bp-5);// pin status
			Serial.write(tx_msg,13);	         // send the pin status to Rocrail		    	
		}	
	}
}

void loop() {
	for (int ap = 1; ap <= a; ap++) {	// scan pins by virtual blocks and check twice (avoiding mistakes)
		for (int bp = 1; bp <= b; bp++) {	// there was change on pin state compare to previous scan ?		
			if (digitalRead(ap"b+bp-5)!=bitRead(sensors[ap],bp-1))  {
				delay(10);
				if (digitalRead(ap"b+bp-5)!=bitRead(sensors[ap],bp-1))  {	// if yes, change the bit
					bitWrite(sensors[ap],bp-1,digitalRead(ap"b+bp-5));		// in 'sensors' variable
					tx_msg[8]=ap"b+bp-8;			  // sensor number
					tx_msg[10]=digitalRead(ap"b+bp-5);// pin status
					Serial.write(tx_msg,13);		  // send the changed pin status to Rocrail		
				}
			}
		}
	}
}


Avatar utente
Digtrain
Messaggi: 1597
Iscritto il: gio dic 20, 2012 11:47 pm
Nome: Walter
Regione: Lombardia
Città: Casarile
Età: 61
Stato: Non connesso
Contatta:

Messaggio da Digtrain » mer dic 21, 2016 7:47 pm

Ciao Antonello, :grin:

grazie per la condivisione.
Devo trovare il tempo per occuparmi anche di Arduino!!! :wink:

Ciao Walter :geek:
Walter - Club Modellismo Pavese - Steamtown National Historic Site - Het Spoorwegmuseum Utrech - Loxx Berlino - "Il mio fisico è stato scolpito e modellato nelle migliori trattorie della Lomellina"

Avatar utente
anam
Messaggi: 39
Iscritto il: mar mar 25, 2014 7:32 pm
Nome: Daniele
Regione: Piemonte
Città: Santhià
Età: 57
Stato: Non connesso

Messaggio da anam » gio dic 22, 2016 8:32 am

Grazie per l'interessante segnalazione.

Se non ho inteso male il listato, sono 48 le entrate monitorate, esatto?
Daniele - Plastico delle terme

Avatar utente
ho_master
Messaggi: 597
Iscritto il: mar nov 06, 2012 6:58 am
Nome: Antonello
Regione: Abruzzo
Città: Pescara
Età: 70
Stato: Non connesso
Contatta:

Messaggio da ho_master » gio dic 22, 2016 3:07 pm

Esatto. Si potrebbero aggiungere anche gli ingressi analogici lavorando sul codice.

Antonello

Riallego il codice, visto che nel precedente ci sono delle righe spurie ( ma da dove vengono quelle faccine ?)

/" This program try to implement a kind of sensor management using Arduino Mega 2560, sending the appropriate info directly to Rocrail by USB. Define an MCS2 controller in Rocrail. In the controller's properties select "serial" and the Arduino "comport".
It is working with any micro switch or IR module, connected to Mega 2560 digital pins.
With a minor modification you can include the 16 analogue pins as well. No any shield
or other elements are needed. The idea is inspired by Bert Havinga and Joerg Pleumann "/

int a=6; //max 6; number of virtual sensor blocks
int b=8; //max 8; virtual sensor block's port
int sensors[7]; // status "matrix"
byte tx_msg[13]; // CAN message to transmit

void setup() {
Serial.begin(500000);
tx_msg[0] = 0;// prio
tx_msg[1] = 35;// command
tx_msg[2] = 59;// highByte(hash)
tx_msg[3] = 121;// lowByte(hash)
tx_msg[4] = 8;// the number of data bytes in the payload
tx_msg[5] = 0;
tx_msg[6] = 1;// bus number
tx_msg[7] = 0;
tx_msg[9] = 0;
tx_msg[11]= 0;
tx_msg[12]= 0;
for (int ap = 1; ap <= a; ap++) { // read pin status and write to sensors variable
for (int bp = 1; bp <= b; bp++) {
pinMode(ap"b+bp-5, INPUT_PULLUP);
bitWrite(sensors[ap],bp-1,digitalRead(ap"b+bp-5));
tx_msg[ 8 ]=ap"b+bp-8; // sensor number
tx_msg[10]=digitalRead(ap"b+bp-5);// pin status
Serial.write(tx_msg,13); // send the pin status to Rocrail
}
}
}

void loop() {
for (int ap = 1; ap <= a; ap++) { // scan pins by virtual blocks and check twice (avoiding mistakes)
for (int bp = 1; bp <= b; bp++) { // there was change on pin state compare to previous scan ?
if (digitalRead(ap"b+bp-5)!=bitRead(sensors[ap],bp-1)) {
delay(10);
if (digitalRead(ap"b+bp-5)!=bitRead(sensors[ap],bp-1)) { // if yes, change the bit
bitWrite(sensors[ap],bp-1,digitalRead(ap"b+bp-5)); // in 'sensors' variable
tx_msg[ 8 ]=ap"b+bp-8; // sensor number
tx_msg[10]=digitalRead(ap"b+bp-5);// pin status
Serial.write(tx_msg,13); // send the changed pin status to Rocrail
}
}
}
}
}

Avatar utente
antogar
Messaggi: 77
Iscritto il: mer dic 31, 2014 1:52 pm
Nome: Antonino
Regione: Campania
Città: C.mare
Età: 54
Stato: Non connesso

Messaggio da antogar » gio feb 23, 2017 6:16 pm

Provato con Arduino UNO e funziona.
Veramente una soluzione a basso costo se si pensa che un Arduino Nano costa meno di tre euro e ha fino a 13 ingressi fra digitali e analogici. L'ho provato con una Raspberry Pi3 sulla quale gira il server di RocRail, il tutto costerebbe meno di 40€...

saluti
Antonino

Avatar utente
buddacedcc
Messaggi: 473
Iscritto il: mar dic 04, 2012 9:37 pm
Nome: Epifanio
Regione: Piemonte
Città: Torino
Età: 42
Stato: Non connesso
Contatta:

Messaggio da buddacedcc » ven feb 24, 2017 2:35 pm

Scusate l'OT, Antonello ti ho spedito un messaggio privato...per caso l'hai letto ? grazie
Nuccio - Visita DCCWorld, il primo ed unico sito italiano dedicato al digitale.

Avatar utente
antogar
Messaggi: 77
Iscritto il: mer dic 31, 2014 1:52 pm
Nome: Antonino
Regione: Campania
Città: C.mare
Età: 54
Stato: Non connesso

Messaggio da antogar » sab mar 04, 2017 6:25 pm

Versione del programma semplificato per Arduino Uno/Nano

Feedback_CS2_Nano.zip (1,6 KB)
Antonino

Avatar utente
Docdelburg
Messaggi: 5367
Iscritto il: mar set 04, 2012 6:16 pm
Nome: Mauro
Regione: Lombardia
Città: Borgo Priolo
Età: 64
Stato: Non connesso

Messaggio da Docdelburg » dom mar 05, 2017 1:44 pm

Chiedo gentilmente lumi: avendo dei moduli con 4 o 8 sensori tipo quelli di DCCWolrd come li collego ad Arduino?
Intendo dire come avete collegato fisicamente i moduli S4 o S8 se questi inviano dati via bus Loconet?
E in che modo date potenza al segnale? Usando l'alimentazione da pc della scheda Arduino?

Avatar utente
antogar
Messaggi: 77
Iscritto il: mer dic 31, 2014 1:52 pm
Nome: Antonino
Regione: Campania
Città: C.mare
Età: 54
Stato: Non connesso

Messaggio da antogar » mer mar 08, 2017 7:23 am

Ciao doc,
In realtà questa soluzione prevede che la stessa scheda arduino sia un modulo e si connette in usb al pc in emulazione della centrale MCS2 Maerklin. Quindi niente loconet.
Ad essa poi vanno connessi eventuali sensori di assorbimento o infrarossi o semplici contatti (ad esempio per rilevare la posizione di uno scambio)
Spero di essere stato chiaro e perdona il ritardo nella risposta...
Ciao
Antonino

Avatar utente
antogar
Messaggi: 77
Iscritto il: mer dic 31, 2014 1:52 pm
Nome: Antonino
Regione: Campania
Città: C.mare
Età: 54
Stato: Non connesso

Messaggio da antogar » gio lug 20, 2017 6:10 pm

Gli esperimenti proseguono e direi che la soluzione funziona bene. In foto vedi ArduinoNano che si interfaccia a semplici circuiti ad assorbimento e a sensori di posizione ad infrarosso. Ad oggi la scheda è capace di leggere 14 ingressi e il prossimo passo è aggiungere schedine slave tramite I2C.



Immagine:
Immagine
130,34 KB
Antonino

Avatar utente
antonino91
Messaggi: 153
Iscritto il: sab giu 07, 2014 11:11 pm
Nome: Antonino
Regione: Sicilia
Città: Palermo
Età: 29
Stato: Non connesso

Messaggio da antonino91 » gio lug 20, 2017 7:25 pm

Ottima segnalazione. Molto interessante :wink:
Nino - Treni colorati come lenzuola al vento.

Avatar utente
antogar
Messaggi: 77
Iscritto il: mer dic 31, 2014 1:52 pm
Nome: Antonino
Regione: Campania
Città: C.mare
Età: 54
Stato: Non connesso

Messaggio da antogar » sab ago 26, 2017 6:50 pm

Aggiornamento.

Ho dotato la scheda Feedback della possibilità di aggiungere schedine satellite ad Arduino che già di suo legge 15 ingressi. Ho trovato su ebay queste schedine a meno si 1,5€ (ce ne sono anche a meno di 1€) che in pratica forniscono ulteriri 8 pin I/O.

Immagine:
Immagine
75,73 KB

In pratica adesso all' avviamento Arduino verifica se ci sono schedine di questo tipo connesse sul bus I2C e aggiunge ulteriori linee per la lettura dei sensori di posizione.

In foto vedete un Arduino Nano connesso a due di queste schedine a loro volta connesse ai classici sensori ad assorbimento.

Immagine:
Immagine
101,04 KB

Il tutto viene correttamente riconosciuto da RocRail e funziona senza problemi. Prossimi passi saranno la gestione degli errori sul bus I2C. Tutto ciò che vedete in foto (Arduino, schedine I2C, componenti per i sensori di assorbimento) non arriva a 10-15euro sui siti cinesi.

Il bus I2C ha una capacità elettrica di un paio di metri (400pf) di cavo cosa che per me è ampiamente sufficiente. Esiste un chip che ho già ordinato (1,5€ per 2 pezzi) capace di portare la capacità a 3000pf, probabilmente si raggiungono distanze notevoli.

A disposizione per chiarimenti :smile:
Saluti
antogar
Antonino

Avatar utente
anam
Messaggi: 39
Iscritto il: mar mar 25, 2014 7:32 pm
Nome: Daniele
Regione: Piemonte
Città: Santhià
Età: 57
Stato: Non connesso

Messaggio da anam » lun set 04, 2017 10:28 pm

Antonino,

scusa ma temo di non aver ben capito a cosa serva questa piccola scheda della quale hai messo l'immagine. Serve ad ampliare le entrate del nano?

Ho fatto alcune prove con arduino mega. Tutto bene con i test fuori plastico. Quando collego i sensori di assorbimento (quelli di Paco) non vengono sentite le variazioni di stato. I sensori funzionano correttamente con la scheda S88 (sempre di Paco) ma sembrano muti nei confronti del Mega. Non riesco a venirne a capo.

Ciao

daniele
Daniele - Plastico delle terme

Avatar utente
antogar
Messaggi: 77
Iscritto il: mer dic 31, 2014 1:52 pm
Nome: Antonino
Regione: Campania
Città: C.mare
Età: 54
Stato: Non connesso

Messaggio da antogar » mar set 05, 2017 2:41 pm

La scheda serve ad ampliare il numero di pin, come hai osservato.

Non so come fai a collegare i sensori S88, la connessione di un tipico sensore ad assorbimento va fatta come in figura:


Immagine:
Immagine
42,91 KB
Antonino

Avatar utente
anam
Messaggi: 39
Iscritto il: mar mar 25, 2014 7:32 pm
Nome: Daniele
Regione: Piemonte
Città: Santhià
Età: 57
Stato: Non connesso

Messaggio da anam » mar set 05, 2017 6:31 pm

Si, il collegamento é esattamente quello.
Non potrebbe dipendere dalla parte ricevente del fotoaccoppiatore? Io uso i tlp521. Dalle foto che hai postato non sono riuscito a leggere il codice dei tuoi. Potresti dirmi quali usi?
Grazie
Daniele - Plastico delle terme

Avatar utente
antogar
Messaggi: 77
Iscritto il: mer dic 31, 2014 1:52 pm
Nome: Antonino
Regione: Campania
Città: C.mare
Età: 54
Stato: Non connesso

Messaggio da antogar » mar set 05, 2017 7:16 pm

Anche io TLP521, nella versione 4x, la resistenza è 22ohm e il ponte diodi uno di quelli a bassa corrente.
Hai configurato i pin con pull-up ?
Antonino

Avatar utente
anam
Messaggi: 39
Iscritto il: mar mar 25, 2014 7:32 pm
Nome: Daniele
Regione: Piemonte
Città: Santhià
Età: 57
Stato: Non connesso

Messaggio da anam » mar set 05, 2017 10:13 pm

Si, 22ohm la resistenza. Ho anche due condensatori sul ramo del diodo. Che tu non hai. Provo a scollegarli.
I pin sono configurati da programma con pull-up.
Questi sensori comandano regolarmente il 4044 dell'S88. Quindi funzionano.
Farò altre prove.
Grazie mille.
Daniele - Plastico delle terme

Avatar utente
antogar
Messaggi: 77
Iscritto il: mer dic 31, 2014 1:52 pm
Nome: Antonino
Regione: Campania
Città: C.mare
Età: 54
Stato: Non connesso

Messaggio da antogar » mer set 06, 2017 12:14 am

Mah, non so che dirti. Se provi a collegare a massa i pin, vedi il messaggio su RocView ?
Antonino

Avatar utente
anam
Messaggi: 39
Iscritto il: mar mar 25, 2014 7:32 pm
Nome: Daniele
Regione: Piemonte
Città: Santhià
Età: 57
Stato: Non connesso

Messaggio da anam » mer set 06, 2017 7:27 pm

Assolutamente sì. Il problema nasce quando collego il rilevatore di presenza.
Come detto, farò ulteriori prove.
Grazie.
Daniele - Plastico delle terme

Avatar utente
antogar
Messaggi: 77
Iscritto il: mer dic 31, 2014 1:52 pm
Nome: Antonino
Regione: Campania
Città: C.mare
Età: 54
Stato: Non connesso

Messaggio da antogar » mer set 06, 2017 8:38 pm

se il circuito che usi dovrebbe è questo: http://usuaris.tinet.cat/fmco/download/ ... DETEC4.pdf (pag 7), i condensatori dovrebbero solo migliorare la situazione.

Fai qualche foto, magari riusciamo a capire dov' è l'inghippo
Antonino

Avatar utente
antogar
Messaggi: 77
Iscritto il: mer dic 31, 2014 1:52 pm
Nome: Antonino
Regione: Campania
Città: C.mare
Età: 54
Stato: Non connesso

Messaggio da antogar » dom set 10, 2017 6:58 pm

anam ha scritto:

Assolutamente sì. Il problema nasce quando collego il rilevatore di presenza.
Come detto, farò ulteriori prove.
Grazie.


anam, fatte altre prove ?
Antonino

Avatar utente
anam
Messaggi: 39
Iscritto il: mar mar 25, 2014 7:32 pm
Nome: Daniele
Regione: Piemonte
Città: Santhià
Età: 57
Stato: Non connesso

Messaggio da anam » mar set 12, 2017 7:05 pm

Ciao Antonino,
Ho provato questo.
Misurata la resistenza sui piedini collettore emettitore.
Resistenza infinita con sezione libera (come previsto)
Con la sezione occupata la resistenza si attesta attorno ad un megaohm. Che mi pare tanto. Soprattutto se di considera che i piedini di entrata di Arduino vengono praticamente cortocircuitati a massa.

Si, confermo che i rilevatori sono quelli che hai postato.

Questa settimana non riesco a fare altri test per impegni di lavoro. La prossima dovrei riuscire a dedicare un pò di tempo.

Tu riusciresti a replicare il mio test sui tuoi rilevatori di presenza, per vedere che valori hai con tratta occupata?

Grazie per la tua disponibilità.
Daniele - Plastico delle terme

Avatar utente
antogar
Messaggi: 77
Iscritto il: mer dic 31, 2014 1:52 pm
Nome: Antonino
Regione: Campania
Città: C.mare
Età: 54
Stato: Non connesso

Messaggio da antogar » mar set 12, 2017 7:31 pm

Più che resistenza devi verificare col tester che il pin di Arduino è a 5v con tratta libera e va a 0 con tratta occupata. Se ciò non succede misura la tensione ai capi dei diodi, devi avere un valore di 1.4 v quando la loco occupa la tratta.
Altra prova che puoi fare è collegare l'uscita del fotoaccoppiatore ad una resistenza da 1-10k e l'altro capo della resistenza a +5V e fare la stessa misura

Ciao
Antonino

Avatar utente
anam
Messaggi: 39
Iscritto il: mar mar 25, 2014 7:32 pm
Nome: Daniele
Regione: Piemonte
Città: Santhià
Età: 57
Stato: Non connesso

Messaggio da anam » gio set 14, 2017 8:32 am

Ok, grazie.
La prossima settimana farò le prove che mi hai suggerito e ti aggiornerò sugli esiti.
Ciao
Daniele - Plastico delle terme

Avatar utente
anam
Messaggi: 39
Iscritto il: mar mar 25, 2014 7:32 pm
Nome: Daniele
Regione: Piemonte
Città: Santhià
Età: 57
Stato: Non connesso

Messaggio da anam » lun set 18, 2017 10:45 pm

Trovato il problema!
Ho eliminato il condensatore elettrolitico e tutto si è risolto.
Il condensatore impediva il corretto funzionamento (in digitale) del diodo dell'optoisolatore. Infatti, la tensione tra massa e l'entrata di Arduino dai 5v a binario libero, scendeva a 2,60 a binario occupato. Tolto il condensatore, la tensione tra i due capi scende a 0,45 a binario occupato e Arduino interpreta correttamente il segnale.
Grazie per i suggerimenti.
Daniele - Plastico delle terme

Rispondi

Torna a “DIGITALE”