Club robotique de Sophia-Antipolis

Accueil > Projets, études > Nos robots > Robots du club > Robots à pattes > Le Pobbypède (2010-2013) > Logiciel d’un robot bipède

Logiciel d’un robot bipède

dimanche 17 novembre 2013, par Julien H.

Notre robot bipède est désormais équipé d’une carte Arduino qui contrôle les 4 servomoteurs. Cela permet à chacun de développer rapidement.

Le code suivant contrôle les 2 moteurs de chaque jambe du robot bipède selon des consignes de position enregistrées dans un tableau du fichier Sequences.h que vous trouverez dans l’archive.

Contrairement à d’autres solutions, ici les servomoteurs sont contrôlés en microsecondes et pas en degrés : cela permet des mouvements beaucoup plus fluide, sans à-coups mais cela laisse moins de temps pour les autres activités d’un robot. Prenez ce critère en compte et optimisez vos algorithmes en fonction.

  1. //
  2. // on utilise la dernière version de la bibliothèque de contrôle de servomoteurs
  3. // il faut donc un environnement Arduino supérieur à la version 1.0
  4. #include <Servo.h>
  5.  
  6. //
  7. // appel au fichier contenant le tableau de séquences
  8. #include "Sequences.h"
  9.  
  10. //
  11. // deux variables pour gérer :
  12. // - le nombre de microsecondes d'incrément de la consigne du signal pour servomoteur
  13. // - le temps en microsecondes entre deux mises à jour des consignes
  14. #define INCREMENT  1
  15. #define DELAY_UPDATE  15
  16.  
  17. //
  18. // ces servomoteurs ont un intervalle de commande entre 1000 et 2000 µs
  19. // on peut adapter ces chiffres selon le modèle
  20. #define SERVO_MIN  1000
  21. #define SERVO_MAX  2000
  22.  
  23. //
  24. // les 4 instances de servomoteur sont stockées dans un tableau
  25. // pour faciliter la mise en adéquation avec les 4 valeurs dans le tableau de séquences
  26. Servo Servos[4];
  27.  
  28. //
  29. // les dernières consignes à atteindre
  30. int consigne[4];
  31.  
  32. //
  33. // les positions courantes données aux servomoteurs
  34. // car on ne passe pas instantanément d'une consigne à l'autre
  35. // de cette manière on contrôle la vitesse des moteurs et pas seulement leur position
  36. int position[4];
  37.  
  38. // l'indice de la commande en cours dans la séquence en cours
  39. int index = 0;
  40.  
  41. int ecart = 0;
  42.  
  43. /**
  44.  * Configuration de l'Arduino
  45.  */
  46. void setup()
  47. {
  48.   // les servomoteurs
  49.   Servos[0].attach(6); // genou gauche
  50.   Servos[1].attach(11); // hanche gauche
  51.   Servos[2].attach(10); // genou droit
  52.   Servos[3].attach(9); // hanche droite
  53.  
  54.   // il faut initialiser les variables pour éviter que le robot tombe au démarrage
  55.   position[0] = 1500;
  56.   position[1] = 1500;
  57.   position[2] = 1500;
  58.   position[3] = 1500;
  59.  
  60.   consigne[0] = 1500;
  61.   consigne[1] = 1500;
  62.   consigne[2] = 1500;
  63.   consigne[3] = 1500;
  64.  
  65.   // position initiale (en degrés donc position milieu)
  66.   Servos[0].write(90);
  67.   Servos[1].write(90);
  68.   Servos[2].write(90);
  69.   Servos[3].write(90);
  70.  
  71. }
  72.  
  73. void loop()
  74. {
  75.   updatePosition();
  76.   delay(DELAY_UPDATE);
  77. }
  78.  
  79. void updatePosition()
  80. {
  81.   // on remet à 0 avant de mesurer l'écart entre la consigne et la position courante
  82.   ecart = 0;
  83.  
  84.   for (int i = 0; i < 4 ; i++) {
  85.     // ajout de l'écart du moteur à l'écart global
  86.     ecart += abs(consigne[i]-position[i]);
  87.  
  88.     if (consigne[i] > position[i]+INCREMENT)
  89.     {
  90.       position[i] += INCREMENT;
  91.       Servos[i].writeMicroseconds(position[i]);
  92.     }
  93.     if (consigne[i] < position[i] - INCREMENT)
  94.     {
  95.       position[i] -= INCREMENT;  
  96.       Servos[i].writeMicroseconds(position[i]);
  97.     }
  98.   }
  99.  
  100.   // on met à jour les consignes si la position des 4 servomoteurs est atteinte
  101.   if (ecart < 4*INCREMENT) {
  102.         index++;
  103.         // si on dépasse, on revient au début du tableau
  104.         if (index >= 10) index = 0;
  105.         // les valeurs dans le tableau construit pas à pas en observant le robot
  106.         // sont entre 1 et 9 pour être plus facile à comprendre  donc on utilise une fonction
  107.         // pour passer de l'intervalle "utilisateur" à l'intervalle "servomoteur"
  108.         consigne[0] = map(sequences[index][0],1,9,SERVO_MIN,SERVO_MAX);
  109.         consigne[1] = map(sequences[index][1],1,9,SERVO_MIN,SERVO_MAX);
  110.         consigne[2] = map(sequences[index][2],1,9,SERVO_MIN,SERVO_MAX);
  111.         consigne[3] = map(sequences[index][3],1,9,SERVO_MIN,SERVO_MAX);
  112.   }
  113.  
  114. }

Télécharger

Voici le contenu du fichier "Sequences.h" à créer à côte de votre sketch Arduino :

  1. /**
  2.  * Séquence des valeurs de consignes pas à pas pour chaque moteur
  3.  */
  4.  
  5. // genou gauche / hanche gauche // genou droit / hanche droite
  6.  
  7. int sequences[12][4] = {{5,5,5,5},{10,5,5,5},{9,5,8,5},{8,5,8,5},{8,3,8,3},{8,3,8,3},{5,3,5,3},{5,3,2,3},{4,3,0,3},{1,3,0,3},{1,5,3,5},{3,5,5,5}};

Télécharger

Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.