buonasera, sto realizzando un macchina evita ostacoli, tramite il sensore a ultrasuoni srf04 che rileva la distanza, in base alla distanza o va dritto o gira a sinistra, il codice sembra funzionare ma vorrei migliorarlo, cerco degli aiuti, mi è stato detto che dovrei rileggere la distanza più volte ma non ho capito... fin ora ho realizzato questo:
#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 distanza = pulseIn(echoPin, HIGH); //impostazione variabile per memorizzare la distanza e imposazione echo alto cronometra da quando è basso a quando è alto in uS
distanza= distanza/58; // calcola la distanza dall'impulso
Serial.println(distanza); //stampa sul monitor seriale la distanza
delay(100); //aspetta 100 uS per la prossima lettura
if(distanza>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 2 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(distanza<45){
//se la distanza dall'oggetto è minore di 45 fermo per 100uS poi gira finchè non torna maggiore di 46 cm
digitalWrite(a, LOW); // motore 1 fermo
digitalWrite(b, LOW);
digitalWrite(c,LOW); //motore 2 fermo
digitalWrite(d,LOW);
delay(100); //aspetta 100 uS
do{
digitalWrite(en1, HIGH); //enable alti, motori abilitati
digitalWrite(en2, HIGH);
digitalWrite(a, LOW); //motore 1 gira in senso anti orario - indietro
digitalWrite(b, HIGH);
digitalWrite(d, LOW); //motore 2 gira in senso orario - avanti
digitalWrite(c, HIGH);
digitalWrite(led, HIGH); //stop acceso finchè la distanza non torna maggiore di 46 cm
}while(distanza>46);
}
Serial.println(distanza);
}
