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.
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.
Salut NicolasB
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)
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...
#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;
}
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
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
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
Très bien vu 3Sigma. Mais ça c'est la marche de l'homme ivre
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 ).
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.