Projet Quadripode

Bonjour à tous,
Je bosse sur un quadripode à 13 moteurs et je bute un peu sur le programme...
voici le code

#include <Servo.h>

Servo hancheAD;                                 // Déclaration des moteurs
Servo femurAD;
Servo patteAD;
Servo hancheRG;
Servo femurRG;
Servo patteRG;
Servo hancheAG;
Servo femurAG;
Servo patteAG;
Servo hancheRD;
Servo femurRD;
Servo patteRD;
Servo tourelle;                                // Moteur de tourelle
int distD, distG, distM, trig = 48, echo = 49; // Déclaration des variables de distance Droite Gauche et Mileu
long lecture_echo;                             // Variables utiles pour la lecture de distance


void setup() {
  pinMode(trig, OUTPUT);   // définition de la patte trig du module ultrason en sortie
  digitalWrite(trig, LOW); // mise à l'etat bas
  pinMode(echo, INPUT);    // définition de la patte echo du module ultrason en entrée
  hancheAD.attach(0);      // déclaration des servos AD = Avant Droit RG = aRrière Gauche
  femurAD.attach(1);
  patteAD.attach(2);
  hancheRG.attach(9);      
  femurRG.attach(10);
  patteRG.attach(11);
  hancheAG.attach(3);
  femurAG.attach(4);
  patteAG.attach(5);
  hancheRD.attach(6);
  femurRD.attach(7);
  patteRD.attach(8);
  tourelle.attach(13);
  repos();                // Appel du sous programme repos pour pouvoir poser le robot
  delay(5000);            // Attente 5 secondes
}

void loop() {  
  
  regardedevant();
 /* if(distM < 30) {
    repos();
    delay(1000);
    toucheobjet();
    repos();
    delay(1000);
    scan();
    if (distD > distG || distD > distM){
      tournedroite();
      delay(1000);
  }
  else tournegauche();
  }
  else */marcheAV(500);
}

void repos(){             // position au démarrage du robot
  tourelle.write(90);
  femurAD.write(180);     // Monter fémur avant droit
  delay(150);             // Laisser le temps au fémur de monter
  patteAD.write(180);     // Patte à la verticale
  hancheAD.write(90);     // position repos à 45° par rapport au socle
  femurAD.write(90);      // Descendre fémur
  delay(150); 
  femurRG.write(0);
  patteRG.write(0);
  hancheRG.write(90);
  femurRG.write(90);
  delay(150);
  femurAG.write(0);
  delay(150); 
  patteAG.write(0);
  hancheAG.write(90);
  femurAG.write(90);
  delay(150);
  femurRD.write(180);
  delay(150); 
  patteRD.write(180);
  hancheRD.write(90);
  femurRD.write(90);
  delay(150);
 }
  
void marcheAV(int vitesse){
  patteAD.write(180);
  femurAD.write(180);   // Monte Fémur avant droit et arriere gauche.
  femurRG.write(0);
  delay(vitesse);
  hancheAD.write(100);  // Avance les hanches avant droite et  arrière gauche
  hancheRG.write(80);
  hancheRD.write(80);   // Recule les hanches avant gauche et arrière droite
  hancheAG.write(100);
  delay(vitesse);
  femurAD.write(90);
  femurRG.write(90);
  delay(vitesse);
  femurRD.write(180);
  femurAG.write(0);
  delay(vitesse);
  hancheAD.write(80);
  hancheRG.write(100);
  hancheAG.write(80);
  hancheRD.write(100);
  delay(vitesse);
  femurRD.write(90);
  femurAG.write(90);
  delay(vitesse);
  
} 
  void tournedroite(){
     patteAD.write(180);
     femurAD.write(180);
     femurRG.write(0);
     delay(500);
     hancheAD.write(180);
     hancheRG.write(180);
     hancheAG.write(0);
     hancheRD.write(0);
     delay(500);
     femurAD.write(90);
     femurRG.write(90);
     delay(500);
     femurRD.write(180);
     femurAG.write(0);
     delay(500);
     hancheAD.write(90);
     hancheRG.write(90);
     hancheAG.write(180);
     hancheRD.write(180);
     delay(500);
     femurRD.write(90);
     femurAG.write(90);
     delay(500);
  }
   void tournegauche(){
     patteAD.write(180);
     femurRD.write(180);
     femurAG.write(0);
     delay(500);
     hancheRD.write(0);
     hancheAG.write(0);
     hancheRG.write(180);
     hancheAD.write(180);
     delay(500);
     femurRD.write(90);
     femurAG.write(90);
     delay(500);
     femurAD.write(180);
     femurRG.write(0);
     delay(500);
     hancheRD.write(90);
     hancheAG.write(90);
     hancheRG.write(90);
     hancheAD.write(90);
     delay(500);
     femurAD.write(90);
     femurRG.write(90);
     delay(500);
  }
  void toucheobjet(){
    for(int i=90; i <181 ; i++){
      patteAD.write(80);
      hancheAD.write(i);
      femurAD.write(90+i);
      delay(10);
    }
    delay(1000);
      femurAD.write(120);
      delay(150);
      femurAD.write(180);
      delay(100);
      femurAD.write(120);
  }
  long regardedevant(){                    // regarde devant durant la marche
    tourelle.write(90); 
    delay(100);
    digitalWrite(trig, HIGH); 
    delayMicroseconds(10); 
    digitalWrite(trig, LOW); 
    lecture_echo = pulseIn(echo, HIGH); 
    distM = lecture_echo / 58;
  }
    
  long scan(){                            // scan l'environnement lorsque un obstacle est détecté
   tourelle.write(0);
    delay(1000);
    digitalWrite(trig, HIGH); 
    delayMicroseconds(10); 
    digitalWrite(trig, LOW); 
    lecture_echo = pulseIn(echo, HIGH); 
    distG = lecture_echo / 58; 
   tourelle.write(90); 
    delay(1000);
    digitalWrite(trig, HIGH); 
    delayMicroseconds(10); 
    digitalWrite(trig, LOW); 
    lecture_echo = pulseIn(echo, HIGH); 
    distM = lecture_echo / 58; 
   tourelle.write(180); 
    delay(1000);
    digitalWrite(trig, HIGH); 
    delayMicroseconds(10); 
    digitalWrite(trig, LOW); 
    lecture_echo = pulseIn(echo, HIGH); 
    distD = lecture_echo / 58; 
   }

je remarque qu'en bougeant les hanches lui font perdre l'équilibre et je voudrais que les hanches AV droite et ARriere gauche bougent par pas successifs mais en meme temps.

Qqun aurait une idée ?

Bonjour,

Tu trouveras peut-être de l'inspiration ici:
http://forum.arduino.cc/index.php?topic=4854.0

Merci.
N'etant pas info mais plutot électro c'est pas évident... :roll_eyes:

Sinon est ce que le code que j'ai écrit vous parait bien ?

Monte Fémur avant droit et arriere gauche.

Une solution est de lever les pattes une par une, de poser le pied en avant à chaque fois, et d'attendre la levée de la quatrième patte pour faire pivoter les hanches (avancement du corps).
Ainsi ta bestiole aurait toujours trois points en contact avec la planète.
Autre piste: En décalant très peu AV Dr et AR Gau, pour avoir toujours les trois points.

nicolasB:
je remarque qu'en bougeant les hanches lui font perdre l'équilibre et je voudrais que les hanches AV droite et ARriere gauche bougent par pas successifs mais en meme temps.

Qqun aurait une idée ?

Pour faire bouger plusieurs servos en même temps, il faut supprimer les delay() et modifier la consigne des servos en question pas par pas ensemble.
Mais il ne faut pas se leurrer, la solution fonctionnera pour un terrain donné et pas pour un autre. Le moindre obstacle fera perdre l'équilibre au robot puisqu'une patte se trouvera trop haute ou trop basse. Il faudrait avoir des capteurs sous les pattes pour détecter le contact avec le sol et un gyro pour vérifier la position du corps.

Merci pour vos infos :slight_smile:
Je fais des essais mais c'est difficile de savoir si son code est optimisé...

fdufnews:
et un gyro pour vérifier la position du corps.

Un accéléro, pas un gyro.

AlienArea51:
( PIF , si tu nous lis :grin:)

Yo ! Salut Will :wink:

Salut NicolasB :slight_smile:
j'avais étudié la façon de marcher d'un quadro, mais j'ai laissé tomber car le codage est hyper chaud (enfin pour moi).
La meilleure façon (afin de ne pas être en désequilibre) c'est de ne bouger qu'une patte à la fois ( 3 au sol, 1 en mouvement)
sinon il faut s'inspirer de la démarche d'un loup/chien (grand de préférence, pour bien voir les détails)

Voilà
si t'as des questions, j'suis là :wink:

Salut Pif,
Oui en fait je me rends compte que c'est difficile de garder l'équilibre... j'essaie de publier des photos dès que possible pour se rendre compte...

voilà la bete



et la mise à jour du code :

#include <Servo.h>

Servo hancheAD;                                 // Déclaration des moteurs
Servo femurAD;
Servo patteAD;
Servo hancheRG;
Servo femurRG;
Servo patteRG;
Servo hancheAG;
Servo femurAG;
Servo patteAG;
Servo hancheRD;
Servo femurRD;
Servo patteRD;
Servo tourelle;                                // Moteur de tourelle
int distD, distG, distM, trig = 48, echo = 49; // Déclaration des variables de distance Droite Gauche et Mileu
long lecture_echo;                             // Variables utiles pour la lecture de distance


void setup() {
  
  pinMode(trig, OUTPUT);   // définition de la patte trig du module ultrason en sortie
  digitalWrite(trig, LOW); // mise à l'etat bas
  pinMode(echo, INPUT);    // définition de la patte echo du module ultrason en entrée
  hancheAD.attach(0);      // déclaration des servos AD = Avant Droit RG = aRrière Gauche
  femurAD.attach(1);
  patteAD.attach(2);
  hancheRG.attach(9);      
  femurRG.attach(10);
  patteRG.attach(11);
  hancheAG.attach(3);
  femurAG.attach(4);
  patteAG.attach(5);
  hancheRD.attach(6);
  femurRD.attach(7);
  patteRD.attach(8);
  tourelle.attach(13);
  repos();                // Appel du sous programme repos pour pouvoir poser le robot
  delay(5000);            // Attente 5 secondes

}

void loop() {  
  
  regardedevant();
  marcheAV(250);
}

void repos(){             // position au démarrage du robot
  tourelle.write(90);
  femurAD.write(180);     // Monter fémur avant droit
  delay(150);             // Laisser le temps au fémur de monter
  patteAD.write(180);     // Patte à la verticale
  hancheAD.write(90);     // position repos à 45° par rapport au socle
  femurAD.write(90);      // Descendre fémur
  delay(150); 
  femurRG.write(0);
   delay(150);
  patteRG.write(0);
  hancheRG.write(90);
  femurRG.write(90);
  delay(150);
  femurAG.write(0);
  delay(150); 
  patteAG.write(0);
  hancheAG.write(90);
  femurAG.write(90);
  delay(150);
  femurRD.write(180);
  delay(150); 
  patteRD.write(180);
  hancheRD.write(90);
  femurRD.write(90);
  delay(150);
 }
  
void marcheAV(int vitesse){
  femurRD.write(180);
  delay(vitesse);
  for(int i = 80; i < 111; i++ ){
  hancheRD.write(i);
  delay(15);
  }
  delay(vitesse);
  femurRD.write(90);
  delay(vitesse);
  femurAD.write(180);
  delay(vitesse); 
  for(int i = 80; i <= 110; i ++){
  hancheAD.write(i);
  delay(15);
  }
  delay(vitesse);
  femurAD.write(90);
  delay(vitesse);
  
  femurRG.write(0);
  delay(vitesse);
  for(int i = 110; i >= 80; i --){
  hancheRG.write(i);
  delay(15);
  }
  delay(vitesse);
  femurRG.write(90);
  delay(vitesse);
  femurAG.write(0);
  delay(vitesse);
  for(int i = 110; i >= 80; i --){
  hancheAG.write(i);
  delay(15);
  }
  delay(vitesse);
  femurAG.write(90);
  delay(vitesse);
  for(int i = 80; i <= 110; i ++){
  hancheAG.write(i);
  delay(15);
  } 
   for(int i = 80; i <= 110; i ++){
  hancheRG.write(i);
  delay(15);
  }
  for(int i = 110; i >= 80; i --){
  hancheRD.write(i);
  delay(15);
  }
  for(int i = 110; i >= 80; i --){
  hancheAD.write(i);
  delay(15);
  }
  delay(vitesse);
    
} 
 long regardedevant(){                    // regarde devant durant la marche
    tourelle.write(90); 
    delay(100);
    digitalWrite(trig, HIGH); 
    delayMicroseconds(10); 
    digitalWrite(trig, LOW); 
    lecture_echo = pulseIn(echo, HIGH); 
    distM = lecture_echo / 58;
  }

bon une énième mise à jour du code :

//* Programmme du robot quadripede par Boidart Nicolas*//

#include <Servo.h>

Servo hancheAD;                                 // Déclaration des moteurs
Servo femurAD;
Servo patteAD;
Servo hancheRG;
Servo femurRG;
Servo patteRG;
Servo hancheAG;
Servo femurAG;
Servo patteAG;
Servo hancheRD;
Servo femurRD;
Servo patteRD;
Servo tourelle;                                // Moteur de tourelle
int distD, distG, distM, trig = 48, echo = 49; // Déclaration des variables de distance Droite Gauche et Mileu
long lecture_echo;                             // Variables utiles pour la lecture de distance


void setup() {
  
  pinMode(trig, OUTPUT);   // définition de la patte trig du module ultrason en sortie
  digitalWrite(trig, LOW); // mise à l'etat bas
  pinMode(echo, INPUT);    // définition de la patte echo du module ultrason en entrée
  hancheAD.attach(0);      // déclaration des servos AD = Avant Droit RG = aRrière Gauche
  femurAD.attach(1);
  patteAD.attach(2);
  hancheRG.attach(9);      
  femurRG.attach(10);
  patteRG.attach(11);
  hancheAG.attach(3);
  femurAG.attach(4);
  patteAG.attach(5);
  hancheRD.attach(6);
  femurRD.attach(7);
  patteRD.attach(8);
  tourelle.attach(13);
  repos();                // Appel du sous programme repos pour pouvoir poser le robot
  delay(5000);            // Attente 5 secondes

}

void loop() {  
  
 marcheAV(250);
}

void repos(){             // position au démarrage du robot
  tourelle.write(90);
  femurAD.write(180);     // Monter fémur avant droit
  delay(150);             // Laisser le temps au fémur de monter
  patteAD.write(180);     // Patte à la verticale
  hancheAD.write(90);     // position repos à 45° par rapport au socle
  femurAD.write(90);      // Descendre fémur
  delay(150); 
  femurRG.write(0);
   delay(150);
  patteRG.write(0);
  hancheRG.write(90);
  femurRG.write(90);
  delay(150);
  femurAG.write(0);
  delay(150); 
  patteAG.write(0);
  hancheAG.write(90);
  femurAG.write(90);
  delay(150);
  femurRD.write(180);
  delay(150); 
  patteRD.write(180);
  hancheRD.write(90);
  femurRD.write(90);
  delay(150);
 }
  
void marcheAV(int vitesse){
  int boucle = 10;
  //femur arriere droit
  for(int i = 90; i <= 180; i+=2){
  femurRD.write(i);
  delay(boucle);
  }
  hancheAD.write(80);
  hancheRG.write(100);
  hancheAG.write(90);
  delay(vitesse);
  for(int i = 80; i<=110; i+=2){
  hancheRD.write(i);
  delay(boucle);
  }
  for(int i = 180; i >= 90; i-=2){
  femurRD.write(i);
  delay(boucle);
  }
 //femur avant droit 
  for(int i = 90; i <= 180; i+=2){
  femurAD.write(i);
  delay(boucle);
  }
  hancheRD.write(100);
  hancheRG.write(110);
  hancheAG.write(100);
  delay(vitesse); 
  for(int i = 80; i<=110; i+=2){
  hancheAD.write(i);
  delay(boucle);
  }
  for(int i = 180; i >= 90; i-=2){
  femurAD.write(i);
  delay(boucle);
  }
//femur arriere gauche
  for (int i = 90; i >= 0; i-=2){
  femurRG.write(i);
  delay(boucle);
  }
  hancheAD.write(100);
  hancheRD.write(90);  
  hancheAG.write(110);
  delay(vitesse);
  for(int i = 110; i>=80; i-=2){
  hancheRG.write(i);
  delay(boucle);
  }
  for(int i = 0; i<= 90; i+=2){
  femurRG.write(i);
  delay(boucle);
  }
//femur avant gauche
for (int i = 90; i >= 0; i-=2){
  femurAG.write(i);
  delay(boucle);
  }
  hancheAD.write(90);
  hancheRD.write(80);
  hancheRG.write(90);
  delay(vitesse);
  for(int i = 110; i>=80; i-=2){
  hancheAG.write(i);
  delay(boucle);
  }
  for(int i = 0; i<= 90; i+=2){
  femurAG.write(i);
  delay(boucle);
  }    
} 
 
  long regardedevant(){                    // regarde devant durant la marche
    tourelle.write(90); 
    delay(100);
    digitalWrite(trig, HIGH); 
    delayMicroseconds(10); 
    digitalWrite(trig, LOW); 
    lecture_echo = pulseIn(echo, HIGH); 
    distM = lecture_echo / 58;
  }

Petit soucis il n'avance pas très droit...

nicolasB:
Salut Pif,
Oui en fait je me rends compte que c'est difficile de garder l'équilibre... j'essaie de publier des photos dès que possible pour se rendre compte...

Courage :wink:
pour qu'il soit en équilibre stable, tout objet doit avoir 3 point d'appuis (comme une trépied), essaye de partir la dessus, ou tu lui rajoute des petites roues :stuck_out_tongue:

sinon je t'ai trouvé/dépoussiéré quelques sites :
http://www.walkingrobots.pl/
http://www.exmachina-robots.com/pageID_7979683.html

http://hobbiesdefana.free.fr/quadripode.php
http://www.semageek.com/dragoon-une-robot-quadrupede-a-base/

Voilà :wink:
Bon courage et n'hésites pas si t'as des questions :slight_smile:

pour qu'il soit en équilibre stable, tout objet doit avoir 3 point d'appuis

Hélas ça ne suffit pas. Il faut aussi que le centre des masses soit à l'intérieur du polygone de sustentation.
Ici le triangle: patteAV dr - patteAV gau - patteARR dr ou gau.
Et comme la masse est au centre, elle est sur un côté du triangle.
La marche est une question de dynamique. Il faut que la patte qui est en l'air, retouche le sol avant que l'équilibre ne puisse plus être rattrapé. Il faut donc jouer sur : temps/amplitude du mouvement.

Quand le robot lève une patte, tu dois aussi bouger les autres servos pour que le robot reste stable.
Mets-toi sur une jambe et regarde ce qui se passe: intuitivement tu inclines ton corps pour que ton centre de gravité soit à l'aplomb du pied qui touche le sol. Pour ton robot, c'est pareil, quand tu lèves la patte arrière-droit, tu dois fléchir la patte avant-gauche pour incliner le robot de sorte que son centre de gravité reste dans le "polygone de sustentation" cher à Carolyne :wink:

Très bien vu 3Sigma. Mais ça c'est la marche de l'homme ivre :grin:
L'homme à jeun reste droit pendant la marche; et c'est bien une question de: "Temps/amplitude".
Plus l'amplitude est grande, plus le temps doit être court....Ou rêve-je ?

Il faut peut-être procéder par étape: dans une première étape, la démarche du "quadripode ivre" et dans une deuxième étape le guépard (le quadrupède le plus rapide paraît-il, jamais vérifié sinon je ne serais plus là pour écrire ce post :wink: ).

Je pense qu'il est trop lourd aussi... il faut que je regarde pour l'alleger... Merci pour vos infos en tout cas... Je vais poster une vidéo de la marche.

Voilà la marche...
non bourré lol mais pas droit quand meme :~