Problema con sensori sonar hc-sr04

Ciao a tutti!!!
Sto progettando un robot tagliaerba e per farlo orientare e per fargli evitare gli ostacoli ho montato tre sensori hc-sr04. mentre lo provavo in casa tutto bene evitava muri ed ostacoli. dopo averlo messo nel prato ho notato i primi problemi. Infatti nel momento in cui si avvicinava ad un cespuglio non molto fitto (da riuscirci a vedere attraverso) il robottino cominciava a procedere dritto come se avesse del tutto estromesso i sensori. Mentre se si avvicina ad un muro o a qualcosa di fitto non ha nessun problema. Cosa posso aver sbagliato?
Grazie mille in anticipo

Penso nella scelta dei sensori. Non sono esperto ma quei sensori sono sonar, ovvero echo. Se il segnale non "rimbalza" indietro hai un ostacolo non visibile.

Con gli ultrasuoni non puoi rilevare oggetti di piccole dimensioni o a bassa densità come un cespuglio, inoltre la vegetazione è un pessimo "riflettente" per gli ultrasuoni.
Per evitare che il robot passi in zone vietate, p.e. una aiuola, si usa la barriere perimetrale, tramite cavo interrato con segnale ad alta frequenza, per delimitare il perimetro operativo e le zone interdette.

Le zone vietate non sono un problema per il momento. Sono ancora un po indietro con il progetto....... Per ora considero di trovarmi in mezzo al prato. ed ho notato che se si trova davanti un pò di erba più alta ( a livello sensori per intenderci) è come se andasse in crash. infatti non mi darebbe fastidio se ignorasse l'erba più alta passandoci attraverso il fatto è che ci passa attraverso e poi continua ad andare dritto ignorando eventuali nuovi ostacoli che in teoria dovrebbe rilevare (arriva in prossimità di un muro, ostacolo che i sensori in genere rilevano con sicurezza, e invece di evitarlo ci picchia dentro). Sapete come potrei risolvere il problema?

controlla di aver espresso il timeout nella funzione pulseIn del sonar:

distanza = pulseIn( sonarPort, HIGH, 9000 ); // in microsecondi

sennò nel caso che l'inpulso emesso dal sonar non si rifletta se nessun ostacolo, questo rimane in attesa fino al limite massimo della funzione pulseIn (1 seconso). E' come un delay = 1000 e questo ti porta dei rallentamenti enormi.

Marco3615:
Sapete come potrei risolvere il problema?

Cosa é che nella risposta di astrobeed non Ti piace che la ignori?

Ciao Uwe

Potresti aggiungere dei semplici sensori anti collisione.

Ad esempio un "baffo/antenna" collegato ad un finecorsa oppure che tocca semplicemente un filo e chiude un circuito.

Credo abbia ragione astrobeed in questo caso.

Quei sensori funzionano a ultrasuoni: questi partono e, nel caso ci fosse qualcosa, il suono dovrebbe rimbalzare indietro e tornare per far capire al sensore che lì c'è un ostacolo.

Nel caso di una siepe, un cespuglio o simili il suono potrebbe non rimbalzare indietro correttamente rendendo praticamente inutile l'utilità del sensore in quel caso.
Forse dovresti provare semplicemente con un altro sensore.

PS: Interessante comunque il progetto. potresti dirmi se ti va quali altri sensori e componenti hai implementato per crearlo con Arduino?

Il timeout dei sonar è giusto xk l'ho provato in ambienti grandi al chiuso e funziona correttamente. e anche se mi desse dei rallentamenti cmq non sarebbero un problema se il robot riprendesse a funzionare. invece comincia ad andare dritto non risponde neanche più al comando di stop che ho impostato tramite telecomando ir. non so proprio xk succeda.

In effetti ho già messo dei microswitch come sistema anticollisione ed effettivamente funzionano bene però mi spiacerebbe abbandonare l'idea dei sensori hc sr04 anche xk ho trovato un progetto di un robotmower su elettronica in e loro usano dei sensori simili. io tra l'altro pensavo di utilizzarli anche come sensori per il "vuoto" in modo che se si avvicinasse ad un gradino riconoscesse il buco e tornasse indietro. così ora devo pensare a qualche altro modo per risolvere il problema.

ogni quanto fai il rilevamento della distanza col sonar nel loop? a quanto hai impostato il timeout? dovresti mettere in post un po di codice per cercare di capirci...

Questa è la parte di codice che concerne un solo sensore hcsr04. io l'ho triplicato per i tre sensori
se serve più codice lo aggiungo senza nessun problema

  //porta bassa l'uscita del trigger
digitalWrite( triggerPort, LOW );

 
//invia un impulso di 10microsec su trigger
digitalWrite( triggerPort, HIGH );
delayMicroseconds( 10 );
digitalWrite( triggerPort, LOW );


 
long duration = pulseIn( echoPort, HIGH );

 
long r = 0.034 * duration / 2;

 
Serial.print( "durata: " );
Serial.print( duration );
Serial.print( " , " );
Serial.print( "distanza: " );

 
//dopo 38ms è fuori dalla portata del sensore
if( duration > 38000 ) Serial.println( "fuori portata");
else { Serial.print( r ); Serial.println( "cm" );}

ok, prova, tanto per escludere che non sia quello il problema, ad impostare un timeout alla funzione pulseIn di 10000 (10ms). Fallo per tutte le funzioni dei sonar. Se effettui la misurazione ad ogni loop, e i sonar non ricevono il segnale riflesso mantengono l'uscita in HIGH e anche pulseIn resta in attesa per 1 sec. Questo (se fosse questo il caso) ti bloccherebbe il loop di 1 secondo sopra ogni funzione di pulseIn dei sensori che trova nel codice. sembrerebbe ingovernabile dato che per impartirli il comando dovresti darli l'input esattamente quando si libera l'ultimo pulseIn. Avresti 1000 ms di pausa e pochi us di tempo per impartire il comando.

  //porta bassa l'uscita del trigger
digitalWrite( triggerPort, LOW );

 
//invia un impulso di 10microsec su trigger
digitalWrite( triggerPort, HIGH );
delayMicroseconds( 10 );
digitalWrite( triggerPort, LOW );


 
long duration = pulseIn( echoPort, HIGH, 10000 ); // Timeout a 10ms

 
long r = 0.034 * duration / 2;

 
Serial.print( "durata: " );
Serial.print( duration );
Serial.print( " , " );
Serial.print( "distanza: " );

 
//dopo 38ms è fuori dalla portata del sensore
if( duration > 38000 ) Serial.println( "fuori portata");
else { Serial.print( r ); Serial.println( "cm" );}