programmare un hexapod [risolto]

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;

}
}

Ecco un video del robot funzionante.

Scusate per la qualità.

Bello bello, complimenti :slight_smile:

bello!!!
la struttura e' opera tua?

si, tutti i pezzi sono stati disegnati in cad e tagliati con una cnc al laser.

Ho caricato un nuovo video con qualità migliore Hexapod 2dof leg - YouTube

exapod:
Ho caricato un nuovo video con qualità migliore http://www.youtube.com/watch?v=EJwUIf_xWz4&feature=youtu.be

bellissimo, complimenti!

Speriamo che la commisione d'esame la pensi allo stesso modo.

Che sensori hai usato per la prossimità degli ostacoli?

Per il momento non ha nessun sensore

exapod:
Per il momento non ha nessun sensore

:astonished: Nooo! Poveretto.... si schianta!! :grin: :grin:

ahahahahaahahah. Cmq dovrei avere un sensore sharp, quando ho un po di tempo lo monto.

Beh, vedrai che la commissione ti premierà, è davvero fatto bene, io volevo portare il mio brat ma poi ho lasciato stare perchè vedono solo robottini :wink:
Questo è un bel ragnetto :stuck_out_tongue_closed_eyes:

Cmq il robot è una "piccola" parte della tesina che è in generale sulla robotica/macchine collegata alla seconda riv industriale, a marx e al futurismo.