Motori passo-passo bipolari comandati da interruttori – prima parte

Pilota un motore passo-passo con due interruttori. Nei precedenti articoli hai imparato a collegare e regolare la velocità di un motore passo-passo bipolare con Arduino.

Pulsanti per motori stepper

Oggi ti spingerai un po’ oltre iniziando a collegare dei pulsanti ad Arduino e utilizzandoli per posizionare l’albero del motore dove lo riterrai più opportuno.

Di pulsanti che puoi utilizzare ne esistono infiniti tipi, alcuni di questi in un progetto futuro potresti pensare di utilizzarli anche come finecorsa di uno spostamento lineare ottenuto con un motore stepper.

Per questo esperimento ti occorreranno 2 pulsanti per ogni motore che desideri pilotare, ecco come collegerai i pulsanti e Arduino:

Collegare due pulsanti ad Arduino

Nell’esempio ti ho riportato un semplice schema di collegamento di due pulsanti, il cui segnale lo potrai leggere sui pin digitali 2 e 3 di Arduino.

Avrai notato che sono anche state collegate due resistenza da 10KΩ tra il pin del segnale che arriva ad Arduino e la massa, mentre l’altro capo del pulsante è direttamente collegato al positivo ( + 5v ) di Arduino.

Quando premi uno dei pulsanti al pin di Arduino corrispondente arriva un segnale HIGH che potrai leggere con la funzione digitalRead(pin) dove pin è il valore del pin corrispondente.

Nell’esempio ho scelto di utilizzare il pulsante a sinistra, quello più vicino alla scheda Arduino, collegandolo al pin 2 e definendo che alla sua pressione il motore dovrà ruotare in senso orario; mentre premendo il pulsante di destra ( pin 3) il motore ruota in verso antiorario.

Sono convenzioni e se vuoi puoi cambiarle nel tuo sketch per ottenere un movimento più simile all’uso a cui hai destinato questo esercizio.

Per verificare che il tuo circuito funzioni, prima di collegare il motore, puoi procedere eseguendo lo sketch seguente:

#define LED 13  
#define ORARIO 2
#define ANTIOR 3

int  ora = 0; 
int  ant = 0;

void setup() {  
  pinMode(LED, OUTPUT);
  pinMode(ORARIO, INPUT);
  pinMode(ANTIOR, INPUT);
}  

void loop() {  
  ora = digitalRead(ORARIO);
  ant = digitalRead(ANTIOR);

  if (ora == HIGH) {  
    digitalWrite(LED, HIGH);
    delay(300);
    digitalWrite(LED, LOW);
    delay(300);
    digitalWrite(LED, HIGH);
    delay(300);
    digitalWrite(LED, LOW);
 }  

  if (ant == HIGH) {  
    digitalWrite(LED, HIGH);
    delay(300);
    digitalWrite(LED, LOW);
    delay(300);
    digitalWrite(LED, HIGH); 
    delay(300); 
    digitalWrite(LED, LOW);
    delay(300);
    digitalWrite(LED, HIGH); 
    delay(300); 
    digitalWrite(LED, LOW);
  }
}

Lo sketch non è complicatissimo, tuttavia lo desciverò nel dettaglio:

linea 01: definisci il pin che utilizzi per accendere il led, sarà il tuo indicatore di funzionamento, non è necessario collegare alcun led al pin 13 in quanto Arduino è già dotato di un led connesso a tale pin;

linee 02-03: definisci i pin collegati ai pulsanti come da schema, pin 2 al senso orario e pin 3 al senso antiorario;

linee 05-06: definisci due variabili di tipo  integer rispettivamente per memorizzare il valore letto sul pin 2 e sul pin 3;

linea 08: definisci la funzione setup() al cui interno devono essere inserite le linee da eseguire in una prima fase di inizializzazione dello sketch;

linea 09: imposta il pin 13 (LED) come pin di tipo OUTPUT, ossia un pin su cui Arduino invierà segnali digitali;

linee 10-11: imposta i pin 2 e 3 come pin di tipo INPUT ossia da cui Arduino si aspetterà segnali da leggere, in questo caso di tipo digitale in quanto sono pin digitali;

linea 14: definisci la funzione loop() quella che ciclicamente sarà eseguita da Arduino e che contiene le istruzioni da verificare ad ogni ciclo di clock;

linee 15-16: leggi il valore presente sul pin 2 e 3 e li memorizzi nelle rispettive variabili ora e ant definite alle linee 05 e 06;

linee 18-26: effettua un controllo sulla variabile ora che conterrà il valore letto sul pin 2; se il valore è HIGH ossia il pulsante è stato premuto esegui la sequenza di istruzioni:

  • accende il led
  • attende 300millisecondi
  • spegne il led
  • attende 300 millisecondi
  • accende il led
  • attende 300 millisecondi
  • spegne il led

L’accensione del led avviene mediante l’invio del segnale HIGH al pin 13, mentre il suo spegnimento avviene inviando LOW allo stesso pin;

linee 28-40: effettua un controllo sulla variabile ant che contiene il valore letto sul pin 3 ed esegue una sequenza simile a quella delle linee 18-26, ma con un lampeggio in più.

L’effetto ottenuto è che premendo il pulsante definito per il senso orario ottieni 2 lampeggi del led sul pin 13, mentre premendo il pulsante definito per il senso antiorario otterrai 3 lampeggi.

Una curiosità, del tutto casuale, i lampeggi sono tanti quanti il pin a cui è connesso il pulsante 🙂

Buon divertimento.

Cortesemente, prima di inserire i commenti leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/motori-passo-passo-bipolari-comandati-da-interruttori.html

19 comments

4 pings

Skip to comment form

    • Mirko on 16 marzo 2013 at 02:23
    • Reply

    Cao Mauro, complimenti ancora per il tuo blog più leggo gli articoli più mi rendo conto di quanto questo blog per un neofita come me che ha tanta voglia di sperimentare, ma poche conoscenze, sia una miniera.Volevo chiederti se è molto difficile implementare un potenziometro che regoli la velocità del giro del motore e se il motore potesse girare in continuo premendo solo una volta il tasto e si stoppasse ripremendo il tasto. Ho letto che intendi realizzare uno slider per camera io volevo utilizzare questo progetto per farlo solo che vorrei effettuare queste modifiche. Se vuoi ti passo dei render che ho fatto per sviluppare il progetto. Al momento è solo un render in 3d, ma quanto prima inizierò i test. Con tutte le informazioni che ho attinto da questo blog mi sento di dirti che se lo ritieni valido e funzionale puoi svilupparlo ed implementarlo come vuoi 🙂

    1. Ciao Mirko,
      i tuoi progetti mi interessano e se vuoi condividerli sarò felice di farlo.
      Per la modifica che vuoi fare é possibile.
      Io la farei con un while() come ho fatto nell’ultimo articolo sul Dolly pubblicato Mercoledì.

      Se vuoi realizzare un dolly per videoriprese, o slider, sto proprio lavorando ad uno slider che é già in kit su robot-domestici.it

      Ti sottopongo una richiesta, poiché sai disegnare in 3D, saresti disposto a disegnare una scatoletta da far stampare in 3D in cui sistemare tutta la parte elettrica degli ultimi dolly che ho presentato? Motore escluso.

      Mauro

    • Daniele on 17 marzo 2013 at 23:00
    • Reply

    Salve Mauro, ho visto dei tuoi tutorial su youtube,e mi complimento.
    La contatto, perché credo che la cosa che io ho in mente sia per lei di una semplicità enorme.
    Possiedo una giulietta ed sto cercando di effettuare un lavoro tipo questo: http://youtu.be/UiTvN4T9QCU

    Non riesco a capire come poter utilizzare un motore passo passo per far alzare in automatico il monitor al momento in cui si gira la chiave dell’auto,oppure quando s’inserisce la retromarcia.

    Ed oltre all’automatico avere a disposizione un potenziometro per il manuale,il cosiddetto tilt quando si ha un riflesso di sole.

    Grazie mille

    1. Ciao Daniele,
      bel progetto quello che stai realizzando.
      Ho spostato il tuo commento in questo articolo perché ciò che ti occorre è spiegato in questo articolo.
      Se hai dubbi, commenta questo articolo con le domande o le cose poco chiare.

      Mauro

        • Simone on 13 ottobre 2016 at 20:15
        • Reply

        Ciao Mauro, anche io sto realizzando un progetto del genere, esattamente per lo stesso utilizzo.
        L’unica differenza sta nel fatto che io ho bisogno solo che il motore giri in un verso di tot passi solo al mio comando con un pulsante normalmente aperto; a quel punto meccanicamente e’ previsto un “finecorsa” a 3 vie, che comandi il tutto facendo capire ad arduino che al prossimo mio segnale tramite il medesimo pulsante giri al contrario di tot passi.
        sto realizzando questo progetto per aprire e chiudere il cassetto della mia Alfa Romeo Giulietta.
        sarei davvero felice se riuscissi ad aiutarmi.
        grazie in Anticipo.

        1. Ciao Simone,
          io per realizzare quello che hai descritto ti suggerisco di usare un servomotore: più potente, più piccolo e semplice da controllare.

    • gennaro on 6 gennaio 2016 at 00:28
    • Reply

    ciao Mauro
    innanzitutto ci tenevo a complimentarmi per il tuo blog ed i tuoi progetti.
    Da un bel po seguo i tutorial e nonostante tutti gli insegnamenti non riesco a trovare la soluzione al mio progetto.
    Non riesco a far partire un motore bipolare tramite la pressione di un tasto e fermare il suo arresto usando un altro tasto
    magari potevi aiutare me e chi ti segue con un altro dei tuoi interessanti tutorial
    grazie

    1. Ciao Gennaro,
      dovrebbe esservi un tutorial simile già fatto, in ogni caso se mi indichi il ragionamento che stai seguendo, non lo sketch, provo a darti qualche delucidazione.

        • gennaro on 8 gennaio 2016 at 12:37
        • Reply

        avrei bisogno di creare un sketch per gestire un motore bipolare con due pulsanti uno di marcia, e uno di arresto.
        ma il mio problema riguarda il pulsante di marcia
        il motore resta in gira solo se tengo premuto il pulsante marcia
        appena lascio il motore si ferma.

        1. Ciao Gennaro,
          mi sembra di aver già risposto a questa richiesta in un altro articolo.
          Trovi nel blog tutti gli articoli che ti occorrono ed anche un corso base arduino gratuito che puoi consultare

    • Alessandro on 8 settembre 2016 at 14:22
    • Reply

    Buongiorno Mauro,

    innanzitutto complimenti per gli ottimi progetti che illustri a tutti!
    Per me che conosco davvero poco il mondo dell’elettronica e della programmazione e non ho mai utilizzato arduino, ma ho tanta voglia (e poco tempo) per sperimentare, provare, testare faccio davvero fatica ad ottenere dei risultati che vanno al di là dei semplici “accendi/spegni” il led…
    Ti espongo quindi il mio “problema”:
    Ho a disposizione ArduinoUNO e Arduino MOTOR SHIELD ed ho l’obiettivo che ad ogni pressione di un pulsante io possa avviare la rotazione di un motore a passo bipolare che deve ruotare sempre nello stesso verso e di un numero di step costante e che si deve fermare nel momento in cui raggiunge il n° di step programmati.

    Domande:
    – Con le schede descritte prima è fattibile?
    – Con quali corsi/esercizi mi consigli di cominciare per ottenere questo risultato?

    Grazie

    1. Ciao Alessandro,
      rispondo subito alle due domande:
      1. si è possibile ma non semplicissimo, se dovessi consigliarti una scheda propenderei per un driver tipo easydriver o simili;
      2. il corso più adatto è il mio corso dal titolo “arduino e motorini” il prossimo lo stiamo programmando in questi giorni e lo troverai pubblicizzato sul blog nella sezione corsi.

    • francesco on 20 agosto 2017 at 18:35
    • Reply

    buosera sig. mauro come faccio ad avere una scheda che gestisce due motori a pulsanti ( motori da 2 amp.)

    1. Ciao Francesco,
      dovresti essere più specifico nella richiesta.

    • Francesco on 13 febbraio 2018 at 18:43
    • Reply

    Salve Mauro ho letto con attenzione il tuo post e ti faccio i complimenti su come descrivi in maniera molto chiara i tuoi progetti. Avrei una domanda: vorrei realizzare un progetto dove far partire tramite un temporizzatore un motore 12v lungo un binario ed arrivando a finecorsa tramite switch inverte la tensione per ritornare al punto di partenza fermandosi sempre con uno switch,ripetendo questo ciclo quando il temporizzatore dà un nuovo segnale…è simile a questo tuo progetto però con alcune modifiche da apportare.. Mi puoi suggerire se si può realizzare….Grazie in anticipo

    1. Ciao Francesco,
      puoi intercettare i segnali direttamente dagli switch e gestire le direzioni ed i tempi da Arduino.

        • Francesco on 17 febbraio 2018 at 21:05
        • Reply

        Grazie per avermi risposto,purtroppo ancora non sò come programmare da solo tale concetto…chiederti un aiuto significa chiederti troppo,potresti almeno darmi un suggerimento su dove trovare qualcosa di simile? Io metto tutta la mia volontà ma su come gestire le direzioni sono in mare aperto… Solo con Arduino e gli switch questo è possibile ? O bisogna qualche altro modulo? Ho un modulo dove riesco tramite un pulsante on/off/on a fare ruotare un motore in tutti e due i sensi ma è manuale, io devo applicare lo stesso principio però in automatico… Ti sarei grato di questo aiuto…. grazie ancora Mauro

    • marco on 30 aprile 2018 at 12:09
    • Reply

    Ciao Mauro..sono alla ricerca di uno sketc per controllare un motore passo passo con il driver tb6600. L’esempio sopra citato può andare bene per tale scopo?
    Grazie ciao buon lavoro

    1. Ciao Marco,
      non ne sono certo, io non ho ancora provato il driver TB6600 con i motori passo passo.

  1. […] non sai come collegare i due pulsanti ad Arduino puoi leggere la prima parte di questa serie di […]

  2. […] Mauro Alfieri Tweet Applica le tue conoscenze al tuo progetto! Se hai letto la prima e la seconda parte di questa serie di articoli avrai certamente raggiunto il livello di conoscenza […]

  3. […] francodare Tweet Il titolo è volutamente provocatorio, se ti sono piaciuti i miei articoli sui motori passo-passo sarai ancora più interessato a quello che stai per […]

  4. […] chiesto un consiglio per realizzare il suo progetto, Gianni vuole realizzare qualcosa di simile al motore passo-passo pilotato da interruttori ma con un motore DC ( corrente continua […]

Lascia un commento

Your email address will not be published.

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