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.
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.
51 commenti
Vai al modulo dei commenti
ciao mauro,non so se dipende dal mio pc, ma della quarta parte c’è solo il titolo ciao
Autore
Errore di pubblicazione WP, corretto.
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
Autore
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
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
Autore
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
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
Autore
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
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
Autore
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
credo che purtroppo i due sketch siano troppo differenti per fa si che un confronto possa aiutarmi …
Autore
Ciao Dario,
puoi allora eseguire un debug usando il Serial.print e il monitor seriale.
Mauro
potresti spiegarmi velocemente di cosa si tratta …
credo di essermi perso la spiegazione…
grazie
dario
Autore
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
ti ringrazio se deciderai di aiutarmi nel trovare un articolo che parla del serial.print
grazie
dario
Autore
Ciao Dario,
Ne é pieno il blog, parti dal corso base on-line gratuito già dalle prime lezioni é descritto e usato.
Mauro
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
Autore
Ciao Dario,
sei il primo che mi segnala la necessità di collegare arduino ad una porta precisa.
Da cosa nasce questa esigenza?
Mauro
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
Autore
Ciao Dario,
sei sicuro che la Arduino sia connesso alla COM3?
Dal messaggio sembra che non ci sia Arduino collegato a quella porta.
Mauro
non riesco a capire quale sia la com 3 …
ora prova ad usare l’ altro pc e ti faccio sapere..
Grazie
Dario
ho problemi con l altro pc
quindi per ora sto brancolando nel buio
Autore
Ciao Dario, non comprendo che situazione tu abbia.
Mauro
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
Autore
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.
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.
Autore
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.
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
Autore
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.
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
Autore
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.
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
Autore
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.
*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
Autore
Ciao Dario,
non ho compreso cosa tu abbia fatto !!!
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
Autore
Ottimo 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( https://www.mauroalfieri.it/elettronica/tutorial-arduino-servo-con-alimentazione-esterna.html ) ma a quanto pare mi è sfuggito qualcosa.
Grazie
Dario
Autore
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.
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
Autore
Ciao Dario, attento al + del circuito e delle alimentazioni ogni alimentazione deve essere collegata al solo circuito da alimentare.
Solo il Gnd è comune.
Ciao Mauto ,
ma è normale che il mio At Mega non voglia scollarsi da Arduino ?
Autore
Ciao Dario,
può darsi che sia molto legato ala scheda 🙂
Scherzi a parte devi insistere per volerlo separare.
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
Autore
Ciao Dario,
la procedura dovrebbe funzionarti comunque, prova a verificare se nel forum arduino ci siano dettagli maggiori.
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 )
Autore
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
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.
Autore
Gracias José por los elogios.
He escrito artículos sobre los codificadores rotatorios que se puede consultar para construir su proyecto con motor diesel
Salve mauro, volevo sapere se questo programma è compatibile con il L298
Cordiali saluti
Autore
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