Ultrasonic Eyes: Interaktive 8×8 LED-Matrix mit Abstandssensoren
Komponenten und Zubehör
| Bauteil | Menge | Hinweise |
|---|---|---|
| Ultraschallsensor HC-SR04 | 2 | Reichweite ~3–4 m |
| Arduino Nano R3 | 1 | Klein, USB, genug GPIOs |
| Fotowiderstand (LDR) | 1 | Für Umgebungslicht-Erkennung |
| MAX7219 8×8 LED-Matrix Modul | 2 | Kaskadierbar (SPI) |
| Steckbrett (Half-Size) | 1 | |
| Steckbrücken | 1 Set | |
| Widerstand 330 Ω | 1 | Für LDR-Spannungsteiler |
Software
- Arduino IDE
- Bibliotheken:
MD_MAX72XX,NewPing(beide über Bibliotheksverwalter installierbar)
Projektbeschreibung
Ein verspielte Projekt: Zwei 8×8 LED-Matrizen bilden „Augen“, die per Ultraschall erkennen, wo sich Personen/Objekte befinden, und dorthin schauen. Dazu zufälliges Blinzeln – gruselig-lustig!
Aufbau & Verkabelung
Wichtig: Code nutzt Hardware-SPI. Bei anderen Boards als Nano: MOSI/SCK-Pins prüfen (Nano: Pin 11 = MOSI, Pin 13 = SCK).
Stromversorgung
- Nano GND → Breadboard GND-Schiene (schwarz)
- Nano 3,3 V (oder 5 V) → Breadboard VCC-Schiene (rot)
- Beide Schienen rechts & links verbinden.
- Hinweis: Manche Matrix-Module brauchen 5 V. Bei Problemen auf 5 V umstecken.
Ultraschallsensoren (HC-SR04)
- Beide: VCC → VCC-Schiene, GND → GND-Schiene.
- Sensor 1 (links): TRIG → Pin 2, ECHO → Pin 3.
- Sensor 2 (rechts): TRIG → Pin 4, ECHO → Pin 5.
LED-Matrizen (MAX7219)
- Modul 1 (links): VCC → VCC, GND → GND.
- Kaskadierung: Modul 1 OUT → Modul 2 IN (GND, VCC, DIN/MOSI, CLK/SCK, CS).
- Modul 1 IN an Nano: DIN → Pin 11 (MOSI), CLK → Pin 13 (SCK), CS → Pin 10.
LDR (Helligkeitssensor)
Spannungsteiler: LDR zwischen VCC und A5, 330 Ω von A5 nach GND. A5 = Analogeingang für Helligkeitswert (0–1023).
Ziel: Displays nachts dimmen (ca. 30 %), tagsüber aufhellen.
Inbetriebnahme
- USB anschließen, Sketch hochladen.
- Vor Sensoren bewegen → Augen folgen, blinzeln zufällig.
Weiterentwicklung
- Auf Lochraster löten (Video im Original).
- 3D-Gehäuse drucken (2 Teile, keine speziellen Settings).
- Kapazitiver Touch-Button für Augen-Form-Wechsel (in Arbeit).
Code (C/C++)
#include <MD_MAX72xx.h>
#include <NewPing.h>
// Hardware-SPI Pins (Nano): MOSI=11, SCK=13, CS=10
#define CS_PIN 10
#define MAX_DEVICES 2
#define LIGHT_PIN A5
MD_MAX72XX mx = MD_MAX72XX(CS_PIN, MAX_DEVICES);
#define TRIG_LEFT 2
#define ECHO_LEFT 3
#define TRIG_RIGHT 4
#define ECHO_RIGHT 5
#define MAX_DIST 400 // cm
NewPing eyeL(TRIG_LEFT, ECHO_LEFT, MAX_DIST);
NewPing eyeR(TRIG_RIGHT, ECHO_RIGHT, MAX_DIST);
// Zustände: 0=vorne, 1=rechts, 2=links
int currentState = -1;
long duration1, duration2;
int distance1, distance2;
float nextBlink = 0;
float lightAmount = 0;
// Augen-Bitmaps (8x8, spaltenweise)
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(TRIG_LEFT, OUTPUT); pinMode(ECHO_LEFT, INPUT);
pinMode(TRIG_RIGHT, OUTPUT); pinMode(ECHO_RIGHT, INPUT);
digitalWrite(TRIG_LEFT, LOW); digitalWrite(TRIG_RIGHT, LOW);
pinMode(LIGHT_PIN, INPUT);
showEyeForward(); currentState = 0;
nextBlink = millis() + 1000;
}
void loop() {
// Helligkeit lesen & auf Display-Intensität mappen (0-15)
lightAmount = analogRead(LIGHT_PIN);
lightAmount = (lightAmount / 1023.0) * 15;
mx.control(MD_MAX72XX::INTENSITY, (int)lightAmount);
// Links messen (Median von 5)
distance1 = eyeL.ping_median(5);
delay(500); // Warten, damit sich Ultraschall nicht stören
distance2 = eyeR.ping_median(5);
// Zufälliges Blinzeln
if (nextBlink < millis()) {
nextBlink = millis() + random(2000, 10000);
if (random(1, 13) <= 6) showEyeBlinkDouble();
else showEyeBlink();
delay(250);
return;
}
// Blickrichtung bestimmen
float diff = distance2 - distance1;
if (abs(diff) < 250 || (distance1 == 0 && distance2 == 0)) {
showEyeForward(); currentState = 0;
} else if (distance2 < distance1 && distance1 > 0) {
showEyeRight(); currentState = 1;
} else if (distance1 < distance2 && distance2 > 0) {
showEyeLeft(); currentState = 2;
}
delay(250);
}
void showEyeRight() {
mx.clear(); mx.control(MD_MAX72XX::INTENSITY, (int)lightAmount);
for (uint8_t row = 0; row < 8; row++) {
mx.setColumn(row, eye_right[row]);
mx.setColumn(row + 8, eye_right[row]);
}
}
void showEyeLeft() {
mx.clear(); mx.control(MD_MAX72XX::INTENSITY, (int)lightAmount);
for (uint8_t row = 0; row < 8; row++) {
mx.setColumn(row, eye_left[row]);
mx.setColumn(row + 8, eye_left[row]);
}
}
void showEyeForward() {
mx.clear(); mx.control(MD_MAX72XX::INTENSITY, (int)lightAmount);
for (uint8_t row = 0; row < 8; row++) {
mx.setColumn(row, eye_forward[row]);
mx.setColumn(row + 8, eye_forward[row]);
}
}
void showEyeBlink() {
mx.clear(); mx.control(MD_MAX72XX::INTENSITY, (int)lightAmount);
for (uint8_t row = 0; row < 8; row++) {
mx.setColumn(row, eye_blink[row]);
mx.setColumn(row + 8, eye_blink[row]);
}
delay(150);
restoreState();
}
void showEyeBlinkDouble() {
mx.clear(); mx.control(MD_MAX72XX::INTENSITY, (int)lightAmount);
for (uint8_t row = 0; row < 8; row++) {
mx.setColumn(row, eye_blink[row]);
mx.setColumn(row + 8, eye_blink[row]);
}
delay(75);
restoreState();
delay(75);
showEyeBlink();
}
void restoreState() {
if (currentState == 0) showEyeForward();
else if (currentState == 1) showEyeRight();
else if (currentState == 2) showEyeLeft();
}
3D-Gehäuse
Zwei Teile (Basis & Deckel), auf jedem 3D-Drucker ohne spezielle Settings druckbar.
Schaltplan
Fritzing-Datei (ultrasoniceyes_final_Th84xpUyB2.fzz) und PNG im Originalprojekt.
Herstellungsprozess
- UFO Attack: Eigenes Arduino-Spiel mit MAX7219 Matrix & Joystick
- Intelligente Jalousien: Automatische Lichtsteuerung mit Arduino & Solarenergie
- 3D RGB Arduclock – Bluetooth-LED-Uhr mit Echtzeituhr
- River Health Monitor: Arduino-basiertes Wasserqualitäts-Messsystem
- Arduino Iron Man bauen: Komponenten, Sensoren & Schritt-für-Schritt-Anleitung
- Einfachen Hindernissensor mit Arduino bauen – IR-LED & Photodiode Tutorial
- Interaktives Joystick-Spiel mit Arduino & LED-Feedback
- Find Me: Smarter Gegenstands-Finder mit Arduino und Bluetooth
- DIY Arduino Luftbefeuchter-Steuerung mit Relais – Sichere Hochspannungs-Installation
- Arduino-Roboter „Little Rover“: Autonomen Hindernisvermeider bauen