En este fragmento de código vamos a tratar un tema muy curioso, vamos a ver como leer y entender un HC-SR04 sensor de ultrasonidos con Arduino. Como ya os hemos dicho en más de un fragmento de código y en el capítulo 48. Sensor de temperatura en Arduino, antes de empezar con un sensor debemos de mirar la ficha técnica del dispositivo. Este dispositivo tiene la referencia HC-SR04. Hacemos un resumen de las características técnicas más importantes:
- Voltaje de trabajo 5 V
- Corriente de trabajo 15 mA
- Rango de precisión entre 3 cm y 400 cm
- La precisión puede llegar a 3 mm en su máximo valor
- Angulo de medición 15º
Además de las características técnicas nos facilitan el conexionado que os lo pongo a continuación.

Es importante fijarse en las patillas que tiene el sensor. Por un lado las típicas GND (tierra) y Vcc (alimentación 5 V) y por otro lado tiene dos patillas que son el Trigger (disparo) y Echo (eco). Estas dos patillas son las importantes. Estas las tenemos que conectar a las entradas/salidas digitales. Por un lado Trigger va a funcionar en modo salida y por otro lado Echo va a funcionar en modo entrada.
Antes de continuar aclarar como funciona un sonar, más concreto el HC-SR04. El Trigger manda un pulso de ultrasonidos y el Echo se encarga en recibirlo. Por lo tanto tenemos el tiempo que tarda en recibirlo y la velocidad, la del sonido, así de fácil. Como hemos tenido que ir hasta el objeto y volver lo estamos calculando por dos así que hay que dividir por dos. Esta fórmula la tenemos también en la ficha técnica.
Distancia = (Tiempo en estado HIGH * Velocidad del sonido) / 2
En el caso de este sensor, hay que iniciar la comunicación entre el Trigger y el Echo para ello debemos mandar un pulso de 10 ms (milisegundos).
Veamos entonces el código que vamos a necesitar
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
/* Creado: Luis del Valle (ldelvalleh@programarfacil.com) https://programarfacil.com */ // Configuramos los pines del sensor Trigger y Echo const int PinTrig = 2; const int PinEcho = 3; // Constante velocidad sonido en cm/s const float VelSon = 34000.0; float distancia; void setup() { // Iniciamos el monitor serie para mostrar el resultado Serial.begin(9600); // Ponemos el pin Trig en modo salida pinMode(PinTrig, OUTPUT); // Ponemos el pin Echo en modo entrada pinMode(PinEcho, INPUT); } void loop() { iniciarTrigger(); // La función pulseIn obtiene el tiempo que tarda en cambiar entre estados, en este caso a HIGH unsigned long tiempo = pulseIn(PinEcho, HIGH); // Obtenemos la distancia en cm, hay que convertir el tiempo en segudos ya que está en microsegundos // por eso se multiplica por 0.000001 distancia = tiempo * 0.000001 * VelSon / 2.0; Serial.print(distancia); Serial.print("cm"); Serial.println(); delay(1000); } // Método que inicia la secuencia del Trigger para comenzar a medir void iniciarTrigger() { // Ponemos el Triiger en estado bajo y esperamos 2 ms digitalWrite(PinTrig, LOW); delayMicroseconds(2); // Ponemos el pin Trigger a estado alto y esperamos 10 ms digitalWrite(PinTrig, HIGH); delayMicroseconds(10); // Comenzamos poniendo el pin Trigger en estado bajo digitalWrite(PinTrig, LOW); } |
Como compruebas en el código, hay que hacer unos ajustes con las unidades. Por un lado la velocidad del sonido pasar de m/s a cm/s. Por otro lado la función pulseIn que se encarga de medir el tiempo que tarda un pin en cambiar de estado devuelve microsegundos y hay que pasarlo a segundos multiplicando por 0.000001. Con esto ya tenemos nuestro sonar totalmente operativo.