vorrei controllare un motore passo passo con un potenziometro in modo che andando a girare questo giri di conseguenza anche il motore.
ho fatto questo sketch:
const byte DIR = 2; // pin direzione
const byte STEP = 3; // pin step
const byte pot = 5; // pin potenziometro
int potval = 0; // valore letto dal potenziometro
int prev_potval = 0; // valore precedente letto dal potenziometro
int ppstep = 0; // numero di passi del motore
boolean dirval = true; // flag direzione step
void setup(){
pinMode(DIR, OUTPUT);
pinMode(STEP, OUTPUT);
}
void stepRoutine() { // funzione movimento motore
digitalWrite(STEP, HIGH);
delayMicroseconds(100);
digitalWrite(STEP, LOW);
delayMicroseconds(100);
}
void loop(){
potval = analogRead(pot); // leggi valore del potenziometro
potval = map (potval, 0, 1023, 0, 150); // mappa valore da 0 a 150
ppstep = potval - prev_potval; // calcola la differenza tra valore attuale e precendete del potenziometro
if (ppstep > 0){ // se il valore è maggiore di 0
dirval = true; // imposta 1 al falg di posizione
}else{ // altrimenti
dirval = false; // imposta 0 al flag di posizione
}
ppstep = abs(ppstep); // prendi valore assoluto degli step
digitalWrite(DIR, dirval); // imposta il pin di direzione dello stepper
delay(10);
for ( int i=0; i<ppstep; i++) { stepRoutine(); delayMicroseconds(500); } // movimento motore
prev_potval = potval; // imposta l'ultimo valore del potenziometro
}
In pratica si tratta di leggere il valore del potenziometro, mappandolo da 0 al numero degli step che si vuole spostare, e confrontarlo con quello registrato in precedenza per calcolarne lo spostamento, vedere se è positivo o negativo per impostare la direzione del movimento, poi prenderne il valore assoluto da usare come step.
La cosa funziona ma le posizioni del motore cambiano sempre: ho messo un po' di nastro adesivo sull'albero motore così da capire come è direzionato, se io inizio con potenziometro a 0 ed il motore è posizionato in modo che il nastro sia perfettamente in alto dopo dopo qualche movimento tornando a 0 questo è leggermente girato verso sinistra o destra...come mai? c'è un modo per avere posizioni sempre fisse in maniera similare ad un servo?