Anzeige

US Police Lights mit Arduino und WS2812-LED-Strip

Die Signalleuchten von amerikanischen Polizeiautos sind nicht mit denen europäischer Einsatzfahrzeuge zu vergleichen. Was da auf dem Dach für eine Party abgeht, wenn der Sheriff auf den Knopf drückt :-D

Wir benötigen Ihre Zustimmung um den Inhalt von YouTube laden zu können.

Mit dem Klick auf das Video werden durch den mit uns gemeinsam Verantwortlichen Youtube [Google Ireland Limited, Irland] das Video abgespielt, auf Ihrem PC Skripte geladen, personenbezogene Daten erfasst und Cookies gespeichert. Mit Hilfe der Cookies ist Google in der Lage, die Aktivitäten von Personen im Internet zu verfolgen und Werbung zielgruppengerecht auszuspielen. Weitere Informationen finden Sie hier.

PGlmcmFtZSB0aXRsZT0iVVMgUG9saWNlIENhciBMaWdodHMgbWl0IEFyZHVpbm8gdW5kIFdTMjgxMiBMRURzIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjM2MCIgc3JjPSJodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC9rLW1lT1R1VG1hcz9mZWF0dXJlPW9lbWJlZCIgZnJhbWVib3JkZXI9IjAiIGFsbG93PSJhY2NlbGVyb21ldGVyOyBhdXRvcGxheTsgZW5jcnlwdGVkLW1lZGlhOyBneXJvc2NvcGU7IHBpY3R1cmUtaW4tcGljdHVyZSIgYWxsb3dmdWxsc2NyZWVuPjwvaWZyYW1lPg==

Das lässt sich mit WS2812-LED-Strip und Arduino natürlich nachbauen. Hier zeige ich dir, wie das geht:

Bauteile

Schaltung

Die Schaltung besteht aus einem Arduino UNO. Der digitale Pin 6 ist über einen 470 Ohm Widerstand mit dem DI-Pin (Data In) des LED-Strips verbunden. Der GND des Strips ist mit dem GND des Arduinos verbunden. Im Beispiel werden nur 8 LEDs verwendet. Deshalb kann der 5V+ vom LED-Strip ebenfalls direkt mit dem 5V+ des Arduino-Boards verbunden werden.

US Police Lights mit Arduino und WS2812-LED-Strip Schaltplan

Optional lässt sich eine externe Spannungsquelle, z. B. eine Batterie, eine Powerbank oder ein Netzteil, verwenden. Besonders bei vielen LEDs des WS2812-Strips ist dies zu empfehlen.

US Police Lights mit Arduino und WS2812-LED-Strip Schaltplan Externe Spannungsversorgung

Programmtext

Das Arduino-Programm benötigt die Adafruit-Nanopixel-Bibliothek. Die muss in der Arduino-Software installiert werden. Öffne dafür in der Arduino IDE (Software) das Menü Sketch>Bibliotheken einbinden>Bibliotheken verwalten … und suche im Suchfeld nach NeoPixel. Installiere die Adafruit NeoPixel-Library von Adafruit in der aktuellen Version.

Das Programm verwendet für die Darstellung der Animation – das Blinken der LEDs ist ja nichts anderes, als eine Animation auf 8 Pixeln – das mehrdimensionales Array frame. Es speichert für jede Animationsphase die drei Farbwerte (RGB) für 8 Pixel.

frame[Animationsphase][LED-Nummer][Farbe]

Die Animation im Beispiel hat 19 Animationsphasen. Zu jeder Animationsphase gehört auch eine Animationsdauer, also einen Wert, der bestimmt, wie lange eine Animationsphase gezeigt werden soll. Das ist wichtig, da z. B. das weiße Aufblitzen der LEDs nur sehr kurz geschehen soll, während ein abwechselndes Rot-Blau-Blinken länger dauert.

Ich habe so lange an den Animationsphasen und Animationsdauern getestet, bis ich zufrieden war.

Zurück zum Code. Im Loop wird zuerst die Methode police1 aufgerufen. Sie zeigt die aktuelle Animationsphase auf den LEDs an und wartet die Animationsdauer ab. Danach wird im Loop der Animationszähler frameCurrent um 1 erhöht (++). Nun wird noch getestet, ob der Animationszähler größer als die maximale Animationsphase (frameMax) ist. Falls das der Fall ist, wird der Animationszähler auf 0 gesetzt und die Animation beginnt von vorne.

#include <Adafruit_NeoPixel.h>

#define LED_PIN 6
#define LED_COUNT 8

Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

const int frameMax = 19;

int frames[frameMax][8][3] = {
  {{0, 0, 255 }, {0, 0, 255 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }},
  {{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }},
  {{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
  {{0, 0, 255 }, {0, 0, 255 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
  {{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }},
  {{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
  {{0, 0, 255 }, {0, 0, 255 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
  {{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }},
  {{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {255, 255, 255}, {255, 255, 255}, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
  {{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
  {{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {255, 255, 255}, {255, 255, 255}, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
  {{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
  {{0, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
  {{0, 0, 0 }, {255, 0, 0 }, {255, 0, 0}, {0, 0, 0 }, {255, 0, 0 }, {0, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }},
  {{0, 0, 255 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {255, 0, 0 }},
  {{255, 255, 255},{255, 255, 255},{255, 255, 255},{255, 255, 255},{255, 255, 255},{255, 255, 255},{255, 255, 255},{255, 255, 255}},
  {{0, 0, 255 }, {0, 0, 255 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
  {{0, 0, 0 },{0, 0, 0 },{255, 255, 255},{255, 255, 255},{255, 255, 255},{255, 255, 255},{0, 0, 0 },{0, 0, 0 }},
  {{0, 0,  0}, {0, 0, 0 }, {255, 0, 0}, {255, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }}
    };

int durations[frameMax] = {1000, 100, 100, 50, 50, 10, 50, 50, 50,40,50,40,100,100,100,20,40,20,100};
int frameCurrent = 0;

void setup() {
  strip.begin();           // INITIALIZE NeoPixel strip object (REQUIRED)
  strip.show();            // Turn OFF all pixels ASAP
  strip.setBrightness(50); // Set BRIGHTNESS to about 1/5 (max = 255)
}

void loop() {
  police1(strip.Color(255,   0,   0), durations[frameCurrent]);
  frameCurrent++;
  if (frameCurrent >= frameMax) frameCurrent = 0;
}

void police1(uint32_t color, int wait) {
  for (int i = 0; i < 8; i++) { // For each pixel in strip...
    strip.setPixelColor(i, strip.Color(frames[frameCurrent][i][0],frames[frameCurrent][i][1],frames[frameCurrent][i][2]));         //  Set pixel's color (in RAM)
    strip.show();                          //  Update strip to match
  }
  delay(wait);                           //  Pause for a moment
}

Du kannst die Animation natürlich anpassen, erweitern oder verkürzen. Dazu musst du nur weitere Animationsphasen in das Array frames einfügen, weitere Wartezeiten in das Array durations hinzufügen und die Variable frameMax anpassen.

Viel Spaß dabei und viel Erfolg. Ach ja, wenn du noch ein bisschen mehr über die WS2812 LEDs erfahren willst, guck dir doch mal den Beitrag an: WS2812 – Der einfachste Weg, viele LEDs mit Arduino steuern.

Wir benötigen Ihre Zustimmung um den Inhalt von YouTube laden zu können.

Mit dem Klick auf das Video werden durch den mit uns gemeinsam Verantwortlichen Youtube [Google Ireland Limited, Irland] das Video abgespielt, auf Ihrem PC Skripte geladen, personenbezogene Daten erfasst und Cookies gespeichert. Mit Hilfe der Cookies ist Google in der Lage, die Aktivitäten von Personen im Internet zu verfolgen und Werbung zielgruppengerecht auszuspielen. Weitere Informationen finden Sie hier.

PGlmcmFtZSB0aXRsZT0iRmVkZXJhbCBTaWduYWwgSW50ZWdyaXR5IExpZ2h0YmFyIGZsYXNoIHBhdHRlcm5zIHdpdGggb3B0aW9uYWwgd2hpdGUgbGlnaHQiIHdpZHRoPSI2NDAiIGhlaWdodD0iMzYwIiBzcmM9Imh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkL2tHcGlzUWdUOUpZP3N0YXJ0PTE5MSZmZWF0dXJlPW9lbWJlZCIgZnJhbWVib3JkZXI9IjAiIGFsbG93PSJhY2NlbGVyb21ldGVyOyBhdXRvcGxheTsgZW5jcnlwdGVkLW1lZGlhOyBneXJvc2NvcGU7IHBpY3R1cmUtaW4tcGljdHVyZSIgYWxsb3dmdWxsc2NyZWVuPjwvaWZyYW1lPg==

Und dieses Video zeigt die Animationen eines kommerziellen Polizeilichts aus den USA. Vielleicht hast du ja Lust, die originalen Animationen zu programmieren.

Ich würde mich freuen, wenn du diesen Beitrag bewerten würdest :-)

Durchschnittliche Bewertung 5 / 5. Anzahl Bewertungen: 3

Bisher keine Bewertungen! Sei der Erste, der diesen Beitrag bewertet.

Deine Meinung ist mir sehr wichtig!

Lasse uns diesen Beitrag verbessern!

Wie kann ich den Beitrag verbessern? Was würdest du dir wünschen? Was hat dir gefehlt?

Ich hoffe, der Beitrag hilft dir weiter. Und falls du weitere Fragen hast, stelle sie gern hier im Arduino-Forum.

Du willst noch tiefer in die Materie einsteigen? Dann präsentiere ich dir die neuen E-Books von StartHardware:

  • 20 Lektionen
  • Projektbasiert und kurzweilig
  • Aus den Erfahrungen unzähliger Workshops
  • Sofortiger Download

  • Die beliebtesten Projekte von StartHardware
  • Mit Code, Schaltplan und Erklärungen
  • Fachwissen-Kapitel
  • Sofortiger Download


Willst du lieber ein Buch zum Anfassen? Dann werde mit diesem hier zum Arduino-Experten! Arduino: Kompendium: Elektronik, Programmierung und Projekte* – Damit lernst du alle Tricks!

Schreibe einen Kommentar

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

 

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.