Tengo algunos sensores ultrasónicos HC-SR04 que compré en eBay no hace mucho. Enganché uno a un Arduino y escribí un boceto rápido para probarlos, y descubrí que ninguno de ellos funciona de manera consistente.
Parece que todos dejan de funcionar cuando la distancia es demasiado grande. Puedo encender el Arduino y escucho el clic del sensor mientras apunta al techo a una distancia de 1.5 metros. Sin embargo, cuando lo giro hacia el otro extremo de la sala, a unos 3 metros, el clic se detiene y el método pulsein () se agota y las distancias se leen a 0 cm. Apuntar el sensor hacia el techo no resuelve el problema, se debe reiniciar la alimentación. En realidad, descubrí que mover el sensor a veces puede hacer que vuelva a funcionar también, sin cambiar la potencia. Busqué personas que tienen problemas con el sensor, pero nadie parece tener el problema que tengo.
EDITAR: He realizado algunos experimentos más y ahora creo que no debe haber un tiempo de espera interno cuando se envía un "clic" y no se recibe. El sensor funciona cuando se dirige a superficies sólidas hasta 3 metros de distancia. Deja de funcionar en dos casos: apuntando hacia una puerta o apuntando a una superficie blanda. La documentación del sensor dice que tiene un alcance de 4 metros y no funciona bien en superficies suaves (que absorben el sonido). Mi conjetura es que en estos dos casos, un eco no se escucha en absoluto. El sensor se queda atascado esperando un eco. Al hacer clic, se crea el eco que estaba esperando y se reanuda hasta que se pierde otro eco.
Hay tres circuitos integrados en la placa: un amplificador, un cambiador de nivel max3232 y uno no identificable. Supongo que el tercero es una especie de microcontrolador, por lo que puedo intentar reprogramarlo o reemplazarlo. Cualquier comentario sobre eso sería apreciado, aunque parece que respondí mi propia pregunta en la medida de lo posible.
Aquí está el código que estoy usando. He revisado tres veces todas las conexiones y el hecho de que funcione brevemente sugiere que son correctas.
const int trig = 3;
const int echo = 4;
float elapsed, distance;
void setup() {
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
Serial.begin(9600);
}
void loop() {
digitalWrite(trig, HIGH);
delayMicroseconds(20);
digitalWrite(trig, LOW);
elapsed = pulseIn(echo, HIGH, 1000000);
// timeout in microseconds
distance = elapsed / 58;
Serial.println((String)(distance) + " cm");
delay(500);
}