Motori passo-passo bipolari comandati da interruttori – quarta parte

In questi giorni ho fatto numerosi esperimenti con i motori passo-passo bipolari per porter scrivere nuovi articoli e sto preparando una sorpresa che, spero, troverai interessante.

Motori passo-passo bipolari con Arduino e SN754410NE

In questo articolo prendo spunto dal commento alla terza parte di questa serie di articoli da parte di un appassionato come te e me. Il problema di cui mi ha reso partecipe è che collegando il motore e caricato lo sketch esso emette un sibilo e non si muove.

Il sibilo emesso dal motore mi ha fatto subito pensare che il mancato movimento fosse un effetto collaterale dell’elevata velocità di rotazione, sembra un controsenso, in realtà il motivo per cui il motore non fa ruotare l’albero è che la sequenza dei segnali che si alternano per la rotazione sono talmente veloci che l’albero motore non riesce a spostarsi di uno step prima che l’avvolgimento precedente sia eccitato e lo forzi a restare fermo.

Te ne puoi rendere conto utilizzando lo sketch presentato in questo articolo e impostando il delayTime a 0, anche il tuo motore resterà fermo ed emetteva un sibilo.

Ed ecco quindi la soluzione, o almeno un primo rimedio, che puoi apportare allo sketch per regolare quello che chiamerei “tempo di rotazione” ossia il delayTime.

In questo articolo lo imposterai fisso a 100 millisecondi o potrai variarlo da codice, in un prossimo articolo potrai regolarlo con  l’aiuto di un potenziometro.

Ecco lo sketch, modificato:

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

int motorPinx[] = {8, 9, 10, 11};
int sequenza[] = {1,3,2,4};
int countX  = 0;
int count2X = 0;
int ora = 0;
int ant = 0;
int delayTime = 100;

void setup() {
  pinMode(LED, OUTPUT);
  pinMode(ORARIO, INPUT);
  pinMode(ANTIOR, INPUT);
  for (countX=0; countX<4; countX++)
  {
    pinMode(motorPinx[countX], OUTPUT);
  }
}  

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

  if (ora == HIGH) {
    orario();
  }  

  if (ant == HIGH) {
    antiorario();
  }
  delay(delayTime);
}

void orario()
{
  int val = LOW;
  for (countX=0; countX<4; countX++)
  {
    if (countX == sequenza[count2X]) val = HIGH;
    else                             val = LOW;

    digitalWrite(motorPinx[countX], val);
  }
  count2X++;
  if (count2X == 4) count2X = 0;
}

void antiorario()
{
  int val = LOW;
  for (countX=3; countX>=0; countX--)
  {
    if (countX == sequenza[count2X]) val = HIGH;
    else                             val = LOW;

    digitalWrite(motorPinx[countX], val);
  }
  count2X--;
  if (count2X < 0) count2X = 3;
}

La modifica che devi apportare è semplicissima, definisci una variabile di tipo integer denominata delayTime dal valore fisso di 100, equivalente a 100 millisecondi: linea 11;

aggiungi quind la line a di codice 34: delay(delayTime); con questa definizione ad ogni ciclo di loop(), sia esso orario o antiorario tra uno step ed il successivo hai impostato un tempo di attesa di 100millisecondi che danno tempo all’alberino di posizionarsi al nuovo step prima di eccitare la bobina successiva e così fino a completare il giro.

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/motori-passo-passo-bipolari-comandati-da-interruttori-quarta-parte.html

51 commenti

Vai al modulo dei commenti

    • emiliano il 1 Febbraio 2012 alle 23:37
    • Rispondi

    ciao mauro,non so se dipende dal mio pc, ma della quarta parte c’è solo il titolo ciao

    1. Errore di pubblicazione WP, corretto.

  1. Ciao Mauro, scusa se ti disturbo nuovamente ma questo sketch non mi funziona, non riesco a capire un passaggio. Nelle funzioni orario antiorario a mio parere manca qualche cosa. Dopo aver portato la variabile val = HIGH non bisognerebbe scriverla sul pin nel seguente modo digitalWrite(motorPinx[countX], val);

    Saluti e grazie

    1. Ciao Franco, ciò che scrivi è corretto infatti alle linee 45 per la funzione orarrio() e 59 per la funzione antiorario() avviene quello che scrivi.

      Mauro

    • dario il 9 Novembre 2013 alle 15:29
    • Rispondi

    ciao , oggi volevo chiederti come riolvere un piccolo problema:
    una volta caricato lo sketch il motore al posto di ruotare compie piccolissimi archetti come se tremasse e non riesco a capire dovepossa essere il problema
    grazie
    Dario

    1. Ciao Dario,
      non mi è chiaro che comportamento ha il motore, cosa intendi per piccoli archetti?
      Se ti riferisci a qualche passo in avanti e qualche passo indietro è certamente un errore di connessione delle fasi.

      Mauro

    • dario il 11 Novembre 2013 alle 18:09
    • Rispondi

    si, è esattamente come dici tu m, ma se carico lo sketch del primissimo articolo sui motori passo passo bipolari funziona.
    credi sia lo stesso problema riguardante le fasi ?
    Grazie
    Dario

    1. Ciao Dario,
      se caricando uno sketch differente il motore gira puoi verificare tra i due sketch cosa cambia per la parte di gestione delle fasi.
      Controlla anche che i tempi tra le fasi siano sufficienti a far ruotare il motore in modo corretto, a volte tempi troppo ristretti causano apparenti malfunzionamenti.

      Mauro

    • dario il 13 Novembre 2013 alle 09:54
    • Rispondi

    Non mi sono ben chiare due cose :
    non riesco a capire dove e come posso modificare la parte di sketch riguardante
    la gestione delle fasi
    potresti specificare più o meno la riga che posso modificare ( riguardante le fasi ovviamente )
    scusa l’ignoranza ma a quanto pare mi son perso in un bicchier d’acqua 🙂
    grazie in anticipo.
    Dario

    1. Ciao Dario,
      ti ho suggerito di fare un confronto tra lo sketch che funziona e quello che presenta un comportamento anomalo per verificare se la differenza è causa del tuo problema, non c’è una riga specifica da modificare.

      Mauro

    • dario il 19 Novembre 2013 alle 13:35
    • Rispondi

    credo che purtroppo i due sketch siano troppo differenti per fa si che un confronto possa aiutarmi …

    1. Ciao Dario,
      puoi allora eseguire un debug usando il Serial.print e il monitor seriale.

      Mauro

    • dario il 24 Novembre 2013 alle 18:33
    • Rispondi

    potresti spiegarmi velocemente di cosa si tratta …
    credo di essermi perso la spiegazione…
    grazie
    dario

    1. Ciao Dario,
      l’articolo é composto da più parti, questa é una sola di quelle.
      Leggi tutto l’articolo partendo dalla prima parte e capirai cosa stai realizzando.

      Mauro

    • dario il 26 Novembre 2013 alle 17:12
    • Rispondi

    ti ringrazio se deciderai di aiutarmi nel trovare un articolo che parla del serial.print
    grazie
    dario

    1. Ciao Dario,
      Ne é pieno il blog, parti dal corso base on-line gratuito già dalle prime lezioni é descritto e usato.

      Mauro

    • dario il 27 Novembre 2013 alle 17:17
    • Rispondi

    grazie della risposta ma è sorto un altro problema più serio…
    quando collego arduino al pc e cerco di caricare il programma mi esce come porta seriale solo la com 3 , ma io ho bisogno della com 4…
    ho gia installato e reinstallato arduino ei rispettivi driver mille volte …
    non so che fare .
    grazie
    dario

    1. Ciao Dario,
      sei il primo che mi segnala la necessità di collegare arduino ad una porta precisa.

      Da cosa nasce questa esigenza?

      Mauro

    • dario il 28 Novembre 2013 alle 17:26
    • Rispondi

    nasce dal fatto che selezionando la com 3 , a qualunque entrata colleghi arduino esce un messaggio di errore ( not in sync ….) sapresti dirmi cosa posso fare per risolvere il problema ?
    Grazie
    Dario

    1. Ciao Dario,
      sei sicuro che la Arduino sia connesso alla COM3?
      Dal messaggio sembra che non ci sia Arduino collegato a quella porta.

      Mauro

    • dario il 28 Novembre 2013 alle 18:14
    • Rispondi

    non riesco a capire quale sia la com 3 …
    ora prova ad usare l’ altro pc e ti faccio sapere..
    Grazie
    Dario

    • dario il 28 Novembre 2013 alle 18:44
    • Rispondi

    ho problemi con l altro pc
    quindi per ora sto brancolando nel buio

    1. Ciao Dario, non comprendo che situazione tu abbia.

      Mauro

    • Dario il 24 Aprile 2014 alle 14:29
    • Rispondi

    Ciao Mauro ,
    é da molto tempo che non scrivo sui tuoi blog , e oggi ho una domanda da porti : io ho 2 motori bipolari con le seguenti caratteristiche:
    2.4V per fase
    2.0A per fase
    l’integrato sn754410ne potrebbe andare bene ?
    se no potresti consigliarmi un tuo blog o un altra pagina con un altro driver (con relativo tutorial se possibile)
    Grazie in anticipo,
    Dario

    1. Ciao Dario,
      fino a 2A per fase non ci sono grandi problemi puoi usare l’esayDriver o uno dei driver della Pololu.
      Per il motore con 2.4A ti consiglio la BigEasyDriver o il Pololu md20A

      Di tutti trovi degli articoli molto interessanti sul blog.

    • dario il 1 Maggio 2014 alle 20:26
    • Rispondi

    Ciao Mauro ,
    Durante le mie sperimentazioni mi è giunto un problema …
    Vorrei riuscire a controllare 5 motori passo passo bipolari tramite due pulsanti ( ciascuno , per permettergli una rotazione in senso orario e antiorario ) e un potenziometro ciascuno per il controllo della velocità ;
    Tuttavia utilizzando arduino e l’integrato SN754410NE posso controllare al massimo 2 motori passo passo ( utilizzano 4 pin per motore e 2 per ogni pulsante ).
    La domanda è la seguente : Potresti consigliarmi un driver o più probabilmente una shield ( se possibile con un tuo tutorial ) che mi permetta di comandare 5 motori passo passo ?

    Grazie Dario.

    1. Certo Dario, io consiglio sempre di usare un driver tipo Easy Driver o uno della Pololu che con soli 2 pin ti permettono di controllare un motore passo-passo.

      Ho scritto molti tutorial su questi driver che ti consiglio di leggere per scegliere quello più adatto al tuo progetto.

    • dario il 2 Maggio 2014 alle 16:33
    • Rispondi

    Ciao Mauro ,
    Scusa per l’ennesima domanda , ma questa volta sarò breve :
    ho dei motori bipolari che assorbono 0.4 A per fase e 12 V per fase , posso alimentarli con un pacco batterie da 8 stilo( di tipo AA , 1,5 V ) ?
    Grazie in anticipo

    Dario

    1. Ciao Dario,
      purché tu usi 12v ed il driver lo supporti puoi usare come fonte di alimentazione qualsiasi a tua disposizione.
      Certo 8 pile di tipo AA non dureranno molto.

    • dario il 3 Maggio 2014 alle 16:55
    • Rispondi

    Ciao mauro ,
    Durante le sperimentazioni con l’uso di un alimentatore esterno arduino si è bloccato , e il led TX non lampeggia più quando carico un qualsiasi programma ( al contrario del led rx , inoltre il led L collegato al pin 13 lampeggia costantemente ) ho già provato ad eseguire la manovra di emergenza ma non è servita a nulla
    spero che tu possa aiutarmi , perchè mi sto un po preccupando ;
    spero di non avere rovinato arduino 🙁

    Grazie ,
    Dario

    1. Ciao Dario,
      qual’è la manovra di emergenza ? non la conosco.
      Potresti aver cancellato il bootloader arduino e questo causa l’impossibilità di inviare nuovi codici alla scheda arduino.
      Prova a seguire un tutorial su come trasferire il bootloader su arduino.

    • dario il 4 Maggio 2014 alle 15:22
    • Rispondi

    Ciao Mauro,
    ho anche fatto questo test ( http://forum.arduino.cc/index.php?topic=73748.0 ) che ho trovato sul sito di arduino con esito positivo , ed ho tirato un sospiro di sollievo …
    ma ora non so cosa fare poichè non ho trovato altre indicazioni se non insistere con la manovra di emergenza che però ho già provato mooolte volte senza ottenere risultati .
    scusa per il disturbo .

    Dario

    1. Ciao Dario,
      questo è un test di comunicazione seriale, se è andato a buon fine non dovresti aver difficoltà a inviare uno sketch alla tua Arduino.
      Ti consiglio di provare lo sketch blink presente negli esempi arduino.

    • dario il 4 Maggio 2014 alle 18:56
    • Rispondi

    *piccolo dettaglio :
    il problema è saltato fuori dopo che ho provato ad alimentare uno stepper ( e pulsanti ) con un alimentatore da 12V e 0.5A collegando il positivo dell’alimentatore sulla breadboard (pin 8 dell’sn754410ne e ai pulsanti)il negativo dell’alimentatore al gnd di arduino e il gnd di arduino sulla breadboard (resistenze dei pulsanti e rispettivi pin dell’sn754410ne ) il +5v l’ho lasciato scollegato.
    mi sembrava giusto specificare…

    Dario

    1. Ciao Dario,
      non ho compreso cosa tu abbia fatto !!!

    • dario il 5 Maggio 2014 alle 16:07
    • Rispondi

    Ciao Mauro,
    La manovra di emergenza serve per sbloccare Arduino quando e bloccato sulla seriale…
    sull Arduino forum ci sono le istruzioni..
    ho già provato a usare lo sketch blink ma non funziona…
    proverò a ripristinare il bootloader
    grazie

    Dario

    1. Ottimo Dario.

    • dario il 5 Maggio 2014 alle 16:32
    • Rispondi

    Ciao Mauro ,
    in attesa che arrivi un altra scheda arduino uno rev3 potresti spiegarmi in breve i collegamenti per l’alimentazione esterna di un motore bipolare comandato da pulsanti ?
    dal precedente commento credo che si capisca che sono andato un po in tilt :).
    avevo guardato un tuo tutorial sull’alimentazione esterna di uno o più servo( https://www.mauroalfieri.it/elettronica/tutorial-arduino-servo-con-alimentazione-esterna.html ) ma a quanto pare mi è sfuggito qualcosa.
    Grazie

    Dario

    1. Ciao Dario,
      il tutorial che citi è proprio quello che ti avrei suggerito come esempio.
      Il concetto è semplice il polo negativo, gnd o comune, di ogni alimentazione deve essere “comune” a entrambi i circuiti.

      Nessun altro collegamento deve incrociarsi.

    • dario il 5 Maggio 2014 alle 19:10
    • Rispondi

    Ciao Mauro ,
    è proprio quello che ho fatto io , coolegare al gnd di arduino il meno dell’alimentazione e il gnd di arduino a sua volta l’ho collegato alla breadboard ( così come il più dell’alimentazione esterna)…
    eppure i miei problemi sono cominciati da li…
    comunque adesso farò diverse prove non appena trasferirò il bootloader , ti farò sapere.
    Grazie

    Dario

    1. Ciao Dario, attento al + del circuito e delle alimentazioni ogni alimentazione deve essere collegata al solo circuito da alimentare.
      Solo il Gnd è comune.

    • dario il 6 Maggio 2014 alle 18:15
    • Rispondi

    Ciao Mauto ,
    ma è normale che il mio At Mega non voglia scollarsi da Arduino ?

    1. Ciao Dario,
      può darsi che sia molto legato ala scheda 🙂
      Scherzi a parte devi insistere per volerlo separare.

    • dario il 6 Maggio 2014 alle 19:21
    • Rispondi

    Ciao Mauro ,
    scusa per la domanda stupida di prima 🙂 …
    sul sito di arduino ho trovato un tutorial dove viene spiegato come caricare il bootloader su un atmega328p …
    c’e scritto di selezionare come tipo di scheda arduino 2009 o nano w/atmega328p..
    avendo io arduino uno rev3 devo comunque selezionare quei determinati tipi di arduino ?
    ne ho comprato uno nuovo di arduino rev3 e volevo usare quello per caricare il bootloader sull’altro atmega ..
    Grazie,

    Dario

    1. Ciao Dario,
      la procedura dovrebbe funzionarti comunque, prova a verificare se nel forum arduino ci siano dettagli maggiori.

    • dario il 7 Maggio 2014 alle 14:47
    • Rispondi

    Ciao Mauro ,
    inoltre ho comprato dei condensatori elettrolitici da 22 uf come descritto nel tutorial su come caricare il bootloader( nel quale non è specificato il voltaggio ) …
    sui condensatori c’è scritto 63V , conta solo il valore in farad oppure devo trovare dei condensatori a 5V ?( per ora in giro non ne ho visti sotto i 50 V )

    1. Ciao Dario,
      vanno bene i condensatori che hai acquistato.
      E’ importante che il voltaggio massimo supportato sia superiore a quello che tu gli applicherai e di certo 63v è maggiore di 5v

    • JOSE MIGUEL FERNANDEZ il 28 Settembre 2014 alle 08:44
    • Rispondi

    Mi estimado Mauro Alfieri, muy agradecido por tus conocimientos compartidos, estoy explorando un poco mas en la programacion con Arduino, y estoy fascinado por lo que se puede hacer. He estado leyendo tu literatura respecto del control del giro de un motor mediante pulsadores, y me parece muy interesante, y gratificante seguir aprendiendo. Ahora, me gustaría saber cómo podria realizar un codigo para el control de rotacion de un motor a velocidad fija, pero que esté controlado por un codificador Giratorio, aquellos de 5 salidas, y ademas tenga un sensor de posicion o de giro para indicar en qué nivel de aceleracion se encuentra; pues deseo aplicarlo para poder controlar la aceleracion, desaceleracion de un motor diesel , así como tambien controlar el encendido y apagado.
    Estaré muy agradecido por el apoyo que me pudiera dar en la resolucion de este caso.

    1. Gracias José por los elogios.
      He escrito artículos sobre los codificadores rotatorios que se puede consultar para construir su proyecto con motor diesel

    • Paolo il 23 Aprile 2015 alle 16:02
    • Rispondi

    Salve mauro, volevo sapere se questo programma è compatibile con il L298
    Cordiali saluti

    1. Ciao Paolo,
      non lo ricordo con precisione ma direi che non è adatto al L298 in quanto tale integrato è più indicato per i motori DC che per i passo-passo

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.