Stepper 28BYJ-48 sketch variabile segue i due precedenti articoli dedicati al motore passo-passo 28BYJ-48.
In particolare in questo articolo ho deciso di utilizzare altri due pulsanti, connessi sempre in matrice, per regolare la velocità del motore.
Puoi leggere i due precedenti articoli qui:
Stepper 28BYJ-48 arduino sketch
in cui sono descritti prima le caratteristiche del motore e del driver e poi uno sketch di esempio per controllarlo con due pulsanti.
Notice
il metodo di controllo, come quello di modifica della velocità di rotazione, che leggerai oggi, non sono solo per il motore 28BYJ-48; potrai applicarli a tutti i motori di tipo passo-passo per i tuoi progetti.
Tornando allo stepper 28BYJ-48 sketch variabile iniziamo con aggiungere due pulsanti allo schema che già conosci.
Circuito di controllo per lo stepper 28BYJ-48 sketch variabile
allo schema originale aggiungi quindi due pulsanti che userai per cambiare la velocità di rotazione del motore:
i primi sue pulsanti, quelli sulla sinistra, li userai per avviare la rotazione in senso orario o antiorario ed i due aggiunti li userai per variare la velocità.
Prima di passare allo sketch
Un passaggio importante è capire e segnare tutti i valori letti alla pressione di ciascun pulsante, questo metodo ti permette di distinguere quale pulsante stai premendo.
La lettura dei pulsanti avviene, in questo esempio, attraverso il pin A0 e con l’utilizzo del comando analogRead().
Puoi utilizzare uno degli esempi presenti nell’IDE Arduino, ad esempio: AnalogReadSerial:
/* AnalogReadSerial Reads an analog input on pin 0, prints the result to the Serial Monitor. Graphical representation is available using Serial Plotter (Tools > Serial Plotter menu). Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground. This example code is in the public domain. http://www.arduino.cc/en/Tutorial/AnalogReadSerial */ // the setup routine runs once when you press reset: void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); } // the loop routine runs over and over again forever: void loop() { // read the input on analog pin 0: int sensorValue = analogRead(A0); // print out the value you read: Serial.println(sensorValue); delay(1); // delay in between reads for stability }
che è già pronto per leggere dal pin A0 e mostrarti i dati sul monitor seriale.
Eseguito l’upload su arduino non devi far altro che aprire il monitor seriale, premere uno alla volta i pulsanti e segnare per ciascun pulsante il valore letto.
Nel mio caso i valori letti sono stati:
- nessun bottone premuto: 1023
- pressione del bottone 1: 512
- pressione del bottone 2: 683
- pressione del bottone 3: 768
- pressione del bottone 4: 820
Ora che conosci i tuoi valori potrai scrivere in modo semplice il tuo stepper 28BYJ-48 sketch variabile.
Stepper 28BYJ-48 sketch variabile
Lo sketch che ti propongo oggi è identico a quello visto nell’articolo di Lunedì solo con la differenza di due linee aggiunte:
#define A 2 #define B 3 #define C 4 #define D 5 #define button A0 // no 1023, 1 - 512, 2 - 683, 3 - 768, 4 - 820 #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); } if (analogRead(button) >= 730 && analogRead(button) <= 780) { us +=10; delay(100); Serial.println( us );} if (analogRead(button) >= 800 && analogRead(button) <= 840) { us -=10; delay(100); Serial.println( us );} } 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); }
le due linee aggiunte sono:
if (analogRead(button) >= 730 && analogRead(button) <= 780) { us +=10; delay(100); Serial.println( us );} if (analogRead(button) >= 800 && analogRead(button) <= 840) { us -=10; delay(100); Serial.println( us );}
la linea 38 e la linea 39.
La prima delle due valuta la pressione del terzo pulsante ed incrementa di 10 il valore della variabile us attendendo, sempre come metodo di anti rimbalzo per il pulsante 100 millisecondi.
Il valore di us sarà trasferito al monitor seriale dopo essere stato impostato.
La linea 39 si comporta in modo del tutto analogo valutando la pressione del secondo pulsante e decrementando us di 10 ad ogni pressione.
In questo modo potrai variare il tempo che intercorre tra l’eseguzione di una fase e la successiva ottenendo una variazione della velocità di rotazione.
Conclusioni e suggerimenti
Noterai, usando lo stepper 28BYJ-48 sketch variabile che al di sotto di un certo valore di microsecondi il motore non si muove: questo è causato dall’eccessiva velocità a cui i comandi arrivano alle fasi a cui il motore non riesce a dare seguito in modo corretto.
Un altro effetto che noterai è che a fase molto veloci corrisponde una inferiore coppia sviluppata e che diminuendo la velocità di esecuzione la velocità diminuisce a vantaggio della coppia sviluppata.
Prova e sperimenta con i motori passo-passo come questo e restituiscimi un feedback nei commenti.