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
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![smiley :)](https://forum.arduino.cc/smileys/arduino/smiley.gif)
quindi arduino è abbastanza veloce, sei tu che lo rallenti
![smiley :)](https://forum.arduino.cc/smileys/arduino/smiley.gif)
Arduino Forum > International > Italiano > Hardware (Moderator: leo72) > Robot con hc-sr04
arduino
Comments
Post a Comment