buonasera, sto cercando di realizzare una macchina che eviti gli ostacoli, rilevandoli con il sensore a ultrasuoni srf04, praticamente se la distanza è maggiore di 45 la macchina va dritta, altrimenti gira finchè la distanza non è di nuovo maggiore di 45 in modo che vada di nuovo dritta. purtroppo quando dovrebbe andare dritta rileva ostacoli che in realtà non ci sono, il sensore rileva una distanza di 0cm dal presunto oggetto (visibile sulla seriale); questo si verifica solo quando i motori sono in funzione e la macchina va, se utilizzo il programma "metro" da solo funziona benissimo... da cosa può dipendere e come lo potrei risolvere? ho provato con un if(distance==0){.....(continua ad andare dritto)} ma non funziona....grazie mille a tutti.
allego il codice:
#define echoPin 2 //segnale echo al pin 2
#define trigPin 3 //segnale trigger al pin 3
int en1 = 11; //enable del motore 1 al piedino 13
int en2 = 6; //enable del motore 2 al piedino 6
int a = 13; //segnale a del motore 1 al piedino 13
int b = 12; //segnale b del motore 1 al piedino 12
int c = 10; //segnale c del motore 2 al piedino 10
int d = 7; //segnale d del motore 2 al piedino 7
int led = 5; //segnale per lo stop
void setup()
{
pinMode(echoPin, INPUT); //impostazione piedino come ingresso
pinMode(trigPin, OUTPUT); //impostazione piedino come uscita
pinMode(en1, OUTPUT); //impostazione piedino come uscita
pinMode(en2, OUTPUT); //impostazione piedino come uscita
pinMode(a, OUTPUT); //impostazione piedino come uscita
pinMode(b, OUTPUT); //impostazione piedino come uscita
pinMode(c, OUTPUT); //impostazione piedino come uscita
pinMode(d, OUTPUT); //impostazione piedino come uscita
pinMode(led, OUTPUT); //impostazione piedino come uscita
Serial.begin(9600); //comunicazione seriale
}
void loop()
{
digitalWrite(trigPin, LOW); //impostazione piediedino trig basso per 2uS
delayMicroseconds(2);
digitalWrite(trigPin, HIGH); //impostazione piedino trig alto per 10uS
delayMicroseconds(10);
digitalWrite(trigPin, LOW); //impostazione piedino trig basso
int distance = pulseIn(echoPin, HIGH); //impostazione variabile per memorizzare la distanza e imposazione echo alto cronometra da quando è basso a quando è alto in uS
distance= distance/58; // calcola la distanza dall'impulso
Serial.println(distance); //stampa sul monitor seriale la distanza
delay(100); //aspetta 100 uS per la prossima lettura
if(distance>45){
//se la distanza dall'oggetto è maggiore di 45 vai avanti
// motore 1 attivo, gira in senso orario - avanti
analogWrite(en1, 100); //egnale pwm per il controllo della velocita
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
// motore 1 attivo, gira in senso orario - avanti
analogWrite(en2, 100); //egnale pwm per il controllo della velocita
digitalWrite(d, LOW);
digitalWrite(c, HIGH);
// stop
digitalWrite(led, LOW);
}
if(distance<45){
//se la distanza dall'oggetto è minore di 45 fermo per 100uS poi gira finchè non torna maggiore di 46
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
delay(100);
do{
digitalWrite(en1, HIGH);
digitalWrite(en2, HIGH);
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(d, LOW);
digitalWrite(c, HIGH);
digitalWrite(led, HIGH);
}while(distance>46);
}
Serial.println(distance);
}
prova_4.ino (2.71 KB)