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 !!!

Cortesemente, prima di inserire i commenti leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/passaggio-a-livello-per-plastici.html

72 comments

Skip to comment form

    • Gianfranco on 21 novembre 2012 at 23:35
    • Reply

    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 on 21 novembre 2012 at 23:37
    • Reply

    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 on 22 novembre 2012 at 09:42
    • Reply

    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 on 25 novembre 2012 at 13:19
    • Reply

    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 on 25 novembre 2012 at 19:23
    • Reply

    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 on 26 novembre 2012 at 19:52
    • Reply

    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 on 26 novembre 2012 at 23:13
      • Reply

      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 on 27 novembre 2012 at 13:52
    • Reply

    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 on 27 novembre 2012 at 16:18
    • Reply

    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 on 27 novembre 2012 at 17:59
    • Reply

    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 on 28 novembre 2012 at 11:14
    • Reply

    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 on 28 novembre 2012 at 11:22
    • Reply

    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 on 28 novembre 2012 at 14:28
    • Reply

    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 on 28 novembre 2012 at 15:35
    • Reply

    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 on 28 novembre 2012 at 15:54
    • Reply

    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 on 28 novembre 2012 at 16:56
    • Reply

    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 on 29 novembre 2012 at 14:11
    • Reply

    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 on 16 maggio 2013 at 20:55
    • Reply

    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 on 17 giugno 2013 at 19:01
    • Reply

    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ò on 13 gennaio 2014 at 19:36
    • Reply

    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 on 11 marzo 2014 at 18:35
    • Reply

    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 on 12 marzo 2014 at 11:21
    • Reply

    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 on 12 marzo 2014 at 11:37
    • Reply

    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 on 2 luglio 2014 at 18:32
    • Reply

    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 on 2 febbraio 2015 at 21:00
    • Reply

    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 on 15 maggio 2015 at 09:58
    • Reply

    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 on 30 maggio 2015 at 08:25
    • Reply

    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 on 3 maggio 2016 at 09:57
    • Reply

    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 on 3 maggio 2016 at 10:03
    • Reply

    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 on 3 maggio 2016 at 11:34
        • Reply

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

    • leonardo biscaro on 22 maggio 2016 at 15:23
    • Reply

    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 on 30 marzo 2017 at 14:07
    • Reply

    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 on 31 marzo 2017 at 09:26
        • Reply

        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 on 16 novembre 2017 at 20:00
    • Reply

    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 on 17 novembre 2017 at 06:02
    • Reply

    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 on 18 gennaio 2018 at 08:50
    • Reply

    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.

Lascia un commento

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.