macchina evita ostacoli.... AIUTO!

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)

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare.
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

E' probabile che sia un problema di alimentazione: l'assorbimento dei motori è tale che disturba il funzionamento del sensore.

Come alimenti Arduino ed i motori?

Arduino e i motori vengono alimentati con una batteria da 12V 1,3 A/h

prova cosi:

...
unsigned long obstacle()
{
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);                 
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    unsigned long distance;
    if ( 0 == ( distance = pulseIn(echoPin, HIGH) ) distance = 3000;
    distance /= 58;
    return distance;
}

byte direction = 0;

void goStop(){...}
void goRight(){...}
void goLeft(){...}
void goForward(){...}
void goBack{...}

void loop
{
    unsigned long distance = obstacle();
    if ( distance > 45 && direction != 1 )
        goForward();
    else if ( distance < 45 )
    {
        goStop();
        delay(xxx);
        goRight();
        while ( obstacle() <45 ) ;
    }
}

Ora completa e cerca di rimanere ordinato!

dimenticavo, se sei ordinato spesso non c'è nemmeno bisogno di commentare il codice.