Il tuo esperimento con i motori passo-passo bipolari inizia a diventare interessante, se hai seguito i precedenti articoli avrai realizzato il tuo controllo motore passo-passo bipolare con Arduino e un SN754410NE.
Nella quarta parte hai affrontato il problema della velocità di rotazione ed una prima soluzione per risolvere l’inconveniente dovuto ad una eccessiva velocità di successione dei segnali alle bobine che hanno come effetto collaterale la completa immobilità del motore e l’emissione di un sibilo.
L’aracano per evitare tutto questo è l’introduzione di un delay o tempo di ritardo tra una fase e la successiva.
Se il motore vuoi che compia un giro completo in un tempo da te stabilito puoi calcolare prima di impostare lo sketch, ad esempio se vuoi che il tuo motore compia un giro completo in un secondo non hai che da dividere il secondo per le fasi ( passi o step ) che il motore impiega per eseguir un giro completo.
Siccome il delay di Arduino lavora in millisecondi ossia 1 secondo = 1000 millisecondi, se il motore con cui stai lavorando è un 200 step ossia impiega 200 passi per compiere un giro, il calcolo è presto fatto: 1000/200 => 10/2 = 5 millisecondi; imposta quindi a 5 il delay.
Il problema vero è quando non sai a quale velocità devi far ruotare il motore, per cui non puoi calcolare anticipatamente il valore del delay da impostare.
Ed ecco che lo schema in figura:
ti mostra una possibile soluzione, inserendo un potenziometro da 10KΩ, come nello schema potrai regolare la velocità di rotazione mediante lo sketch presentato nella quarta parte di questa serie di articoli con qualche piccola modifica:
#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; int pinPot = 0; void setup() { pinMode(LED, OUTPUT); pinMode(ORARIO, INPUT); pinMode(ANTIOR, INPUT); for (countX=0; countX<4; countX++) { pinMode(motorPinx[countX], OUTPUT); } pinMode(pinPot, INPUT); } void loop() { ora = digitalRead(ORARIO); ant = digitalRead(ANTIOR); int readPot = analogRead( pinPot ); int delayTime = map(readPot,0,1024,10,1000); 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; }
Avrai già visto la modifica da fare, riguarda le linee 12, 22, 28 e 29.
linea 12: definisci una nuova variabile di tipo integer in cui memorizzare il numero di pin a cui hai collegato il pin centrale del potenziometro, nella figura il pin è connesso al pin A0 (analogico 0);
linea 22: è all’interno della funzione setup() per cui è una istruzione di settaggio eseguita all’avvio dello sketch, imposti il pinPot, assegnato alla linea 12, in modalità INPUT indicando ad Arduino di leggere da questo pin i valori analogici che gli saranno inviati attraverso il potenziometro.
linea 28: leggi il valore del potenziometro attraverso il pin 0 analogico, e memorizzi il valore nella variabile readPot;
linea 29: utilizzi la funzione map(valore,valmin,valmax,outputvalmin,outputvalmax) per rimappare dei valori di input su dei valori di output, in pratica questa funzione accetta come primo parametro il valore da rimappare (readPot) il cui valore oscilla tra valmin ( 0 ) e valmax (1024 ) il passaggio da 0 a 1024 è il valore acquisito dal pin 0 in base alla posizione dell’alberino del potenziometro; tale valore viene rimappato in funzione dei valori di output min e max ( parametro 4 e 5 della funzione map ); nell’esempio i valori da 0 a 1024 sono rimappati da 10 a 1000 ma puoi provare a variare questi valori per adattarli al tuo progetto.
Buon divertimento.
Prima di inserire un commento, per favore, leggi il regolamento
61 pings
Skip to comment form