Partage
  • Partager sur Facebook
  • Partager sur Twitter

servos en mode miroir

Faire fonctionner 2 servos en opposition

20 avril 2020 à 11:32:33

Bonjour à tous,

J'ai un souci avec un ptit projet: Il s'agit d'une commande de freins sur un ptit kart d'enfant.

J'ai 2 servos qui viennent actionner les freins, un de chaque côté du kart. Ils sont tous les 2 commandés par un petit accélérateur de trottinette électrique à 3 fils (+5v, masse et signal).

Les 2 servos sont positionnés en mode miroir sur le kart, mais leur action mécanique doit aller dans le même sens (tirer un câble vers l'arrière). 

J'ai réussi à les faire fonctionner en copie conforme, mais pas en miroir. Du coup l'un tire bien le câble, mais l'autre le pousse...

Sauriez-vous me dire ce que je dois modifier dans mon code pour y arriver?

Un gros merci d'avance,

Benjamin

#include <Servo.h>

Servo myservoL;  // création servo Gauche
Servo myservoR;  // création servo Droit

int potpin = A0;  // Pin de lecture de la poignée de commande
int valL;    // Variable pour le servo Gauche
int valR;    // Variable pour le servo Droit

void setup() {
  myservoL.attach(9);  // Commande Servo Gauche attachée au pin 9
  myservoR.attach(10);  // Commande Servo Droit attachée au pin 10
}

void loop() {
  valL = analogRead(potpin);            // Lecture de la valeur de la poignée pour servo Gauche (0% => 166 et 100% => 870)
  valL = map(valL, 0, 870, 0, 90);     //  Echelle du servo Gauche (value between 0 and 90°)
  
  valR = analogRead(potpin);            // Lecture de la valeur de la poignée pour servo Droit (0% => 166 et 100% => 870)
  valR = map(valR, 0, 870, 0, 90);     //  Echelle du servo Droit (value between 0 and 90°)
  
  myservoL.write(valL);                  // ordre donné au servo Gauche
  myservoR.write(valR);                  // ordre donné au servo Droit
  delay(15);                           //   pause 
}



  • Partager sur Facebook
  • Partager sur Twitter
20 avril 2020 à 13:34:27

Bonjour,

Tu devrais juste pouvoir faire une soustraction pour avoir l'angle de l'autre moteur:

 valL = analogRead(potpin);            // Lecture de la valeur de la poignée pour servo Gauche (0% => 166 et 100% => 870)
 valL = map(valL, 0, 870, 0, 90);     //  Echelle du servo Gauche (value between 0 and 90°)
   
 valR = 90 - valL;

Si les valeurs doivent bien être entre 0 et 90 pour les 2 servos, et pas entre 0 et 90 pour l'un et 180 et 90 pour l'autre, et si c'est bien dans ce sens (potentiomètre à 0 => valL à 0 et valR à 90, potentiomètre au max => valL à 90 et valR à 0), sinon il faudra respectivement remplacer 90 par 180 dans la dernière ligne, et échanger valL et valR dans ces 3 lignes.

  • Partager sur Facebook
  • Partager sur Twitter
20 avril 2020 à 16:00:53

Bonjour Alexisdm!

Merci pour le retour, je vais tester ta solution. J'avais finalement réglé le problème en inversant le 0 et le 90 dans la map d'un des servos:

void loop() {
  valL = analogRead(potpin);            // Lecture de la valeur de la poignée pour servo Gauche (0% => 166 et 100% => 870)
  valL = map(valL, 0, 870, 0, 90);     //  Echelle du servo Gauche (value between 0 and 90°)
   
  valR = analogRead(potpin);            // Lecture de la valeur de la poignée pour servo Droit (0% => 166 et 100% => 870)
  valR = map(valR, 0, 870, 90, 0);     //  Echelle du servo Droit (value between 0 and 90°)



  • Partager sur Facebook
  • Partager sur Twitter