Nel precedente articolo dedicato alla motor shield FE fornita da robot-domestici.it hai imparato a pilotare un motore bipolare con la motor shield, probabilmente i tuoi progetti non sono quelli di farlo ruotare all’infinito ma di controllare la posizione, i giri e i passi che il tuo motore compie.
In questo articolo vedrai come impostare un numero di passi che vuoi far compiere al motore bipolare ed eseguirli.
int motorPinDirA = 2; int motorPinDirB = 8; int motorPinPwmA = 3; int motorPinPwmB = 9; int delayTime = 500; int myStep=10; // 40 passi ( 10 + 4 ) void setup() { pinMode(motorPinDirA, OUTPUT); pinMode(motorPinDirB, OUTPUT); pinMode(motorPinPwmA, OUTPUT); pinMode(motorPinPwmB, OUTPUT); } void loop() { for (int i=1; i<=myStep; i++) { orario(); } for (int i=1; i<=myStep; i++) { antiorario(); } } void orario() { digitalWrite(motorPinDirA, HIGH); digitalWrite(motorPinDirB, LOW); digitalWrite(motorPinPwmA, HIGH); digitalWrite(motorPinPwmB, LOW); delay(delayTime); digitalWrite(motorPinDirA, LOW); digitalWrite(motorPinDirB, HIGH); digitalWrite(motorPinPwmA, LOW); digitalWrite(motorPinPwmB, HIGH); delay(delayTime); digitalWrite(motorPinDirA, LOW); digitalWrite(motorPinDirB, LOW); digitalWrite(motorPinPwmA, HIGH); digitalWrite(motorPinPwmB, LOW); delay(delayTime); digitalWrite(motorPinDirA, LOW); digitalWrite(motorPinDirB, LOW); digitalWrite(motorPinPwmA, LOW); digitalWrite(motorPinPwmB, HIGH); delay(delayTime); } void antiorario() { digitalWrite(motorPinDirA, LOW); digitalWrite(motorPinDirB, LOW); digitalWrite(motorPinPwmA, LOW); digitalWrite(motorPinPwmB, HIGH); delay(delayTime); digitalWrite(motorPinDirA, LOW); digitalWrite(motorPinDirB, LOW); digitalWrite(motorPinPwmA, HIGH); digitalWrite(motorPinPwmB, LOW); delay(delayTime); digitalWrite(motorPinDirA, LOW); digitalWrite(motorPinDirB, HIGH); digitalWrite(motorPinPwmA, LOW); digitalWrite(motorPinPwmB, HIGH); delay(delayTime); digitalWrite(motorPinDirA, HIGH); digitalWrite(motorPinDirB, LOW); digitalWrite(motorPinPwmA, HIGH); digitalWrite(motorPinPwmB, LOW); delay(delayTime); }
Rispetto al codice del primo articolo devi fare una prima importante variazione: definisci due funzioni di tipo void ossia che non prevendono parametri di input o risposta in output; le due funzioni le ho chiamate orario() e antiorario() perchè la prima fa ruotare il motore in senso orario e la seconda in senso antiorario.
Nella prima funzione ho ricopiato il contenuto della loop() del precedente articolo, la spiegazione di ogni riga di codice puoi leggerla li, nella funzione antiorario() ho invece copiato il contenuto della funzione orari() ma ho invertito le funzioni, ossia la prima è diventata la quarta, la seconda -> la terza, la terza -> la seconda e la quarts -> la prima; il gioco è semplice invertendo l’ordine di eccitazione delle fasi il motore ruota in senso inverso al precedente.
Vediamo cosa modificare della funzione loop(): crea due cicli for identici linee 17 e 22, il primo ciclo ad ogni incremento del valore di i chiama la funzione orario() il secondo chiama la funzione antiorario() l’effetto è che il motore esegue prima un numero definito di step in un senso e poi lo steso numero nel senso opposto.
Come ti accennavo lo sketch è dimostrativo quindi potresti aver bisogno solo della rotazione in un senso o di differenti passi in un senso rispetto al senso opposto.
Per indicare al motore quanti step eseguire ho utilizzato la variabile myStep definita alla linea 06, nota il commento se metto 10 il numero di step realmente eseguito è 10 * 4 = 40 questo accade perchè sia la funzione orario() sia la antiorario() eseguono 4 step ogni volta che le invochiamo.
Ci sono dei trucchetti che puoi utilizzare e delle soluzioni alternative per impostare myStep come l’effettivo numero di step che intendi far compiere al motore, ti suggerisco 2 modi:
Semplice
dividi per 4 il valore di myStep: int newMyStep = (myStep / 4); considerando che myStep è una variabile di tipo integer come newMyStep di conseguenza otterrai un valore approssimato per intero es.: 10/4 = 2,5 => 2;
Avanzato
potresti modificare le funzioni orario e antiorario percè accettino in input il numero di step da compiere da 1 a 4, eseguano solo gli step reali e restituisceano in output ( return ) il passo a cui sono arrivati; nella loop dovrai quindi tener presente che se richiami la funzione orario(3) eseguirà i soli primi 3 passi e restituirà 3 come punto di arrivo, se la richiami con orario(2) dovrà partire dal 4° passo eseguire due passi e restituirà 1 perchè 3 +2 = 5 /4 =1,25 => 1.
Buon divertimento
6 commenti
1 ping
Vai al modulo dei commenti
Ciao, mi chiamo Giacomo Saccone e sono uno studente dell’Università di Pisa.
Sto cominciando un’attività di laboratorio, e ho bisogno di controllare tramite pc due motori passo passo bipolari per muovere due slitte micrometriche.
Ho seguito i tuoi tutorial sul sito, e sono stato in grado di comandare tramite motorshield_fe e arduinoUNO un motore bipolare (a cominciato a girare all’infinito e variano il delaytime ho imparato a regolarne la velocità).
Volevo chiederti se è possibile creare una procedura semplice per far compiere al motore un singolo giro, o parte di giro.
Tra gli esempi del software arduino1.0.1 c’è un programma: stepper one revolution, che però non funziona con la motorshield o comunque richiama un altro programma (mystepper) che non riesco a vedere…
Grazie,
Giacomo
Autore
Ciao Giacomo,
ho inserito sul blog la tua richiesta di consigli perché fosse condivisa con tutti gli appassionati arduino.
L’articolo in cui l’ho inserita dovrebbe essere compatibile con quello che vuoi realizzare, imposti il numero di step per giro e lo sketch li esegue, leggi bene la spiegazione per calcolarti il valore da inserire.
Mauro
Ciao Mauro e grazie dell’ aiuto che mi stai dando.
Ho letto i tuoi articoli e sto trovando delle difficoltà con uno stepper e l’integrato ULN2003A. L’ho collegato rispettando l’ordine degli avvolgimenti ma il motore fa 3 step avanti e 2 indietro, e in ogni caso applicando una forza al albero non dimostra di avere i 90N/cm per cui l’ho acquistato. Ora mi chiedo se con una motor shield FE risolverei il problema che imputo all’alimentazione.
Grazie per un eventuale delucidazione.
Autore
Ciao Marco,
il motore è unipolare o bipolare?
il comportamento che mi segnali mi fa pensare che i collegamenti non sono corretti o che stai utilizzando uno sketch non adatto.
La motor shield fe va benissimo se il tuo motore è bipolare, se non la possiedi già io ti consiglio di leggere gli articoli sull’easydriver una scheda dal costo inferiore con grandi potenzialità e con soli 2 pin arduino puoi pilotare un motore stepper bipolare.
Ciao
Ciao Mauro,
Mi sto avvicinando ora al mondo arduino, nella mia testa ho in mente di creare una cnc 5 assi o un braccio robotico a 7 assi… utilizzando motori stepper
Volevo chiederti:
Quanti motor shield fe posso utilizzare contemporaneamente con una board arduino uno ?
Quale shield mi consigli o se hai dei suggerimenti
Grazie in anticipo
Gianni
Autore
Ciao Gianni,
sei alquanto lontano dallo studio di fattibilità del progetto, se dovessi realizzare una cnc a 5 assi andrei su qualcosa di più strutturato come una scheda per stampanti 3d che già dispone di 5 driver di controllo.
[…] parte dello sketch è descritto in questo mio precedente articolo, le differenze principali riguardano due nuove funzioni che trovi in fondo, ma parti con […]