Capacitación Arduino · Sensor ultrasónico

HC-SR04
Semáforo
de distancia

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.

Eco (TRIG / ECHO) Si / si no Bloques + C++

El componente

Sensor ultrasónico HC-SR04

Emisor (T) Receptor (R) lanza el pulso de sonido escucha el eco Cristal 40 kHz 4 pines un sonido tan agudo que no se oye de 2 a 400 cm VCC → 5V TRIG → D10 ECHO → D9 GND → GND
TRIG (disparo) es una salida del Arduino: un pulso de 10 µs hace que el sensor lance 8 pulsos de ultrasonido.
ECHO es una entrada: queda en HIGH mientras el sonido va y vuelve. Mientras más dura el pulso, más lejos está el objeto.

Cómo funciona

Medir con un eco

objeto ida vuelta (eco) ECHO → pin D9 tiempo de ida y vuelta
  1. Arduino da un pulso corto en TRIG (D10).
  2. El sensor lanza el sonido y pone ECHO (D9) en HIGH hasta que vuelve el eco.
  3. El sonido recorre unos 0,0343 cm por µs, ida y vuelta: distancia = tiempo × 0,01723.
  4. Con la distancia, el programa elige el LED: < 20 cm rojo, < 50 cm amarillo, si no verde.

Para simular

Tinkercad lo tiene… elige el de 4 pines

En el kit real

El HC-SR04 tiene 4 pines: VCC, TRIG, ECHO y GND. No necesita bibliotecas.

En Tinkercad: «Sensor de distancia ultrasónico»

Qué revisarTinkercad traePon esto (como el kit)
Componentedos versiones: 3 pines (SIG) y 4 pinesel de 4 pines
Bloque · pin del desencadenador010 (TRIG)
Bloque · pin de ecoigual que el desencadenador9 (ECHO)
Bloque · unidadescmcm

«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.

En Tinkercad, al simular, haz clic en el sensor: aparece un círculo (el objeto) que se arrastra delante de él. El sensor lo ve en un cono hacia arriba, de 2 a 336 cm.

Paso 1 · Componentes

Búscalos en el panel de componentes de Tinkercad

Arduino Uno R3 ×1

Buscar: Arduino

Placa de pruebas pequeña ×1

Buscar: Placa de pruebas

Sensor de distancia ultrasónico (4 pines) ×1

Buscar: ultrasónico

Resistencias 220 Ω ×3

Una para cada LED.

LED verde ×1

Lejos: 50 cm o más.

LED amarillo ×1

Cerca: de 20 a 50 cm.

LED rojo ×1

¡Muy cerca! Menos de 20 cm.

Para cambiar el color de un LED, haz clic en él y edítalo en el cuadro de propiedades.

Paso 2 · Circuito

Así se ve en Tinkercad

Distancia 80 cm Semáforo VERDE Como en Tinkercad: el objeto se mueve delante del sensor y el semáforo cambia de color.

Paso 2 · Conexiones

Conexión por conexión

Alimentación
Arduino 5VRiel + inferior
Arduino GNDRiel − inferior
Sensor HC-SR04 (fuera de la protoboard)
Sensor VCCRiel +
Sensor TRIGColumna 28
Sensor ECHOColumna 27
Sensor GNDRiel −
Arduino D10Columna 28 (fila e)
Arduino D9Columna 27 (fila e)
Las columnas 27 y 28 sirven de empalme: el cable del sensor entra por abajo y el del Arduino por arriba.
Semáforo (cada LED con 220 Ω en la fila c)
—Verde cátodo / ánodoColumna 3 / 4 · 220 Ω 4 → 8
Arduino D4Columna 8
—Amarillo cátodo / ánodoColumna 10 / 11 · 220 Ω 11 → 15
Arduino D5Columna 15
—Rojo cátodo / ánodoColumna 17 / 18 · 220 Ω 18 → 22
Arduino D6Columna 22
Columnas 3, 10 y 17Riel −
Todo va en los rieles de abajo (+ y −). Los LEDs van en la fila e; la pata doblada es el ánodo (+).

Paso 3 · Código en bloques

Arrastra estos bloques · todo dentro de «siempre»

Antes de empezar

Variables → Crear variable: distancia.

Primero se apagan los tres LEDs y después se enciende solo el que corresponde.
Controlsiempre, si / si no
Entradaleer el sensor de distancia ultrasónico
Matemáticascomparar ( < )
Variablesdefinir distancia en
Salidadefinir pin 4 / 5 / 6

Paso 3 · Código C++

El mismo programa en texto

// 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

¡A probar!

  1. Pulsa Iniciar simulación: con el objeto lejos se enciende el verde.
  2. Haz clic en el sensor: aparece el objeto (un círculo). Arrástralo a menos de 50 cm: amarillo.
  3. Acércalo a menos de 20 cm: rojo.
  4. Cambia el 20 y el 50 de los bloques y prueba otras distancias.

Si algo no funciona

Siempre rojoLa distancia da 0: revisa que el bloque diga desencadenador 10 y eco 9.
Siempre verdeEl objeto está fuera del cono (muy al lado) o a más de 50 cm.
Un LED no enciendeRevisa la orientación (pata doblada = ánodo, hacia la resistencia).
Usé el de 3 pinesCámbialo por el de 4 pines (VCC, TRIG, ECHO, GND).

Paso 5 · Kit real

Del simulador al sensor real

Mismas conexiones, mismo código

HC-SR04Arduino
VCC5V
TRIGD10
ECHOD9
GNDGND

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.

Para medir bien

  1. Apunta el sensor hacia una superficie plana y dura (un cuaderno, una pared).
  2. Telas, esponjas o superficies inclinadas absorben o desvían el eco: la medida salta.
  3. Si no hay nada al frente (más de 4 m) el eco no vuelve y la distancia sale 0: el LED rojo se enciende. Reto: ignora el 0.

Revisa que TRIG y ECHO no estén intercambiados: es el error más común.

Alternativa · OpenCircuits

En OpenCircuits el HC-SR04 tiene bloques propios

Distancia 80 cm Semáforo VERDE Iniciar.bat → SensoresSensor ultrasónico HC-SR04 · Semáforo

El bloque nuevo

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.

HC-SR04ultrasónico TRIG 10 ECHO 9: ¿objeto a menos de … cm?
Controlsiempre, si / si no
Salidadefinir pin 4 / 5 / 6

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
}
Este texto lo escribe OpenCircuits a partir de los bloques. Funciona igual en el kit real, sin bibliotecas.

Para seguir

Retos

1 · Distancia en pantalla

Muestra la distancia en el Monitor serie. Pista: Serial.println(distancia).

2 · Sensor de estacionamiento

Agrega un buzzer en D8 que pite más rápido mientras más cerca esté el objeto.

3 · Ignorar el 0

Si la distancia es 0 (sin eco), deja el semáforo en verde.

4 · Contador de pasadas

Cuenta cuántas veces alguien pasa a menos de 30 cm frente al sensor.

← → para avanzar · + − acercar el circuito · F pantalla completa