OK, qualche mia considerazione:
-
Non sono un esperto di encoder, ma mi sembra che il modo che usi per leggerlo sia eccessivamente macchinoso (e dunque lento). Prova a googlare, giurerei di avere trovato del codice molto più semplice qualche tempo fa.
-
Per coerenza con sx() e dx(), metti il codice per fermare il carrello in una funzione stop().
-
digitalWrite() è una funzione piuttosto lenta (4-5 ms), per cui il controllo sul superamento dei passi non viene effettuato sufficientemente spesso. Come già pensavi, è meglio che separi il codice per l'avviamento dello spostamento da quello per fermarlo, evitando di eseguire il primo quando non è necessario.
-
Non so bene dove vuoi arrivare, ma immagino ti convenga iniziare ad impostare il programma sotto forma di macchina a stati, se vuoi eseguire una determinata serie di movimenti consecutivi.