Ciao a tutti, ho da poco finito di costruire un hexapod (http://letsmakerobots.com/node/29821) ma ora ho dei problemi nel scrivere il programma per farlo camminare.
Il wave gait funziona ma l'hexapod no, il problema è che quando si muove perde l'equilibrio e cade sul servo 6.
Ho creato tre funzioni: muovi, alza ed abba; che come si comprende dal nome muovono,alzano ed abbassano il servo selezionato di n gradi.
Capisco che è molto difficile risolvere il problema guardando solo il codice ma qualsiasi aiuto o documento su i gait negli hexapod sono molto apprezzati.
Grazie a tutti per l'aiuto.
La foto mostra il nome dei servi nell'hexapod.
#include <Servo.h>
#define avanti 0
#define indietro 1
#define wavegait 0
#define tripodgait 1
Servo S1,S2,S3,S4,S5,S6;
Servo S1Z,S2Z,S3Z,S4Z,S5Z,S6Z;
//zero servi
int p1=94,p2=97,p3=97,p4=81,p5=81,p6=81,p1Z=89,p2Z=94,p3Z=87,p4Z=90,p5Z=87,p6Z=86;
char c;
void setup()
{ // pin collegamento servi
S1.attach(3); S2.attach(5); S3.attach(6); S4.attach(9); S5.attach(10);
S6.attach(12); S1Z.attach(2); S2Z.attach(4); S3Z.attach(7); S4Z.attach(8);
S5Z.attach(11); S6Z.attach(13);
tuttiservi90(1000);
}
void loop() {
if(wavegait){
for (c=3;c>0;c--){
alza(c,30,100);
muovi(c,indietro,30,100);
abba(c,0,100);
}
for (c=4;c<7;c++){
alza(c,30,100);
muovi(c,indietro,30,100);
abba(c,0,100);
}
for(c=1;c<7;c++){
muovi(c,avanti,0,0);
}
delay(300);
}
if(tripodgait){
alza(1,30,0);
alza(3,30,0);
alza(5,30,100);
muovi(1,avanti,15,0);
muovi(3,avanti,15,0);
muovi(5,avanti,15,100);
muovi(2,indietro,15,0);
muovi(4,indietro,15,0);
muovi(6,indietro,15,100);
abba(1,0,0);
abba(3,0,0);
abba(5,0,100);
alza(2,30,0);
alza(4,30,0);
alza(6,30,100);
muovi(2,avanti,15,0);
muovi(4,avanti,15,0);
muovi(6,avanti,15,100);
muovi(1,indietro,15,0);
muovi(3,indietro,15,0);
muovi(5,indietro,15,100);
abba(2,0,0);
abba(4,0,0);
abba(6,0,100);
}
}
void alza(char servoalz,char gradi_alza,unsigned int delay_alza){
switch(servoalz){
case 1:
S1Z.write(p1Z-gradi_alza );
delay(delay_alza);
break;
case 2:
S2Z.write(p2Z-gradi_alza );
delay(delay_alza);
break;
case 3:
S3Z.write(p3Z-gradi_alza );
delay(delay_alza);
break;
case 4:
S4Z.write(p4Z+gradi_alza );
delay(delay_alza);
break;
case 5:
S5Z.write(p5Z+gradi_alza );
delay(delay_alza);
break;
case 6:
S6Z.write(p6Z+gradi_alza );
delay(delay_alza);
break;
}
}
void tuttiservi90(unsigned int delay90){
S1.write(p1);
S2.write(p2);
S3.write(p3);
S4.write(p4);
S5.write(p5);
S6.write(p6);
S1Z.write(p1Z+10);
S2Z.write(p2Z+10);
S3Z.write(p3Z+10);
S4Z.write(p4Z-10);
S5Z.write(p5Z-10);
S6Z.write(p6Z-10);
delay(delay90);
}
void muovi(char servomov,char direzione,char gradi_mov,unsigned int delaymov){
switch(servomov){
case 1:
if(direzione==avanti){
S1.write(p1-gradi_mov );
delay(delaymov);
}
else if (direzione==indietro){
S1.write(p1+gradi_mov );
delay(delaymov);
}
break;
case 2:
if(direzione==avanti){
S2.write(p2-gradi_mov );
delay(delaymov);
}
else if (direzione==indietro){
S2.write(p2+gradi_mov );
delay(delaymov);
}
break;
case 3:
if(direzione==avanti){
S3.write(p3-gradi_mov );
delay(delaymov);
}
else if (direzione==indietro){
S3.write(p3+gradi_mov );
delay(delaymov);
}
break;
case 4:
if(direzione==avanti){
S4.write(p4+gradi_mov );
delay(delaymov);
}
else if (direzione==indietro){
S4.write(p4-gradi_mov );
delay(delaymov);
}
break;
case 5:
if(direzione==avanti){
S5.write(p5+gradi_mov );
delay(delaymov);
}
else if (direzione==indietro){
S5.write(p5-gradi_mov );
delay(delaymov);
}
break;
case 6:
if(direzione==avanti){
S6.write(p6+gradi_mov );
delay(delaymov);
}
else if (direzione==indietro){
S6.write(p6-gradi_mov );
delay(delaymov);
}
break;
}
}
void abba(char servoalz,char gradi_abb,unsigned int delay_alza){
switch(servoalz){
case 1:
S1Z.write(p1Z+gradi_abb+10 );
delay(delay_alza);
break;
case 2:
S2Z.write(p2Z+gradi_abb+10 );
delay(delay_alza);
break;
case 3:
S3Z.write(p3Z+gradi_abb+10);
delay(delay_alza);
break;
case 4:
S4Z.write(p4Z-gradi_abb -10);
delay(delay_alza);
break;
case 5:
S5Z.write(p5Z-gradi_abb -10);
delay(delay_alza);
break;
case 6:
S6Z.write(p6Z-gradi_abb -10);
delay(delay_alza);
break;
}
}