
Indicador de proximidad con sensor ultrasónico y LEDs utilizando la ZUM Core 2.0, con Arduino IDE y C++
Indicador de proximidad con sensor ultrasónico y LEDs utilizando la ZUM Core 2.0
Introducción
En esta práctica vamos a utilizar un sensor ultrasónico para medir la distancia a un objeto y mostrar el resultado mediante dos LEDs conectados a la placa ZUM Core 2.0.
El funcionamiento será muy sencillo:
- Si no hay ningún objeto cerca, ambos LEDs permanecerán apagados.
- Si un objeto se encuentra a una distancia intermedia, se encenderá un LED.
- Si el objeto está muy cerca, se encenderán los dos LEDs.
Además, aprovecharemos esta actividad para introducir uno de los conceptos más importantes de la programación: las funciones.
Material necesario
- 1 placa ZUM Core 2.0
- 1 sensor ultrasónico BQ/ZUM
- 2 módulos LED BQ/ZUM
- Cables de conexión de tres hilos
- Arduino IDE
Conexiones
Una de las ventajas de los kits BQ/ZUM es que utilizan módulos ya preparados que se conectan fácilmente mediante cables de tres hilos.
Sensor ultrasónico
El sensor dispone de tres conexiones:
- G → GND
- V → 5V
- S → D4
La conexión S corresponde a la señal utilizada para enviar y recibir los pulsos ultrasónicos.
Primer LED
- G → GND
- V → 5V
- S → D2
Segundo LED
- G → GND
- V → 5V
- S → D3
Los módulos BQ/ZUM incorporan los componentes electrónicos necesarios para su funcionamiento, por lo que no es necesario utilizar resistencias externas.
Código del programa
const int sensor = 4;
int medirDistancia()
{
pinMode(sensor, OUTPUT);
digitalWrite(sensor, LOW);
delayMicroseconds(2);
digitalWrite(sensor, HIGH);
delayMicroseconds(10);
digitalWrite(sensor, LOW);
pinMode(sensor, INPUT);
long duracion = pulseIn(sensor, HIGH);
return duracion / 58;
}
void setup()
{
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
Serial.begin(9600);
}
void loop()
{
int distancia = medirDistancia();
Serial.print("Distancia: ");
Serial.print(distancia);
Serial.println(" cm");
if (distancia > 50)
{
digitalWrite(2, LOW);
digitalWrite(3, LOW);
}
else if (distancia > 20)
{
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
}
else
{
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
}
delay(100);
}
¿Qué es una función?
Una función es un bloque de código diseñado para realizar una tarea concreta. Una vez creada, puede utilizarse tantas veces como sea necesario dentro del programa.
Podemos imaginar una función como una pequeña máquina especializada. Nosotros le pedimos que realice una tarea y ella nos devuelve el resultado.
En este proyecto hemos creado la función:
int medirDistancia()
Su misión es:
- Enviar un pulso ultrasónico.
- Esperar el eco reflejado por un objeto.
- Calcular la distancia.
- Devolver el resultado en centímetros.
Gracias a esta función, el programa principal resulta mucho más sencillo y fácil de entender.
Explicación de la función medirDistancia()
Emisión del pulso ultrasónico
pinMode(sensor, OUTPUT);
digitalWrite(sensor, LOW);
delayMicroseconds(2);
digitalWrite(sensor, HIGH);
delayMicroseconds(10);
digitalWrite(sensor, LOW);
Estas instrucciones generan un breve pulso eléctrico que provoca la emisión de una onda ultrasónica.
Recepción del eco
pinMode(sensor, INPUT);
long duracion = pulseIn(sensor, HIGH);
Cuando la onda rebota en un objeto, vuelve al sensor.
La función:
pulseIn()
mide el tiempo que tarda el eco en regresar.
Cálculo de la distancia
return duracion / 58;
Esta operación convierte el tiempo medido en una distancia aproximada expresada en centímetros.
El valor calculado es devuelto al programa principal.
Configuración inicial
void setup()
{
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
Serial.begin(9600);
}
En esta parte:
- Configuramos los pines D2 y D3 como salidas para los LEDs.
- Activamos la comunicación serie para visualizar la distancia medida en el ordenador.
Lectura de la distancia
Dentro de la función principal encontramos:
int distancia = medirDistancia();
Esta línea ejecuta la función creada anteriormente y almacena el resultado obtenido en la variable distancia.
Visualización por el Monitor Serie
Serial.print("Distancia: ");
Serial.print(distancia);
Serial.println(" cm");
Estas instrucciones muestran continuamente la distancia medida.
Por ejemplo:
Distancia: 120 cm
Distancia: 85 cm
Distancia: 47 cm
Distancia: 18 cm
De esta forma podemos comprobar que el sensor está funcionando correctamente.
Control de los LEDs
Objeto lejano
if (distancia > 50)
{
digitalWrite(2, LOW);
digitalWrite(3, LOW);
}
Si el objeto está a más de 50 centímetros, ambos LEDs permanecen apagados.
Objeto a distancia intermedia
else if (distancia > 20)
{
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
}
Si el objeto se encuentra entre 20 y 50 centímetros:
- Se enciende el LED conectado al pin D2.
- El LED conectado al pin D3 permanece apagado.
Objeto muy cercano
else
{
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
}
Si el objeto está a menos de 20 centímetros:
- Se enciende el LED D2.
- Se enciende el LED D3.

Funcionamiento del sistema
El comportamiento del indicador puede resumirse mediante la siguiente tabla:
| Distancia | LED D2 | LED D3 |
|---|---|---|
| Más de 50 cm | Apagado | Apagado |
| Entre 20 y 50 cm | Encendido | Apagado |
| Menos de 20 cm | Encendido | Encendido |
Conclusión
Esta práctica permite trabajar simultáneamente con numerosos conceptos fundamentales de la programación y la robótica:
- Sensores ultrasónicos.
- Variables.
- Funciones.
- Condicionales.
- Salidas digitales.
- Comunicación serie.
Además, muestra cómo un robot puede utilizar la información proporcionada por un sensor para tomar decisiones automáticamente, un principio básico presente en multitud de sistemas de automatización, robótica e inteligencia artificial.
Gracias a los módulos BQ/ZUM, las conexiones resultan especialmente sencillas, permitiendo al alumnado centrarse en la programación y en el funcionamiento de los sensores y actuadores sin necesidad de realizar montajes electrónicos complejos.
Etiqueta:arduino, c++, sensor, ultrasonidos, zum core



