[Risolto] Identificare guasto su un sensore ad ultrasuoni HC-SR04

Ciao a tutti,

sono in possesso di un Arduino Duemilanove e ho acquistato su ebay 3 sensori HC-SR04 e per tutti e tre ottengo sempre un valore letto dal pin Echo uguale a 0. Ho provato ad utilizzare sia la libreria Ultrasonic e sia gli sketch che gestiscono direttamente la scrittura sul trigger e la successiva lettura sul pin di Echo. Ma per tutti e 3 il valore e' sempre 0. L'arduino e' alimentato dalla porta USB su cui si leggono i dati.

Le prove sono state effettuate sia collegando i sensori direttamente alla board sfruttando i pin 11, 12, 13, GND sia collegando e testando con diversi altri pin tramite una bread board.

Un esempio di codice usato per i test e' il seguente:

const int trigPin = 12;   
const int echoPin = 13;     


void setup() {
       Serial.begin(9600);
       pinMode(trigPin, OUTPUT);
       pinMode(11, OUTPUT); // Pin VCC sensor
       digitalWrite(11, HIGH);
       pinMode(echoPin, HIGH);
}

void loop() {

   int duration, distance;


   pinMode(trigPin, OUTPUT);
   digitalWrite(trigPin, LOW);
   delayMicroseconds(2);
   digitalWrite(tringPin, HIGH);
   delayMicroseconds(10);
   digitalWrite(pingPin, LOW);

   pinMode(echoPin, INPUT);
   duration = pulseIn(echoPin, HIGH);
   distance = (duration/2) / 29.1;

   Serial.print(distance);
   Serial.println(" cm");
   Serial.print(duration);
   Serial.println(" duration");

   delay(1000);
 }

Ignorando l'algoritmo ottimale per trovare il valore piu' preciso (per esempio tramite media di campionamenti, ecc.) nei test che ho fatto con i sensori il valore duration e' sempre uguale a 0 ed ovviamente anche la distanza in cm sara' uguale.

Adesso presumendo che il codice sia corretto c'e' un modo per poter verificare se un sensore e' guasto oltre ad avere un valore sempre uguale a 0 come nel mio caso? Potrebbe essere un problema di insufficienza di alimentazione anche se i test sono stati fatti su una board con il solo sensore montato e nessun altro oggetto che assorba alimentazione?

Ho letto diversi thread e forum e ho trovato solo in questo:

ed in ultro il mio stesso problema. In questo non ci sono risposte nell'altro il problema era legato alla mancanza dei comandi che attivassero il pin 11 per alimentare il sensore. Ma nel mio caso questo puo' non essere paragonato visto che ho provato anche su una breadboard in cui alimentavo il sensore direttamente prendendo la corrente dal pin dei 5v.

Detto questo per concludere c'e' un modo per assicurarmi che effettivamente sia tutti 3 i sensori danneggiati e non ci sia un mio sbaglio da qualche parte?

Grazie in anticipo a tutti quelli che perderanno un po' di tempo nel rispondermi.

Geaaru

È improbabile che tutti tre i sensori siano rotti, é possibile che hai rotti tutti tre uno dopo l' altro.

Il sensore SR04 ha 4 piedini:
GND: va a GND di Arduino
VCC: va a 5V di Arduino
trig: gli dai un impulso H di una lunghezza almeno 10µs e po aspetti la risposta sul pin echo
echo: dopo il segnale trigger il modulo effettua una misura e da un impulso pari al tempo di percorrenza del suono fino all ostacolo e ritorno.

Col codice Sensore a ultrasuoni HC SR04 e Arduino | Tauon Barcadero
ottieni 0 cm o anche un tempo di durata di 0?

Ti consiglio il modulo SFR05 che é simile ma che ha anche la modalitá che puó essere triggerato sullo stesso piedino dove manda la risposta. percui Ti basta un piedino per il sensore.

Ciao Uwe

Fossi in te non alimenterei HC-SR04 con un digital pin dell' atmega, poichè non sai quanto assorbe il sensore
collega il pin di alimentazione(sensore) ai 5v dell'Arduino

A parte che sono molto fortunato (o meglio sfortunato :slight_smile: ) ... credo di non averli rotto tutti e 3 ... almeno spero. :slight_smile:
Pero' ho fatto dei test piuttosto semplici.

Per il discorso valori, si esatto ottengo un valore 0 gia' come durata e quindi conseguentemente un valore zero anche sui cm.

Per il discorso alimentazione... ho infatti eseguito il test collegando il sensore direttamente sull'arduino usando il pin digitale per alimentarlo ma anche collegandolo direttamente al pin analogico 5v tramite una bread board, quindi non so proprio che pesci prendere :).

Grazie mille per l'attenzione.

D.

Avevo avuto anche io un problema con questo sensore ad ultrasuoni:
http://arduino.cc/forum/index.php/topic,97268.0.html
ecco il topic che avevo aperto.

Si avevo visto il tuo topic, ma nel mio caso non ho valori sballati, ho sempre 0.

Aggiungo un informazione... il valore duration e' sempre 0 ma c'e' una cosa che e' strana il led del pin 13 si illumina ovviamente un po' piu' a lungo se la distanza e' piu' lunga tra il sensore ed il primo oggetto... questo mi indicherebbe che il sensore funzioni, ma allora perche' il risultato della funzione pulseIn risulta essere sempre pari a 0?

Potrebbe esserci qualche problema nell'utilizzo del sensore con l'arduino Duemilanove e/o nel leggere il valore dal pin echo ?

Hai provato di usare un altro pin per il echo. Sul pin 13 il LED puó dare fastidio e puó non raggiungere una tensione letta come H. Questo non vale per l'Arduino UNO R3 che usa un amplificatore operazionale per pilotare il LED L sul pin13.

Ciao Uwe

Si adesso ho collegato l'echo sul pin 6 mantenendo il trigger sul 12, ma la duration rimane sempre a 0.

...mmmm... non capisco

Ciao a tutti,

ho provato a mettermi sul pin echo del sensore con un tester. In pratica da quanto ho visto viene sparato fuori sull'echo un voltaggio che sale proporzionalmente alla distanza del primo ostacolo.
Con una distanza di 3/4 metri sul pin echo vedo un voltaggio di 4.0-4.6V e anche in questo caso la funzione pulseIn ritorna sempre 0. Nei casi in cui l'ostacolo sta a 20/30cm sul pin echo si arriva a 0,025-0,030V il che vuol dire che pulseIn(.., HIGH) ritornera' sempre 0.

Sulla base del codice che ho inserito (che e' molto simile a quello che fa la libreria) la lettura della distanza dovrebbe essere data dalla quantita' di tempo in cui sul pin ECHO si ha una frequenza superiore a 3.0/3.3V giusto ? E' questo lo scopo della funzione pulseIn ? In realta' sul sensore che ho io, la quantita' di voltaggio indica la distanza e quindi l'algoritmo sarebbe sbagliato in questo caso.

Non capisco pero' perche' anche nel caso il voltaggio arrivi a 4.6V la duration rimanga sempre a 0! Infatti se uso il pin 13 il led si accende anche per 500/600ms .

Potrebbe esserci un bug nel codice che legge i dati dal pin Echo? Ho provato anche su un Arduino Uno e lo scenario non cambia.

Di seguito il codice un po' piu' compilabile di quello che avevo messo inizialmente.

const int trigPin = 12;   
const int echoPin = 13;     


void setup() {
       Serial.begin(9600);
       pinMode(trigPin, OUTPUT);
       pinMode(11, OUTPUT); // Pin VCC sensor
       digitalWrite(11, HIGH);
       pinMode(echoPin, INPUT);
}

void loop() {

   long duration, distance;


   //pinMode(trigPin, OUTPUT);
   digitalWrite(trigPin, LOW);
   delayMicroseconds(2);
   digitalWrite(trigPin, HIGH);
   delayMicroseconds(10);
   digitalWrite(trigPin, LOW);
 // delayMicroseconds(10);
   //pinMode(echoPin, INPUT);
  // duration = pulseIn(echoPin, HIGH, 10000);
      duration = pulseIn(echoPin, HIGH);
   distance = (duration/2) / 29.1;

   Serial.print(distance);
   Serial.println(" cm");
   Serial.print(duration);
   Serial.println(" duration");

   delay(1000);
 }

Mission Accomplished!!!

Arduino e' troppo veloce rispetto al sensore quindi occorre allungare il timeout sul pulseIn.

duration = pulseIn(echoPin, HIGH, 60000000L);

Grazie a tutti per il supporto e le risposte.

W Arduino!

Per misurare qualcosa di significante devi usare un oscilloscopio e non un tester. cosí vedi la forma d'onda e la durata dei impulsi.

Non ci credo; Stai dando a pulseIn() un tempo di timeout di 60 secondi. Di defaut, omettendo il parametro timeout, il tempo di timeout é 1 secondo.
Il datasheet dice che l' impulso é da 150µS a 25mS e se non c'é un ostacolo l' impulso dura 38mS e che la distanza si calcolo il tempo del impulso in µS diviso per 58 per ottenere cm.

Il problema potrebbe essere che hai scritto:

   pinMode(trigPin, OUTPUT);
   digitalWrite(trigPin, LOW);
   delayMicroseconds(2);
   digitalWrite(tringPin, HIGH);
   delayMicroseconds(10);
   digitalWrite(pingPin, LOW);

   pinMode(echoPin, INPUT);
   duration = pulseIn(echoPin, HIGH);
   distance = (duration/2) / 29.1;

Togli i pinMode dal loop() e mettili nel setup(). Non ha senso che ci sia. Anche se l'e secuzione dura solo intorno a 4µS puó essere che perdi l' inizio del impulso echo del sensore e percui non misuri niente.

la sintassi del "pinMode(echoPin, HIGH);" nel setup é sbaglaito.

Ciao Uwe