«

»

Feb 01

Stampa Articolo

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.

Permalink link a questo articolo: http://www.mauroalfieri.it/elettronica/motori-passo-passo-bipolari-comandati-da-interruttori-quarta-parte.html

51 comments

Vai al modulo dei commenti

  1. emiliano

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

    1. Mauro Alfieri

      Errore di pubblicazione WP, corretto.

  2. frappaweb

    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. Mauro Alfieri

      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

  3. dario

    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. Mauro Alfieri

      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

  4. dario

    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. Mauro Alfieri

      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

  5. dario

    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. Mauro Alfieri

      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

  6. dario

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

    1. Mauro Alfieri

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

      Mauro

  7. dario

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

    1. Mauro Alfieri

      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

  8. dario

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

    1. Mauro Alfieri

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

      Mauro

  9. dario

    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. Mauro Alfieri

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

      Da cosa nasce questa esigenza?

      Mauro

  10. dario

    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. Mauro Alfieri

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

      Mauro

  11. dario

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

  12. dario

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

    1. Mauro Alfieri

      Ciao Dario, non comprendo che situazione tu abbia.

      Mauro

  13. Dario

    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. Mauro Alfieri

      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.

  14. dario

    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. Mauro Alfieri

      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.

  15. dario

    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. Mauro Alfieri

      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.

  16. dario

    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. Mauro Alfieri

      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.

  17. dario

    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. Mauro Alfieri

      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.

  18. dario

    *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. Mauro Alfieri

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

  19. dario

    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. Mauro Alfieri

      Ottimo Dario.

  20. dario

    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( http://www.mauroalfieri.it/elettronica/tutorial-arduino-servo-con-alimentazione-esterna.html ) ma a quanto pare mi è sfuggito qualcosa.
    Grazie

    Dario

    1. Mauro Alfieri

      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.

  21. dario

    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. Mauro Alfieri

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

  22. dario

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

    1. Mauro Alfieri

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

  23. dario

    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. Mauro Alfieri

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

  24. dario

    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. Mauro Alfieri

      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

  25. JOSE MIGUEL FERNANDEZ

    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. Mauro Alfieri

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

  26. Paolo

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

    1. Mauro Alfieri

      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. I campi obbligatori sono contrassegnati *

Puoi usare i seguenti tag ed attributi HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>