Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

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

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

Ultraschallsensoren (HC-SR04)

LED-Matrizen (MAX7219)

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

  1. USB anschließen, Sketch hochladen.
  2. Vor Sensoren bewegen → Augen folgen, blinzeln zufällig.

Weiterentwicklung

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

  1. UFO Attack: Eigenes Arduino-Spiel mit MAX7219 Matrix & Joystick
  2. Intelligente Jalousien: Automatische Lichtsteuerung mit Arduino & Solarenergie
  3. 3D RGB Arduclock – Bluetooth-LED-Uhr mit Echtzeituhr
  4. River Health Monitor: Arduino-basiertes Wasserqualitäts-Messsystem
  5. Arduino Iron Man bauen: Komponenten, Sensoren & Schritt-für-Schritt-Anleitung
  6. Einfachen Hindernissensor mit Arduino bauen – IR-LED & Photodiode Tutorial
  7. Interaktives Joystick-Spiel mit Arduino & LED-Feedback
  8. Find Me: Smarter Gegenstands-Finder mit Arduino und Bluetooth
  9. DIY Arduino Luftbefeuchter-Steuerung mit Relais – Sichere Hochspannungs-Installation
  10. Arduino-Roboter „Little Rover“: Autonomen Hindernisvermeider bauen