Como funciona un sensor de ultrasonidos

Uno de los sensores mas usados en robótica y en IoT es el sensor de ultrasonidos. Normalmente se usa para detectar la proximidad a obstaculos para no colisionar o hacerlo disminuyendo la velocidad como es el caso de un robot aspirador, también son usados prevenir inundaciones (MB7360) o para encender las luces de casa a nuestro paso.

Los sensores de ultrasonidos están basados en sistemas naturales como los que ayudan a las ballenas a detectar bancos de peces o a los murcielagos a cazar en la oscuridad, estos emiten un sonido que al colisionar producen un eco. El sensor mide el tiempo entre que emite el sonido y recibe el eco por lo que conociendo este tiempo y la velocidad del sonido podemos obtener la distancia a la que se encuentra un objeto.

hc-sr04

Trabajar con un sensor de ultrasonidos es realmente sencillo, el montaje es el siguiente, necesitamos conectar dos pines para enviar y recibir los pulsos y calcular el tiempo y necesitamos conectar los pines de VCC y Gnd a los mismos en el Arduino:

esquema que muestra como probar un hc-sr04 con arduino.
Montaje para probar el sensor HC-SR04

En el código lo que haremos será definir los pines que manejaran el emisor y el receptor de los ultrasonidos. En el setup indicamos que pin actua como salida y cual como entrada.

La funcion «loop» dejar pasar la tensión durante un instante con la instrucción digitalWrite y esperamos 20 microsegundos, cortamos el voltaje en el pin del trigger


digitalWrite(triggerPin, LOW);  
delayMicroseconds(2);  
digitalWrite(triggerPin, HIGH);  
delayMicroseconds(20);  
digitalWrite(triggerPin, LOW);

y para leer el pin de echo y calcular el tiempo de respuesta usamos la funcion pulseIn que devuelve el tiempo que tarda el pin en cambiar de estado:


microseconds = pulseIn(echoPin, HIGH);

Por último ya solo queda calcular la distancia usando la velocidad del sonido y el tiempo de respuesta, eso si, tenemos que hacerlo cambiando las unidades a microsegundos.

Aquí está el código completo:


#define triggerPin 12 // Trigger Pin
#define echoPin 11 // Echo Pin

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

void loop() {

   long microseconds, distance;

   digitalWrite(triggerPin, LOW);
   delayMicroseconds(2);
   digitalWrite(triggerPin, HIGH);
   delayMicroseconds(20);
   digitalWrite(triggerPin, LOW);
   //return the lenght of the pulse when it´s changing from LOW to HIGH in microseconds
   microseconds = pulseIn(echoPin, HIGH);
   //0,0342 centimetre/microsecond (speed of sound) to work with HC-SR04  
   distance = microseconds * 0.0342 / 2;
   Serial.print(distance);
   Serial.print("cm");
   Serial.println();
   delay(100);
}

Como se puede ver es muy facil usar este sensor y ya estaría listo para usarse en nuestros montajes.