POV mit Arduino und Neopixel

Zum dritten Advent ein weiterer Betrag aus der Reihe ‚Advent für Fotonerds‘. POV (Persistance of Vision) auf deutsch Nachbildwirkung, bezeichnet den Effekt das das menschliche Auge schnell hintereinander folgende Lichtreize nicht auflösen kann. Die Lichtimpulse von Einzelbildern verschmelzen zu einer durchgehenden Bewegung. Auf diesem Effekt beruht die Technik von Film und Fernsehen. In der Fotografie wird dieser Effekt ebenfalls angewendet, bei der Lichtmalerei.

Lichtmalerei

Die Lichtmalerei, gemeinhin Light painting genannt, ist ein Teilbereich der Langzeitfotografie. Dabei werden mit Hilfe von einer oder mehreren Lichtquellen Figuren oder Zeichen in die Luft gemalt und diese mit Hilfe einer Langzeitbelichtung von der Kamera als Bild aufgezeichnet.

POV Display

Bei einem POV Display handelt es sich um eine Reihe von LEDs, die von einem Mikrocontroller einzeln angesteuert werden können. Das ist die Lichtquelle die vor der Kamera gedreht oder geschwenkt wird um das gewünschte Bild aufzunehmen. Im Prinzip klappt das schon mit einzelnen einfarbigen LEDs, die von je einen Prozessor Pin angesteuert werden. Die LEDs sind dabei in einer Linie angebracht und werden vertikal ausgerichtet und horizontal vor der Kamera vorbeigeschwenkt.

IMG_1462.JPG

Der Prozessor berechnet dabei spaltenweise welche LEDs angeschaltet werden. Daraus kann z.B. eine Laufschrift generiert werden. Dazu müssen aber alle darzustellenden Zeichen als Tabelle im Programm abgelegt werden, mit dem Wert für jede Spalte. Ähnlich wie sie im Speicher eines Character LC Displays liegen. Das Programm gibt dann die gewünschten Zeichen spaltenweise aus. Nach jeder Spalte wird eine fest vorgegebene Zeit gewartet (üblich sind 10..20ms) bis die nächste Spalte ausgegeben wird. Nach jedem Zeichen wird zudem noch eine längere Pause (100..200ms) gewartet.

IMG_1457.JPG

Eine weitere Spielart von POV Displays sind die beliebten Propeller clocks. Hier drehen sich die LEDs sehr schnell durch einen Motor und der Betrachter sieht die Zeiger einer quasi in der Luft schwebenden Uhr.

Neopixel

Um mehr Farbe ins Bild zu bekommen sind RGB LEDs ideal. Leider steigt dadurch die Anzahl der benötigten Prozessor Pins. Will man dazu noch jede einzelne Farbe einer LED per PWM ansteuern ist sehr schnell Schluss mit der Anzahl der anzusteuernden LEDs. 3 PWM Pins pro RGB LED würden dazu benötigt. Ein Arduino verfügt über 6 PWM fähige Pins, das reicht gerade mal für 2 RGB LEDs. Der Arduino Mega über 14, d.h. max. 4 RGB LEDs. Zum Glück gibt es intelligente RGB LEDs mit eingebautem Controller, die seriell angesteuert werden können. So reduziert sich die Anzahl der benötigten Pins auf 2 oder 1.

Die Neopixel Reihe ist eine Familie von intelligenten RGB LED Produkten aus dem Hause Adafruit. Neben flexiblen RGB LED Bändern gibt es auch Einzel LEDs, ringförmig angeordnete, Matrizen oder starre Streifen, wie z.B. der Neopixel Stick.

IMG_3667.JPG

Arduino Neopixel POV

Für dieses Projekt sind 2 Neopixel Sticks mit je 8 WS2812 RGB LEDs zusammengeschaltet. Insgesamt also 16 Pixel in den 3 Grundfarben rot, grün und blau, aus denen sich alle Zwischenfarben erzeugen lassen. Weiterhin benötigt werden ein Arduino (hier z.B. das MiniFotoControl Board) und ein Taster (von insgesamt 3 verfügbaren Tastern) um die Gesamt Helligkeit der LEDs zu steuern. Das ganze ist in ein kleines Gehäuse gepackt, auf den der Neopixel Stick aufgesteckt werden kann.

IMG_3672.JPG

Die Schaltung entspricht dem Neopixel Painter von Adafruit, erweitert um 3 Taster. Als Spannungsquelle wurde ein Steckernetzteil mit 5V verwendet.

LightPainter_Steckplatine.jpg

Software

Die Software benötigt die Adafruit Neopixel Library. Auf die Taster kann verzichtet werden, wenn als Helligkeit (brightness) ein Wert von ungefähr 75% (192) fest vorgegeben wird. Die Tabelle mit den Spaltenwerten enthält die Werte für eine ‚Kerze‘, die mit Bleistift und Papier ermittelt wurden. Die Kerze wird einfach endlos wiederholt ausgegeben. Normalerweise würde man nach jedem Zeichen alle Pixel löschen. Dieser Befehl wurde absichtlich weggelassen um das grüne Band des Adventskranzes zu erhalten.

Foto Setup

Das Foto Setup für das Titelbild besteht aus einem schwarzen Vorhangstoff als Hintergrund. Das POV Display ist mit Filzgleitern versehen und steht auf einer schwarzen Keramikfliese. Die Kamera ist auf einem Stativ montiert und wird bei eingeschalteter Zimmerbeleuchtung auf den Neopixel Streifen fokussiert. Danach wird der Fokus auf Manuell gestellt. Die weiteren Kamera Einstellungen stehen ebenfalls auf manuell (Blende 11, 4 Sekunden, 100 ASA). Für die Aufnahme muss der Raum abgedunkelt werden. Das Neopixel POV Display wird eingeschaltet, der Auslöser gedrückt und das POV Display mit einer gleichmäßigen Bewegung vor der Kamera von links nach rechts vorbeigezogen.

IMG_4525.JPG

Das Titelbild

Kommen wir nun zum Titelbild. Was auf den ersten Blick aussieht wie eine Leuchtreklame oder ein Screenshot eines alten 8-Bit Games, soll passend zum Thema 3. Advent, 3 Kerzen darstellen. Ich muss zugeben, das ist nur teilweise gelungen.

IMG_4517.JPG

Hier steckt noch einiges an Verbesserungspotential drin. So könnte man auch das Foto einer brennenden Kerze als Bitmap speichern und mit dem POV Display wiedergeben. Ich habe da schon mal etwas mit Photoshop vorbereitet, basierend auf einem echten Foto.

3-kerzen.jpg

Als 16×28 Pixel Bitmap würde das dann etwa so aussehen. Das sieht schon sehr viel besser aus, selbst bei dieser geringen Auflösung. Leider bietet die Adafruit Neopixel Library keine direkte Anzeige Funktion für Bitmaps. Dies geht nur durch Lesen der Bitmap Dateien von einer SD-Card. Vielleicht kriege ich das später noch hin, einfache Bitmap Grafiken in Tabellen zu wandeln und ohne SD-Karte direkt per Programm einzubinden oder seriell zu laden.

3-kerzen28x16.jpg

Der verwendete Programmcode ist hier zu finden:
https://github.com/robotfreak/dfhacks/tree/master/Arduino/Neopixel

Eine Antwort auf „POV mit Arduino und Neopixel“

Schreibe einen Kommentar

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

10 − 8 =