Capacitación Arduino · Sensor ultrasónico
El sensor mide a qué distancia está un objeto con un eco de sonido: verde = lejos, amarillo = cerca, rojo = ¡muy cerca! Simulado en Tinkercad y en OpenCircuits.
El componente
Cómo funciona
Para simular
El HC-SR04 tiene 4 pines: VCC, TRIG, ECHO y GND. No necesita bibliotecas.
| Qué revisar | Tinkercad trae | Pon esto (como el kit) |
|---|---|---|
| Componente | dos versiones: 3 pines (SIG) y 4 pines | el de 4 pines |
| Bloque · pin del desencadenador | 0 | 10 (TRIG) |
| Bloque · pin de eco | igual que el desencadenador | 9 (ECHO) |
| Bloque · unidades | cm | cm |
«Igual que el desencadenador» es para el sensor de 3 pines. Con el de 4 pines, si TRIG y ECHO no coinciden con el cableado, la distancia queda en 0.
Paso 1 · Componentes
Buscar: Arduino
Buscar: Placa de pruebas
Buscar: ultrasónico
Una para cada LED.
Lejos: 50 cm o más.
Cerca: de 20 a 50 cm.
¡Muy cerca! Menos de 20 cm.
Paso 2 · Circuito
Paso 2 · Conexiones
| Alimentación | ||
| Arduino 5V | Riel + inferior | |
| Arduino GND | Riel − inferior | |
| Sensor HC-SR04 (fuera de la protoboard) | ||
| Sensor VCC | Riel + | |
| Sensor TRIG | Columna 28 | |
| Sensor ECHO | Columna 27 | |
| Sensor GND | Riel − | |
| Arduino D10 | Columna 28 (fila e) | |
| Arduino D9 | Columna 27 (fila e) | |
| Semáforo (cada LED con 220 Ω en la fila c) | ||
| — | Verde cátodo / ánodo | Columna 3 / 4 · 220 Ω 4 → 8 |
| Arduino D4 | Columna 8 | |
| — | Amarillo cátodo / ánodo | Columna 10 / 11 · 220 Ω 11 → 15 |
| Arduino D5 | Columna 15 | |
| — | Rojo cátodo / ánodo | Columna 17 / 18 · 220 Ω 18 → 22 |
| Arduino D6 | Columna 22 | |
| Columnas 3, 10 y 17 | Riel − | |
Paso 3 · Código en bloques
Variables → Crear variable: distancia.
Paso 3 · Código C++
// C++ code // int distancia = 0; long readUltrasonicDistance(int triggerPin, int echoPin) { pinMode(triggerPin, OUTPUT); // Clear the trigger digitalWrite(triggerPin, LOW); delayMicroseconds(2); // Sets the trigger pin to HIGH state for 10 microseconds digitalWrite(triggerPin, HIGH); delayMicroseconds(10); digitalWrite(triggerPin, LOW); pinMode(echoPin, INPUT); // Reads the echo pin, and returns the sound wave travel time in microseconds return pulseIn(echoPin, HIGH); } void setup() { pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); }
void loop() { distancia = 0.01723 * readUltrasonicDistance(10, 9); digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); if (distancia < 20) { digitalWrite(6, HIGH); } else { if (distancia < 50) { digitalWrite(5, HIGH); } else { digitalWrite(4, HIGH); } } delay(10); // Delay a little bit to improve simulation performance }
readUltrasonicDistance devuelve el tiempo del eco en µs; × 0,01723 lo pasa a cm.Paso 4 · Simular
| Siempre rojo | La distancia da 0: revisa que el bloque diga desencadenador 10 y eco 9. |
| Siempre verde | El objeto está fuera del cono (muy al lado) o a más de 50 cm. |
| Un LED no enciende | Revisa la orientación (pata doblada = ánodo, hacia la resistencia). |
| Usé el de 3 pines | Cámbialo por el de 4 pines (VCC, TRIG, ECHO, GND). |
Paso 5 · Kit real
| HC-SR04 | Arduino |
|---|---|
| VCC | 5V |
| TRIG | D10 |
| ECHO | D9 |
| GND | GND |
No hace falta ninguna biblioteca ni cambiar nada del código: copia el C++ de la diapositiva 9 en el Arduino IDE y súbelo.
Revisa que TRIG y ECHO no estén intercambiados: es el error más común.
Alternativa · OpenCircuits
El bloque verde de la categoría HC-SR04 mide y compara en un paso: «¿objeto a menos de 20 cm?». No hace falta variable.
Como el bloque mide dentro del «si», cada rama enciende un LED y apaga los otros dos (si se apagaran antes, el LED quedaría apagado mientras mide).
// C++ code // long readUltrasonicDistance(int triggerPin, int echoPin) { pinMode(triggerPin, OUTPUT); // Clear the trigger digitalWrite(triggerPin, LOW); delayMicroseconds(2); // Sets the trigger pin to HIGH state for 10 microseconds digitalWrite(triggerPin, HIGH); delayMicroseconds(10); digitalWrite(triggerPin, LOW); pinMode(echoPin, INPUT); // Reads the echo pin, and returns the sound wave travel time in microseconds return pulseIn(echoPin, HIGH); } void setup() { pinMode(6, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); }
void loop() { if (0.01723 * readUltrasonicDistance(10, 9) < 20) { digitalWrite(6, HIGH); digitalWrite(4, LOW); digitalWrite(5, LOW); } else { if (0.01723 * readUltrasonicDistance(10, 9) < 50) { digitalWrite(5, HIGH); digitalWrite(4, LOW); digitalWrite(6, LOW); } else { digitalWrite(4, HIGH); digitalWrite(5, LOW); digitalWrite(6, LOW); } } delay(10); // Delay a little bit to improve simulation performance }
Para seguir
Muestra la distancia en el Monitor serie. Pista: Serial.println(distancia).
Agrega un buzzer en D8 que pite más rápido mientras más cerca esté el objeto.
Si la distancia es 0 (sin eco), deja el semáforo en verde.
Cuenta cuántas veces alguien pasa a menos de 30 cm frente al sensor.