Quand le joystick est rajouté, cela inclut deux instructions entre deux pas:
− analogread qui attend la fin de la conversion
− map qui convertit les nombres en entiers longs et qui fait entre autre une division qui prends aussi beaucoup de temps.
Une première démarche importante serait de ne lire le joystick qu'une fois de temps en temps au lieu d'à chaque pas. Du coup, tous les pas auraient la bonne temporisation sauf un de temps en temps.
On peu difficilement s'affranchir du digitaread, la solution pourrait être de faire le déclenchement manuel (passer par les registres!) juste après une lecture. Ainsi quand on ferait la lecture, la donnée serait prête sans que l'on ait besoin d'attendre.
Pour map, je conseille vivement de la boycotter, car c'est un gaspillage important de code et de temps. Certains ne jurent que par map et accelstepper, qui ne sont pas performant.
vitesseXpos = map(joyX, 530, 945, moteurVitesseLente, moteurVitesseRapide);
est équivalent à
vitesseXpos = (joyX - 530) * (2000 - 5) / (945 - 530)
avec un calcul fait sur des entiers longs. map fait donc deux conversion int <-> long des multiplications et une division. Le nombre (2000 - 5) / (945 - 530) vaut quasiment 4,8.
Si on peut se contenter d'une approximation à 5, on pourrait remplacer map par
vitesseXpos = (joyX-530)*5
ce qui serait beaucoup plus rapide. Même peut être par
vitesseXpos = joyX-530;
vitesseXpos += (vitesseXpos << 2); // multiplication par 5 (on ajoute 4 fois le nombre)
Il faudrait alors peut être ajuster 530 vu que l'on a changé la pente de le transformation.