Rilevare la polarità sulla rotaia di un plastico ferroviario

Ciao a tutti,
ho l’ennesima richiesta di aiuto alla community per il mio plastico ferroviario comandato da Arduino: ho bisogno di rilevare la polarità della corrente su di una rotaia, per poi impostare una serie di relè.

Come è fatto l’ambiente (semplificando molto, ma molto, la situazione): plastico ferroviario in scala H0 in CC, alimentato da un trasformatore Rivarossi che eroga (per l’esercizio che ne voglio fare io) circa 12V. Questo trasformatore (come tutti i trasformatori per ferromodellismo) eroga una corrente con polarità + sulla rotaia di sinistra del binario e - su quella di destra se giro la manopola che regola la tensione in un senso , MA… se giro la manopola nel senso opposto eroga la corrente con polarità inversa, cioè con il - sulla rotaia di sinistra ed il + su quella di destra. In questo modo posso fare muovere una locomotiva avanti oppure indietro, in quanto per convenzione NEM la locomotiva si aspetta il + a sinistra per marciare in avanti, e se invece ha il - a sinistra fa girare motore e ruote all’indietro.

Ora, io ho un circuito ovale con un raddoppio di binario in una stazione, e due treni che percorrono alternativamente il tracciato uno in una direzione ed uno nell’altra, scambiandosi in stazione. In pratica parte un treno che percorre il tracciato in senso orario, arriva in stazione, si ferma, e parte l’altro treno nel senso opposto, fa il suo giro, arriva in stazione e si ferma, fa partire il primo e così via.

Il tutto è comandato da Arduino tramite una scheda con tre relè , due rilevatori IR di binario impegnato e due sensori reed di ingresso sul binario di scambio.

Il problema è che ogni tanto viene tolta corrente al circuito tramite il trasformatore Rivarossi mentre un treno è fuori dalla stazione e sta girando; e quando, magari dopo alcuni giorni, qualcuno deve ridare corrente per farlo ripartire non sa in quale delle due direzioni girare la manopola per far marciare il treno nella direzione corretta.

In altre parole ho bisogno di far sapere ad Arduino se sulla rotaia di sinistra ho la polarità + o quella -.
In questo modo (tramite il rilevatore di binario impegnato) so quale treno è fermo in stazione e quale è fuori, e di conseguenza so come impostare le polarità per far marciare il treno nella giusta direzione, eventualmente invertendo tramite i relè comandati da Arduino la polarità ai binari.

Quindi, venendo alla domanda tecnica relativa ad Arduino, come faccio a leggere se su una rotaia a 12V ho la polarità + o quella -? Che tipo di componenti devo utilizzare?

Grazie.
Ciao.
Aldo

Dato che su arduino non puoi usare piu di 5V, ne dare segnali negativi agli ingressi, la soluzione piu semplice e sicura al tempo stesso e' quella di usare due optoisolatori (o uno doppio, e' indifferente), collegando i due led degli ingressi in antiparallelo (cioe' in parallelo, ma con le polarita' uno in senso opposto all'altro), con un'opportuna resistenza, fra le due rotaie ... in questo modo quando c'e' una polarita' si attivera' uno degli opto, e quando c'e' l'altra si attivera' l'altro ... poi li leggi con due normali ingressi digitali, e sei a posto ;)

Ne basta uno, per controllare una sola rotaia, visto che se il positivo non è su quella è per forza sull'altra

Non e' detto ... potrebbe anche non esserci tensione perche' il treno e' fermo ;)

Ok, a questo non ci avevo pensato. Però se non c'è tensione ( treno fermo ) anche se usi due fotoaccoppiatori non sai a priori su quale binario ci sara' il positivo

Etem, molte grazie! mi sembra un'ottima soluzione. :D

Potresti per favore anche indicarmi un qualche tipo di opto che io possa utilizzare? li conosco in teoria ma non nella pratica e non so se c'è qualche caratteristica particolare da cercare.

Arigrazie!

visto che sembri più ferrato con hardware vecchia maniera, puoi usare un relè alimentato dalla rotaia, con un diodo in serie, il relè si armerà solo se il verso della corrente in rotaia è concorde con il diodo ma comunque non vedo il problema, sarò dordo io, ma secondo me se metti una locomotiva in avanti e una ruotata di 180 gradi vanno sempre nella direzione corretta senza bisogno di scambiare le tensioni, o sbaglio?

Comunque, se vuoi usare dei fotoaccoppiatori…
rotaie.jpg

rotaie chip.jpg

Dato che devi solo rilevare presenza di tensione, uno qualsiasi di quelli degli schemi di Brunello (che mi ha battuto sul tempo postandoti anche i possibili collegamenti :D) andra' bene ... ;)

brunello22: Ok, a questo non ci avevo pensato. Però se non c'è tensione ( treno fermo ) anche se usi due fotoaccoppiatori non sai a priori su quale binario ci sara' il positivo

Vero, fino ad un certo punto ... non so adesso a quale tensione il motore inizia a girare su quelle locomotive, pero' potrebbe fornire una tensione piu bassa della soglia per controllare senza muoverle (gli opto dovrebbero iniziare a condurre prima che il motore si metta a girare, almeno in teoria :D) ... oppure fornire impulsi brevissimi, se usa un ponte H, per leggere le polarita' senza che il treno inizi a muoversi ... sempre che questo gli serva ...

Diverso e' il caso del rilevare in quale direzione e' girato il treno sul binario, ora che ci penso ... un conto e' che le manovre le faccia "a vista", per cui vede gia l'operatore come e' disposta la motrice, un'altro conto e' che tutto quanto sia gestito dalla MCU, nel qual caso serve una circuiteria diversa, ma non m isembra dalla descrizione che ci ha dato che sia cosi, cioe' arduino a quanto ho capito si basa solo sui sensori di binario impegnato in stazione e non controlla la presenza ed il verso dei treni che non sono in stazione, giusto aldozan ?

Etem, Brunello,
grazie! :smiley: :smiley: :smiley:

Ora mi metto al lavoro e colloco gli opto, così rendo il circuito funzionante al di là degli errori umani.
In realtà il circuito di cui parliamo è parte di un grande plastico installato a Castelmaggiore (BO).
Qui trovate un qualche filmato sul plastico.

Ci sono diversi operatori addetti al plastico, e quindi è importante far sì che i circuiti funzionino anche se si commette qualche errore di gestione… :sunglasses:

Abbiamo operato un grande restauro negli anni precedenti, riattivando tre circuiti con la tecnologia dell’epoca del plastico originale, quindi relè analogici (Fleischmann) che comandano 11 treni.

Nell’ultimo anno abbiamo iniziato una manutenzione evolutiva, per arrivare a movimentare anche parti che nel plastico originale erano comandate a mano. Questo perchè il plastico era originalmente realizzato per il divertimento di una sola persona, il Generale C. A. Vittorio Santini, scomparso nel 2016. Alla sua morte il plastico fu donato all’Esercito Italiano e rimontato nella caserma del Reggimento Genio Ferrovieri, dove è possibile visitarlo. Per questa sua seconda vita il plastico deve vivere di “vita autonoma”, ovvero il movimento dei treni deve essere affidato ad automatismi che richiedano il minimo d intervento umano.

Abbiamo quindi iniziato a realizzare circuiti comandati da Arduino, e già un circuito punto punto con soste è percorso da un treno navetta che si muove attraverso le diverse stazioni e scali.

Ora stiamo attrezzando il circuito di cui in oggetto, che sarà percorso da due brevi treni di servizio.

!(http://“D:\Aldo\Treni\Plastico Genio\Schemi tecnici\Circuito 4.pdf”)

arduino a quanto ho capito si basa solo sui sensori di binario impegnato in stazione e non controlla la presenza ed il verso dei treni che non sono in stazione

Uno dei due treni è sempre fermo in stazione, mentre l’altro percorre il circuito. Quando arriva in stazione sul suo binario (fisso) occupa il sensore (un IR) e da qui il programma toglie alimentazione tramite un relè, inverte la polarità tramite altri due relè, aspetta un tempo predefinito poi ridà tensione e l’altro treno parte nella direzione opposta. Come potete vedere dall’attachment (prima o poi capirò come si inserisce un’immagine in un messaggio nel forum… Ancora non ci sono riuscito. :disappointed_relieved:) ) il tutto funziona perchè le due tratte di sosta in stazione sono isolate sulla rotaia del polo + e collegate tramite un diodo ciascuna al resto del circuito, quindi a seconda della polarità una delle due è in tensione ed una è isolata.

La presenza dell’altro treno sul circuito la controllo attraverso i sensori di binario impegnato in stazione (potrebbero essere entrambi fermi) e se un binario è libero sono certo che il treno è in giro per il circuito.
La polarità sulle rotaie mi dice la direzione di marcia del treno, dato che nei sistemi a due rotaie la locomotiva si aspetta il + sulla rotaia di sinistra per marciare in avanti. Il verso del treno (cioè se deve marciare in senso orario o antiorario) lo so dal treno che è fermo in stazione, perchè essendo il binario di sosta fisso per ogni treno so per differenza chi è fuori e ognuno dei due treni ha un verso prederminato.

La rilevazione della polarità sulla rotaia mi serve proprio qui: so che ho treno fuori (che deve andare ad esempio in senso orario) e quindi so che devo dare il + sulla rotaia di sinistra rispetto al verso di percorrenza. Ma se giro la manopola del trasformatore dal lato sbagliato mi ritrovo il - sulla rotaia di sinistra, e quindi il treno va indietro ed il disastro è assicurato!
E, dato che una volta passa un treno in senso orario, ed una volta un treno in senso antiorario, la rotaia di sinistra rispetto al verso non è fissa ma cambia al cambiare del treno.

Ultima nota: nei sistemi a tre rotaie (tipo Marklin) ogni locomotiva ha il suo senso di marcia determinato da un relè interno e quindi si possono far marciare due treni in due direzioni opposte sullo stesso binario; nei sistemi a due rotaie (tipo Rivarossi ed è questo il caso) invece il verso è determinato dalla polarità alle rotaie.

Ciao! :wink:

Circuito 4.pdf (500 KB)

Ah, ecco, quindi non erano "solo" un paio di treni su un'anello, come sembrava dal primo post :D

Ora con le MCU si fa un sacco di roba, ma io ricordo ancora parte del lavoro che avevo fatto quasi una trentina di anni fa per aiutare nel restauro di un plastico ancora piu vecchio, di prima del 1980, grosso forse come quello, con 9 treni ed una dozzina di tracce ... l'originale era tutto azionato "a manina", usava solo interruttori e rele', ed il restauro consisteva nell'aggiungerci un po di elettronica ... quella che ormai definiremmo "vecchio stile", tutta porte logiche, un paio di schede doppio eurocard piene di integrati TTL per essere precisi ...

Bei tempi, quelli ... ancora mi ricordo l'incubo per aggiungere all'interno delle carrozze del "gambrinus" l'illuminazione a microlampade, pero' senza usare i kit della rivarossi ... :D :D :D

Circuito realizzato nell'ambiente di prova e funziona perfettamente. La prossima settimana lo installeremo sul plastico.

Molte grazie! :)

Brunello, ho collegato il CNY74-2 senza le resistenze optional che indichi nello schema e tutto funziona bene. Quando citi le resistenze interne sono quelle di pullup di Arduino? cioè definisco i pin come INPUT_PULLUP?

Ciao. Aldo

cioè definisco i pin come INPUT_PULLUP?

Esatto. Bravo

Rilevo un comportamento strano: leggendo ripetutamente i valori di polarità sulle rotaie ho delle fluttuazioni sul valore zero ogni qualche lettura.
Mi spiego meglio: la lettura del PIN quando è HIGH va sempre bene; la lettura del PIN quando è LOW di tanto in tanto mi segnala erroneamente lo stato come HIGH.
Ecco un esempio:

Il codice usato per testare il dispositivo è:

const int polarita1Pin = A2;  // Pin di rilevamento polarità iniziale
const int polarita2Pin = A3;  // Pin di rilevamento polarità iniziale
boolean polarita1PinValue = false;  // valore HIGH se polarità +, LOW se - o assente. Va collegato alla rotaia esterna e deve valere - per treno DSX (per senso antiorario rotaia DX)
boolean polarita2PinValue = false;  // valore HIGH se polarità +, LOW se - o assente. Va collegato alla rotaia interna e deve valere + per treno DSX (per senso antiorario rotaia SX)


void setup() {
  // put your setup code here, to run once:

  // inizializzazione dei pin di rilevamento polarità
  pinMode(polarita1Pin, INPUT_PULLUP);
  pinMode(polarita2Pin, INPUT_PULLUP);
  Serial.begin(115200);
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(500);
  if (digitalRead(polarita1Pin)) {
    polarita1PinValue = true;  // il + è sulla rotaia collegata al polarita1Pin
  }
  else {
    polarita1PinValue = false;
  }
  if (digitalRead(polarita2Pin)) {
    polarita2PinValue = true;  // il + è sulla rotaia collegata al polarita2Pin
  }
  else {
    polarita2PinValue = false;
  }
  Serial.print("polarita1PinValue = ");
  Serial.print(polarita1PinValue);
  Serial.print("; polarita2PinValue = ");
  Serial.println(polarita2PinValue);
}

Il fotoaccoppiatore usato è il CNY74-2 collegato come indicato da Brunello. (vedi questo thread sopra).

Il comportamento non cambia se definisco i PIN come INPUT semplice, e non cambia anche se faccio letture multiple del sensore a intervalli di qualche tempo, da alcuni millis a 5 secondi.

Secondo voi, come si spiega questo comportamento?

Nuova immagine (19).jpg

Potrebbe essere (tiro ad indovinare) che al di sotto di una certa tensione, fra le cadute dei diodi e la resistenza non ci sia abbastanza corrente per far illuminare correttamente il led interno dell'opto ...

Prova a fare una cosa del genere ... invece di mettere due resistenze e due diodi in ingresso dell'opto, collega semplicemente i due led interni in antiparallelo (catodo di uno con anodo dell'altro e viceversa), ed usa una sola resistenza da 820 ohm (o valore simile), senza i diodi ... va bene lo stesso perche' ogni volta che uno dei led conduce, limita la tensione ai suoi capi alla sua caduta, che e' di circa 1,5V, inferiore alla soglia inversa dell'altro che e' collegato alla rovescia ... e vedi se cosi il problema si risolve ...