In diesem Weekend Project möchte ich dir zeigen wie du dir ein US Polizeilicht mit 12 8mm LEDs erstellst.
Aufbau der DIY US Polizeilichts
Dieses Projekt besteht aus 12 8mm LEDs (jeweils 6x rot und 6x blau) sowie einem Drehpotentiometer für die Frequenz des blinkens und natürlich einem Arduino welcher das ganze steuert.
Die LEDs sind in jeweils 2 Reihen zu 3 LEDs, rechts sowie links angeordnet. Damit lassen sich die verschiedenen Lichtsignale eines solchen Polizeilichts darstellen.
Die Abfolge des blinkens der LEDs ist wiefolgt:
benötigte Bauteile
- 1x Arduino Nano*,
- 2x 15 Pin Buchsenleiste*,
- 2x Lochrasterplatine*,
- 1x 13 Pin Stiftleiste, 1-reihig, 90° abgewinkelt*,
- 6x 8mm LED rot**,
- 6x 8mm LED blau**,
- 12x 220 Ohm Widerstand*,
- 1x 50 kOhm Drehpotentiometer
- ca. 50cm blaue Litze***,
- ca. 50cm rote Litze***,
- ca. 20cm schwarze Litze***,
- ca. 10cm gelbe Litze***
** Die LEDs habe ich über aliexpress.com bestellt, dort findest du diese Bauteile zu einem unschlagbaren Preis von 2€ inkl. Versandkosten für 10 Stück, du findest diese aber auch auf ebay.de*, dort jedoch zu einem deutlich höheren Preis.
*** Auf ebay.de findest du große Litzensortimente* welche deutlich günstiger sind als diese einzeln zu erwerben, daher würde ich dir eines dieser Sets empfehlen.
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
Aufbau
Schaltplan
Schritt 1 – positionieren der LEDs
Die LEDs positionieren ich jeweils in die Ecken. Wobei in die linke die roten und in die rechte Ecke die blauen LEDs gesteckt werden.
Es ist darauf zu achten das jeweils die Kathode bzw. Anode immer in die gleiche Richtung gesteckt wird.
Wir werden nämlich später die Beinchen der Kathoden miteinander verbinden.
Schritt 2 – Montage der Widerstände / Stiftleiste
Im zweiten Schritt werden die Widerstände sowie die Stiftleiste angelötet.
Es verbleibt ein Pin ohne Widerstand, an diesem wird später der Minus Pol bzw. GND vom Arduino Nano angelötet.
Schritt 3 – “verkabeln”
Der dritte Schritt zum Aufbau beinhaltet die Verkabelung der LEDs, hier verwende ich blaue sowie rote Kabel. Diese farbliche Trennung sorgt später dafür das man auf der Rückseite besser erkennt wo welche LED angeschlossen ist ohne das man das Modul drehen und wenden muss.
Bevor wir dieses jedoch machen, werden wir zunächst die Kathoden (der Minus Pol der LED) um 90° biegen so das wir jeweils die Reihen verbinden können.
Die Kathode erkennst du an dem kurzen Beinchen (Eselsbrücke “k wie kurz”) bzw. an der abgeflachten Seite am Gehäuse.
erster Test am Arduino UNO
Nachdem das LED Modul verkabelt wurde, können wir einen ersten Test am Arduino vornehmen, dazu werden zusätzlich 13 Breadboardkabel benötigt. Da ich zum testen einen Arduino UNO verwende muss ich hier Breadboardkabel mit 20cm und Buchse – Stecker wählen.
Schritt 4 – auflöten des LED Moduls
Im vierten Schritt löten wir nun eine Lochrasterplatine an das LED Modul.
So das die beiden Platinen einen 90° Winkel zu einander ergeben.
Schritt 5 – Montage Arduino Nano & Drehpotentiometer
Auf einer weiteren Platine wird der Arduino Nano mit den 15 poligen Buchsenleisten sowie der Drehpotentiometer montiert.
Der Drehpotentiometer verfügt über 3 kleine Beinchen an
- dem rechten Beinchen wird GND,
- dem linken Beinchen wird 5V und
- in der Mitte analog Pin A0
angelötet
Programmieren
Hier nun der Sketch für dieses Projekt.
Zunächst legen wir uns zwei Arrays mit den jeweiligen Pins der LEDs für rot & blau an.
int blueLeds[2][3] = {{13,12,11},{10,9,8}}; int redLeds[2][3] = {{7,6,5},{4,3,2}};
Und natürlich definieren wir unseren Pin für den Drehpotentiometer und eine Variable für die Pause.
Die Pause berechnen wir später aus der Position / den Wert des Drehpotentiometers.
#define drehpoti A0 int pause = 75;
In der Funktion “setup” müssen wir ersteinmal alle Pins an welche LEDs angeschlossen sind als Output quasi Ausgang setzen.
void setup() { for(int i=1;i<=13;i++){ pinMode(i,OUTPUT); } }
Man könnte alternativ auch über die beiden Arrays iterieren, aber eine einfache For-Schleife ist genauso gut.
Die Funktion “loop” enthält die einzelnen Funktionen für das jeweilige Blinken sowie das lesen der Pause.
void loop() { pause = getPause(); .... }
Die Pause lesen bzw. berechnen wir aus dem aktuellen Wert des Drehpotentiometers.
Der Drehpotentiometer ist über einen analogen Pin angeschlossen und wir erhalten einen Wert von 0 (für 0V) und 1023 (für 5V) zurück.
Diesen Wertebereich (0..1023) können wir nun auf einen Millisekundenwert unserer Wahl mappen. Ich wähle hier ein Minimum von 75ms und ein Maximum von 1500 ms. (1,5sek.).
int getPause(){ int value = analogRead(drehpoti); return map(value,0,1023,75,1500); }
Implementieren wir uns zunächst eine Hilfsmethode um eine Spalte zu aktivieren bzw. deaktivieren.
Du kannst eine LED mit der Funktion “digitalWrite” aktivieren bzw. deaktivieren
//aktivieren einer LED digitalWrite(<<LED_PIN>>, HIGH); //deaktivieren einer LED digitalWrite(<<LED_PIN>>, LOW);
Da wir die LEDs in Arrays sortiert und in dem Array selbst nach Spalte gruppiert haben übergeben wir unserer Hilfsfunktion dieses interne Array mit den 3 Werten der LEDs in der Spalte.
void activateColumn(int leds[], int stat){ for(int i=0;i<=2;i++){ digitalWrite(leds[i] , stat); } }
Wir wissen das unser Array genau 3 Daten enthält, darum entfällt hier die Ermittlung der Anzahl der Datensätze.
Arrays beginnen immer beim Index 0, somit ergibt sich die Zahlenfolge 0,1,2 für unsere LEDs.
Wenn wir also nun die jeweils linke Spalte der blauen LEDs und die linke Spalte der roten LEDs aktivieren wollen dann schreiben wir:
void blinkLL(){ delay(pause); activateColumn(blueLeds[1], HIGH); delay(pause); resetModul(); activateColumn(redLeds[1], HIGH); delay(pause); resetModul(); }
Wir rufen hier zusätzlich eine weitere Hilfsmethode “resetModul” auf. Diese Hilfsmethode resetet die LEDs (deaktiviert diese) und berechnet die Pause aus dem aktuellen Wert des Drehpotentiometers.
void resetModul(){ activateColumn(blueLeds[0], LOW); activateColumn(redLeds[0], LOW); activateColumn(blueLeds[1], LOW); activateColumn(redLeds[1], LOW); pause = getPause(); }
Wenn wir nun die beiden rechten Spalten der LEDs Segmente aktivieren wollen müssen wir schreiben:
void blinkRR(){ delay(pause); activateColumn(blueLeds[0], HIGH); delay(pause); resetModul(); activateColumn(redLeds[0], HIGH); delay(pause); resetModul(); }
Wir rufen in der Funktion “loop” nun die beiden Methoden “blinkLL” & “blinkRR” mit einer Pause dazwischen auf.
void loop() { pause = getPause(); blinkRR(); delay(pause); blinkLL(); delay(pause); }
Um zwei Spalten der LEDs zum blinken zu bringen müssen wir also beide Spalten auf den Wert “HIGH” setzen und danach unsere Hilfsmethode “resetModul” aufrufen.
void blinkBlue(){ delay(pause); activateColumn(blueLeds[0], HIGH); activateColumn(blueLeds[1], HIGH); delay(pause); resetModul(); }
void blinkRed(){ delay(pause); activateColumn(redLeds[0], HIGH); activateColumn(redLeds[1], HIGH); delay(pause); resetModul(); }
Es fehlt nun noch das alle LEDs gleichzeitig blinken hier müssen wir alle LEDs aktivieren und die Hilfsmethode “resetModul” deaktiviert diese dann wieder.
void blinkAll(){ delay(pause); activateColumn(blueLeds[0], HIGH); activateColumn(blueLeds[1], HIGH); activateColumn(redLeds[0], HIGH); activateColumn(redLeds[1], HIGH); delay(pause); resetModul(); }
Hier nun das fertige Sketch im ganzen:
#define drehpoti A0 int blueLeds[2][3] = {{13,12,11},{10,9,8}}; int redLeds[2][3] = {{7,6,5},{4,3,2}}; int pause = 75; void setup() { for(int i=1;i<=13;i++){ pinMode(i,OUTPUT); } } void loop() { pause = getPause(); blinkRR(); delay(pause); blinkLL(); delay(pause); blinkBlue(); delay(pause); blinkRed(); delay(pause); blinkAll(); delay(pause); } void activateColumn(int leds[], int stat){ for(int i=0;i<=2;i++){ digitalWrite(leds[i] , stat); } } int getPause(){ int value = analogRead(drehpoti); return map(value,0,1023,75,1500); } void blinkLL(){ delay(pause); activateColumn(blueLeds[1], HIGH); delay(pause); resetModul(); activateColumn(redLeds[1], HIGH); delay(pause); resetModul(); } void blinkRR(){ delay(pause); activateColumn(blueLeds[0], HIGH); delay(pause); resetModul(); activateColumn(redLeds[0], HIGH); delay(pause); resetModul(); } void blinkBlue(){ delay(pause); activateColumn(blueLeds[0], HIGH); activateColumn(blueLeds[1], HIGH); delay(pause); resetModul(); } void blinkRed(){ delay(pause); activateColumn(redLeds[0], HIGH); activateColumn(redLeds[1], HIGH); delay(pause); resetModul(); } void blinkAll(){ delay(pause); activateColumn(blueLeds[0], HIGH); activateColumn(blueLeds[1], HIGH); activateColumn(redLeds[0], HIGH); activateColumn(redLeds[1], HIGH); delay(pause); resetModul(); } void resetModul(){ activateColumn(blueLeds[0], LOW); activateColumn(redLeds[0], LOW); activateColumn(blueLeds[1], LOW); activateColumn(redLeds[1], LOW); pause = getPause(); }
Download
Nachfolgend findest du einen Link zum bequemen Download des Sketches.