controllare stepper con potenziometro

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?

Hai provato di stampare i valori di posizione (ppstep e potval) sulla seriale e controllato che potval é lo stessi a paritá di posizione del potenziometro?
Che driver motore usi?
Ciao Uwe

Si ho provato, i valori sono sempre gli stessi e anche la differenza tra il valore precedente e attuale del potenziometro è corretta.
Come driver uso un pololu A4988

Artal:
Si ho provato, i valori sono sempre gli stessi e anche la differenza tra il valore precedente e attuale del potenziometro è corretta.
Come driver uso un pololu A4988

Il Driver lo usi in modalitá microstepping? Con che tensione alimenti il driver e che tensione nominale ha il motore?

Prova di pilotare il motore in modalitá Full Step.

Ciao Uwe

Il driver lo uso già un Full Step, i pin per il microstepping non sono neanche connessi, il motore funziona a 2.8 V e il driver lo alimento a 12...in effetti il codice sembra funzionare, ma non capisco dov'è l'inghippo nel motore