FERMATA AUTOMATICA TRENINO ELETTRICO

Salve a tutti!
Prima di tutto mi presento in quanto sono un nuovo utente nel forum di arduino. Mi chiamo Alessandro e vorrei approfondire la conoscenza con il dispositivo Arduino, Ho buona dimestichezza con l'elettronica.

Vorrei realizzare un plastico ferroviario dinamico in scala. Il compito che vorrei attribuire ad arduino è quello di far fermare il treno in prossimità della stazione per 30 secondi e trascorsi i 30 secondi farlo ripartire. In pratica vorrei che questo comando si attivasse premendo un pulsante, si accendesse un led rosso che indica il segnale di stop del treno e non appena il treno raggiunge la stazione esso si ferma per 30 secondi. Trascorsi i 30 secondi il sistema dovrebbe far spegnere il led rosso, farne accendere uno verde, e far ripartire il treno. Fino a che io non premo di nuovo il pulsante il treno continua a girare. In pratica arduino dovrebbe togliere la corrente alla rotaia in prossimità della stazione in modo che il treno quando arriva su quella rotaia si fermi e dopo 30 secondi ripristini corrente. Come posso fare a impostare questo sistema a livello di programmazione e cllegamenti?

ringrazio anticipatamente tutti coloro che visualizzano questo post!
Attendo aiutini :slight_smile:

Grazie.
Almax.

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento se non lo hai già fatto: Regolamento
Qui una serie di link utili, non inerenti al tuo problema:

Per favore, nei forum scrivere in maiuscolo equivale ad URLARE. Non lo usare nei titoli.

Prima del programma bisogna capire come fare i collegamenti. Mi piacciono i trenini ma non ne possiedo. E non sò quanti nel forum ne hanno uno. Perciò... come funziona ? Ha una centralina ? A quanti volt ?

Ciao nid69, ti ringrazio per la risposta e per i link. Provvedo alla presentazione. Riguardo al maiuscolo sapevo che significava urlare ma non credevo che questo valesse anche per i totli.
Grazie dei consigli. a presto.

Scusa non avevo visto la parte finale del tuo messaggio.

Allora, il trenino elettrico LIMA funziona elettricamente nel senso che la locomotiva riceve una tensione di 12V diretamente dalle rotaie, esse alimentano un motorino all'interno della locomotiva.
L'alimentazione viene fornita da un alimentatore variabile con potenziometro, da 0 a 12 volt (valori positivi) per la velocità regolabile del treno, e da 0 a -12V per l'inversione di marcia.
Io ho vuluto rendere la cosa più dinamica e divertente impostando una fermata automatica. Lo scorso anno avevo già fatto una cosa simile impostato una fermata manuale, nel senso che
io premevo un pulsante e il treno si fermava in stazione ma ripartiva quando io ripremevo il pulsante. con arduino vorrei che la partenza fosse automatica dopo 30 sec circa.
per farlo fermare è semplice; immagina le rotaie del treno come un circuito chiuso. Il treno riceve corrente dalle rotaie che sono collegate insieme a pezzi. se tu isoli una rotaia, con degli isolanti specifici in plastica,
il treno appena giunge su quella rotaia si ferma perchè non riceve più tensione. Io poi ho collegato un interruttore tra alimentatore treno e rotaia isolata in modo da togliere e ridare tensione in modo tale che il treno si fermi e riparta quando voglio io.
Stavolta vorrei fare una cosa simile ma con la partenza automatica dopo 30 secondi. per questo che ho pensato ad arduino.
Appena ho un po di tempo leggo i tuoi link e vedo un attimo

Grazie.
Almax

Lo puoi fare con un relè (ed annessi resistori, transistor ecc.) e due LED (con i relativi resistori).
Ti serve anche un alimentatore, visto che quello variabile è - appunto - variabile e lo regoli in base alle esigenze del treno. Uno fisso da 12 volt ed 1 - 2 ampere andrà benissimo, ovviamente usando un relè a 12 V.
Poi ovviamente ti serve anche il pulsante o se vuoi un interruttore per commutare il semaforo.
Rimane da stabilire un dettaglio: come fare per capire quando il treno giunge alla stazione.
Ci sarebbero varie soluzioni, le più semplici sono: sensore di prossimità IR oppure fotocellule oppure sensore di distanza ad ultrasuoni.

Ciao,

paulus ti ha indicato la parte hardware, per quanto riguarda l'aspetto software ti consiglierei di utilizzare quello che in programmazione si chiama un "automa a stati finiti". Sembra una cattiva parola ma è qualcosa di molto semplice.

Suddividi il tuo problema in n stati, in pratica il tuo programma in ogni istante si trova in uno stato specifico che svolge una particolare funzione. Per sapere in che stato ti trovi puoi utilizzare una variabile numerica che assume n valori ciascuno dei quali indica un particolare stato. Per passare da uno stato all'altro devi solo cambiare il valore della variabile.

Nel tuo caso gli stati potrebbero essere i seguenti:

0 - fornisci tensione alle rotaie; accendi il led verde; passi nello stato 1

1 - il programma controlla il pulsante per vedere se lo premi. Se premi il pulsante il programma passa nello stato 2 altrimenti rimane indefinitamente in questo stato

2 - accendi il led rosso e passi nello stato 3

3 - controlli l'arrivo del treno in stazione (usando una delle soluzioni hardware proposte da paulus alle quali io aggiungerei un semplice microswitch da fissare sotto la rotaia in modo che venga premuto dal treno). Quando arriva il treno passi nello stato 4

4 - togli tensione alle rotaie e passi nello stato 5

5 - conti 30 secondi. Al termine spegni il led rosso e torni nello stato 0.

Nota bene. Nello stato 5 non hai bisogno di accendere il led verde né di ridare tensione alle rotaie perché lo farà lo stato 0 dove abbiamo già implementato queste funzionalità.

Per l'implementazione il modo migliore è uno statement switch sul valore della variabile di stato.

Inizia a ragionarci su e se hai bisogno chiedi ancora.

ciao

vittorio68:
per quanto riguarda l'aspetto software ti consiglierei di utilizzare quello che in programmazione si chiama un "automa a stati finiti". Sembra una cattiva parola ma è qualcosa di molto semplice.
...

Qui un tutorial: www.lucadentella.it/2013/04/30/macchina-a-stati-finiti-e-arduino/

Bene, vi ringrazio davvero molto per gli aiuti preziosi! :wink:
Sono molto a digiuno per quanto riguarda la programmazione quindi dovrò mettermi sotto a vedere qualche tutorial e cose del genere.. Il procedimento consigliato da Vittorio68 è chiaro anche se mi sfugge una cosa; qual è l'azione che mi fa passare dallo stato 0 a 1? se lo stato 0 permette di alimentare rotaie e accendere il led verde..
Volendo potrei abbandonare l'alimentatore del treno manuale e usare direttamente quello da 12 V con relè consigliato da paulus? magari collegando qualcosa tipo motorshield che si occupa di regolare la tensione al motore?
Anche se a questo punto mi sfugge l'utilità dell'alimentatore.. arduino non fornisce una tensione da solo?
scusate le troppe domande ma ho scoperto arduino da qualche giorno su consiglio di un amico e non ne conosco bene le caratteristiche.
grazie ancora!

almax.

qual è l'azione che mi fa passare dallo stato 0 a 1?

nessuna azione, semplicemente fornisci tensione, accendi il led e poi cambi il valore della variabile di stato da 0 a 1. Nel mio esempio, lo stato 0 serve solo per non ripetere l'attivazione della tensione alle rotaie e l'accensione del led ad ogni ciclo del loop che controlla lo stato del pulsante (stato 1).

Un alimentatore esterno serve assolutamente perché arduino non sarebbe in grado di fornire la corrente necessaria al funzionamento del trenino.

Magari non adesso, ma in futuro, considera anche la possibilità di modulare in PWM la tensione fornita alle rotaie per regolare la velocità del treno. In questo modo potresti simulare una partenza ed una frenata lenta.

ciao

Ok grazie mille!
Probabilmente dovrei cercare uno schema di collegamento per capire come gestire Arduino, alimentatore, relè ecc.. Probabilmente avrei bisogno anche di una breadboard. Intanto vedo se trovo uno schema..
Grazie mille
Ciao.

Scusate ma come faccio a far controllare ad arduino un sistema che ha bisogno di più tensione? L'alimentatore aggiuntivo, che serve ad alimentare in questo il treno, come può interagire con arduino ed essere controllato da esso togliendo e fornendo tensione?

Grazie di nuovo

Arduino deve avere la sua alimentazione su jack nero tra 16-7,5 volt (meglio 12V o anche meno) oppure tramite usb (5V). Il treno deve avere il suo (mi pare hai detto a 12V).
Se devi solo accendere/spegnere alimentatore del treno basta un rele. Meglio un modulo già fatto pilotabile dai 5V di Arduino, semplicemente da un pin digitale esempio il 7. digitalWrite(7,HIGH); attiva 5V sul pin digitalWrite(7,LOW); spegne il pin
Il modulo rele da una parte accetta GND e il pin (es.7) di Arduino e dall'altra deve interrompere uno dei due fili (il positivo) che vanno dall'alimentatore 12V ai binari. Sul COM (comune) il positivo che esce dall'alimentatore e su NO (normalmente aperto) il filo positivo che va al binario (naturalmente il filo positivo LO DEVI tagliare in due tronconi !!)

Se però devi regolare quei 12V allora serve un modulo/circuito di regolazione che usa un transistor. Ma qui è meglio che ti diano consigli di uno schema gli elettronici.

Ok tutto chiaro, quindi scheda relè lavora a 5V o a 12?

La scheda "lavora" a 5V vuol dire che viene pilotata da un dispositivo (Arduino) che lavora a 5V.

Poi la scheda DEVE poter staccare/attaccare (gestire) almeno 12V.
Esempio:

Nella sigla quel 05V indica che è pilotabile dai 5V che escono dai pin di Arduino (con adeguato circuito che sul modulino pare esserci, ovvero transistor+diodo+resistenze).
Sopra la sigla indicano quello che può gestire, e questo andrebbe bene per il treno a 12V.

Perfetto! Grazie, gentilissimo

Salve, torno a stressarvi con le mie solite domande..:slight_smile:
Ho trovato uno switch a leva, secondo voi potrebbe essermi utile per interrompere la tensione alle rotaie e far fermare il treno?

devo trovare una maniera efficace per appliccarlo sotto la rotaia interessata in modo che il peso del treno lo faccia azionare.

Ne approfitto per chiedere un consiglio sulla programmazione; non riesco a far gestire ad arduino più di un pulsante, perchè il primo pulsante mi serve per accendere il led rosso, spegnere il verde e far partire tutto. Io ho provato a inserire un secondo pulsante per simulare il passaggio del treno ma non riesco a programmarlo

#define LED 4 rosso
#define LED 3 verde // LED collegato al pin digitale 3
#define BUTTON 2 // pin di input dove è collegato il pulsante
int val = 0; // si userà val per conservare lo stato del pin di input

void setup() {
pinMode(4, OUTPUT); // imposta il pin digitale come output
pinMode(3, OUTPUT);
pinMode(2, INPUT); // imposta il pin digitale come input
}

void loop() {

val = digitalRead(2); // legge il valore dell'input e lo conserva
digitalWrite(3, HIGH);
// controlla che l'input sia HIGH (pulsante premuto)
if (val == HIGH) {
digitalWrite(4, HIGH); //accende il led
digitalWrite(3, LOW);

così facendo se io premo il pulsante accende il rosso, il verde in realtà non fa in tempo a spegnersi perchè riparte il loop ovviamente. Io a questo punto dovrei impostare lo switch a leva premuto poi dal treno e togliere corrente, ma come imposto lo switch al sistema? con un secondo input non mi funziona..

Grazie mille

Io più che uno switc avrei usato un magnete, che puoi nascondere nel plastico e sotto il treno, in più puoi usarlo in entrambe le direzioni, quello che hai in una direzione scivola, nell'altra inchioda il treno.
Se hai un plastico complesso togliere tensione ai binari interrompendo l'alimentazione ferma tutto anche gli altri treni se ne hai più di uno

il modo più elementare

void setup() { 
  pinMode(4, OUTPUT);       // led verde
  pinMode(3, OUTPUT);      // led rosso + relè che toglie alimentazione 
  pinMode(2, INPUT);     //  microswitch
 //-------------stato iniziale--------------------
  digitalWrite(3, 0);  //spegne il led rosso e da tensione
  digitalWrite(4, 1);  //accende il led verde
} 
 
void loop() {
  if (digitalRead(2)) { //se micro == 1 [high]
    digitalWrite(3, 1);  //accende il led rosso e aziona un relè che toglie tensione
    digitalWrite(4, 0);  //spegne il led verde
    delay(30000); // aspetta 30 secondi
    digitalWrite(3, 0);  //spegne il led rosso e il relè cade ridando tensione
    digitalWrite(4, 1);  //accende il led verde
    delay(2000); // se il treno tiene premuto il micro durante l'arresto non riparte più, riconta 30 sec all'infinito, con 2000 diciamo al programma di ignorare per 2 secondi gli input
  }
}

se poi arduino dovraà fare altre cose quel delay dovrai sostituirlo con un millis e cambiare qualcosa

ps: togliere tensione ai binari con l'attivazione di un relè invece che l'incontrario, ti permette di avere la funzionalità del plastico anche con arduino staccato

lo sketch di prima rende tutto automatico, il treno si ferma ad ogni giro, se invece vuoi decidere tu quando fermarloi, prenoti l'arresto con un pulsante

byte val = 0;  // flag di selezione (al prossimo giro fermati) 

void setup() { 
  pinMode(4, OUTPUT);       // led verde
  pinMode(3, OUTPUT);      // led rosso 
  pinMode(6, OUTPUT);     //  relè che toglie alimentazione 
  pinMode(2, INPUT);     //  microswitch
  pinMode(5, INPUT);     //  pulsante (fermata prenotata)

 //-------------stato iniziale--------------------
  digitalWrite(3, 0);  //spegne il led rosso 
  digitalWrite(4, 1);  //accende il led verde
  digitalWrite(6, 0); // relè riposo e tensione ai binari
} 
 
void loop() {
  if(digitalRead(5)) val =1;  // legge il valore dell'input e lo conserva
  
   digitalWrite(3, val);  //accende/spegne il led rosso
   digitalWrite(4, ~val);  //accende/spegne il led verde

  if (digitalRead(2) && val) { //se micro == 1 [high] e anche val == 1
    digitalWrite(6, 1);  //aziona il relè che toglie tensione
    digitalWrite(4, 0);  //spegne il led verde
    delay(30000); // aspetta 30 secondi
    digitalWrite(3, 0);  //spegne il led rosso 
    digitalWrite(6, 0);  //relè cade ridando tensione
    val = 0;
  }
}

Ciao,

scusatemi ma non condivido l'uso di delay così lunghi (30 sec.) in uno sketch. In pratica arduino è bloccato in quel periodo. Se in futuro si volessero aggiungere nuove funzionalità grazie anche al fatto di disporre di altri piedini di I/O inutilizzati, come faremmo?

All'inizio del thread si era parlato di automi a stati finiti... che fine hanno fatto?

Se qualcosa ancora non è chiaro negli automi, chiedi pure.

Se in futuro si volessero aggiungere nuove funzionalità grazie anche al fatto di disporre di altri piedini di I/O inutilizzati, come faremmo?

Infatti l'ho scritto nel post, che è un modo semplice e va ottimizzato se arduino fa dell'altro.
E' un principiante, intanto incomincia con questo, ma potresti aggiungerci tu un millis() visto che non sei d'accordo :slight_smile: .
Stati finiti per accendere un led e un relè ................. mha! :o