Robot con hc-sr04


buongiorno, sto realizzando un robot che si muove autonomamente come tesina scolastica
nelle ultime settimane il mio professore mi ha chiesto di sostituire delay con altre funzioni in modo che il robot possa sempre leggere la distanza dagli oggetti
il programma che ho sviluppato funziona abbastanza bene solo che alcune volte il sensore restituisce valori totalmente sbagliati (anche 0.4 come se non leggesse nulla).
non riesco capire perchè si comporti in questo modo visto che uso la libreria ultrasonic che da sola va benissimo; forse arduino è troppo poco veloce?
come componenti ho usato:
arduino uno
sensore ultrasuoni hc-sr04
un servo
un ponte h che controlla due motori

arduino, il servo e il sensore sono alimentati da una pila da 9 v mentre il resto da 4 pile aa da 1.5 v

code: [select]
#include <ultrasonic.h>
 #include <servo.h>

 servo myservo;  // create servo object control servo
               // maximum of 8 servo objects can created
               
 //pin sensore
 #define trigger_pin  12
 #define echo_pin     13
 #define red_led      9
 #define green_led    8
 
 //motore sinistro
 const int motorapin1 = 4;    // h-bridge leg 1 (pin 2, 1a) 21 su basetta
 const int motorapin2 = 3;    // h-bridge leg 2 (pin 7, 2a) 20 su basetta
 
 //motore b destro
 const int motorbpin1 = 6;    // h-bridge leg 1 (pin 2, 1b) 16 su basetta
 const int motorbpin2 = 5;    // h-bridge leg 2 (pin 7, 2b) 17 su basetta
 
 //vcc 18 su basetta
 //gnd 19 su basetta

 int angolo=0,flag=0;
 float cmmsec, x ,cmdx=16,cmsx=16; //x variabile in cui metto la distanza minima dall'ostacolo
 unsigned long int time,old_time,old_time_s=0;

 
 ultrasonic ultrasonic(trigger_pin, echo_pin);

 void setup() {
 


   // set other pins you're using outputs:
   pinmode(motorapin1, output);
   pinmode(motorapin2, output);
   pinmode(motorbpin1, output);
   pinmode(motorbpin2, output);
   pinmode(trigger_pin, output);  
   pinmode(echo_pin, input);
   pinmode(red_led, output);  
   pinmode(green_led, output);

old_time=millis();
time=millis();
   
    myservo.attach(10); // piedino che controlla servo
    giraservo(160);

    serial.begin(9600);
 }

 void loop() {
 
    long microsec = ultrasonic.timing();

time=millis();

 x=15;

   // controllo se ci sono ostacoli

if(angolo==0 || angolo==2)
   { cmmsec = ultrasonic.convert(microsec, ultrasonic::cm);
     serial.print("primo ");
     serial.print(cmmsec);
   }
else
if(angolo==1)
{
cmsx = ultrasonic.convert(microsec, ultrasonic::cm);
serial.print("sx ");
serial.print(cmsx);
}
else
if(angolo==3)
{
cmdx = ultrasonic.convert(microsec, ultrasonic::cm);
serial.print("dx ");
serial.print(cmdx);
}


/*scelgo dove far girare il sensore
      caso 0 da 160 100
      caso 1 da 100 60
      caso 2 da 60 100
      caso 3 da 100 160   */
if(time>=old_time+100)
{
switch (angolo)
{
 case 0:{
 angolo=1;
 giraservo(100);
}break;
 case 1:{
 angolo=2;
 giraservo(60);
}break;
case 2:{
 angolo=3;
 giraservo(100);
}break;
 case 3:{
 angolo=0;
 giraservo(160);
}break;
}
       old_time=millis();
}
if(cmmsec < x || cmsx< x || cmdx<x)
     {
 fermo(0);
 if(cmdx<=cmsx)
 {
//vado sinistra
sinistra(600);
fermo(0);
                       
 }
 else
 {
//vado destra
destra(600);

fermo(0);
 }    
       cmdx=16;
       cmsx=16;
       cmmsec=16;

   }
   else
   {
   // no ostacoli va dritto
dritto(0);
   }
delay(500);
}


void sinistra(int tempo)
{
   digitalwrite(motorbpin1, high);   // set leg 1 of h-bridge low
   digitalwrite(motorbpin2, low);  // set leg 2 of h-bridge high
   digitalwrite(motorapin1, low);   // set leg 1 of h-bridge low
   digitalwrite(motorapin2, high);  // set leg 2 of h-bridge high
   delay(tempo);
}
void destra(int tempo)
   {
   digitalwrite(motorapin1, high);   // set leg 1 of h-bridge low
   digitalwrite(motorapin2, low);  // set leg 2 of h-bridge high
   digitalwrite(motorbpin1, low);   // set leg 1 of h-bridge low
   digitalwrite(motorbpin2, high);  // set leg 2 of h-bridge high
   delay(tempo);
   }
void fermo(int tempo)
 {
   digitalwrite(motorapin1, low);   // set leg 1 of h-bridge low
   digitalwrite(motorapin2, low);  // set leg 2 of h-bridge high
   digitalwrite(motorbpin1, low);   // set leg 1 of h-bridge low
   digitalwrite(motorbpin2, low);  // set leg 2 of h-bridge high
   delay(tempo);
 }
void dritto(int tempo)
  {
   digitalwrite(motorapin1, high);   // set leg 1 of h-bridge low
   digitalwrite(motorapin2, low);  // set leg 2 of h-bridge high
   digitalwrite(motorbpin1, high);   // set leg 1 of h-bridge low
   digitalwrite(motorbpin2, low);  // set leg 2 of h-bridge high  
   delay(tempo);
  }
void giraservo(int x)
{
myservo.write(x);
}

a fine loop hai un delay(500); salvo che la libreria ultrasonic non usi interrupt, questo ti fa saltare le tempistiche del sensore.

quindi arduino è abbastanza veloce, sei tu che lo rallenti :)


Arduino Forum > International > Italiano > Hardware (Moderator: leo72) > Robot con hc-sr04


arduino

Comments

Popular posts from this blog

Convierte tu Raspberry en un NAS. Firmware fvdw-sl 15.3 - Raspberry Pi Forums

How to format a Get Request

avrdude: verification error, first mismatch at byte 0x0000 0x0c != 0x62