Sensor Ultrasonico - mediciones erróneas

Amigos resulta ser que tengo un problema con un sensor HC-SR04, lo tengo programado para cuando un objeto este a menos de 20 cm se encienda un Led o de lo contrario se apague…

Mi inconveniente es que el sensor arroja por unos instantes el valor “0” (cero centímetros) sin que tenga ningún tipo de obstáculo presente y hace encender mi Led por un instante cosa que no quiero que pase :

O en el peor de los casos se queda congelada en “0” todo el tiempo sin importar lo que haga, hasta apretar de nuevo el botón de reset del arduino…

ESTE ES EL CÓDIGO QUE ESTOY USANDO

     #define trigPin 9
     #define echoPin 8
     #define led 12

     void setup()
        {   Serial.begin (9600);
            pinMode(trigPin, OUTPUT);
            pinMode(echoPin, INPUT); 
            pinMode(led, OUTPUT);
        }

     void loop()
     
        {   
               
            long duracion, distancia ;
            
            digitalWrite(trigPin, LOW);        
            delayMicroseconds(2);              
            digitalWrite(trigPin, HIGH);      
            delayMicroseconds(10);             
            digitalWrite(trigPin, LOW);  
            
            duracion = pulseIn(echoPin, HIGH) ;
            distancia = duracion / 2 / 29.1  ;
            
            Serial.println(String(distancia) + " cm.") ;
                        
            if ( distancia < 20 )
                 digitalWrite ( led , HIGH) ;
            else
                 digitalWrite( led , LOW) ;
                 
            delay (500) ;    
        }

COMO PUEDO EVITAR QUE PASE ESTO? GRACIAS DESDE YA :slight_smile:

Hola yo utilizo este código te lo dejo para ver si te sirve es similar al que usas solo que yo puse en el rango de distancia mínima 10 cm. También podrías usar la librería NewPing que esta muy bien optimizada para este tipo de sensores. Saludos

Código:

#define Pecho 6
#define Ptrig 7
long duracion, distancia;   
 
void setup() {                
  Serial.begin (9600);       // inicializa el puerto seria a 9600 baudios
  pinMode(Pecho, INPUT);     // define el pin 6 como entrada (echo)
  pinMode(Ptrig, OUTPUT);    // define el pin 7 como salida  (triger)
  pinMode(13, 1);            // Define el pin 13 como salida
  }
  
void loop() {
  
  digitalWrite(Ptrig, LOW);
  delayMicroseconds(2);
  digitalWrite(Ptrig, HIGH);   // genera el pulso de triger por 10ms
  delayMicroseconds(10);
  digitalWrite(Ptrig, LOW);
  
  duracion = pulseIn(Pecho, HIGH);
  distancia = (duracion/2) / 29;            // calcula la distancia en centimetros
  
  if (distancia >= 500 || distancia <= 0){  // si la distancia es mayor a 500cm o menor a 0cm 
    Serial.println("---");                  // no mide nada
  }
  else {
    Serial.print(distancia);           // envia el valor de la distancia por el puerto serial
    Serial.println("cm");              // le coloca a la distancia los centimetros "cm"
    digitalWrite(13, 0);               // en bajo el pin 13
  }
  
   if (distancia <= 10 && distancia >= 1){
    digitalWrite(13, 1);                     // en alto el pin 13 si la distancia es menor a 10cm
    Serial.println("Alarma.......");         // envia la palabra Alarma por el puerto serial
  }
  delay(400);                                // espera 400ms para que se logre ver la distancia en la consola
}

lo acabo de probar... me soluciono el problema del parpadeo del led por unos instantes pero el otro problema sigue el de quedarse congelado :(

ah y gracias por la ayuda

mike_117: Hola yo utilizo este código te lo dejo para ver si te sirve es similar al que usas solo que yo puse en el rango de distancia mínima 10 cm. También podrías usar la librería NewPing que esta muy bien optimizada para este tipo de sensores. Saludos

tu problema puede estar por este camino

defines distancia como long

long duracion, distancia;

Yo creo que no existen distancias negativas, en todos caso usaría una variable tipo float

float distancia;

Y como la tienes definida como long lo que sigue es una barbaridad (desde el punto de vista de programación) y ya lo explico.

distancia = (duracion/2) / 29;

Divides un numero largo x 2 y luego por 29, lo que genera un resultado del tipo long tamb. Asi que supongamos que la lectura fuera menor a 29x2 = 58. Supongamos 57, tendrías 57/2/29 = 0 y cualquier valor que entregue duración entre 1 y 57 dará 0

Ahora si lo pones como float mira el cambio para duracion = 1 => distancia = 1/2/29 = 0.17 para duracion = 57 => distancia = 57/2/29 = 0.983

Mira que cambio por definir correctamente el tipo de variable. Prueba y nos cuentas.

Aha! ahora lo tengo claro... disculpa estoy empezando recién en el mundo de arduino y la programación :sweat_smile:

pero sigue con los dos problemas incluso cambiando a (float), el parpadeo lo pude solucionar con el código de @mike_117

pero sigue quedándose congelado :( he notado que me pasa cuando llego a tocar físicamente el sensor, si no lo llego a tocar funciona bárbaro... Hice un vídeo para que entiendan mejor lo que ocurre...

https://www.youtube.com/watch?v=to5ThSqUFRo

surbyte: Y como la tienes definida como long lo que sigue es una barbaridad (desde el punto de vista de programación) y ya lo explico.

distancia = (duracion/2) / 29;

Divides un numero largo x 2 y luego por 29, lo que genera un resultado del tipo long tamb. Asi que supongamos que la lectura fuera menor a 29x2 = 58. Supongamos 57, tendrías 57/2/29 = 0 y cualquier valor que entregue duración entre 1 y 57 dará 0

Ahora si lo pones como float mira el cambio para duracion = 1 => distancia = 1/2/29 = 0.17 para duracion = 57 => distancia = 57/2/29 = 0.983

Mira que cambio por definir correctamente el tipo de variable. Prueba y nos cuentas.

dices que el código que te postee te sirvio no? podrías volver a subir el nuevo código que estas usando incluyendo las modificaciones que has hecho

Otra observación, eh visto el video que has incluido y se me hace muy raro el hecho de que cuando tocas el sensor este se "buguea" por así decirlo, mi experiencia no es mucha pero pues has intentado cambiar ese sensor por otro y probar? digo esto porque cuando recién empecé a usar estos sensores en una ocasión termine quemando uno, por curiosidad lo deje enfriar como 10 min y lo volví a probar a ver si funcionaba, me sorprendió el hecho de que si lo hiciera pero minutos después de hacer algunas pruebas me pasaba algo similar a lo que te esta pasando ahorita, el caso es que termine por reemplazar ese sensor por otro y nuevamente pude trabajar bien.

Pues la verdad tengo 2 sensores y son nuevos y el fallo ocurre con los 2…
Este es el código que me pasaste solo le cambie los pines:

#define Pecho 8
#define Ptrig 9
float duracion, distancia;   
 
void setup() {                
  Serial.begin (9600);       // inicializa el puerto seria a 9600 baudios
  pinMode(Pecho, INPUT);     // define el pin 6 como entrada (echo)
  pinMode(Ptrig, OUTPUT);    // define el pin 7 como salida  (triger)
  pinMode(12, 1);            // Define el pin 13 como salida
  }
  
void loop() {
  
  digitalWrite(Ptrig, LOW);
  delayMicroseconds(2);
  digitalWrite(Ptrig, HIGH);   // genera el pulso de triger por 10ms
  delayMicroseconds(10);
  digitalWrite(Ptrig, LOW);
  
  duracion = pulseIn(Pecho, HIGH);
  distancia = (duracion/2) / 29;            // calcula la distancia en centimetros
  
  if (distancia >= 500 || distancia <= 0){  // si la distancia es mayor a 500cm o menor a 0cm 
    Serial.println("---");                  // no mide nada
  }
  else {
    Serial.print(distancia);           // envia el valor de la distancia por el puerto serial
    Serial.println("cm");              // le coloca a la distancia los centimetros "cm"
    digitalWrite(12, 0);               // en bajo el pin 13
  }
  
   if (distancia <= 10 && distancia >= 1){
    digitalWrite(12, 1);                     // en alto el pin 13 si la distancia es menor a 10cm
    Serial.println("Alarma.......");         // envia la palabra Alarma por el puerto serial
  }
  delay(400);                                // espera 400ms para que se logre ver la distancia en la consola
}

Probé con un arduino mega ese mismo código se congela al empezar , cambie el codigo y funciona, solo que con el problema de siempre al tocarlo se queda congelado

mike_117:
dices que el código que te postee te sirvio no? podrías volver a subir el nuevo código que estas usando incluyendo las modificaciones que has hecho

Otra observación, eh visto el video que has incluido y se me hace muy raro el hecho de que cuando tocas el sensor este se “buguea” por así decirlo, mi experiencia no es mucha pero pues has intentado cambiar ese sensor por otro y probar? digo esto porque cuando recién empecé a usar estos sensores en una ocasión termine quemando uno, por curiosidad lo deje enfriar como 10 min y lo volví a probar a ver si funcionaba, me sorprendió el hecho de que si lo hiciera pero minutos después de hacer algunas pruebas me pasaba algo similar a lo que te esta pasando ahorita, el caso es que termine por reemplazar ese sensor por otro y nuevamente pude trabajar bien.

Acabo de probar dejándolo trabajar un buen tiempo y también ocurre lo mismo se queda "congelado" los 2 sensores :(

Pon el esquema de conexionado. Cambia los pines de echo y trigger. He visto que en el video que usas un micro (o nano), si tiene un uno a mano prueba el codigo. En codigo prueba esto y dinos versión del ide.

duracion = pulseIn(Pecho, HIGH);
distancia = (duracion/2.0)/29.0;

Acabo de cambiar los pines y el pedazo de código y sigue con lo mismo, al tocar varias veces el sensor se traba, estoy usando la versión 1.0.6 de arduino
algunas veces ni el botón de reset del arduino lo hace funcionar de vuelta tengo que desconectar de la fuente
enseguida subo el esquema

victorjam:
Pon el esquema de conexionado.
Cambia los pines de echo y trigger.
He visto que en el video que usas un micro (o nano), si tiene un uno a mano prueba el codigo.
En codigo prueba esto y dinos versión del ide.

duracion = pulseIn(Pecho, HIGH);

distancia = (duracion/2.0)/29.0;

No es lógico que se quede colgado el arduino solo por eso, y más que colgado cuando al hacerle un reset tampoco funciona... Como te he dicho antes prueba, si puedes, a cambiar el arduino por otro, a ser posible que no sea micro... para mi gusto son malisimos...

esto es muy raro si lo dejas funcionando se congela solo, luego vuelve a funcionar por un rato después se congela y asi continua.... tengo un mega voy a probar con eso y les aviso gracias a todos!

victorjam: No es lógico que se quede colgado el arduino solo por eso, y más que colgado cuando al hacerle un reset tampoco funciona... Como te he dicho antes prueba, si puedes, a cambiar el arduino por otro, a ser posible que no sea micro... para mi gusto son malisimos...

Como estas alimentando todo? Me huele que tienes un problema de alimentación.

pues lo tengo conectado con el cable USB que va a una placa PCI de la PC :confused:

surbyte: Como estas alimentando todo? Me huele que tienes un problema de alimentación.

Intenta alimentarlo con una fuente que al menos entregue 7V, 9 o 12 estan bien. Mira bien de respetar la polaridad del conector externo.

Por otro lado verifica esos cables con los que tienes conectado el sensor ultrasonido. No es posible que lo toques y se tilde el arduino. Algo esta mal, o algo hace una mala conexión. Son suposiciones, no afirmaciones.

Un modulo puede tener algo malo pero 2 no. Asi que suena a un error de conexionado o de alimentación. Revisa todo con espíritu crítico. Lo que veas raro, pues lo cambias o mejoras.

He probado cambiando los cables, de pines, de fuente (le puse una de 9V) pero estando el arduino quieto sin moverse no se congela pero cuando empiezo a mover de un lado para el otro funciona por un momento luego se queda congelada... no se mas que puedo hacer amigo

surbyte: Intenta alimentarlo con una fuente que al menos entregue 7V, 9 o 12 estan bien. Mira bien de respetar la polaridad del conector externo.

Por otro lado verifica esos cables con los que tienes conectado el sensor ultrasonido. No es posible que lo toques y se tilde el arduino. Algo esta mal, o algo hace una mala conexión. Son suposiciones, no afirmaciones.

Un modulo puede tener algo malo pero 2 no. Asi que suena a un error de conexionado o de alimentación. Revisa todo con espíritu crítico. Lo que veas raro, pues lo cambias o mejoras.

ENCONTRÉ ALGO AMIGOS...

http://aularagon.catedu.es/materialesaularagon2013/ProgramacionCODE-Scratch-Arduino/firmware_ultrasonido.html

En la ultima parte de a pagina abajo creo que habla sobre mi problema!!! pero no lo logro entender bien... alguien me lo puede explicar...

Si te refieres a la última parte del todo, es el uso de un "fuera de tiempo" o timeout. Ello hace que la función pulseIn pasado un tiempo, termine de ejecutarse.

Por ejemplo:

duracion=pulseIn(echo, HIGH, 1000);.

Transcurridos 1000 microsegundos (1 milisegundo), si no se ha recibido ningún pulso, entonces deja de esperar y sale de la función, devolviendo el valor 0.

Es como si no hubiera recibido nada del sensor de ultrasonidos y sale.

En teoria, eso evitaría que el arduino se bloquease en esa función y se quedará parado cuando estas midiendo, cosa que creo que no es tu caso.

Sigo pensando que sea un problema del arduino, ¿has probado con el mega?

Ah entiendo! Pensaba que era mi caso como se me trababa y mostraba 0cm en el monitor ya he probado con el mega y es lo mismo, si dejas el sensor quieto no hace nada pero empiesas moverlo y tarde o temprano se traba... Pensaba que era algun cable que estaba flojo pero tampoco... Que mas podria ser?

victorjam: Si te refieres a la última parte del todo, es el uso de un "fuera de tiempo" o timeout. Ello hace que la función pulseIn pasado un tiempo, termine de ejecutarse.

Por ejemplo:

duracion=pulseIn(echo, HIGH, 1000);.

Transcurridos 1000 microsegundos (1 milisegundo), si no se ha recibido ningún pulso, entonces deja de esperar y sale de la función, devolviendo el valor 0.

Es como si no hubiera recibido nada del sensor de ultrasonidos y sale.

En teoria, eso evitaría que el arduino se bloquease en esa función y se quedará parado cuando estas midiendo, cosa que creo que no es tu caso.

Sigo pensando que sea un problema del arduino, ¿has probado con el mega?

Porque no usas la librería NewPing? La que todos usan!!

Bajala, usa el ejemplo disponible y luego me dices con ESE ejemplo y no adaptes nada si se cuelga o no.