Lo Stepper 28BYJ-48 arduino sketch segue il precedente articolo dedicato a questo motore stepper.
è passato un mese dal mio precedente articolo e mi spiace tu abbia atteso tanto, sappi che ho preparato un progetto intero in questo mese e che pubblicherò a breve.
Tornando a questo motore hai letto, in questo articolo, come eseguire i collegamenti elettronici tra motore, driver arduino e due pulsanti.
Adesso è ora di programmare lo sketch arduino per riprodurre quello cha hai già visto in questo video:
ossia controllare la rotazione del motore stepper 28BYJ-48 con arduino e due pulsanti.
Schema di collegamento
riporto lo schema dei collegamenti per permetterti di avere nello stesso articolo sia lo schema elettronico sia lo stepper 28BYJ-48 arduino sketch:
i dettagli sui collegamenti e lo schema realizzato li trovi nel precedente articolo ( vedi link sopra ).
Descrizione degli step per rotazione
Prima di iniziare voglio premettere alcune informazioni che ti potranno essere utili per comprendere meglio lo schema.
Tali informazioni le hai già lette nel precedente articolo ma probabilmente non le hai messe in relazione tra loro; partiamo dal valore di angolo per step che abbiamo definito come descritto in questo articolo ben fatto:
- l’angolo per step: 0.17578° per step intero ( full mode ) o 0.08789° se controllato a mezzo step (half step);
poi prendi in considerazione la modalità in cui andrai a controllare il tuo mootre, io ho scelto la seconda “half step” per cui:
- IN1-IN2-IN3-IN4: “1000”, “1100”, ”0100”, ”0110″, ”0010”, ”0011”, “0001”, “1001” per il mezzo passo;
sempre dal medesimo post indicato e riportato anche nel mio blog.
Il valore che ti serve per impostare lo sketch è il numero di step da eseguire per ciascuna rivoluzione, per farlo puoi eseguire il segunete calcolo:
360 gradi / numero di comandi per il 1/2 passo / andolo di step in half step = 360 / 8 / 0.08789 = 512 arrotondando per difetto
Ora che conosci queste informazioni puoi scrivere il tuo sketch.
Stepper 28BYJ-48 arduino sketch
Passiamo a scrivere e commentare il codice:
#define A 2 #define B 3 #define C 4 #define D 5 #define button A0 // no 1023, 1 - 512, 2 - 683 #define NUMBER_OF_STEPS_PER_REV 512 int us=1000; void setup() { Serial.begin( 115200 ); pinMode(A,OUTPUT); pinMode(B,OUTPUT); pinMode(C,OUTPUT); pinMode(D,OUTPUT); } void loop(){ int i=0; if (analogRead(button) >= 500 && analogRead(button) <= 530) { while(i<NUMBER_OF_STEPS_PER_REV) { forwardStep(); i++; } delay(200); } if (analogRead(button) >= 650 && analogRead(button) <= 700) { while(i<NUMBER_OF_STEPS_PER_REV) { backwardStep(); i++; } delay(200); } } void write(int a,int b,int c,int d){ digitalWrite(A,a); digitalWrite(B,b); digitalWrite(C,c); digitalWrite(D,d); } void forwardStep(){ Serial.println( "halfStep" ); write(1,0,0,0); delayMicroseconds(us); write(1,1,0,0); delayMicroseconds(us); write(0,1,0,0); delayMicroseconds(us); write(0,1,1,0); delayMicroseconds(us); write(0,0,1,0); delayMicroseconds(us); write(0,0,1,1); delayMicroseconds(us); write(0,0,0,1); delayMicroseconds(us); write(1,0,0,1); delayMicroseconds(us); } void backwardStep(){ Serial.println( "reverseStep" ); write(1,0,0,1); delayMicroseconds(us); write(0,0,0,1); delayMicroseconds(us); write(0,0,1,1); delayMicroseconds(us); write(0,0,1,0); delayMicroseconds(us); write(0,1,1,0); delayMicroseconds(us); write(0,1,0,0); delayMicroseconds(us); write(1,1,0,0); delayMicroseconds(us); write(1,0,0,0); delayMicroseconds(us); }
Descrizione Stepper 28BYJ-48 arduino sketch
le linee 01-04 definiscono i pin a cui è connesso il driver che controllerà il motore, ricorda che si tratta du ULN2003;
la linea 05 imposta il pin su cui leggerai in analogico il valore del pulsante, sfruttando il collegamento a matrice per i pulsanti.
Notice
prima di scrivere questo codice ti consiglio di provare il pulsante leggendo i suoi valori con un semplice sketch di analogRead sul pin A0. Poi segna in un commento i valori letti quando nessun pulsante è premuto, quando premi il primo e quando premi il secondo.
Warning!
i valori riportati nello sketch sono quelli che io ho verificato nel mio circuito ma non è detto che siano coincidenti con i tuoi.
linea 07: imposti il numero di step necessari per compiere un diro intero dell’albero motore, nel nostro caso 512, il valore calcolato nel paragrafo precedente;
linea 08: imposta un valore in microsecondi che passerà tra una fase e la successiva, capirai meglio leggendo il resto dell’articolo;
le linee 10-16 impostano la funzione di setup e la modalità di OUTPUT per i pin di controllo dello stepper 28BYJ-48 arduino sketch;
nella funzione loop che inizia alla linea 18 imposti una variabile di tipo int chiamata “i”;
alla linea 21 controlli che i valori analogici letti sul pin A0 siano compresi tra 500 e 530, come sai 512 equivale al valore di pressione del primo pulsante per cui se leggi un valore compreso tra 500 e 530 sai che è stato premuto il primo bottone;
linea 22: inizia un ciclo while fino a che il valore di “i” non sarà identico a quello del numero di step da eseguire.
linee 23-24 per ciascun passaggio del ciclo while appena creato esegui la funzione forwardStep() ed incrementa i di uno in modo da segnare che hai eseguito un altro passo. In realtà 1/2 passo;
linea 26: attendi 200millisecondi prima di passare nuovamente ad eseguire i comandi nella loop() questo è necessario per avere un minimo di effetto anti rimbalzo sul pulsante.
linee 30-36: esegui il medesimo controllo delle linee 21-27, appena viste, a cui l’unica modifica è il richiamo della funzione backwardStep();
le linee 39-44 definiscono la funzione write() il cui scopo è semplicemnete passare ai pin del driver la sequenza di valori che riceve in imput come a,b,c e d che vedrai tra poco;
linea 46 imposta la funzione forwardStep() il cui scopo è far girare il motore in senso orario;
lineea 48: richiama la funzione write() passandole la prima sequenza di 0 e 1 da inciare allo stepper 28BYJ-48 mediante l’arduino sketch. Questa sequenza è definita nel paragrafo precedente e te la riporto per comodità:
- IN1-IN2-IN3-IN4: “1000”, “1100”, ”0100”, ”0110″, ”0010”, ”0011”, “0001”, “1001” per il mezzo passo;
ossia passeremo al motore in successione i segnali:
- 1000
- 1100
- 0100
- 0110
- 0010
- 0011
- 0001
- 1001
avrai notato che sono esattamente i comandi in sequenza delle linee 48-55;
in ciascuna delle linee 48-55 dopo il richiamo della funzione write() è impostato un delay in microsecondi del valore di us impostato alla linea 08 che definisce quanto tempo quella sequenza di segnali deve rimanere sul driver prima di passare al successivo.
Conclusione e suggerimenti
Avrai intuito che il delay definisce anche la velocità di rotazione del motore ma ciò di cui devi tener conto è che definisce anche la coppia che il motore sviluppa e che tale coppia è inversamente proporzionale alla velocità.
Ho verificato che con us impostato sotto alla soglia di 700 il motore gira ma la coppia è molto bassa;
Tornando allo sketch le linee 58-68 eseguono le medesime operazioni di step ma in sequenza inversa e questo determina la rotazione in senso antiorario.
Proveremo a variare il valore di us mediante altri due pulsanti e verificare gli effetti sul motore stesso nei prossimi articoli dedicati allo stepper 28BYJ-48 arduino sketch.