Weekend Project: US Polizeilicht mit 8mm LEDs

In diesem Weekend Project möchte ich dir zeigen wie du dir ein US Polizeilicht mit 12 8mm LEDs erstellst.

DIY US Polizeilicht mit Arduino Nano
Dieses Video ansehen auf YouTube.

 

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

* 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.

Bauteile für das US Polizeilicht
Bauteile für das US Polizeilicht

Aufbau

Schaltplan

Schaltplan - US Polizeilicht am Arduino Nano
Schaltplan – US Polizeilicht am Arduino Nano

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.

Schritt 1 - positionieren der LEDs in den Ecken der Lochrasterplatine
Schritt 1 – positionieren der LEDs in den Ecken der Lochrasterplatine

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.

Schritt 2 - auflöten der Widerstände und der Stiftleiste
Schritt 2 – auflöten der Widerstände und der Stiftleiste

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.

Schritt 3 - verbinden der Kathoden der LEDs
Schritt 3 – verbinden der Kathoden der LEDs

Die Kathode erkennst du an dem kurzen Beinchen (Eselsbrücke „k wie kurz“) bzw. an der abgeflachten Seite am Gehäuse.

Bauteil: LED
Bauteil: LED

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.

Schritt 5 - Arduino Nano & Drehpotentiometer auf Lochrasterplatine
Schritt 5 – Arduino Nano & Drehpotentiometer auf Lochrasterplatine

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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.