Passaggio a livello per plastici con Arduino

Il passaggio a livello per plastici è un’esigenza che come modellista ferroviario, e non solo, ti sarai trovato ad affrontare.

Passaggio a livello per plastici

L’esigenza è solitamente legata all’automazione del passaggio a livello per plastici di tipo dinamico ossia quelli in cui il treno è in movimento sulle rotaie ed automatizzarlo rende tutto il plastico più realistico.

Con arduino e pochi altri componenti puoi realizzare l’automazione che più ti soddisfa ed aggiungere oltre alla sbarra del passaggio a livello anche controlli sul treno e luci di avvertimento.

Se hai seguito i miei articoli sai che ai plastici ferroviari ho dedicato già l’articolo: Il plastico di Davide e Luca e successivamente un articolo dal titolo: Un semaforo con Arduino e i led.

Il progetto che ti presento oggi mette in relazione alcuni componenti per consentirti di realizzare il tuo passaggio a livello per plastici.

Materiale per realizzare il passaggio a livello per plastici

La lista dei componenti puoi variarla come ti piace se hai bisogno di gestire più sbarre o più semafori ecc…

Io ho reaizato questa prima versione del progetto pensando ad un passaggio a livello per plastici in cui passa un solo treno alla volta e in cui è presente un singolo servomotore collegato ad entrambe le sbarre meccanicamente in modo che si sollevino insieme.

Lista della spesa:

  • n.1 Arduino Uno, Leonardo, Mini, …
  • n. 2 led rossi (uno per lato)
  • n. 1 servomotore collegato a entrambe le sbarre
  • n. 2 pulsanti o microswitch a leva
  • n. 2 resistenze di pull-down da 330Ω
  • n.1 resistenza da 470Ω

Con questi componenti la realizzazione è davvero semplice.

Realizzazione del passaggio a livello per plastici

Ecco un esempio di massima del passaggio a livello per plastici che ho immagginato e sulla base del quale ho realizzato lo sketch per arduino, puoi realizzare il passaggio a livello con il metodo che più preferisci e nella forma che ritieni più opportuna.

disegno del passaggio a livello per plastici

la particolarità di quello illustrato risiede nella presenza di un unico servo per entrambe le sbarre e nella presenza di una sola sbarra per ogni lato del binario.

Schema elettrico del passaggio a livello

I collegamenti sono molto semplici in quanto in questa prima versione il numero di componenti è limitato:

schema passaggio a livello per plastici

I led possono essere alimentati attraverso un unico pin di arduino e questo riduce anche il numero di resistenze che devi inserire nel circuito.

Il servo puoi alimentarlo attraverso i +5v di Arduino che a sua volta prende alimentazione dai 12v del plastico, ricorda che le uscite Arduino erogano al massimo 40/50mAh per cui se il servo che utilizzi assorbe correnti maggiori devi provvedere ad alimentarlo con un circuito esterno.

Un’altra particolarità di alcuni servo è data dalla diversa velocità di rotazione se operano a 4,8/5v o se operano a 6v, valuta se la velocità di rotazione del servo a 5v è sufficiente al tuo scopo.

Osserva bene i collegamenti che hai realizzato, in particolare quelli diretti ai pin 2 e 3 di arduino, sono pulsanti o microswitch a leva:

microswitch a leva

Il loro funzionamento elettrico è semplice, normalmente tra il pin centrale ed uno di quelli esterni c’è continuità, si dice che è NC ( normalmente chiuso ) mentre tra gli altri due non c’è continuità ( NA = normalmente aperto ) alla pressione della leva il contatto si inverte portando il NC a NA e viceversa.

Nella connessione ad arduino dovrai collegare un pin del contatto NA ad arduino e l’altro al polo positivo ( +5v ) del circuito.

I due microswitch o pulsanti a leva serviranno a indicare che il treno è in arrivo e che il treno è passato oltre, dovrai pertanto posizionarli al centro dei binari in modo che il treno passando possa premerli prima uno e poi il secondo.

Lo sketch

/**
 * Passaggio a livello per pastici con Arduino
 *
 * Autore: Mauro Alfieri
 * Web:    www.mauroalfieri.it
 * Tw:     @mauroalfieri
 */

#include <Servo.h> 

#define servoPin 5
#define swClose  2
#define swOpen   3
#define ledSemaf 4

#define posMin 0
#define posMax 90
#define timePL 10

boolean statoPL=false;
int currentGrad=posMax;

Servo myservo;

void setup()
{
  pinMode( swClose,INPUT );
  pinMode( swOpen,INPUT );
  pinMode( ledSemaf,OUTPUT );

  myservo.attach(servoPin);
  myservo.write(currentGrad);
  digitalWrite( ledSemaf,LOW );
} 

void loop()
{
  if ( digitalRead(swClose) == HIGH ) { statoPL = true;  }
  if ( digitalRead(swOpen) == HIGH )  { statoPL = false; }

  if ( statoPL == true && currentGrad > posMin) {
     digitalWrite( ledSemaf,HIGH );
     while (currentGrad > posMin) {
        currentGrad--;
        myservo.write(currentGrad);
        delay(timePL);
     }
  }

  if ( statoPL == false  && currentGrad < posMax) {
     while (currentGrad < posMax) {
        currentGrad++;
        myservo.write(currentGrad);
        delay(timePL);
     }
     digitalWrite( ledSemaf,LOW );
  }

}

Il funzionamento dello sketch prevede che al passaggio del treno sullo switch connesso al pin 2 il servo verifichi la posizione della sbarra e la abbassi progressivamente fino alla posizione 0° = sbarra chiusa accendendo i led rossi collegati al pin 4 di arduino. Al passaggio del treno sul secondo switch, quello connesso al pin 3, il servo ritorna in posizione 90°, ossia apre le sbarre dl passaggio a livello per plastici e spegne i led rossi.

Perché funzioni al primo colpo è necessario rispettare i seguenti accorgimenti:

  1. il microswitch swClose deve essere posizionato ad una distanza dal passaggio a livello sufficiente a consentire la corretta chiusura della sbarra prima che il treno giunga al passaggio a livello per plastici;
  2. il microswitch swOpen deve essere posizionato ad una distanza dal passaggio a livello sufficiente a consentire il passaggio dell’intero treno prima di aprire il passaggio a livello;
  3. le sbarre devono essere in posizione aperte quando il servo è a 90° in posizione chiuse quando il servo è a 0°

Puoi variare il tempo in cui il passaggio a livello si apre o si chiude cambiando il valore di timePL calcolandolo in questo modo: gradi/tempo ( 90° / 9sec. = 10 ) se vuoi che il passaggio a livello si apra in 5 secondi devi cacolare: 90°/5 = 18;

Un passaggio importante è costituito dalle linee 32-33: in cui posizioni il servo a 90° e spegni il led ad ogni avvio del programma, ossia quando alimenti arduino per la prima volta o quando esegui un reset;

linee 38-39: definisci lo stato in cui il sistema opera, alla pressione del microswitch swClose lo stato passa da false a true che comporta la chiusura del passaggio a livello, la pressione del microswitch swOpen comporta il passaggio della variabile statoPL da true a false che determina la chiusura del passaggio a livello per plastici.

Puoi evitare l’uso degli stati in questo tipo di sketch spostando la condizione digitalRead( swClose ) == HIGH al posto  della condizione statoPL == true alla riga 41 e allo stesso modo spostando digitalRead( swOpen ) == HIGH al posto di statoPL == false alla linea 50 tuttavia l’utilizzo di un sistema a STATI è più comodo se vuoi realizzare interazioni più complesse come ad esempio verificare che il passaggio a livello per plastici sia in apertura o chiusura anche se lo switch non è più premuto perché il treno è passato.

In particolare è utile questo tipo di programmazione nei casi in cui hai un segnale per un breve periodo di tempo ( pressione del microswitch ) che può essere utile valutare più volte nello sketch.

Il video del passaggio a livello

un appassionato di plastici ferroviari: Gianfranco, ha realizzato un video per mostrarti come funziona il suo passaggio a livello:

Oggi 03 dicembre 2012, Gianfranco mi ha inviato il video del suo passaggio a livello collegato al servo ed arduino, non ho resistito alla tentazione di pubblicarlo subito:

Buon divertimento !!!

  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

Permalink link a questo articolo: https://www.mauroalfieri.it/elettronica/passaggio-a-livello-per-plastici.html

86 commenti

Vai al modulo dei commenti

    • Gianfranco il 21 Novembre 2012 alle 23:35
    • Rispondi

    Grande Mauro!!!

    Addirittura hai pensato a come far muovere tutto con un solo servo!
    Non vedo l’ora di iniziare a fare le prove!!!!!

    Ti tengo aggiornato e grazie!
    Gianfranco

    1. Grazie a te Gianfranco per l’ispirazione.

      Mauro

    • Gianfranco il 21 Novembre 2012 alle 23:37
    • Rispondi

    Ciao Mauro,
    finalmente sembra che ho messo a posto l’ATX per alimentare servo ed arduino.

    Prima di iniziare pero ti volevo chiedere se secondo te è possibile gestire il movimento della sbarra con un solo pulsante. Nel tuo tutorial ne usi 2, ma se ne potrebbe usare anche solo 1, per maggior semplicità?

    Nel frattempo mi procuro pulsanti e resistenze….

    Grazie!!! Non vedo l’ora di azionarlo 🙂
    Gianfranco

    1. Ciao Gianfranco,
      sono contento per l’alimentatore.
      Io ho immaginato una situazione tipo in cui voglio essere sicuro che il treno sia passato prima che il passaggio a livello alzi la sbarra.
      Ho una predilezione per la sicurezza 🙂 anche se si tratta di un plastico.

      Quale interruttore toglieresti?
      E come gestiresti la chiusura o l’apertura del passaggio a livello con un solo interruttore?

      Mauro

    • Gianfranco il 22 Novembre 2012 alle 09:42
    • Rispondi

    Ciao Mauro e grazie di tutto. Devo fare una piccola premessa. Il motivo per cui da fermodellista ho scelto di provare Arduino è non solo per gestire un passaggio a livello (PL), ma per la gestione eventualmente di tutti gli oggetti che compongono unplastico: scambi, segnali, lampioni di stazione, etc…gia nel nostro ambito esistono decoder digitali che permettono di soddisfare ciò (e che sono pilotati dalla stessa centrale usata per pilotare i trenini) con la sola differenza che puoi gestire al massimo 4/8 oggeti alla volta e che ogni decoder costa almeno 25€. Arduino mega (correggimi se sbaglio) ha 54 uscite di cui 14 pwm…il costo è 40€. Credo di aver detto tutto. 🙂

    Innanzitutto consiglierei di alimentare a parte tutto ciò che non riguarda Arduino per non avere brutte sorprese e per non avere limiti sulla corrente che assorbono tali utilizzatori (considerando che solo un servo assorbe circa 500mA con picchi di 1A e Arduino se non erro riesce a gestirne uno solo). A tal scopo mi sono procurato un ATX per PC dove utilizzo la 12V/8A per Arduino e la 5V/16A per tutto il resto (in realtà la 12V l’ho abbassata a 10V mettendo 4 diodi 1N4007 in serie).

    Tornando al PL, proprio per la moltitudine di azionamenti che si controllano in un plastico, io pensavo di mettere un solo pulsante: premi e il PL si apre; ripremi e il PL si chiude. Al momento sto tralasciando la funzionalità che il PL si apre e chiude automaticamente al passaggio di un treno in quanto un PL vero si abbassa almeno 3/5 minuti prima di un passaggio del treno, per cui riportato in scala occorrerebbe un plastico lunghissimo per riprodurre la cosa fedelmente…per cui al momento pensavo a una gestione completamente manuale.

    Che ne pensi? Si può fare?

    1. Ciao Gianfranco,
      grazie per la precisazione sul progetto e per le indicazioni sull’alimentazione che hai voluto condividere con gli appassionati.
      Sul costo di un Arduino Mega mi sembra di averla pagata qualcosa in più ma magari si trova al prezzo che dici, il vantaggio di utilizzare Arduino, a mio avviso, è:
      1 – puoi disporre di molti più ingressi/uscite ( come dici )
      2 – puoi decidere cosa far fare alle uscite, e non avere ingressi/uscite predefiniti

      Pr il tuo quesito la risposta è si, si può fare devi pensare ad un sistema a stati in cui la pressione del pulsante una volta chiuda il pasaggio e la successiva pressione apra.
      Ci sono molti modi di farlo io ti consiglio di guardare i miei tutorial, e non solo, sull’accensione dei led con un unico pulsnate, ne trovi molti nel web.

      Mauro

    • Gianfranco il 25 Novembre 2012 alle 13:19
    • Rispondi

    Ok Mauro, per il fatto di un solo pulsante ci penserò poi.

    Intanto, ti volevo dire che l’escursione che deve fare il servo non è di 90° (e nemmeno di 85° come inzialmente ipotizzato), ma molto di molto di meno. Forse solo tra 8 e 10°!!!…..

    Pensi che Arduino riesca a gestire un movimento di 1° del servo al secondo?

    Appena posso ti metto una foto piu chiarificatrice del perche l’escursione è solo di 8-10°….

    Grazie mille
    Gianfranco

    1. Ciao Gianfranco,
      nessun problema, modifica il codice in modo che i gradi diminuiscano e il tempo tra un grado ed il successivo sia di 1000 millisecondi = 1 secondo.
      Arduino Uno lavora a 16Mhz circa 16000hz ossia 16000 cicli al secondo, sono dati approssimati perchè dipende molto anche dallo sketch che realizzi e dai componenti utilizzati, in ogni caso sono molti più cicli di quanti te ne occorrono per il tuo progetto.

      Mauro

    • gianfranco il 25 Novembre 2012 alle 19:23
    • Rispondi

    Ok perfetto, da domani inizio a mettere tutto in moto, sperando prima di tutto che i circuiti sono tutti ok!!
    😉

    Ti aggiorno e grazie!
    Gianfranco

    • Gianfranco il 26 Novembre 2012 alle 19:52
    • Rispondi

    ciao Mauro….dunque….con tuo sketch il servo si muove, quindi funziona, grazie mille!!!
    :)))))))))))))))

    Ora stavo modificando il codice per il mio scopo, cioè fargli fare il movimento di 8° in 8 secondi. Seguendo la tua “teoria”, ho messo il timePL = 8°/8secondi = 1. In pratica ho fatto queste modifiche:

    #define posMin 0
    #define posMax 8
    #define timePL 1

    Se sono corrette, noto che:
    – il movimento è veloce, si muove sì di 8° ma lo fa in meno di 1 secondo.
    – dopo che ho premuto il tasto al pin 3, sento che qualcosa dentro il servo continua a girare. Non penso sia normale….

    mi sai dire qualcosa in merito??

    grazie mille, per il momento sono contento che il sistema con l’ATX incluso per lo meno funzioni.
    🙂
    Gianfranco

      • Gianfranco il 26 Novembre 2012 alle 23:13
      • Rispondi

      spiego meglio il secondo punto…il servo ha la paletta ferma ma dentro qualcosa si muove…si sentono gli ingranaggi muoversi. Poi una volta ha fatto uno scatto “pazzo”.
      Per quanto riguarda il movimento della paletta invece, inizialmente è pulito, senza rumore, poi dopo vari movimenti si sente grattare….e il movimento non è più pulito. Insomma il servo non reagisce bene e non capisco se è colpa del servo stesso o se di Arduino.

      Grazie…

      1. Spesso é colpa della meccanica del servo, tuttavia potrebbero essere anche i collegamenti non definitivi e un po’ ballerini a dare questo problema.

        Io con i servo in mio possesso non ho mai rilevato questi problemi, ma non sei il primo utente c’è mi segnala di averne, altri hanno risolto utilizzando servo di migliore qualità.

        Tu che servo stai utilizzando?

        Mauro

    1. Ciao Gianfranco,
      non hai letto gli articoli o non mi sono spiegato in modo chiaro, arduino funziona in millisecondi e ha molti più cicli di quelli che ti occorrono per il tuo progetto.

      La formula é 8 secondi / 8 gradi = 8000 millisecondi / 8 gradi = 1000 millisecondi = 1 secondo.

      Mauro

    • gianfranco il 27 Novembre 2012 alle 13:52
    • Rispondi

    Ciao Mauro, mi sono confuso perchè in questo stesso articolo citavi che per trovare il timePL dovevo calcolare:

    “gradi/tempo ( 90° / 9sec. = 10 ) se vuoi che il passaggio a livello si apra in 5 secondi devi cacolare: 90°/5 = 18;”

    allora ho fatto 8° / 8 sec = 1, dove 1 però sono secondi per cui andava convertito in ms, cioè 1000. Approfitto per segnalarti che forse intendevi dire 9sec/ 90°?

    Comunque ieri sera stesso avevo gia provato con timePL=1000. Gli effetti collaterali che ho notato con 8° in 8 secondi (cioè con posMax= 8 e timePL=1000) sono stati i seguenti:

    1) i movimenti sono “grattosi” e anche quando la paletta si ferma, dentro sento gli ingranaggi continuare a ruotare…e poi dopo un po’ si fermano.

    2) il movimento non è continuo ma scattoso, cioè ad ogni passo fa “tac tac tac” finchè arriva a fine corsa…e anche in tal caso sento cose girare dentro…e poi si ferma…probabilmente è il servo che non ce la fa a supportare tale andamento cosi lento….Il servo mi è stato regalato e la marca è un servo ACE RC S 1903.

    Ma mettendo cicli for invece dell’if peggiorerebbe ancora di piu le cose secondo te? Che io sappia i cicli for sono una cosa pesante per l’oggetto che esegue il codice….

    Credo che al momento la soluzione migliore sia quella di modificare il braccio del PL per fare in modo che l’escursione del servo sia di 90° in 9 secondi, perche viene un movimento a dir poco spettacolare…In alternativa, se tu hai un servo buono, faresti un video di come va il tuo servo nel fare 8° in 8 secondi? Stasera posso postare il mio, cosi ti faccio vedere.

    ciao e grazie!
    Gianfranco

    1. Ciao Gianfranco,
      un servo programmato per eseguire 8 passi in 8 secondi si muove per forza a scatti, devi lavorare con i decimi di grado per avere un movimento più fluido, ma non sono certo che il tuo servo li supporti.

      La mia domanda è come mai 8 secondi? la maggior parte dei problemi che stai incontrando sono relativi al tempo, evidentemente sei particolarmente legato agli 8 secondi per qualche riferimento alla realtà.

      Mauro

    • Gianfranco il 27 Novembre 2012 alle 16:18
    • Rispondi

    Si, il tempo di 8 secondi è un vincolo assolutamente da mantenere, per avvicinarsi alla realtà. Ed è il motivo per cui ho scelto Arduino. 🙂

    Il motivo degli 8° è perche se vedi il mio video, ad una rotazione di 90° della sbarra corrisponde in realtà un movimento di soli 8° dell’asticella verticale che devo tirare verso il basso.

    Come ti dicevo poco fa, la soluzione è presto fattibile qualora riuscissi a fare in modo da mettere un ulteriore braccio di ottone saldato all’asticella verticale del PL, e poi collegato al servo, in modo che l’escursione del servo stesso non sia più solo di 8° ma già tipo di 60-70°. Devo fare delle prove dirette con il PL che al momento non ho con me….

    Ti saprò dire meglio appena provo il servo direttametne sul PL.

    Intanto grazie ancora….
    Gianfranco

    1. Ottimo ragionamento e soluzione almeno di non provare a usare i decimi di grado ma il servo deve supportarlo.
      Farò qualche prova anche per un altro progetto che ho in mente.

      Mauro

    • Gianfranco il 27 Novembre 2012 alle 17:59
    • Rispondi

    Ok Mauro, come si fa usare i decimi di grado?

    Se non è una cosa lunga da spiegare, sennò non ti preoccupare.

    Grazie mille
    Gianfranco

    1. Ciao Gianfranco,
      le variabili in cui memorizzi il grado da impartire al servo devono essere float e non integer.
      Mi sembra che la sintassi prevede come separatore il punto 1.10, tuttavia ho verificato nella classe servo e non supporta il float ma solo l’int.
      Dovresti trovare una classe che piloti un servo e supporti i numeri decimali.

      Mauro

    • Gianfranco il 28 Novembre 2012 alle 11:14
    • Rispondi

    Ok, ci ragiono un po’. Intanto ti volevo dire le prestazioni del mio servo….

    maxPos, timePL (tempo di rotazione) -> risultato della prestazione

    10, 1000 (10s) -> scatta
    12, 800 (9,6s) -> scatta
    15, 600 (9s) -> scatta
    18, 500 (9s) -> scatta
    25, 400 (10s) -> scatta
    30, 300 (9s) -> scatta
    40, 250 (10s) -> scatta
    45, 200 (9s) -> scatta un po meno
    60, 170 (9s) -> scatta un po meno
    75, 120 (9s) -> scatta appena
    90, 100 (9s) -> non scatta
    180, 60 (10,8s) -> non scatta

    Se ti trovi a giocare un po’ con i servo magari mi dici il tuo servo come si comporta….al momento sono rimasto un po’ deluso del mio!! :)))

    Gianfranco

    1. Ciao Gianfranco,
      quando dici scatta intendi che si muove a scatti:
      grado – pausa – grado – pausa
      o che fa degli scattini interni quando è fermo su un grado?

      Il primo caso è normale, sei tu a dirgli di farlo, ogni grado attendi 1sec il movimento a scatti è normale, infatti riducendo il timaPL ed aumentando i gradi ottieni un movimento più fluido.

      Il secondo caso potrebbe dipendere dal servo.

      Mauro

    • Gianfranco il 28 Novembre 2012 alle 11:22
    • Rispondi

    Questa sera provo quanto si dice qui:

    http://arduino.cc/forum/index.php/topic,37399.0.html
    e quindi qui:
    http://arduino.cc/en/Reference/ServoWriteMicroseconds

    😉
    gianfranco

    1. Molto interessante, questa funzione non l’ho mai provata.
      Lavora sulla generazione del segnale PWM in Microsecondi invece di dargli il grado e puoi arrivare a risoluzioni molto interessanti.

      Di contro devi essere molto bravo con i calcoli.

      Ciao
      Mauro

    • Gianfranco il 28 Novembre 2012 alle 14:28
    • Rispondi

    Ciao Mauro, il servo fa proprio:
    grado – pausa – grado – pausa

    ahhhhhhhhhhh…….!!! 1000ms è la pausa!!! Io credevo che era il tempo che impiegava per fare uno scatto (cioè uno scatto della durata di 1 secondo) e non il tempo tra uno scatto e l’altro!!!

    E non si può fare che mi faccia i 10° senza pause?? Ovvero fare in modo che ogni scatto duri 1 secondo e non che tra uno scatto e l’altro si fermi 1 secondo….Oppure l’unica soluzione è aumentare per forza i gradi??

    Grazie!!! Ora ho capito!!!!

    Intanto stasera provo anche il Microsecondi!!

    1. Ciao Gianfranco,
      per farlo devi utilizzare i decimi di grado o anche i centesimi di grado.
      Forse con la writeMicrosecondi() puoi riuscirci, è solo questione di calcoli.

      Mauro

    • Gianfranco il 28 Novembre 2012 alle 15:35
    • Rispondi

    In pratica lascio il delay fisso, ad esempio, a 10ms e poi gioco con i Mircosecondi?

    Il delay deve esserci sempre giusto?

    1. Si può essere un’idea, tuttavia devi fare dei calcoli precisi tra millisecondi di delay, decimi di grado da eseguire e corrispettivi Microsecondi.

      Mauro

    • Gianfranco il 28 Novembre 2012 alle 15:54
    • Rispondi

    Allora…siccome in Microseconds si ha che il valore 1000 corrisponde a 0°, il valore 2000 a 180° e il valore 1500 a 90°, ho fatto questa proporzione:

    500 : x = 90° : 10°

    cioè, se voglio una rotazione di 10° su 90°, allora rapportato a Microseconds, il 90 corrisponde a 500 (cioè 1/4 di circonferenza considerando il range [1000,2000]).

    Da cui, x=55.

    Se i calcoli sono giusti, basta mettere:
    #define posMin 1500
    #define posMax 1556
    #define timePL 10

    Questa sera provo….

    Gianfranco

    • Gianfranco il 28 Novembre 2012 alle 16:56
    • Rispondi

    Mauro, forse qui ci poterbbe essere la soluzione a tutto il problema….

    http://arduino.cc/forum/index.php?topic=61586.0

    E’ una libreria che non necessita dell’uso del delay.

    E qui c’è un articolo con un esempio….(spero non sono in difetto linkando questo link):
    http://www.bajdi.com/sweeping-servos-with-arduino/

    Gianfranco

    1. Ottimo Gianfranco,
      non sei affatto in difetto, il blog serve a condividere conoscenza ed il web è pieno di informazioni utili.
      Da una prima lettura del codice sembra molto interessante, se la provi condividi le tue impressioni.

      Mauro

    • Gianfranco il 29 Novembre 2012 alle 14:11
    • Rispondi

    Ciao Mauro, ieri sera ho provato tutte e due le soluzioni alternative a quelle da te proposte.

    Dunque….
    La libreria varServoSpeed funziona, va di pochissimo più lenta della classica con il delay. Anche impostando la speed=1, il movimento è tanto piu scattoso quanto più è piccolo l’angolo. Quindi…non cambia nulla….

    Il metodo writeMicroseconds offre le stesse prestazioni del classico write…non ho notato differenze per piccoli angoli. Ti segnalo anche che la mia proporzione è giusta: 55 in Microseconds corrisponde a 10 in gradi.

    Concludendo…credo che questi servo possono arrivare a queste prestazioni per piccoli angoli.

    Per ovviare al problema ho due alternative:
    1) mettere un braccio ulteriore all’asticella che vedi nel video
    2) mettere l’asticella in uno dei fori del servo in modo che descriva lo stesso arco che viene descritto all’interno della “cassa motore” del PL. Per questa soluzione mi sta aiutando un amico con disegno cad, che se sarà d’accordo (sicuramente sì), la posterò qui.

    a presto!!
    Gianfranco

    1. Ciao Gianfranco,
      grazie per il report sull’analisi.
      Attendo impaziente di vedere il risultato finale, se potrai pubblicarlo 🙂

      Mauro

  1. Ciao Mauro,
    mi sto avvicinando al mondo arduino, e ho notato il tuo sito, in particolare questo post.
    Di dove sei? Ho notato che la foto di questo post è il passaggio a livello vicino casa mia!
    Comunque complimenti, ottimi tutorial!!
    Ciao Rubens

    1. Ciao Rubens,
      sono originario di Napoli e vivo in provincia di Monza da 13 anni, era ancora provincia di Milano.
      Il passaggio a livello della foto dovrebbe essere quello di Osnago ci sono passato qualche volta e mi piaceva la foto su google maps.

      Se abiti in provincia di Monza o Milano e ti stai avvicinando ad Arduino potrebbe interessarti partecipare al prossimo corso Arduino Base, penso di organizzarlo a Milano per fine gennaio o i primi di febbraio.

      Mauro

      1. Ciao Mauro,
        anche se in ritardo, ti ringrazio per la risposta!
        Sisi, lo conosco, io abito a Merate, 300 metri da quel passaggio a livello! Infatti mi è risultato subito familiare!

        Si, ho appena acquistato un kit avanzato con Arduino UNO, e ho in mente già un progetto tramite l’utilizzo della shield EasyVR per la gesrione di alcuni servo.
        Io lavoro vicino Monza, precisamente a Villasanta!
        Ti ringrazio per l’invito, mi terrò aggiornato costantemente per sapere la data del corso!

        Già che ci sono, ti chiedo anche un’informazione tecnica:
        sapresti cosa posso utilizzare per generare un moto linare con arduino?
        Il movimento che dovrei simulare quello di un lettore CD di un desktop, ovvero escursione di 15cm/20cm in avanti e viceversa.
        Ho pensato a una rotella dentata+cremagliera, oppure a braccio pieghevole utilizzando un servo.
        Però quello che sembra strano che non ci siano degli apparecchi su internet per il moto lineare.
        tu avresti qualche consiglio da darmi?

        Grazie in anticipo,
        Buona giornata!
        Rubens

    • Piero il 16 Maggio 2013 alle 20:55
    • Rispondi

    Salve ho l’intenzione di automatizzare un vecchio passaggio a livello rivarossi. Ho comperato un modello Arduino mi chiedevo quale tipo di servo e’ più indicato grazie!!

    1. Ciao Piero,
      come modellista saprai meglio di me che tipo di servo esistono e come sceglierlo per il tuo progetto.
      L’importante, per usare il mio sketch, é che sia analogico e con angolo 0-180 gradi.

      Per coppia, torsione, velocità, ecc … valuta in funzione delle tue esigenze.

      Mauro

    • mahmood fasil il 17 Giugno 2013 alle 19:01
    • Rispondi

    Ciao Mauro,
    mi servirebbe lo schema elettrico in formato orcad con spiegazione di singoli blocchi sempre di questo progetto, possibilmente entro le 15. 00 del 18/06/2013!!!!!!
    è urgentissimo, mi servono per presentare la tesina.
    ciao e grazie.

    1. Ciao Mahmood,
      premetto che non sviluppo progetti per tesine o impili, sei tu a doverlo fare ed inoltre non conosco ed uso orcad.

      Tuttavia lo schema non é complesso, puoi riprodurlo in 10/15min.

      Mauro

    • Nicolò il 13 Gennaio 2014 alle 19:36
    • Rispondi

    Salve Mauro, per il progetto che sto realizzando io, voglio mettere un servomotore a ognuna delle sbarre, visto che mi è difficile l’automazione meccanica delle sbarre con un unico servomotore. Sulla base dello sketch che c’è qui mi riesci a modificare il programma da caricare su arduino e aggiungere un altro servomotore che lavora in contemporanea con l’altro? Grazie

    1. Ciao Nicolò,
      le modifiche agli sketch lascio che siate voi a farle per questo descrivo linea per linea il codice per spiegare come eseguire le modifiche.

      Nel tuo caso se i due servo devono muoversi insieme puoi collegarli entrambi al medesimo pin e alimentarli da una sorgente esterna.

      Mauro

    • Alberto Tacchella il 11 Marzo 2014 alle 18:35
    • Rispondi

    Scusa ma se il treno proviene dall altra direzione? Come si puo risolvere

    1. Ciao Alberto,
      domanda interessante, non ci avevo pensato.
      Mi piacerebbe avere una soluzione da tutti i lettori del Blog.
      In primo luogo da te se hai dei suggerimenti da modellista.

    • Alberto Tacchella il 12 Marzo 2014 alle 11:21
    • Rispondi

    Grazie.Poi non ho ben capito i collegamenti sulla basetta

    1. Ciao Alberto,
      è un po’ generica la tua richiesta, quale collegamento non ti è chiaro?
      Sai come funziona un breadboard ?

    • Alberto Tacchella il 12 Marzo 2014 alle 11:37
    • Rispondi

    Si non mi sono chiari i collegamenti dei pulsanti. Per il passaggio di due treni avevo pensato di mettere un tempo di chiusura alle sbarre

    1. Ciao Alberto,
      i pulsanti sono collegati con un pin al polo positivo ( +5v ) di arduino ed uno verso Gnd passando da una resistenza di 330ohm.
      Trovi degli articoli del mio corso base on-line dedicati solo ai pulsanti che ti invito a leggere.

      Mauro

    • Nino il 2 Luglio 2014 alle 18:32
    • Rispondi

    Per un plastico lo sketch va bene…ma se ne volessimo realizzare uno reale?
    Forse la soluzione è usare Arduino come contassi.
    P1 = pulsante
    P2 pulsante
    variabile1 = 0
    variabile 2 = 0

    if variabile1= variabile2 barra alzata.
    else barra abbassata.

    Se le due variabili hanno lo stesso valore le sbarre sono aperte.
    Arriva il treno, la prima ruota del treno preme il pulsante P1 che incrementa la variabile1.
    La barra si abbassa perchè le due varibili non hanno lo stesso valore.
    Tutte le ruote del treno hanno premuto per… 30 volte P1.
    Il treno supera il passaggio a livello chiuso.
    La ruota del treno preme P2.
    E solo dopo che P2 sarà premuto un numero di volte pari a P1 la barra si alza.

    1. Ciao Nino,
      interessante ragionamento 🙂

    • Francisco il 2 Febbraio 2015 alle 21:00
    • Rispondi

    Ciao Mauro,
    Ho visto il vostro progetto passaggio a livello con Arduino e mi è piaciuto, quindi mi congratulo.
    Vorrei sapere se avete qualsiasi progetto che viene gestito con Arduino una stazione della metropolitana in plastico. Se è così, mi piacerebbe di mettere in contatto con me e quali proporzioni, dal momento che la mia conoscenza di elettronica è limitata e dopo l’incontro con Arduino, penso che si può gestire la stazione di nascosto con Arduino.

    Grazie e attendo con impazienza le vostre spiegazioni

    1. Ciao Francesco,
      il blog è nato per insegnare a chi ha poche conoscenze di arduino, elettronica e programmazione a realizzare i propri progetti.
      Purtroppo un progetto già pronto come quello che chiedi non l’ho mai realizzato ne pubblicato ma sarebbe limitato e non è detto che farebbe al caso tuo.
      Il mio consiglio è di provare a studiare i miei articoli e provare a realizzarti la stazione come la vorresti tu.
      Se ti occorrono consigli sugli articoli che leggi usa pure i commenti ed io cercherò di risponderti dandoti tutte le informazioni necessarie.

    • Alessandro il 15 Maggio 2015 alle 09:58
    • Rispondi

    Ciao Mauro volevo chiederti un’informazione: io sto usando lo stesso programma e sto facendo un passaggio a livello con due binari ma al posto dei pulsanti uso dei sensori e invece che averne due ne ho quattro, due per l’apertura e due per la chiusura ma il problema sorge quando vado ad agire sui sensori di riapertura e voglio che le sbarre si riaprano solo quando entrambi mi diano un segnale alto, come fare? Oltre a questo mi servirebbe anche inserire il lampeggio se possibile, grazie in anticipo, qui sotto c’è il programma modificato da me.

    [[ codice rimosso in automatico ]]

    1. Ciao Alessandro,
      come hai letto è vietato inserire codice nei commenti, viene rimosso in automatico.
      Nell’articolo trovi la descrizione dello sketch line a per linea proprio per spiegare come è fatto e come modificarlo.
      Se vuoi controllare 2 sensori che non danno un segnale alto contemporaneamente dovrai memorizzare in una variabile il valore alto del primo e attendere che il secondo ti dia il segnale alto verificando entrambi.

      Per le luci cerca nel blog ci sono molti articoli che descrivono giochi di luce e uso dei led.

    • Roberto il 30 Maggio 2015 alle 08:25
    • Rispondi

    Buon giorno Mauro,
    eccomi in questa sezione sperando di essere in quella corretta.

    Mio figlio sta realizzando un progettino per la scuola
    che descrive una passaggio a livello a due sbarre (una in un senso e una nell’altro) con 1 solo servo e con 2 semafori ferroviari
    e l’aggiunta di 2 semafori stradali.

    Purtroppo nella realizzazione del passaggio a livello il singolo servo crea problemi,
    a mio avviso dovrebbero essercene 2 di servi: uno per ogni sbarra. E’ possibile?… penso proprio di si.
    Mi perdoni ma, da vecchio elettrotecnico, questa “cosa” sta diventando una sfida….almeno per me!

    Grazie
    Roberto

    In allegato Le invio lo sketch di quello attualmente usato e che penso sia da modificare….

    [[ codice rimosso in automatico ]]

    1. Ciao Roberto,
      come avrai letto negli articoli non è consentito incollare sketch perché essi vengano corretti.
      Io posso aiutarvi a risolvere i dubbi su quello che state realizzando ma non ho tempo ne possibilità di riprodurre tutti i progetti che ogni giorno i lettori del blog scrivono per cui mi limito a dare suggerimenti, quando ne ho.
      Per tuoi figlio non penso sia un problema aggiungere 2 servo, e sketch in cui descrivo l’uso di 2 o più servi nel blog ne troverai tanti.
      Se ti occorrono chiarimenti su come utilizzare i miei sketch i commenti sono la strada migliore.

    • Giuseppe Lavagna il 3 Maggio 2016 alle 09:57
    • Rispondi

    chi mi dice se questo può funzionare con una linea avanti e indietro?
    [[ codice rimosso in automatico ]]

    1. Ciao Giuseppe,
      il codice viene rimosso in automatico dal sistema prima della pubblicazione per evitare di contravvenire ad una semplice regola del blog.

    • Giuseppe Lavagna il 3 Maggio 2016 alle 10:03
    • Rispondi

    Scusami ho invito lo sketch e non avevo letto sopra. I ogni caso forse utilizzando una logica booleana del tipo boolean direzione= false , si potrebbe fare in modo da controllare il PL nelle due direzioni. Saluti cordiali.

    1. Ciao Giuseppe,
      questa è la via corretta per chiedere consigli.
      Si la logica booleana puoi utilizzarla per controllare la direzione, lo sketch stesso usa questa tecnica associata allo statoPL

        • Giuseppe Lavagna il 3 Maggio 2016 alle 11:34
        • Rispondi

        Grazie del consiglio allora sono sulla strada giusta! Appena termino lo sketch lo provo e vedo se funziona in pratica. Saluti cordiali.

    • leonardo biscaro il 22 Maggio 2016 alle 15:23
    • Rispondi

    che cosa significa currentGrad. ho capito che è una variabile ma a cosa sta significare ?

    1. Ciao Leonardo,
      serve a memorizzare la posizione corrente dei servo.

    • Luca il 30 Marzo 2017 alle 14:07
    • Rispondi

    Ciao a tutti e complimenti Mauro per il blog!
    Anch’io sono un fermodellista che da poco è entrato nel fantastico mondo di Arduino. Ieri ho provato questo sketch implementandolo per il mio progetto che, per quanto riguarda l’azionamento delle sbarre (alza/abbassa), prevede l’uso di reed al posto di pulsanti: il treno sul cui fondocassa applicherò una calamitina passerà sopra il 1′ reed ed abbasserà le sbarre.. quando sarà sufficientemnte lontano dal PL transiterà sopra il 2′ reed e le sbarre si alzeranno… Questo discorso,al momento, vale per il binario unico…
    Come qualcuno ha giustamente notato il problema sorge se il treno giunge dalla direzione opposta.. ebbene basta collegare i reed in parallelo a quelli già esistenti… Mi spiego: il reed della “nuova” direzione che abbasserà le sbarre si posizionerà piu o meno dove già risiede il reed che alza le sbarre nella “vecchia” direzione: lo si collega al pin 2 (#define swClose 2) e lo stesso di fa con l’altro reed che verrà collegato al pin 3 (#define swOpen 3); i pin 2 e 3 in pratica restano sempre in ascolto di quello che succede: da qualsiasi parta sopraggiunga il treno loro azionano le sbarre…
    Ciao a tutti!
    Luca

    1. Ciao Luca,
      perdonami ma non mi è chiaro se la tua è una domanda o una soluzione.
      Nel secondo caso grazie per averla condivisa.

        • Luca il 31 Marzo 2017 alle 09:26
        • Rispondi

        Si Mauro era una soluzione 🙂
        Per quanto riguarda l’introduzione di un suono (campanella che preannuncia l’abbassamento delle sbarre) si potrebbe aggiungere un modulo che viene azionato da un pin tipo quello che fa accendere il led (pin 4 di questo sketch) ?
        So che esistono dei moduletti semplici che montano un voice recorder + altoparlante integrato..Potrebbe essere una soluzione? Ci sono altri moduli per applicazioni anche più complesse? Tipo “centralina” che gestisce una serie di rumori e suoni(applicazione per i suoni di una stazione)?
        Grazie a tutti!

        1. Ciao Luca,
          sai che io preferisco le soluzioni semplici, per cui ti consiglierei dei moduli già in grado di eseguire il suono della campanella, immagino che in modellismo esistano già, non saprei indicartene uno in particolare.
          Io sto sperimentando un modulo in cui puoi inserire una microSD ed eseguire dei brani in Mp3 inviando un segnale da arduino, nelle prossime settimane dovrei riuscire a pubblicare i primi esperimenti.

    • Salvatore il 16 Novembre 2017 alle 20:00
    • Rispondi

    Ciao, complimenti per il progetto, ho montato il tutto e caricato lo sketch, ma non mi funziona come dovrebbe, mi spiego meglio,
    non appena parte il ciclo premendo il primo tasto il servo compie i 90° lenti, dopo di chè continua o ruotare nello stesso senso a velocità sostenuta senza mai fermarsi.
    si arresta solo dopo che premo il secondo pulsante che si arresta e spegne il led.

    e capitato anche a qualcun altro?

    1. Ciao Salvatore,
      sembra sia un problema del server che non riconosce il punto di arrivo.

    • Salvatore il 17 Novembre 2017 alle 06:02
    • Rispondi

    buongiorno, dopo vari tentativi ho capito del perchè non funzionava, il servo non è sicuramente di grandissima qualità, e quando arrivava a 0° realmente andava oltre, quindi entrava nel loop e non si fermava mai, è bastato modificare gli angoli, cioè aumentare li minimo a 20°, ed il max a 110° per far funzionare il tutto.

    Una ultima delucidazione, dopo che il servo raggiunge la posizione definita perche continua ad essere sotto tensione, trema ma senza fermarsi?

    grazie.

    1. Ciao Salvatore,
      i servo solitamente sono sempre alimentati per mantenere la posizione in modo che se qualcuno o qualcosa tenta di spostarli dalla posizione raggiunta possano correggere.
      Se vuoi toglire tensione puoi provare con un detach o collegare il pin di alimentazione ad un pin digitale e portarlo a livello logico 0 quando è fermo.
      Ricordati di alimentare il servo e fare l’attach quando vuoi che si muova.

    • Marcello il 18 Gennaio 2018 alle 08:50
    • Rispondi

    Buongiorno,
    basandomi su questo esempio volevo apportare due modifiche, penso la prima facilmente eseguibile, per la seconda forse è più complicato, se non addirittura impossibile
    1 – sostituire i pulsanti con sensori IR
    2- il binario non è singolo ma doppio, problema i treni giungono da direzione opposta, è possibile inserire un comando che dice (il primo sensore -qualunque dei due- a rilevare una variazione apre, il secondo chiude)
    Grazie e complimenti per il lavoro

    1. Ciao Marcello,
      entrambe le richieste sono possibili ed un bel esercizio che puoi eseguire, il primo è un esercizio facile di elettronica, i sensori IR esistono di vari tipi e puoi sceglierne con un output simile ad un pulsante ( 0/1 ) oppure costruirti un circuito di interfaccia.
      Per il secondo quesito si tratta solo di logica ed applicazione delle regole che hai descritto al codice.

        • stefano Stucchi il 1 Febbraio 2019 alle 14:26
        • Rispondi

        Buongiorno.

        Sono interessato anch’io al progetto del passaggio a livello.
        Ho effettuato il circuito di prova con esito positivo, e per questo ringrazio Mauro, ma vorrei allo stesso modo sostituire i due pulsanti con due sensore ir di prossimità che già ho.
        Questi due sensori hanno un’uscita analogica e una digitale, oltre hai due pin di alimentazione. Ho visto che vengono usati per evitare ostacoli su progetti di auto o robot.
        Mi chiedo se sarà sufficiente collegare uscita digitale alla R, oppure modificare software e collegamento del circuito.

        Grazie mille.

        1. Ciao Stefano,
          se i tuoi sensori dispongono di una uscita digitale puoi sostituirli ai pulsanti.
          Controlla che l’uscita sia normalmente LOW e che passi in stato HIGH solo quando rileva un ostacolo.

            • Stefano il 21 Febbraio 2019 alle 16:04

            Ciao.
            Grazie dell’aiuto. Sono riuscito ad inserire i sensori e funziona correttamente.

            Ora mi servirebbe inserire un ulteriore servo motore che mi comporta allo stesso modo del primo. Ho compilato il tutto cosi ma non funziona. Dove sbaglio?

            [[codice rimosso in automatico ]]

            Si muove solo il servo relativo al pin 5.
            Grazie

          1. Ciao Stefano,
            da regolamento non è consentito inserire codice nei commenti, indicami che errore o comportamento anomalo ricevi.

            • stefano Stucchi il 21 Febbraio 2019 alle 16:18

            Ho risolto…

            [[codice rimosso in automatico ]]

            Grazie

          2. Bravo Stefano,
            ricordati di rispettare le regole del Blog.

    • Domenico il 16 Marzo 2019 alle 19:16
    • Rispondi

    ciao, ho provato a fare tutto come spieghi, ma quando premo il primo pulsante sul 2, il servo va su e giù.. è un po autonomo… non risponde ai comandi … cosa posso controllare..?
    grazie

    1. Ciao Domenico,
      prova a controllare l’alimentazione del servo ed eventualmente separala da quella di arduino, molti servo economici sono sensibili alle variazioni di tensione e si comportano in modo anomalo.
      La mia è solo una ipotesi.

    • Giovanni il 20 Marzo 2019 alle 17:55
    • Rispondi

    Salve,
    ho caricato lo sketch su un arduino mega per comandare un servomotore SG90 ma ho riscontrato un problema.
    Quando premo uno dei due pulsanti mi esegue sia l’apertura che la chiusura del PL, questo è normale oppure è un difetto del cablaggio o della scheda arduino? Il problema si presenta per entrambi i pulsanti. Nel caso questo comportamento è previsto dallo sketch, come potrei fare per far si che un pulsante comandi solo l’apertura e l’altro solo la chiusura ?
    Grazie mille per l’attenzione
    Giovanni

    1. Ciao Giovanni,
      hai verificato con il monitor seriale la lettura dei valori che ricevi alla pressione dei pulsanti ?
      Coincide con quella attesa dallo sketch?

    • stefano il 17 Aprile 2019 alle 11:00
    • Rispondi

    Ciao Mauro.
    Ho utilizzato il tuo sketch per gestire lo scambio di due binari che si diramano e poi si riuniscono.
    I pulsanti sono stati sostituiti da due sensori.
    Funziona alla perfezione correggendo la posmax .
    Avrei bisogno però di creare una terza condizione. Cioè, dopo un tempo trascorso, all’attivazione del sens swClose, mi attivi un relè, che non fa altro che togliere l’alimentazione hai binari. (arresto treno).
    Questo per evitare che il treno si fermi a cavallo dello scambio, visto che ci accende e si spegne in automatico .
    Probabilmente si deve utilizzare la funzione millis ma non riesco a venirne a capo.
    Un aiuto. Grazie

    1. Ciao Stefano,
      si la funzione millis() è ideale in questi casi.
      Il modo migliore che puoi usare è la memorizzazione del tempo T0 e verificare il trascorrere del tempo confrontando la differenza tra millis() ed il tempo T0.
      Trovi molti dettagliati articoli sull’argomento con esempi d’uso.

    • Andrea il 23 Maggio 2023 alle 12:47
    • Rispondi

    E possiabile sapere cosa è meglio utilizzare per alzare e abbassare le sbarre del PL collegato al servo motore?
    GRAZIE

    1. Ciao Andrea,
      purtroppo non ho compreso la domanda, cosa intendi per “cosa è meglio utilizzare ?”

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.