Sensor de proximidad con Arduino y HC-SR04

Vamos a crear un sensor de proximidad con el sensor HC-SR04, que utiliza pulsos de ultrasonido para detectar distancias.

El sensor tiene cuatro patitas, una VCC a 5 voltios y otra a masa para alimentar el sensor y dos más, Trigger y Echo, para enviar el frente de impulsos de ultrasonido con un pulso de 10 milisegundos y Echo, que se pone a 1 durante el tiempo que tarda en recibir el eco del frente de impulsos. Ojo con las superficies en ángulo, suelen generar distancias erróneas.

El circuito que vamos a montar es este:

sensor-distancia_mini

Tenemos por una parte las conexiones con el sensor, 5 voltios para el vcc, masa y dos señales, una de entrada y otra de salida. El conector 11 será la salida que activará la patita Trigger, que generará el frente de onda, y pondrá a 1 la salida echo del sensor hasta que rebote la señal. Esta salida del sensor será la entrada al arduino, en el conector 12.

El sensor sólo nos va a marcar el tiempo que tarda la señal en ir y volver, pero con este tiempo y conociendo la velocidad del sonido, podemos calcular la distancia desde el sensor al primer obstáculo. Sabemos que la velocidad del sonido es de 343 m/s, o en nuestro caso 0,0343 cm/μs. Obtenemos los microsegundos que tarda en ir y volver la señal con la función pulseIn, y de ahí calculamos la distancia en centímetros como (0,0343/2) * t

En función de esta distancia calculada, encenderemos uno de los leds, rojo a menos de 10 cm, amarillo entre 10 y 15, verde entre 15 y 25 y azul a más de 25 cm.

Vamos con el código:

int ledrojo = 7;
int lednaranja = 6;
int ledverde = 5;
int ledazul = 4;
int disparador = 11;
int eco = 12
long distancia;
long tiempo;
int led;

void setup() {
 Serial.begin(9600);
 pinMode(disparador, OUTPUT);
 pinMode(eco, INPUT);
 pinMode(ledrojo, OUTPUT);
 pinMode(lednaranja, OUTPUT);
 pinMode(ledverde, OUTPUT);
 pinMode(ledazul, OUTPUT);
}

void loop() {
 digitalWrite(disparador , LOW);
 delayMicroseconds(10);
 digitalWrite(disparador, HIGH);
 delayMicroseconds(10);
 tiempo = pulseIn(eco, HIGH);
 distancia = int(0.0172 * tiempo);
 if (distancia > 25) {
 led = 1;
 }
 if (distancia <= 25 && distancia > 15) {
 led = 2;
 }
 if (distancia <= 15 && distancia > 10) {
 led = 3;
 }
 if (distancia <= 10) {
 led = 4;

}
 switch (led) {
 case 1:
 digitalWrite(ledazul, HIGH);
 digitalWrite(ledverde, LOW);
 digitalWrite(lednaranja, LOW);
 digitalWrite(ledrojo, LOW);
 break;
 case 2:
 digitalWrite(ledazul, LOW);
 digitalWrite(ledverde, HIGH);
 digitalWrite(lednaranja, LOW);
 digitalWrite(ledrojo, LOW);
 break;
 case 3:
 digitalWrite(ledazul, LOW);
 digitalWrite(ledverde, LOW);
 digitalWrite(lednaranja, HIGH);
 digitalWrite(ledrojo, LOW);
 break;
 case 4:
 digitalWrite(ledazul, LOW);
 digitalWrite(ledverde, LOW);
 digitalWrite(lednaranja, LOW);
 digitalWrite(ledrojo, HIGH);
 }
 Serial.print("Distancia ");
 Serial.print(distancia);
 Serial.println(" cm");
 delay(1);
}

 

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *