FERMATA AUTOMATICA TRENINO ELETTRICO

Hai ragione, scusami, mi era sfuggita la tua successiva spiegazione.

Per quanto riguarda gli automi, mi rendo conto che il nome è altisonante e sembra di voler sparare alle mosche con il cannone, ma in fondo si tratta di un semplice switch...

A beneficio di almax85 provo a tradurre in codice quello che avevo descritto a parole nel post precedente:

byte stato;  // variabile che memorizza lo stato del sistema 
unsigned long startWait;

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 = 0;
} 
 
void loop() 
{
   switch (stato)
   {
      case 0:
         //-------------stato iniziale--------------------

         digitalWrite(3, 0);  //spegne il led rosso 
         digitalWrite(4, 1);  //accende il led verde
         digitalWrite(6, 1); // attiva il relè e fornisce tensione ai binari

         stato = 1;            // passa nello stato 1
         break;

      case 1:
         // controlla la pressione del pulsante di prenotazione fermata
         // non serve debounce perché al primo ciclo cambia stato
         // e non entrerà più in questo case

         if (digitalRead(5) == LOW)
         {
            digitalWrite(3, 1);  //accende il led rosso 
            digitalWrite(4, 0);  //spegne il led verde
            
            stato = 2;             // passa nello stato 2
         }

         break;

      case 2:
         // controlla la pressione del microswitch (arrivo in stazione)

         if (digitalRead(2) == LOW) 
         {
            digitalWrite(6, 0);       // disattiva il relè e toglie tensione ai binari

            startWait = millis();    // memorizza l'istante iniziale

            stato = 3;                  // passa nello stato 3
         }

         break;

      case 3:
         
         if (millis() - startWait > 30000) stato = 0;

         break;
   }
}

Descrivo il funzionamento ricordandoti che ad ogni ciclo del loop viene eseguito soltanto il codice che si trova nel case corrispondente al valore della variabile stato.

  • all'inizio stato = 0 e viene eseguito il primo case. Io preferisco che il relè attivo fornisca tensione, mi pare più coerente... se preferisci diversamente basta invertire la digitalWrite.

  • dal secondo ciclo in poi viene eseguito il case 1. Si controlla lo stato del pulsante. Appena questo è premuto (LOW) si inverte lo stato dei led e si passa nello stato 2 a controllare l'arrivo del treno in stazione. Di solito si preferisce usare lo stato LOW per controllare la pressione di un pulsante perché per fare ciò basta attivare la resistenza di pullup interna del MCU. Se hai bisogno di chiarimenti su questo chiedi pure.

  • nello stato 2 si attende la pressione del microswitch. Appena questo avviene si memorizza l'istante e si passa nello stato 3. Ti ricordo che la millis ritorna sempre il numero di millisecondi trascorsi dall'accensione di arduino.

  • nello stato 3 si controlla quanti millisecondi sono passati dall'attivazione dello stato 3. Facciamo un esempio: se il microswitch è stato premuto quando arduino era stato acceso da 152000 ms in startWait avremo memorizzato appunto 152000. Ad ogni ciclo il numero di ms dall'accensione (millis) aumenterà... quando arriverà a 182001 allora millis() - startWait = 30001 e la condizione dell'if diventerà vera. Allora impostiamo lo stato a 0.

Al prossimo loop eseguiremo nuovamente lo stato 0 spegnendo il led rosso, accendendo il verde e fornendo nuovamente tensione ai binari.

Se sono stato poco chiaro fai chiedi pure i chiarimenti che desideri.

Salve gente, scusate il ritardo.. Vi ringrazio molto della vostra considerazione!:slight_smile:

Il plastico non prevede più treni quindi togliere tensione alla rotaia va bene, sul fatto dello switch in effetti ho un po' di perplessità su come posizionarlo, pensavo sotto sfruttando il peso cosi quando il treno inverte il senso di marcia non viene intralciato. Posso anche considerare il sensore magnetico ma avete un tipo da suggerirmi? nell'altra pagina paulus mi ha consigliato un sensore IR ma mi pare un po complesso come funzionamento.
Vi ringrazio molto per i consigli sul codice; il secondo di pablos potrebbe fare a caso mio, anche gli stati finiti di vittorio mi interssa solo che non ho chiaro il discorso sulla resistenza del MCU, io avrei messo i digitalRead del pulsante e swith HIGH anziché LOW..

Comunque siete veramente esaustivi nelle vostre risposte.

grazie infinite

Ciao

quando colleghi un pulsante ad un ingresso digitale del MCU devi sempre inserire una resistenza che a pulsante aperto tenga l'ingresso in uno stato ben definito. In caso contrario l'ingresso capta disturbi e diventa flottante, ossia cambia stato anche senza che tu prema il pulsante.

Normalmente quindi lo schema corretto è quello di inserire una resistenza tra il positivo di alimentazione ed il piedino di ingresso ed il pulsante tra il piedino di ingresso e la massa. In questo modo a pulsante aperto (non premuto), la resistenza tiene l'ingresso HIGH. Quando premi il pulsante collegando l'ingresso a massa questo diventa LOW.

La configurazione è così "standard" che è prevista direttamente all'interno del MCU: in pratica la resistenza (che, dimenticavo, si chiama di PULLUP) verso il positivo è presente già all'interno del microcontrollore e la devi solo attivare. Colleghi quindi soltanto un pulsante tra il piedino e la massa.

Per attivare la resistenza devi soltanto scrivere pinMode(5, INPUT_PULLUP); invece di pinMode(5, INPUT);

Tutto ciò comporta soltanto che quando il pulsante è aperto la digitalRead ti restituirà HIGH e quando è premuto ti restituirà LOW.

Ok tutto chiaro! Stessa cosa quindi anche allo switch per pilotare il relè? Resistenza che valore deve avere?

grazie

Puoi usare dei reed tipo ad esempio questi per gli ingressi, ed un magnetino sulla locomotiva ... sono equivalenti a dei pulsanti, solo che si chiudono avvicinando un magnete ...

Per il relè non ti serve una resistenza di pullup perché quella serve per mantenere in uno stato preciso un ingresso non un'uscita. Il valore di una resistenza di pullup può essere di 10k ma come ti dicevo non ti serve metterla esternamente perché ti basta attivare quella interna.

Per pilotare il relè hai invece bisogno di un transistor. QUI trovi un esempio tipico: Connect a relay.

Bene, Etemenanki la tua proposta sui reed magnetici è molto interessante! in pratica uno di quelli si comporta esattamente come uno switch solo che viene attivato con il passaggio di un magnete per cui il codice di arduino può non variare? Basterà applicare una calamita alla motrice, ottima soluzione!

Grazie vittorio per la delucidazione sul pullup penso che mi convenga attivarla dal codice senza metterela fisicamente al circuito. Il transistor è necessario? pensavo che fosse sufficiente il pin della scheda per farlo scattare..

grazie de nuevo :wink:

Si, purtroppo il transistor è necessario perché un relè assorbe più corrente di quella che un pin di arduino può fornire

Anche se uso la schedina modulo relè? il modulo relè non presenta il circuito con transistor, resistenza già al suo interno?

Se usi la schedina relè che ti ha mostrato nid69ita in un post precedente allora va bene. Su quella schedina il transistor c'è (è quel coso nero in basso con il corpo a mezzaluna...).

Se non hai ancora la scheda, prima di comprarla posta un link e verifichiamo insieme.

Una cosa del genere?

Le uscite sono tutte superiori a 12 v ma tanto quello è un limite massimo quindi posso collegarci all'uscita un carico di 12v giusto?

Si, direi che questa va bene.

Fai attenzione al fatto che, come indicato sulla pagina ebay che hai linkato, il relè si eccita ponendo l'ingresso IN1 della scheda a LOW ed è diseccitato con l'ingresso a HIGH. Nessun problema, devi solo ricordartelo quando scrivi lo sketch facendo le giuste digitalWrite.

Ok quindi all'inzio dello sketch avrò

digitalWrite(6, 0); // attiva il relè e fornisce tensione ai binari

e al passaggio del treno

digitalWrite(6, 1); // disattiva il relè e toglie tensione ai binari

ho invertito i valori..

perfetto

Le uscite del relè sono commutabli? nel senso che devo settare io quale uscita mi interessa oppure sono disponibili tutte e si adatta automaticamente al carico che devo alimentare?

Grazias

Non sono sicuro di aver capito bene la domanda.

Dalla foto che ho visto nel link che hai postato mi pare che la scheda utilizzi un relè con contatto normalmente aperto, contatto normalmente chiuso e contatto comune.

A relè diseccitato il contatto comune è collegato al contatto normalmente chiuso. Quando il relè si eccita, il contatto comune viene scollegato dal contatto normalmente chiuso e collegato al contatto normalmente aperto.

Nel tuo caso quindi devi collegare il polo di alimentazione negativo direttamente ai binari; il polo di alimentazione positivo al contatto comune del relè; il contatto normalmente aperto del relè all'altro polo dei binari.

In questo modo se il relè è diseccitato si comporta come un interruttore aperto (ci siamo collegati infatti al contatto normalmente aperto). Quando arduino eccita il relè il contatto comune viene collegato al contatto normalmente aperto chiudendo il circuito e facendo arrivare corrente ai binari.

I tre contatti del relè sono quel connettore a vite blu che vedi a destra della foto. Si vede che sullo stampato è presente una icona che ti dice qual è il contatto comune, quello NA e quello NC.

in pratica.... cosi'

digitalWrite(6, 0); // attiva il relè e fornisce tensione ai binari
e al passaggio del treno
digitalWrite(6, 1); // disattiva il relè e toglie tensione ai binari

No, lo scopo dello sketch non era questo, l'alimentazione deve passare attraverso il contatto NC normalmente chiuso (con relè a riposo)

Si si il collegamento è chiaro, mi riferivo al valore delle uscite; 125Vca - 28Vcd 250Vca - 30Vcd. c'è un modo per selezionarne una determinata ad esempio commutando con ponticelli o cose del genere oppure basta attaccare il carico e fa da se?
quindi da 0 a 30v in dc e da 0 a 250 v in ac

grazie e scusate ancora..

No, il collegamento è sempre lo stesso. Quelli che vedi sono i valori massimi che devi rispettare, finchè rimani al di sotto il componente regge, se li superi ne rischi la rottura.