samedi 23 février 2013

Contrôler la vitesse d'un moteur pas à pas au moyen d'un potentiomètre (Arduino)

L'objectif:  utiliser un Arduino pour contrôler la vitesse de rotation d'un moteur pas à pas au moyen d'un potentiomètre (ou d'un joystick):  lorsque le potentiomètre se trouve à sa position centrale, le moteur ne tourne pas.  Il tourne de plus en plus rapidement dans le sens horaire à mesure qu'on tourne le potentiomètre dans une direction, et tourne de plus en plus rapidement dans le sens antihoiraire à mesure qu'on tourne le potentiomètre dans l'autre direction.

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:

/***************************************************************
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)

1 commentaire:

  1. Bonsoir et merci pour votre Tito.
    Peut on adaptée le code pour un arduino avec une carte shield adafruit.
    Cordialement. Merci

    RépondreSupprimer