
La Stepper Library est accompagnée d'un exemple intitulé "stepper_speedControl" qui accomplit à peu près cette tâche, sauf que le moteur tourne toujours dans la même direction (la vitesse est nulle à une position extrême du potentiomètre, et maximale à l'autre position extrême). Au départ, j'ai supposé que ma tâche consistait à apporter quelques modifications mineures à ce sketch pour obtenir le comportement souhaité.
Malheureusement, cette première approche n'a pas très bien fonctionné. L'exemple "stepper_speedControl" règle la vitesse au moyen de la routine "setSpeed" de la Stepper Library. Malheureusement, tel qu'indiqué dans l'entête de l'exemple, l'Arduino est lent à répondre aux commandes du potentiomètre lorsque setSpeed est réglé à une faible valeur. Le pire, c'est lorsque qu'on règle setSpeed à zéro: l'Arduino se met alors à attendre pendant un délai qui semble sans fin. Inutile de modifier la position du potentiomètre: l'Arduino ne la vérifiera même pas.
À la place, j'ai donc choisi de régler la vitesse de rotation sans utiliser setSpeed: le moteur tourne d'un step à la fois, et la position du potentiomètre contrôle la durée du délai qui s'écoule entre deux rotations successives. Le moteur se comporte exactement de la façon souhaitée.
Voici mon sketch:
Pour les branchements, du moteur au Arduino, vous suivez les instructions fournies ici pour un L293D ou ici pour un ULN2003. Il ne reste plus qu'à ajouter un potentiomètre à l'entrée A0.
Yves Pelletier (Twitter: @ElectroAmateur)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*************************************************************** | |
Contrôle de vitesse d'un moteur pas à pas au moyen d'un joystick | |
ou d'un potentiomètre. | |
Branchements: un moteur pas à pas branché à 8, 9, 10, 11 | |
un joystick ou potentiomètre branché à A0 | |
https://electroniqueamateur.blogspot.com/2013/02/controler-la-vitesse-dun-moteur-pas-pas.html | |
****************************************************************/ | |
#include <Stepper.h> | |
const int stepsPerRevolution = 48; | |
Stepper myStepper(stepsPerRevolution, 8,9,10,11); | |
unsigned long lastTime = 0; | |
unsigned long thisTime = 0; | |
void setup() { | |
// réglage de la vitesse maximale du moteur | |
myStepper.setSpeed(50); | |
} | |
void loop() { | |
// on lit la valeur du joystick | |
int sensorReading = analogRead(A0); | |
// on l'étalonne entre -500 et 500 (plus pratique qu'entre 0 et 1023) | |
int motorSpeed = map(sensorReading, 0, 1023, -500, 500); | |
thisTime = millis(); // qu'elle heure est-il? | |
// si le joystick n'est pas à la position zéro | |
if (abs(motorSpeed) > 0){ | |
// et si un temps raisonnable s'est écoulé depuis | |
// la dernière rotation du moteur | |
if ((thisTime - lastTime) > abs(abs(motorSpeed)-500)){ | |
if (motorSpeed > 0){ | |
myStepper.step(1); // un step en sens horaire | |
} | |
else{ | |
myStepper.step(-1); // un step en sans antihoraire | |
} | |
lastTime = thisTime; // archivage du moment de la dernière rotation | |
} | |
} | |
} |
Pour les branchements, du moteur au Arduino, vous suivez les instructions fournies ici pour un L293D ou ici pour un ULN2003. Il ne reste plus qu'à ajouter un potentiomètre à l'entrée A0.
Yves Pelletier (Twitter: @ElectroAmateur)