Robot bipede con board arduino e rx-tx xbee pro1

ho costruito da zero un brat e non riesco a farlo camminare o meglio fa mezzo passo poi cade.... qualcuno mi può aiutare?
presto inserirò le foto e lo schema elettrico grazie in anticipo......sostanzialmente è come questo..... 6servi gws xò.... telaio in hergal e il controllore atmega328 con bootloader arduino.

beh direi che quando cammina il suo baricentro si sposta e "esce" dalla base del piede di appoggio.
ci sono varie soluzioni:
modificare la struttura del bot facendo in modo che il baricentro resti all'interno della base del piede
modificare il movimento in modo da mantenere il baricentro come sopra
utilizzare dei giroscopi meccanici come quelli delle moto radiocomandate
ecc...
comunque è un problema derivato dalla fisica, non dalla semplice programmazione :slight_smile:

so che il problema deriva in parte dalla struttura però a livello di codice non riesco a fa andare le due gambe allo stesso modo

non capisco... il codice per il movimento dovrebbe essere lo stesso, l'unica cosa che cambia è il pin di output...
quindi immagino che avrai messo il codice per il passo in una funzione e che lo richiamerai una volta per il passo sinistro e una per il destro, ovviamente attendendo che il codice precedente abbia eseguito completamente

#include <Servo.h>

Servo anc_d;     //Anca destra
Servo anc_s;     //Anca sinistra
Servo gin_d;     //Ginocchio destro
Servo gin_s;     //Ginocchio sinistro
Servo pie_d;     //Piede destro
Servo pie_s;     //Piede sinistro
int carattere;
//Posizioni a riposo dei servi
int ancdx=80;
int ancsx=85;
int gindx=85;
int ginsx=85;
int piedx=95;
int piesx=94;


void setup() 
{ 

    anc_d.attach(13);  
    anc_s.attach(12);     
    gin_d.attach(11);    
    gin_s.attach(10);     
    pie_d.attach(9);
    pie_s.attach(8);   
    Serial.begin(9600); 
}

void avanti();
void indietro();
void destra();
void sinistra();



void loop(){  
   
    anc_d.write(ancdx);  
    anc_s.write(ancsx);     
    gin_d.write(gindx);    
    gin_s.write(ginsx);     
    pie_d.write(piedx);
    pie_s.write(piesx); 
  
   if (Serial.available() > 0) {
    carattere = Serial.read();
    if (carattere == 'A') {      //Avanti
         int pos,pos1;
         Serial.println("Ora vado avanti"); 
         pie_s.write(45);           //
         pie_d.write(110);          //in queste due posizioni il robot sposta il peso su di una gamba solo la destra  
         for(pos = 85; pos>=55; pos-=1){
         gin_s.write(pos);              
         anc_s.write(pos);
         delay(130);
         }
      
    anc_d.write(ancdx);  
    anc_s.write(ancsx);     
    gin_d.write(gindx);    
    gin_s.write(ginsx);     
    pie_d.write(piedx);
    pie_s.write(piesx); 
 
         pie_s.write(75);          
         pie_d.write(110);           //in queste due posizioni il robot sposta il peso su di una gamba solo la sinistra 
         delay(100);
         for(pos1 = 85; pos1 <=115; pos1 += 1) 
           {                                   
           gin_d.write(pos1);               
           anc_d.write(pos1);
            delay(130);            
            }
    anc_d.write(ancdx);  
    anc_s.write(ancsx);     
    gin_d.write(gindx);    
    gin_s.write(ginsx);     
    pie_d.write(piedx);
    pie_s.write(piesx); 
           }
           
   
   
   
   
   
   
   
    if (carattere == 'I'){
        void indietro();
        Serial.println("Ora vado indietro"); 
        delay(1000);
         int pos,pos1;
         Serial.println("Ora vado avanti"); 
         pie_s.write(45);           //
         pie_d.write(110);          //in queste due posizioni il robot sposta il peso su di una gamba solo la destra  
         for(pos = 85; pos>=55; pos-=1){
         gin_d.write(pos);              
         anc_d.write(pos);
         delay(130);
         }
    anc_d.write(ancdx);  
    anc_s.write(ancsx);     
    gin_d.write(gindx);    
    gin_s.write(ginsx);     
    pie_d.write(piedx);
    pie_s.write(piesx); 
         pie_s.write(70);          
         pie_d.write(120);           //in queste due posizioni il robot sposta il peso su di una gamba solo la sinistra 
         delay(100);
         for(pos1 = 85; pos1 <=115; pos1 += 1) 
           {                                   
         gin_s.write(pos1);               
         anc_s.write(pos1);
         delay(130);            
            }
    anc_d.write(ancdx);  
    anc_s.write(ancsx);     
    gin_d.write(gindx);    
    gin_s.write(ginsx);     
    pie_d.write(piedx);
    pie_s.write(piesx);
    delay(1000);
    }
    if (carattere == 'D'){
        void destra();
        Serial.println("Ora giro a destra");  
        delay(1000);
    }
    if (carattere == 'S'){
        void sinistra();
        Serial.println("Ora giro a sinistra");
        delay(1000); 
    }
   
    if (carattere == 'P'){
    anc_d.write(ancdx);  
    anc_s.write(ancsx);     
    gin_d.write(gindx);    
    gin_s.write(ginsx);     
    pie_d.write(piedx);
    pie_s.write(piesx); 
    Serial.println("Ora mi fermo");
    }
   }
  }

che vi sembra?
e come si fa a inserire le foto? :-?

non capisco a che ti servono a fare le funzioni avanti() ecc.. se poi il codice è tutto negli if...
poi io creerei anche la funzione riposo() che vedo che ad ogni if esegui il codice per mettersi a riposo.
Per il resto non ho guardati più approfonditamente che i lcodice non è identato e non capisco...

ma in quale movimento, e in particolare a quale istruzione, il bot "cade"?
per inserire immagini prima le uppi su qualche sito tipo imageshack.us e poi prendi il link che ti da il sito, quello tra blablabal e lo copi nel messaggio.

nella parte in cui fa il secondo passo avanti.....si sbilancia e cade ....

an si la funzioni non ci sono in realtà.... avevo provato a farlo con le funzioni poi non andava e boh me le sarò dimenticate li..... ora mi rimetto sotto e le ripristino.....

         for(pos = 85; pos>=55; pos-=1){
         gin_s.write(pos);
         anc_s.write(pos);
         delay(130);
         }

non ho capito questo passaggio:
tu sposti il servo di un grado alla volte per 30 volte facendo aspettare 30ms? ci mette 0.9 secondi a fare un passo? :o

questo è quello che mi è saltato al'occhio, infatti se dai un valore in gradi al servo direttamente lui lo raggiunge, non serve dargli grado per grado, magari dovrai farlo aspettari 0.3 secondi se proprio vuoi essere sicuro raggiunga la posizione prima di andare avanti.

probabilmente poi avrai voluto fare un robot umanoide, sai che gli umani quando camminano a ogni passo perdono l'equilibrio? ma la velocità di spostare il piede ci permette di stare in piedi, ovvio che se il tuo robot l'hai fatto seguendo il moto delle nostra gambe non cammina perchè i servi non sono così veloci, non quelli da modellismo almeno.

ennesima cosa, probabilmente il tuo problema è che il robot ha il baricentro spostato e un'altra cosa: il movimento del piede e del ginocchio è relativo al pavimento, se vai in un punto leggermente sconnesso si rebalta, io metterei solo il servo dell'anca e gli altri liberi di muoversi, la tibia sarà sempre perpendicolare al terreno no? al massimo un filo di oscillazione ci sarà e devi comandare meno i servi e ci guadagni di tempo: ogni segnale che invii ai servi dura 20ms :wink:

il robot ora va' :slight_smile: !!!!!!!!!!!!!!!!!!!!!!!111
oRA però ho un problema devo muover un servo comendo usando due lettere della tastiera idee?

usi la omunicazione seriale a cui invii un valore o l'altro in base al tasto schiacciato.
per farlo puoi usare visual basic o anche il C per computer che è molto facile un programma simile..

per tutti quelli che hanno avuto un problema simile tu come hai risolto?

(il forum serve a questo, chiedere aiuto e postare proprie soluzioni in aiuto di altri :wink: )

avevo sbegliato il segno maggiore minore nel secondo for :-[
cmq conosco il c e come faccio a pilotarlo?

crei uno script in C che a un keypress invii un segnale sulla seriale (mettiamo 1) e che a un'altro invii un altro segnale (mettiamo 2)
poi nello sketch di arduino metti:

Byte dato;
void loop() {
  if(Serial.available() > 0) {
    dato = Serial.read();
    switch(dato) {
      case 1:
      Servo1.write(50);
      break;
      case 2:
      Servo2.write(50);
      break;
    }
  }
}

nel setup inizializzi la comunicazione seriale e attacchi i servi

poi sul pc non saprei, o meglio http://www.control.com/thread/1026187785 e aggiungi un evento in ascolto sul tasto, ora non ho il tempo e nemmeno la possibilità di vedere il codice scusa

grazie milleeeee :wink: