Piloter un moteur pas à pas avec un potentiomètre

Bonjour à tous,

Dans la cadre d'un projet je souhaiterais piloter un moteur pas à pas bipolaire à l'aide d'un potentiomètre de façon à gérer chaque pas ( je souhaite que lorsque l'on tourne le potar de 4 crans, le moteur tourne de 4 pas et inversement selon le sens dans lequel je tourne mon potar).

J'ai trouvé des bouts de codes mais j'avoue que je ne vois pas comment les adapter pour avoir cette inversion de sens.

PS : Je dispose d'un driver DRV8834, d'un moteur pas à pas 20pas/tour et d'un encodeur rotatif actuellement.

Je souhaite réaliser l'installation la plus facile possible et surtout avec un ressenti client top, que l'utilisation soit facile.

Merci d'avance.

Cordialement.

Excusez moi, mais vous avez une confusion entre un potentiomètre (titre; premières ligne du texte) et un encodeur rotatif (le contexte, me semble-t-il).
Excusez mon indiscrétion, mais savez vous gérére un encodeur rotatif (ceci semble une partie de votre problème)

Fredoooo:
J'ai trouvé des bouts de codes mais j'avoue que je ne vois pas comment les adapter pour avoir cette inversion de sens.

Bonjour,

Moi je le sais, mais je le dirai pas :grin:

Sérieusement, comment veux tu qu'on t'aide sans le moindre début de code.
Je te conseille de lire les messages épinglés en particulier Informations nécessaires

Autant pour moi j'ai fais une erreur.

Au début de ma recherche je suis parti sur une solution sans carte Arduino ou similaire et donc je voulais utiliser un encodeur associé à une Bascule D pour générer mon signal carré et repérer mon inversion de sens.

N'arrivant pas à faire ce que je souhaite, je pars désormais sur une solution utilisant une carte Arduino car plus commune et donc surement plus facile à mettre en oeuvre.

J'aimerais donc utiliser mon encodeur (ou acheter un potentiomètre si besoin), le but étant simplement que le ressenti client soit représentatif. Je souhaite avoir un bouton rotatif avec lequel on ressent les "crans".

Pour ce qui est du code, j'ai tenté de faire quelque chose mais n'y connaissant pas beaucoup en Programmation je ne sais pas si cela est viable. Ci-dessous le début de code dont je dispose :

#include <Stepper.h>

// change this to fit the number of steps per revolution
// nombre de step
const int stepsPerRevolution = 20;
// for your motor

// initialize the stepper library on pins 8 through 11
// initialisation de la librairie stepper
// (step,1N2,1N4,1N3,1N1)
Stepper myStepper(stepsPerRevolution, 9, 11, 10, 8);
//Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);

void setup() {

}

void loop()
{
// read the sensor value:
// on lit la valeur sur le potentiometre
int sensorReading = analogRead(A0);
// map it to a range from 0 to 100:
// convertie la valeur au potentiometre
int motorSpeed = map(sensorReading, 0, 1023, 0, 10);

if (motorSpeed > 0) {
// on donne la vitesse du moteur
// motor speed
myStepper.setSpeed(motorSpeed);
myStepper.step(1);

}

if (motorSpeed < 0) {
// on donne la vitesse du moteur
// motor speed
myStepper.setSpeed(motorSpeed);
myStepper.step(-1);
delay(1500);
}
}

En vous remerciant pour votre aide

Mets ton code entre balises

Bonjour a tous,

pourquoi ne pas utiliser un deuxieme moteur pas-a-pas identique comme encodeur, tu auras les "clics", meme nombre de pas etc.

Petite recherche sur Google avec : " use stepper motor as encoder "
et le premier lien : https://www.instructables.com/id/Using-Stepper-Motor-As-Rotary-Encoder/

Bonne lecture

Jacques

Si vous ne mettez pas votre code entre balises, ça génère des hiéroglyphes rigolos (appelés smileys)
Votre code (débarassé de commentaires inutiles, traduits de l'anglais) ressemble à ca:

#include <Stepper.h>

// fits the number of steps per revolution for your motor

const int stepsPerRevolution = 20; 




// initialisation de la librairie stepper
// (step,1N2,1N4,1N3,1N1)
Stepper myStepper(stepsPerRevolution, 9, 11, 10, 8);

void setup() {

}

void loop()
{
  // read the sensor value:
  // on lit la valeur sur le potentiometre
  int sensorReading = analogRead(A0);
  // map it to a range from 0 to 100:
  // convertie la valeur au potentiometre
  int motorSpeed = map(sensorReading, 0, 1023, 0, 10);
 
  if (motorSpeed > 0) {
    // on donne la vitesse du moteur
  
    myStepper.setSpeed(motorSpeed);
    myStepper.step(1);

   }

 if (motorSpeed < 0) {
    // on donne la vitesse du moteur
  
    myStepper.setSpeed(motorSpeed);
    myStepper.step(-1);
    delay(1500);
  }
}

Est ce qu'il donne un semblant de satisfaction pour votre moteur?

je souhaite que lorsque l'on tourne le potar de 4 crans, le moteur tourne de 4 pas et inversement selon le sens dans lequel je tourne mon potar.

Au début de ma recherche je suis parti sur une solution sans carte Arduino ou similaire et donc je voulais utiliser un encodeur associé à une Bascule D pour générer mon signal carré et repérer mon inversion de sens.

Un encodeur rotatif est parfaitement pilotable avec un ARDUINO grâce à la librairie Encoder :

Le ressenti sera certainement meilleur qu'avec un potentiomètre.

hbachetti:
Un encodeur rotatif est parfaitement pilotable avec un ARDUINO grâce à la librairie Encoder :

GitHub - PaulStoffregen/Encoder: Quadrature Encoder Library for Arduino

Le ressenti sera certainement meilleur qu'avec un potentiomètre.

Je te remercie mais peux-tu m'expliquer comment procéder, je débute vraiment en programmation et je ne sais pas comment réaliser le branchement ou même comment adapter mon code.

Je te remercie

Vous devriez déjà commencer par jouer avec les exemples de la librairie Stepper, qui gèrera votre moteur pas à pas; une fois que vous en serez satisfait et que vous aurez compris, vous pourriez jouer avec les exemples de la librairie Encoder;
l'avantage de couper un problème en deux est que , si vous débutez, vous n'aurez pas un énorme effort de compréhension. Descartes recommandait bien de sérier les problèmes.... au millénaire dernier.

Je te remercie mais peux-tu m'expliquer comment procéder, je débute vraiment en programmation et je ne sais pas comment réaliser le branchement ou même comment adapter mon code.

T'es-tu donné au moins la peine de visiter la librairie ?
Il y a un répertoire exemples.
Un exemple s'appelle basic.

Les pins A et B sont branchées sur 5 et 6, et la C sur GND.

Question : Quel encodeur ? avec bouton ? sans bouton ?
Un EC11 classique ?

hbachetti:
T'es-tu donné au moins la peine de visiter la librairie ?
Il y a un répertoire exemples.
Un exemple s'appelle basic.

Les pins A et B sont branchées sur 5 et 6, et la C sur GND.

Question : Quel encodeur ? avec bouton ? sans bouton ?
Un EC11 classique ?

Je te remercie pour ton aide, je viens de regarder les exemples dans la librairie, je comprends le fonctionnement de l'encodeur mais je ne sais pas comment faire le branchement de l'ensemble.

Pour mon encodeur il s'agit d'un encodeur sans bouton à 3 broches du coup.

Ce que j'ai du mal à comprendre c'est que sur certains exemple on déclare les pins du moteur sur la carte Arduino alors que sur d'autres on ne déclare que les 2 pins du Driver. Du coup je me demande, y-a t-il une solution sans passer par le Driver et relier directement mon Arduino au moteur?

Les pins A et B sont branchées sur 5 et 6, et la C sur GND.

Tout est dit, non ?

Un moteur sans passer par un driver ?
Je n'ai encore jamais vu ça.

Bonjour les amis,

Bon, on va faire simple, c'est-à-dire je vais te proposer des programmes qui utilisent le codeur rotatif binaire, et des programmes avec des moteurs pas à pas. Tu y trouveras forcément ce que tu cherches.

En tête d’écran du forum tu vas dans [Tutoriels et cours].
Puis, pour trouver mes didacticiels tu cliques sur [Started by] qui classe les auteurs par ordre alphabétique. Tu te déplace de page en page jusqu’à la Page[8] où tu vas trouver les documents proposés par Nulentout, c'est-à-dire Môamôa.

En particulier il y a [Recueil de programmes documentés].

C’est un didacticiel de 82 pages, mais pour des raisons techniques les fichiers que je joins sont des paquets contenant environ 10 pages. Peu importe, tu télécharge ces fichiers et :

Page 14 est donné un exemple d’utilisation de l’encodeur rotatif. (Qui fonctionne et commenté.)
Page 60 et page 66 deux exemples de pratique de moteurs pas à pas.
Page 68 Un pointeur LASER sur 360° utilisant un moteur pas à pas.
Page 72 : Deux moteurs pas à pas croisés pour faire un petit appareil qui suit la direction d’uns source lumineuse.

Certains de ces programmes utilisent un dialogue avec le moniteur USB de l’IDE.
Peu importe, en récupérant dans tous ces programmes qui fonctionnent sans problème les séquences dont tu as besoin, tu pourras faire ce que tu veux.

L’est pas belle la vie ? :wink:

hbachetti:
Tout est dit, non ?

Un moteur sans passer par un driver ?
Je n'ai encore jamais vu ça.

du coup avec ce genre d'encodeur à 3 broches, je ne l'alimente pas c'est ça? Et Faut-il relier le pin C obligatoirement a GND ou le relier à une masse est suffisant?

Je viens de tester et cela ne fonctionne pas

Et bien si il faut l'alimenter, car il génère deux sorties donnant des signaux binaires déphasés. Hors un signal binaire sur des électroniques comme les notres, c'est entre 0v et +5Vcc environ.
Ne te prend pas la tête : Page 14 tu as le schéma à adopter, les broches du µP à utiliser, et un petit programme qui fonctionne.
Tant que j'y suis, sur Internet on trouve plein plein plein de ces codeurs. Certains bien moins cher que les autres ... mais qui présentent de faux comptages. Alors avis ...

C'est un organe purement mécanique, donc sans alimentation.

Faut-il relier le pin C obligatoirement a GND ou le relier à une masse est suffisant?

GND et masse sont différents ? Explique-toi.
Produis un schéma, parce que là j'ai l'impression que l'on ne se comprend pas.
Et bien sur : la référence de l'encodeur ou un lien vers le site d'achat.
Est-tu sûr de disposer d'un encodeur d'ailleurs ?

Un tuto :
http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ArduinoInitiationEntreesOnOffEncodeurRotatifTerminal

Ici une petite page qui explique, photos à l'appui :

L'encodeur rotatif peut être considéré comme deux switchs produisant des signaux décalés, en fonction du sens de rotation.

Pourquoi brancher C sur GND (ou masse) ?

Comme sur n'importe quel switch on peut brancher C sur GND ou VCC, c'est comme on veut.
Dans le premier cas, il faudra des pullups, dans le deuxième cas des pulldown.

La librairie de Paul Stoffregen fait ceci :

  pinMode(pin1, INPUT_PULLUP);
  pinMode(pin2, INPUT_PULLUP);

Donc cela veut dire qu'elle fonctionnera avec C à la masse.

Mais si on veut écrire son propre code avec des pulldown matérielles, on peut.

Voici le code que je viens d'utiliser il fonctionne partiellement.:

//     Stepper Motor using a Rotary Encoder
      
 

// defines pins numbers
 #define stepPin 13 
 #define dirPin  12
 #define outputA 10
 #define outputB 11

 int counter = 0;
 int angle = 0; 
 int aState;
 int aLastState;  
 
void setup() {
  // Sets the two pins as Outputs
  pinMode(stepPin,OUTPUT); 
  pinMode(dirPin,OUTPUT);
  pinMode (outputA,INPUT);
  pinMode (outputB,INPUT);
  
  aLastState = digitalRead(outputA);

}
void loop() {

  aState = digitalRead(outputA);
  
  if (aState != aLastState){     
     if (digitalRead(outputB) != aState) { 
       counter ++;
       angle ++;
       rotateCW();  
     }
     else {
       counter--;
       angle --;
       rotateCCW(); 
     }
     //if (counter >=30 ) {
      //counter =0;
     //}
     
     //lcd.clear();
     //lcd.print("Position: ");
     //lcd.print(int(angle*(-1.8)));
     //lcd.print("deg"); 
     //lcd.setCursor(0,0);
     
   }
  aLastState = aState;
}

void rotateCW() {
  digitalWrite(dirPin,LOW);
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(50);
    digitalWrite(stepPin,LOW);
    delayMicroseconds(50); 
}
void rotateCCW() {
  digitalWrite(dirPin,HIGH);
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(50);
    digitalWrite(stepPin,LOW);
    delayMicroseconds(50);   
}

Mon problème se situe dans l'inversion du sens. A l'heure actuelle mon moteur ne tourne que dans un sens peu importe le sens de rotation de mon encodeur.

Des idees?

Pourquoi ne pas utiliser la librairie Encoder ?

Ton code ne peut pas marcher :

  • pas de pullups (à moins que tu aies mis des résistances)
  • pas de gestion de rebonds (à moins que tu aies mis des condensateurs)

Mais on peut aussi le faire sans la librairie si tu préfères :
https://www.locoduino.org/spip.php?article82

Dans cet exemple l'auteur met des pullups matérielles et il gère les rebonds.