Pages: [1]   Go Down
Author Topic: Primo robot con arduino  (Read 935 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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)
« Last Edit: December 18, 2012, 04:51:59 pm by darkavatar1 » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

nessuno sà aiutarmi??   (sto imazzendo  smiley-cry)
Logged

Bologna
Offline Offline
God Member
*****
Karma: 5
Posts: 520
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ammazza! Devi dare un po' di respiro smiley 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 smiley-wink
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 111
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 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
Logged

Pages: [1]   Go Up
Jump to: