Intelligenter Garagen-Parkassistent mit RGB-LED-Feedback
Komponenten und Zubehör
| Komponente | Menge |
|---|---|
| Arduino Nano R3 | 1 |
| Ultraschallsensor HC-SR04 (generisch) | 1 |
| Kondensator 1000 µF | 1 |
| 1N4148 – Schnellschaltende Diode | 1 |
| Durchgangswiderstand 470 Ω | 1 |
| WS2812B LED-Streifen 1 m IP30 5 V DC | 1 |
Benötigte Werkzeuge und Maschinen
- 3D-Drucker (generisch)
- Lötkolben (generisch)
Über das Projekt
Dies ist ein Garagen-Parksensor, der adressierbare RGB-LEDs verwendet, um dem Fahrer visuelles Feedback zu geben, während er sich der Parkposition nähert und diese schließlich erreicht. Video in Aktion:
Ich habe das Design um halbrunde Acrylstäbe (1/2″ Durchmesser, Länge 20-7/16″) herum entworfen, die als Linse dienen und die Schwalbenschwanz-Segmente zusammenhalten. Dieses Material ist online für ca. 0,66 $ pro Fuß erhältlich. Alternativ habe ich auch ein 3D-druckbares Linsenmodell (in Segmente unterteilt, für klares Filament) beigefügt.
SCHRITT 1
LED-Streifen vorbereiten (WS2812B, einzeln ansteuerbar, 30 LEDs/m, 1 m lang). Streifen in zwei 15-LED-Segmente schneiden und an jedem Segment am Anfang Anschlusskabel anlöten. Pfeile auf dem Streifen zeigen *weg* von der Anschlussseite.
SCHRITT 2
Alle Schienen-Segmente montieren (eine Außenschiene, zwei Innenschienen-Segmente pro Seite) mit dem Gehäuse in der Mitte.
SCHRITT 3
Anschlusskabel der LED-Streifen in das Gehäuse auf jeder Seite führen und mit Klebeband fixieren. Die LED-Streifen enden ca. 1/2″ vor jedem Außenschienen-Ende.
SCHRITT 4
Linse von jedem Ende her einschieben, bis sie im Gehäuse einrastet und alle Schwalbenschwanz-Verbindungen verriegelt. Bei gedruckter Linse: 4 Segmente pro Seite erforderlich, sie überbrücken die Schwalbenschwanz-Bereiche.
SCHRITT 5
Montage mit Endkappen auf einer Trägerplatte (ich verwendete 1/2″ MDF, 2″ breit × 45-1/8″ lang). Mit kleinen Zylinder- oder Senkkopfschrauben befestigen (keine Rundkopfschrauben, sonst passt das USB-Kabel später nicht in den Schlitz für Reprogrammierung).
SCHRITT 6
Elektronik verdrahten. Beachten Sie die Position des Kondensators – er verhindert Spannungsspitzen von der Stromversorgung. Ein Widerstand wird am Signalkabel (Pin 7) für die LEDs verwendet, eine Diode am Arduino (V+), um Rückspeisung zu verhindern, falls USB ohne Netzteil eingesteckt wird. Ohne Diode würde der Arduino versuchen, die LEDs zu versorgen, was zu übermäßigem Strom durch den onboard-Regler führt. Diode und Widerstand sind in die Verkabelung eingelötet und mit Schrumpfschlauch isoliert. Das Gehäuse muss von außen nahe der Unterseite unter dem Arduino durchbohrt werden, um die Kabel der Stromversorgung hindurchzuführen (Größe hängt vom Kabeltyp ab – ich empfehle 18/2-Kabel, ich nutzte Türklingeldraht mit Stecker kurz außerhalb des Gehäuses).
SCHRITT 7
Arduino mit 2,5 mm Schraube fixieren und Verkabelung vervollständigen. Die Haltelaschen ragen in quadratische Löcher im Gehäuse. Ich entfernte die äußeren, ungenutzten Pins am Arduino, um die Montage zu erleichtern.
SCHRITT 8
Ultraschallsensor (HC-SR04) mit 2,5 mm Schrauben an der Abdeckung befestigen. Lötverbindungen zum Sensor herstellen. ACHTUNG: Kabel müssen zur Sensor-Mitte hin zeigen, um nicht mit der Seitenwand bei der Montage zu kollidieren.
SCHRITT 9
Abdeckung mit 3 mm Schrauben am Gehäuse befestigen.
SCHRITT 10
Arduino programmieren (Code unten). Vor dem Kompilieren Bibliotheken FastLED und QuickStats in der IDE aktualisieren. Parameter anpassen: startdistance (Erkennungsbeginn bei Fahrzeugannäherung) und stopdistance (endgültige Parkposition). Sensorbereich: 3 cm bis 400 cm – Start- und Stopp-Parameter müssen innerhalb dieser Grenzen liegen.
SCHRITT 11
Am Garagentoröffner eine Lampenfassung mit integrierter Steckdose installieren. 5 V DC Netzteil dort einstecken und zum Lichtbalken führen. Der Lichtbalken ist nur aktiv, solange das Garagentorlicht nach dem Öffnen leuchtet – verhindert Dauerbetrieb.
Code
- Arduino Code
Arduino Code Arduino
/* Garage Parking Sensor - Published By Bob Torrence */
#include <FastLED.h>
#include <QuickStats.h>
QuickStats stats;
#define LED_PIN 7
#define NUM_LEDS 15
const int trigPin = 9;
const int echoPin = 10;
CRGB leds[NUM_LEDS];
float duration;
float durationarray[15];
int distance;
int stopdistance = 115; // Parkposition vom Sensor (ZENTIMETER)
int startdistance = 400; // Erkennungsbeginn beim Einfahren (ZENTIMETER)
int increment = ((startdistance - stopdistance) / 15);
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
Serial.begin(9600);
}
void loop() {
for (int i = 0; i <= 14; i++) {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
durationarray[i] = pulseIn(echoPin, HIGH);
distance = durationarray[i] * 0.034 / 2;
Serial.print(distance); Serial.print(" ");
}
duration = (stats.median(durationarray, 15));
distance = duration * 0.034 / 2;
Serial.print("Distance: "); Serial.println(distance);
if (distance < stopdistance) {
for (int i = 0; i <= 14; i++) leds[i] = CRGB(255, 0, 0); // Rot: Stopp
FastLED.show();
}
else if (distance < stopdistance + increment) { showLEDs(0, 0, CRGB(255, 255, 0)); } // Gelb 1
else if (distance < stopdistance + increment * 2) { showLEDs(1, 0, CRGB(255, 255, 0)); }
else if (distance < stopdistance + increment * 3) { showLEDs(2, 0, CRGB(255, 255, 0)); }
else if (distance < stopdistance + increment * 4) { showLEDs(3, 0, CRGB(0, 255, 0)); } // Grün
else if (distance < stopdistance + increment * 5) { showLEDs(4, 0, CRGB(0, 255, 0)); }
else if (distance < stopdistance + increment * 6) { showLEDs(5, 0, CRGB(0, 255, 0)); }
else if (distance < stopdistance + increment * 7) { showLEDs(6, 0, CRGB(0, 255, 0)); }
else if (distance < stopdistance + increment * 8) { showLEDs(7, 0, CRGB(0, 255, 0)); }
else if (distance < stopdistance + increment * 9) { showLEDs(8, 0, CRGB(0, 255, 0)); }
else if (distance < stopdistance + increment * 10) { showLEDs(9, 0, CRGB(0, 255, 0)); }
else if (distance < stopdistance + increment * 11) { showLEDs(10, 0, CRGB(0, 255, 0)); }
else if (distance < stopdistance + increment * 12) { showLEDs(11, 0, CRGB(0, 255, 0)); }
else if (distance < stopdistance + increment * 13) { showLEDs(12, 0, CRGB(0, 255, 0)); }
else if (distance < stopdistance + increment * 14) { showLEDs(13, 0, CRGB(0, 255, 0)); }
else { for (int i = 0; i <= 14; i++) leds[i] = CRGB(0, 255, 0); FastLED.show(); delay(50); }
}
// Hilfsfunktion für übersichtlichen Code (nicht im Original, aber empfohlen)
void showLEDs(int lastYellow, int firstGreen, CRGB color) {
for (int i = lastYellow + 1; i <= 14; i++) leds[i] = CRGB(0, 0, 0);
for (int i = 0; i <= lastYellow; i++) leds[i] = CRGB(255, 255, 0);
for (int i = 0; i <= firstGreen; i++) leds[i] = color;
FastLED.show(); delay(50);
}
Benutzerdefinierte Teile und Gehäuse
STL-Dateien für 3D-Druck (Gehäuse, Linsen, Endkappen) sind im Projekt enthalten.
Schaltpläne
Aktualisiert am 21.04.2019 zur Korrektur der Diodenrichtung.
Herstellungsprozess
- TinyML Spracherkennung mit Edge Impulse auf Arduino Nano 33 BLE Sense
- Echtzeit-Gyroskop-Spiel mit Arduino Nano & MPU-6050
- Arduino Digitaler Würfel: LCD-Würfel mit Zufallszahlen (1–6)
- 37-LED-Roulette-Spiel mit Arduino Nano bauen – Europäisches Layout
- ATtiny85 Mini-Arcade: Snake – Handheld OLED-Spielekonsole selbst bauen
- Tragbarer Entfernungsmesser – Arduino Nano DIY-Kit mit HC-SR04, 18650-Akku und 3D-gedrucktem Gehäuse
- Audio-reaktive Schreibtischlampe mit Arduino Nano bauen
- Personal Healthcare Assistant (PHA) – Smarte IoT-Lösung für Community Health
- Kupfer-Galvanik-Projekt: Intelligentes System mit Arduino UNO bauen
- NeoPixel-Matrix Pong auf Arduino Nano: Neon-Pong selbst bauen