2074005

Light Painting mit dem Raspberry Pi

05.05.2015 | 08:30 Uhr |

Light Painting, also Malen mit Licht, ist eine Ausdrucksform, die verschiedene Ausprägungen hat. Absicht ist aber immer, mit nur einer Belichtung künstlerische Werke zu schaffen.

Eigentlich ist Peter K. Boxler Mac-Nutzer – aber er ist auch Raspberry-Projektentwickler. Als solcher hat er drei Projekte erfolgreich auf die Beine gestellt. Alle machten und machen ihm viel Spaß, wie er sagt, kosteten aber auch viel Schweiß und Tränen. Die Projektbeschreibungen sind eher für Pi-Hacker geeignet, da er die einfacheren Schritte nicht dokumentiert hat. Sie können aber generell als Anregung für Projektideen dienen.

Diesmal beschreibt er, wie das Malen mit Licht - das Light Painting - mit dem Raspberry Pi gesteuert werden kann.

Die Idee: ein Pixelstab

Beim Light Painting handelt es sich um photographische Aufnahmen mit langer Belichtungszeit (3 bis 30 Sekunden). Auf der einen Seite gibt es Fotografen, die nächtliche, unbewegte Szenerien mit Lampen beleuchten. Andere verwenden bewegte Lichtquellen, um damit zu ‚zeichnen‘.

Seit einiger Zeit sind LED-Strips erhältlich, die bis zu 144 individuell ansteuerbare RGB-LEDs pro Meter haben. Damit sind höher aufgelöste ‚Zeichnungen‘ möglich. Ich verwende die als Neopixel bezeichneten Produkte von Adafruit und möchte damit einen Lichtstab mit einem Meter Länge - also 144 RGB-Pixel - bauen und über den Raspberry Pi steuern.

Die fertige Lösung

Der fertige Pixelstab sieht so aus:

Pixelstab mit Griffen und Steuerungs-Box
Vergrößern Pixelstab mit Griffen und Steuerungs-Box
© Peter K. Boxler
Pixelstab mit Regenbogenfarben
Vergrößern Pixelstab mit Regenbogenfarben
© Peter K. Boxler

Der Hardware-Aufbau

Anordnung der Komponenten
Vergrößern Anordnung der Komponenten
© Peter K. Boxler

Lichtstab

Der Neopixel-Streifen mit 144 Pixeln und einem Meter Länge ist auf einem Buchenstab mit 15 x 15 mm montiert. Die Control Box und die Handgriffe sind ebenfalls auf dem Stab befestigt.

144 RGB-Pixel auf einem Meter Länge
Vergrößern 144 RGB-Pixel auf einem Meter Länge
© Peter K. Boxler

Control Box

Die Control Box beinhaltet die Steuer-Elektronik, bestehend aus dem Raspberry Pi, dem Interface Board und dem 16x2 Char-Display-Board. Diese drei Komponenten sind stacked - also alle aufeinandergesteckt. Die Box hat links und rechts Öffnungen für USB und LAN-Anschluss und für Wechsel der Micro-SD-Karte mit dem Linux OS.

Control Box
Vergrößern Control Box
© Peter K. Boxler

Das User Interface besteht aus dem 16x2 Char-Display sowie fünf Drucktasten (Momentankontakt) und zwei Kippschaltern. Die 5-V-Stromversorgung wird über einen zweipoligen Stecker angeschlossen. Die drei Leitungen zum LED-Pixelstick (5 Volt, Ground, Data In) werden über einen dreipoligen DIN-Stecker an die Box angeschlossen. Das User Interface wird weiter unten beschrieben.

Schema Interface Board
Vergrößern Schema Interface Board
© Peter K. Boxler

Die GPIO-Pins des Raspberry Pi haben einen Pegel von 3.3 Volt; der LED-Pixelstrip braucht für die serielle Ansteuerung (DATA-IN) einen Pegel von 5 Volt. Die Pegelwandlung wird durch zwei Dioden und ein Potentiometer erledigt. GPIO Pin 18 wird dafür benötigt. Der verwendete Raspberry Pi Modell B+ hat 40-Pins, es werden jedoch nur die ersten 26 Pins verwendet. Die Tabelle zeigt, welche Pins in der Software verwendet werden.

Pin-Belegung Raspberry Pi
Vergrößern Pin-Belegung Raspberry Pi
© Peter K. Boxler

Stromversorgung

Portable 5-Volt-Stromversorgung
Vergrößern Portable 5-Volt-Stromversorgung
© Peter K. Boxler

Ein einzelner Pixel benötigt bei der Farbe Weiss (alle drei LEDs leuchten) maximal 60 mA Strom bei 5 Volt. Für den ganzen Streifen von 144 Pixeln ist demnach eine Stromversorgung mit ca. 8 Ampère Maximalstrom bereitzustellen. Für den portablen Betrieb bringen sechs Batterien vom Typ D (6 x 1.5 Volt) und ein Spannungsregler den nötigen Saft.

RGB-LEDs

Die verwendeten LEDs sind vom Typ WS2812 Intelligent Control LED Integrated Light Source. Jeder einzelne Pixel (des Streifens) besteht aus einem Element WS2812 mit einer Größe von ca. 5 x 5 mm. Eines enthält drei LEDs (Rot, Grün und Blau) sowie einen kleinen Controller, der die LEDs steuert. Weitere Infos siehe Datenblatt .

Streifen mit 8 RGB-Led WS2812
Vergrößern Streifen mit 8 RGB-Led WS2812
© Peter K. Boxler
Einzelnes Element WS2812
Vergrößern Einzelnes Element WS2812
© Peter K. Boxler

Für einen Streifen mit 144 solcher Pixel-Elemente werden nur drei Anschlüsse benötigt: Ground, 5 Volt und Steuerleitung (Data In). Es sind Farbwerte von 0 bis 255 jeweils für Rot, Grün und Blau möglich; total also 16 Millionen Farben.

Die Ansteuerung eines Streifens mit 144 RGB-LEDs erfolgt seriell asynchron (ohne clock) über einen einzigen Draht. Das Timing der Pulse ist relativ streng definiert (im Bereich Microsekunden) und ein Linux-Computer ist als Nicht-Echtzeit-Maschine dafür wenig geeignet.

LED-Strip mit 144 Pixeln - Adafruit Product 1507
Vergrößern LED-Strip mit 144 Pixeln - Adafruit Product 1507
© Peter K. Boxler

Kluge Köpfe haben jedoch für dieses Problem eine Lösung gefunden: Adafruit bietet eine Library an (rpi_ws281x), mit welcher sogenannte Neopixel-Strips aus Python-Scripten in einem Pi angesteuert werden können. Diese Library ist die Grundlage der vorliegenden Lösung.

Eine sehr gute Einführung zu diesen genialen RGB-LEDs gibt der Neopixel-Ueberguide von Adafruit.

Die Software

Die im folgenden beschriebenen LP-Scripts setzen folgendes voraus:

  • der Adafruit Code für 16x2 Char Plate muss im aktuellen Folder vorhanden sein.

  • die Adafruit Neopixel Library (rpi_ws281x) muss installiert sein (Ansteuerung der Pixel).

  • die Python Image Library Pillow muss installiert sein.

Light Painting-Programm

Die verwendete Script-Sprache ist Python. Das Hauptprogramm (Script) heisst lp_main.py. Es ist in /etc/rc.local eingetragen und wird nach dem Boot gestartet.

Beim Start des Programms können folgende Commandline-Parameter angegeben werden:

-d                kleiner debug, Statusmeldungen werden ausgegeben (stdout)

-D                großer debug, weitere Statusmeldungen

-g wert        Gamma-Wert

Die Programmstruktur der verwendeten Programmteile sieht so aus:

Module Struktur LIght Painting
Vergrößern Module Struktur LIght Painting
© Peter K. Boxler

Das Light Painting-Projekt besteht aus ca. 3600 Zeilen Python-Code, der in folgende Module strukturiert ist:

Python-Code
Vergrößern Python-Code
© Peter K. Boxler

Der gesamte Code kann aus meiner Dropbox geladen werden.

Der Shutdown des Pi

Für den ordentlichen Shutdown des Pi sorgt das Script lp_softshut.py. Es ist ebenfalls in /etc/rc.local eingetragen und wird damit nach dem Boot gestartet. Dieses Script prüft kontinuierlich, ob Pin GPIO27 auf Null geht - bei Tastendruck auf die kleine rote Taste an der Unterseite der Control Box. Abhängig von der Stellung des Kippschalters 2 wird entweder

  • der Pi wird heruntergefahren mit dem Befehlt halt oder

  • ein Reboot ausgeführt, Befehl reboot

Das User Interface

Das User Interface des Lichtstabs besteht aus einem Adafruit 16x2 Character LCD 2x16. Die verschiedenen Funktionen werden über fünf Pushbuttons und zwei Kippschalter ausgewählt.

Weitere Statusmeldungen werden über eine grüne LED kommuniziert.

Die Anzeige auf dem 16x2 Display sieht etwa so aus. Dargestellt ist die Variante 1 (Draw Images):

User Interface-Anzeige
Vergrößern User Interface-Anzeige
© Peter K. Boxler

Eingaben und Selektionen des Benutzers werden durch Pushbuttons und Kippschalter vorgenommen:

Pushbuttons und Kippschalter
Vergrößern Pushbuttons und Kippschalter
© Peter K. Boxler

Die Funktionen des Lichtstabs

Draw Image

Diese Funktion ‚zeichnet‘ Bilder. Diese Bilder müssen am Computer vorbereitet werden und müssen eine Höhe von 144 Pixeln haben (der Lichtstab hat 144 LEDs). Die Breite ist variabel, sinnvoll sind 200 bis 1000 Pixel. Die Bilder müssen auf einem USB-Stick im Ordner images gespeichert werden Man kann sie aber auch im Linux-Filesystem ablegen. Möglich sind die Formate jpg, png oder gif.

Diese Bilder werden ‚gezeichnet‘, indem die Kolonnen (1 Kolonne entspricht einem Pixel der Bildbreite) sukzessive auf die 144 Pixel (Bildhöhe) ausgegeben werden. Das Intervall ist dabei 20 ms - dies ist aber im Setup konfigurierbar von 5 ms bis 50 ms. Mit anderen Worten: eine Kolonne ist sichtbar für 20 ms.

Beispiel: Ein Bild der Grösse 500 Pixel Breite und 144 Pixel Höhe wird also in 500 x 20ms = 10 Sekunden ‚gezeichnet‘. Je nach Laufgeschwindigkeit kann das Bild breiter/schmäler werden.

Das User Interface erlaubt die Weiterschaltung von Bild zu Bild (round robin), dabei wird für jedes Bild die ‚Schreibzeit‘ in Sekunden angezeigt. Dies ist wichtig für die Wahl der Verschlusszeit beim Fotografieren.

Funktion Setup

Diese Funktion erlaubt die Änderung folgender Parameter:

  • Sekunden Wartezeit vor Beginn Zeichnen (nach Druck auf roten Pushbutton)

  • Millisekunden Intervall (Leuchtzeit einer Kolonne)

  • Helligkeit der LEDs, Wert zwischen 50 und 255 möglich

  • Richtung des ‚Zeichnens‘ der Bilder; links nach rechts oder rechts nach links

  • Anzahl Iterationen beim Zeichnen von Pattern (nicht relevant bei Bildern)

  • Gamma-Wert für Korrektur der Helligkeit (LEDs haben ziemlich lineare Transferfunktion, das Auge

  • hat nichtlineare Rezeptionsfähigkeit)

Draw a Pattern 1

Diese Funktion erlaubt das ‚Zeichnen‘ von verschiedenen Mustern, die alle in Echtzeit durch Programmcode erzeugt werden. Es gibt verschiedene Arten von Regenbogen-Mustern, es gibt Lauflichter und und und...

Draw a Pattern 2

Diese Funktion erlaubt das Zeichnen von vordefinierten Mustern, die durch Programmcode interpretiert und gezeichnet werden. Es stehen dabei mehrere Farbdefinitionen zur Verfügung - diese sind ebenfalls definiert und erlauben Farbvariation clockwise und anticlockwise auf dem Farbrad. Innerhalb eines Musters kann eine Farbe clockwise verändert werden, einen andere Farbe anticlockwise.

Draw Text

Diese Funktion ist noch nicht voll realisiert - sie funktioniert im Testmodus, wo im Computer eine Tastatur vorhanden ist: Sie ‚zeichnet‘ einen eingegebenen Text mit einem wählbaren Font. Wird der Lichtstab portabel verwendet, so ist zur Zeit keine Tastatur möglich. Hier muss ich noch einiges abklären.

Generierung von Farben

Zur Generierung von RGB-Farbwerten ist eine Funktion color_wheel () implementiert, die auf dem Farbrad 1536 Farben des Regenbogens erzeugen kann. Obwohl mit je 0 bis 255 Werten für R,G und B maximal 16 Millionen Farben möglich sind, sieht man nach einiger Überlegung schnell, dass man bei Variation (Einerschritte) aller drei Farben R,G und B nur maximal 1036 kontinuierliche Farben des Regenbogens erzeugen kann. Alle weiteren anderen Farben sind selbstverständlich möglich, befinden sich jedoch auf anderen Farbkreisen (mit anderen Luminanzen).

Color Wheel
Vergrößern Color Wheel
© Peter K. Boxler

Die Funktion color_wheel (pos, luminance) akzeptiert zwei Parameter:

  • Position auf dem Farbrad, Werte von -1536 bis _1536 möglich

  • Luminanz, 10 % bis 90 % in Zehnerschritten. Defaultwert ist 50 %, dabei ist die maximale Anzahl Farben (1536) möglich.

Rückgabe sind RGB-Werte im Bereich 0 bis 255.

Die Funktion color_wheel implementiert folgende Tabelle - diese zeigt den Verlauf von R, G und B beim Lauf um das Farbrad. Die Tabelle zeigt gesättigte Farben - eine der drei Farben hat den Wert 255.

Die Funktion color_wheel
Vergrößern Die Funktion color_wheel
© Peter K. Boxler
Color Wheel Code
Vergrößern Color Wheel Code
© Peter K. Boxler

Diese Funktion wird in den übrigen Modulen (Generierung von Pattern) sehr oft verwendet.

Ansteuerung der RGB-LEDs

Mit der Library rpi_ws281x, die Adafruit zur Verfügung stellt, ist das Ansteuern der einzelnen Pixel sehr einfach. Das Application Program Interface (API) kennt nur wenige Funktionen. Als Beispiel hier der Pseudo-Code zum Setzen aller 144 Pixel des Stabes auf Farbe Rot (255,0,0). Man sieht, dass der Code sehr simpel ist (strip ist dabei das vorgängig allozierte Objekt, das den Strip kennzeichnet).

Ansteuerung der RGB-LEDs
Vergrößern Ansteuerung der RGB-LEDs
© Peter K. Boxler

Beispiele für Light Painting-Aufnahmen

Bei allen Aufnahmen wurde eine Belichtungszeit von 20 Sekunden verwendet, Blende 16 bei ISO 100. Die Kamera ist eine Sony A7 mit 35-mm-Objektiv.

Bild 144 x 400 Pixel, weisse Schrift auf schwarzem Hintergrund
Vergrößern Bild 144 x 400 Pixel, weisse Schrift auf schwarzem Hintergrund
© Peter K. Boxler
Muster, durch Programm-Code interpretiert
Vergrößern Muster, durch Programm-Code interpretiert
© Peter K. Boxler
Regenbogen 1536 Farben
Vergrößern Regenbogen 1536 Farben
© Peter K. Boxler
Muster, in Echtzeit erzeugt
Vergrößern Muster, in Echtzeit erzeugt
© Peter K. Boxler

Hier geht's zu Peter Boxlers anderen Raspberry-Pi-Projekten:

Switcher (Lampensteuerung) - mehr Informationen und den Code dazu können Sie hier herunterladen. Lesen können Sie diesen Beitrag bereits auf www.pcwelt.de/hacks

Das dritte Projekt von Peter Boxler ist das Xmas TV - mehr dazu finden Sie hier .

Weitere interessante Links:

Neopixel ansteuern mit dem Pi

Adafruit Online-Shop LED-Strips

Timing bei der Ansteuerung von WS2812

Color Wheel im Web:

www.workwithcolor.com/hsl-color-picker-01.htm

https://color.adobe.com/de/create/color-wheel/

Hinweis für alle Bastler:
Wenn auch Sie ein kreatives Projekt entwickelt haben, schreiben Sie uns. Wir würden Ihre Konstruktionen, nützlich oder einfach nur schräg, gern auf www.pcwelt.de/hacks vorstellen. Schreiben Sie an Birgit Götz - hacks@pcwelt.de. 

0 Kommentare zu diesem Artikel

PC-WELT Hacks - Technik zum Selbermachen?

Raspberry Pi erfreut sich gerade unter Bastlern einer großen Beliebtheit. Kein Wunder, denn mit der 35-Euro-Platine lassen sich viele spannende Projekte realisieren. Vom Mediacenter, Netzwerkspeicher, Fotomaschine bis hin zum Überwachungssystem ist alles möglich. Dieser Bereich ist aber nicht nur dem Raspberry Pi gewidmet, sondern bietet auch viele Tipps, Tricks und Anleitungen für andere spannende Bastelprojekte.

2074005