Go Down

Topic: Primo robot con arduino (Read 1 time) previous topic - next topic

darkavatar1

Dec 18, 2012, 01:34 am Last Edit: Dec 18, 2012, 10:51 pm by darkavatar1 Reason: 1
Come da titolo sto realizzando il mio primo robot con arduino mega,sono un principiante e ho un problema con il codice.
Il mio robot è un quadrupede,con un sendore di prossimità ad ultrasuoni che ruota e gli permette di osservare e calcolare la via migliore (il classico robot evita ostacoli).
ecco il codice:
Code: [Select]

#include <Servo.h>
#define grad_gir 15   //ogni volta che il robot manda in esecuzione la funzione gira (dx o sx), si muove di 15°
Servo myservo1;
Servo myservo2;
Servo myservo3;
Servo myservo4;
Servo myservo5;
Servo myservo6;
Servo myservo7;
Servo myservo8;
Servo myservo_sens;
int echoPin = 22;                              
int initPin = 23;                                
unsigned long pulseTime = 0;                    
unsigned long distance = 0;                    

int pos=90;

void setup()
{
 myservo1.attach(2);  
 myservo2.attach(3);  
 myservo3.attach(4);  
 myservo4.attach(5);  
 myservo5.attach(8);  
 myservo6.attach(9);  
 myservo7.attach(10);  
 myservo8.attach(11);
 myservo_sens.attach(12);
 partenza();                            //mette sutti i servo nella posizione di partenza
 pinMode(initPin, OUTPUT);                    
 pinMode(echoPin, INPUT);
 delay(2000);
}

void loop()
{
 distance=sens_pross();              
 if (distance<=10)  pos_girare;
 else camminare();                     //procedura per camminare (fa un solo passo e  verifica ancora se ci sono ostacoli)
 delay(200);
 
}


void pos_girare()
{
 unsigned long distanza=10000,angolo;      
 int volte=0;
 while (pos <180)     //ho fatto più cicli per muovere il servo per farlo sembrare piu naturale dato che parte da 90°
     {                                  
       myservo_sens.write(pos);              
       delay(15);
       if (sens_pross()<distanza)
       {
          distanza=sens_pross();
          angolo=pos;
       }
       pos++;      
     }
  while(pos>=1)      
     {                                
       myservo_sens.write(pos);              
       delay(15);
       if (sens_pross()<distanza)
       {
          distanza=sens_pross();
          angolo=pos;
       }
       pos--;      
     }
  while(pos < 90)  
     {                                  
        myservo_sens.write(pos);              
       delay(15);
       if (sens_pross()<distanza)
       {
          distanza=sens_pross();
          angolo=pos;
       }
       pos++;            
     }
     
  if (angolo>90)   //ho fatto 2 if per evitare che il calcolo di volte esca negativo
     {
       volte =(int)(angolo-90)/grad_gir;      // calcola quante volte deve mandare in esecuzione la funzione gira_dx
       for (int i=0;i<volte;i++)  girare_dx();
     }
  if (angolo<90)  
     {
       volte =(int)(90-angolo)/grad_gir;
       for (int i=0;i<volte;i++)  girare_sx();
     }
}




unsigned long sens_pross()   //calcolo della distanza (formula trovata in internet XD )
{
 unsigned long d;
 digitalWrite(initPin, HIGH);                    
 delayMicroseconds(10);                          
 digitalWrite(initPin, LOW);                    
 pulseTime = pulseIn(echoPin, HIGH);            
 d = pulseTime/58;  
return d;
}

non ho postato le procedure camminare,girare_dx e girare_sx perchè sono solo istruzioni per gestire i servo, sono certo che non ci siano errori.
Sò che il codice è diverso dagli altri per i robot evita ostacoli, ma volevo fare qualcosa di originare e personale.
Quando il robot viene attivato, cammina finche non si trova a 10cm da un ostacolo; davanti ad un qualsiasi ostacolo resta fermo senza fare niente (non si muove il servo che mantiene il sensore), sembra quasi che l'intera procedura pos_girare() non venga mai chiamata..... Cosa posso fare?  (volevo inoltre sapere se esiste una specie di debug sul compilatore arduino per vedere che valori avevano le variabili durante l'esecuzione del programma)

darkavatar1

nessuno sà aiutarmi??   (sto imazzendo  =()

Subsea

ammazza! Devi dare un po' di respiro :) un up dopo 45 minuti mi sembra un po' troppo. :smiley-sweat: Comunque ti consoglio di postare il codice dentro il cancelletto sopra le emoticons, poi ci possiamo dare un occhio ;)

d407336

In loop():
Code: [Select]
if (distance<=10)  pos_girare;
mancano le parentesi a pos_girare()

darkavatar1

:smiley-roll-sweat: mi vergono ad ammetterlo ma il problema erano proprio le parentesi...
Grazie a tutti per le risposte e soprattutto a d407336 che ha risolto il problema

Go Up