Ojos ultrasónicos: Matriz LED 8x8 interactiva con sensor de distancia HC-SR04
Componentes y materiales
| Componente | Cantidad | Notas |
|---|---|---|
| Sensor ultrasónico HC-SR04 | 2 | Ojo izquierdo y derecho. |
| Arduino Nano R3 | 1 | Pequeño, USB nativo, pines SPI hardware. |
| Fotorresistencia (LDR) | 1 | Auto-brillo según luz ambiente. |
| Matriz LED 8x8 MAX7219 (módulo cascada) | 2 | Solo la primera conectada a Arduino; segunda en cadena. |
| Protoboard media | 1 | |
| Cables jumper | Varios | |
| Resistencia 330 Ω | 1 | Para divisor LDR. |
Software
- Arduino IDE.
- Librerías:
MD_MAX72xx(matrices),NewPing(ultrasónicos).
Sobre el proyecto
UltrasonicEyes es un proyecto lúdico: dos "ojos" en matrices 8x8 que miran hacia donde detectan movimiento (diferencia de distancia entre los dos sensores HC-SR04), parpadean aleatoriamente y ajustan su brillo según la luz ambiente. Ideal para colocar en una estantería y "vigilar" la habitación de forma simpática y un poco inquietante.
Cableado detallado
Alimentación y GND
- Nano GND → rail GND protoboard; 3.3V (o 5V) → rail VCC.
- Unir rails laterales (GND-GND, VCC-VCC).
- HC-SR04 VCC/GND a rails.
- Matriz 1 VCC/GND a rails; Matriz 2 VCC/GND en cadena desde Matriz 1.
Sensores ultrasónicos
- Sensor 1 (izq): TRIG → D2, ECHO → D3.
- Sensor 2 (der): TRIG → D4, ECHO → D5.
Matrices LED (SPI hardware)
- Matriz 1: CS → D10, MOSI → D11, SCK → D13 (pines SPI hardware Nano).
- Matriz 2 en cadena: CS, MOSI, SCK, GND, VCC conectados en paralelo a salidas de Matriz 1.
- Nota: Si usas otro board, verifica pines SPI hardware (MOSI/SCK).
LDR (fotorresistencia)
- LDR entre fila A y B de protoboard.
- Resistencia 330Ω entre fila A y GND.
- Fila B a VCC (3.3V/5V).
- Fila A (punto medio) → A5 (analógico).
Código (UltrasonicEyes.ino)
#include <MD_MAX72xx.h>
#include <NewPing.h>
#define CS_PIN 10
#define MAX_DEVICES 2
#define LIGHT A5
MD_MAX72XX mx = MD_MAX72XX(CS_PIN, MAX_DEVICES);
#define t1 2; #define e1 3; // Sensor izq
#define t2 4; #define e2 5; // Sensor der
#define maxDist 400
NewPing eyeL(t1, e1, maxDist);
NewPing eyeR(t2, e2, maxDist);
int currentState = -1; // 0=centro, 1=derecha, 2=izquierda
long distance1, distance2;
float nextBlink = 0;
float lightAmount = 0;
// Patrones 8x8 (columnas)
uint8_t eye_forward[8] = {0b00111100, 0b01000010, 0b01011010, 0b10101101, 0b10111101, 0b10011001, 0b01000010, 0b00111100};
uint8_t eye_right[8] = {0b00111100, 0b01000010, 0b01110010, 0b11011001, 0b11111001, 0b10110001, 0b01000010, 0b00111100};
uint8_t eye_left[8] = {0b00111100, 0b01000010, 0b01001110, 0b10010111, 0b10011111, 0b10001101, 0b01000010, 0b00111100};
uint8_t eye_blink[8] = {0b00000000, 0b00111100, 0b01111110, 0b11111111, 0b10111101, 0b11000011, 0b01111110, 0b00111100};
void setup() {
mx.begin();
pinMode(t1, OUTPUT); pinMode(e1, INPUT);
pinMode(t2, OUTPUT); pinMode(e2, INPUT);
digitalWrite(t1, LOW); digitalWrite(t2, LOW);
pinMode(LIGHT, INPUT);
ShowEye_Forward(); currentState = 0;
nextBlink = millis() + 1000;
}
void loop() {
lightAmount = analogRead(LIGHT);
lightAmount = (lightAmount / 255.0) * MAX_INTENSITY; // MAX_INTENSITY = 15
mx.control(MD_MAX72XX::INTENSITY, lightAmount);
distance1 = eyeL.ping_median(5); // 5 lecturas, mediana
delay(500); // Evita interferencia entre sensores
distance2 = eyeR.ping_median(5);
// Parpadeo aleatorio
if (nextBlink < millis()) {
nextBlink = millis() + random(2000, 10000);
if (random(1,13) <= 6) ShowEye_Blink_Dbl(); else ShowEye_Blink();
delay(250); return;
}
float diff = distance2 - distance1;
if (abs(diff) < 250 || (distance1==0 && distance2==0)) { ShowEye_Forward(); currentState=0; }
else if (distance2 < distance1 && distance1>0) { ShowEye_Right(); currentState=1; }
else if (distance1 < distance2 && distance2>0) { ShowEye_Left(); currentState=2; }
delay(250);
}
// Funciones ShowEye_Forward, _Right, _Left, _Blink, _Blink_Dbl (ver original)
// Cada una limpia, setea INTENSITY, escribe columnas en ambos displays (0-7 y 8-15).
Carcasa 3D
Dos piezas imprimibles (base y tapa) sin requerimientos especiales de impresión. Diseño paramétrico en Fusion 360. Archivos STL en sección "Custom parts".
Esquemático
Diagrama Fritzing (ultrasoniceyes_final_Th84xpUyB2.fzz) y imagen PNG con todas las conexiones descritas arriba.
Ampliaciones futuras
- Botón capacitivo/táctil para cambiar formas de ojo.
- Más animaciones (guiño, enfado, sueño).
- Versión soldada en protoboard para instalación permanente.
Proceso de manufactura
- Construye tu Juego "UFO Attack" con Arduino UNO y Pantalla MAX7219
- Persianas Inteligentes: Control Automático de Luz con Arduino y Energía Solar
- Reloj 3D RGB Arduclock – Bluetooth, LED NeoPixel y RTC
- Monitor de Salud Fluvial: Sistema de Calidad de Agua con Arduino
- Construye un Iron Man animado con Arduino: componentes, sensores y guía paso a paso
- Sensor de obstáculos IR casero con Arduino – Tutorial fácil con LED IR y fotodiodo
- Juego interactivo con joystick analógico y LEDs en Arduino
- Find Me: Localizador Inteligente de Objetos con Arduino y Bluetooth
- Controlador de Humidificador DIY con Arduino y Relé: Configuración Segura de Alto Voltaje
- Pequeño Rover con Arduino: Construye tu Robot Autónomo Evita Obstáculos
- Construye un volante joystick personalizado con Arduino para gaming