Go Down

Topic: Servomoteurs et angle maximal ? (Read 56 times) previous topic - next topic

Fabounch

May 13, 2019, 05:02 pm Last Edit: May 13, 2019, 05:56 pm by Fabounch
Bonjour,

Pour un projet, je dois déplacer un bras robotisé (référence : Lynxmotion AL5D) sur un plateau d'échec. Le robot possède 4 degrés de liberté soit 4 servomoteurs.
Je dois envoyer à chaque servomoteur une information de position pour qu'il aille se positionner sur une case.

J'ai commencé par chercher une position initiale pour chaque moteur, c'est-à-dire que je positionne le servomoteur dans une position particulière au début du jeu.
Le 1er servomoteur à comme valeur initiale 180 (pour 180 degrés)
le 2nd : 120, le 3e : 125 et enfin le 4e : 125.

Pour faciliter le code, je procède par fonctions. Chaque case est définit par une fonction caseXX où XX correspond au numéro de la case.
Code: [Select]
void caseXX(){
  posServo1 = ;
  posServo2 = ;
  posServo3 = ;
  posServo4 = ;
}


Les déplacements se font à l'aide d'une autre fonction appelé deplacer() qui fonctionne à l'aide de boucle :
Code: [Select]
for(pos1 = 180;pos1 >= posServo1;pos1 -= 1){
    myServo1.write(pos1);
    delay(25);
   }
  }
Voici un exemple d'une des 4 boucles que j'utilise afin de déplacer mon robot.

Je suis contraint d'utiliser ce genre de boucle car en envoyant seulement
Code: [Select]
myServo1.write(pos1); le servomoteur se déplace à une vitesse trop élevé pour ne pas être prise en compte.

Cette méthode semblait être la méthode parfaite mais un problème survient sur certaines cases.
Certaines cases requièrent un angle supérieur à la valeur initiale. Cette méthode ne fonctionne donc plus.

Ma question est donc : Comment vous vous y prendriez afin de déplacer le robot sur toutes les cases existantes du plateau sachant que le robot doit retourner à sa position initiale dès lors qu'il a atteint la case avec une autre fonction appelé pos_init() qui fonctionne de la même manière que la fonction deplacer mais le sens de la boucle est simplement inversé :
Code: [Select]
  for(pos1 = posServo1;pos1 <= 180;pos1 += 1){
    myServo1.write(pos1);
    delay(20);
  }


Je cherche plus ici une aide au niveau algorithmique.

Merci de votre aide et merci de m'avoir lu.

Go Up