zurück zum Artikel

Projekt zum Nachbauen: LED-Hosenträger für Karneval

Miguel Köhnlein, Michael Gaus

Mikrocontroller-Projekt für Fasching: Auf den Hosenträgern sind LED-Streifen angebracht, die man mit einem PICAXE oder einem Arduino ansteuern kann.

Wer braucht noch ein Last-Minute Bastelprojekt für Fasching? Wir schlagen LED-Hosenträger mit individuell ansteuerbaren RGB-LEDs vor. Durch die Verwendung von günstig erhältlichen WS2812B LED-Stripes lässt sich das Projekt in kurzer Zeit aufbauen. Das Besondere: Die Ansteuerung kann entweder mit einem PICAXE oder mit einem Arduino erfolgen. Den Lichteffekt kann man je nach Wunsch passend programmieren.

Normalerweise ist die Datenübertragung zu den WS2812B äußerst zeitkritisch, aber mit dem hier gezeigten Schaltungsprinzip wird der Controller während der eigentlichen Datenübertragung nicht belastet, da diese selbsttätig im Hintergrund abläuft. Dadurch schafft es auch ein PICAXE, die LEDs anzusteuern.

Mehr Infos

Kurzinfo

  • Hosenträger mit 2x 20 RGB-LEDs mit WS2812B
  • LEDs individuell steuerbar, optional sind auch mehr LEDs möglich
  • WS2812B mit PICAXE 14M2 ansteuern

Material

  • Hosenträger
  • PICAXE oder Arduino Nano
  • WS2812B LED-Stripes mit 30 LEDs pro Meter, insgesamt ca 2 Meter
  • Serial SPI RAM zum Beispiel 23LC1024 oder 23LC512
  • Mini-Haargummis, transparent
  • USB-Powerbank
  • USB-Kabel mit A-Stecker
Make PICAXE Special

Mehr zum Thema gibt es im Make: PICAXE Special.

Außer dem Controller benötigt man noch einen Serial SPI RAM. Passende Typen sind der 23LC1024 [2] oder der 23LC512 [3]. Dieser RAM dient als Datenspeicher für die LED-Daten der WS2812B-Kette. Der Controller beschreibt ihn mit dem gewünschten Lichtmuster. Der Dateneingang der WS2812B LEDs ist über einen 100 Ω Serienwiderstand direkt mit dem Datenausgang SO des SPI-RAMs verbunden. Die Ausgabe der LED-Daten zum WS2812B erfolgt durch das Senden eines Lesebefehls vom Controller an den RAM und dem anschließenden Anlegen eines Takts an SCK, der durch eine PWM-Einheit im Controller ohne Prozessorbelastung erzeugt wird. Das genaue Prinzip wird später erklärt.

Die Schaltpläne sind in drei Varianten dargestellt: für einen PICAXE 14M2 standalone, für einen PICAXE 14M2 auf dem NANO AXE Board sowie für einen Arduino Nano. Bei den beiden Nano-Board-Varianten ist der einzige Unterschied der Pin für das PWM-Signal: Beim NANO AXE wird hier Pin C3 und beim Arduino Nano Pin D3 benötigt.

LED-Hosenträger für Karneval: Schaltpläne (0 Bilder) [4]

[5]

Für unseren Testaufbau haben wir WS2812B Standard-LED-Stripes verwendet, die weder wasserdicht noch isoliert, aber dennoch erstaunlich robust sind. Wer auf Nummer sicher gehen möchte, kann die wasserdichte Ausführung mit transparenter Kunststoff-Ummantelung wählen, sodass der Aufbau unempfindlicher ist und auch bei Regenwetter keine Probleme macht.

Man benötigt WS2812B LED-Stripes mit 30 LEDs/m. Dafür kann man entweder zwei einzelne mit je 1 Meter Länge nehmen oder einen 2 Meter langen Stripe. Zuerst schneidet man zwei Stripes mit jeweils 20 LEDs zurecht. Je nach Größe der Person können aber auch mehr als 20 LEDs nötig werden – dann muss man die Ansteuersoftware entsprechend anpassen.

Die LED-Stripes sind mit transparenten Mini-Haargummis (z.B. von DM [6]) auf dem Hosenträger befestigt. Dabei darf der Stripe nicht plan aufliegen: Man sollte etwas Spielraum lassen, so dass durch die spätere Spannung der Hosenträger alles glatt gezogen wird. Noch besser klappt es, wenn eine Person die Hosenträger trägt und eine zweite Person den Stripe durch die Gummis fädelt.

So sieht der Hosenträger mit den befestigten LED-Streifen aus

Der erste Stripe wird so montiert, dass sich der Dateneingang der LEDs in getragenem Zustand unten oberhalb der Hosentasche befindet. Die Datenrichtung der LEDs verläuft dann von unten nach oben. Wir nutzen hier das vorhandene Anschlusskabel mit 3-poligem Steckverbinder. Das ebenfalls im Lieferumfang beiliegende passende Gegenstück mit Kabeln wird später an der Ansteuerschaltung angelötet. An die beiden zusätzlich herausgeführten offenen Kabelenden des Stripes (rote und weiße Ader) löten wir dann ein abgeschnittenes USB-Kabel mit A-Stecker an und isolieren es mit Schrumpfschlauch. Dort kann dann man dann eine USB-Powerbank anschließen, die zusammen mit der Ansteuerelektronik Platz in der Hosentasche findet.

Beim zweiten Stripe verläuft die Datenrichtung entgegengesetzt von oben nach unten. Auf dem Rückenteil werden die beiden Stripes durch drei isolierte Litzen miteinander verlötet, also jeweils 5V und GND durchverbunden sowie DOUT des ersten mit DIN des zweiten Stripes.

Die Spannungsversorgung erfolgt per USB-Kabel über eine USB-Powerbank. An den 3-poligen Steckverbinder wird die Ansteuerelektronik angeschlossen. Die LED-Stripes sind mit Mini-Haargummis am Hosenträger fixiert. Die beiden Stripes verbindet man mit 3 Litzen miteinander:

5V<-> 5V
GND <-> GND
DOUT <-> DIN

In der Mitte ist die Ansteuerelektronik mit dem Spi-RAM und dem Anschlusskabel für den ersten LED-Stripe zu sehen. In die Buchsenleisten kann entweder ein NANO AXE mit Picaxe 14M2 oder ein Arduino Nano eingesteckt werden.

Laut Spezifikation der WS2812B sollten sie mit einer Frequenz von 800 kHz, also einer Periodendauer von 1,25µs, angesteuert werden. Dabei bestimmt die Länge des High-Anteils, ob eine 0 (0,35µs) oder eine 1 (0,9µs) als Datenbit eingetaktet wird. In der Praxis sind die WS2812B jedoch etwas toleranter als in der Theorie, was durch die Analyse des Timings in dieser Anleitung [7] bestätigt wird.

Die Rückansicht des LED-Hosenträgers

Wir verwenden folgendes Timing für die Datenausgabe zu den WS2812B LEDs: Basis ist ein 4 MHz Taktrsignal, also 250 ns Periodendauer. Ein Datenbit für den WS2812B setzt sich aus 8 Takten zusammen, es hat also eine Dauer von 8x 250ns = 2µs, was größer als die spezifizierten 1,25µs ist, in der Praxis jedoch problemlos funktioniert. Um ein 0-LED-Datenbit zu generieren wird ein High-Anteil von 1 Takt, also 250ns gesendet. Für ein 1-LED-Datenbit wird 4 Takte lang High gesendet, also 1µs. Dadurch kann jedes LED-Datenbit als 1 Byte im SPI-RAM abgebildet werden. Es hätten auch 5 Bits im RAM gereicht, aber dann wären Bit-Shift-Operationen beim Hineinschreiben notwendig, die bei Verwendung von 8 Bits entfallen.

Das Schreiben der Daten in den RAM erfolgt über SPI-Datenzugriffe, das MSB wird zuerst übertragen. Für ein 0-LED-Datenbit verwenden wir als Datenbyte den Wert 40 (hex), also 01000000 und für ein 1-LED-Datenbit den Wert 78 (hex), also 01111000. Das MSB ist jeweils 0, weil später beim Lesevorgang am SPI-RAM nach der High-Low-Flanke des letzten Adressbits bereits das erste Datenbit am Ausgang SO erscheint. Beim PICAXE verwendet man das onchip MSSP-Interface mithilfe von pokesfr-Befehlen, um die Datenübertragung zu beschleunigen. Beim Arduino könnte ebenfalls die Hardware-SPI benutzt werden, hier benutzt man jedoch ein Bitbanging per Software, damit man beim Arduino Nano die gleichen Pins wie beim NANO AXE Board nehmen kann.

Um die im RAM vorhandenen LED-Daten auszulesen und als kontinuierlichen Datenstrom zur WS2812B-LED-Kette zu übertragen, muss der SPI-RAM zuerst per Mikrocontroller in den Lesemodus ab der gewünschten Adresse gebracht und danach SCK des Controllers auf Eingang geschaltet werden, bevor dann anschließend ein 4 MHz Taktsignal an SCK angelegt wird. Solch ein kontinuierliches Taktsignal kann im Controller einfach durch Verwendung der PWM-Einheit erzeugt werden, sowohl beim PICAXE als auch beim Arduino. Hierzu wird ein passender PWM-Ausgangspin mit dem SCK-Signal verbunden. Per Software ist entweder der SCK-Ausgang des Controllers oder der PWM-Ausgang aktiv und der jeweils andere Pin als Eingang konfiguriert, sodass es keine Kurzschlüsse geben kann. Ein Pulldown an SCK sorgt dafür, dass es keine undefinierten Pegel während der Umschaltung gibt.

Der Mikrocontroller könnte während der PWM-Ausgabe auch andere Aufgaben wahrnehmen oder einfach warten. Die zeitkritische Datenausgabe zu den WS2812B erledigt das SPI-RAM selbsttätig, solange das PWM-Signal an SCK anliegt. Das PWM-Signal muss mindestens solange generiert werden, dass alle Datenbits zu den LEDs übertragen werden können. Pro LED werden 24 Datenbits entsprechend 24 Bytes aus dem SPI-RAM benötigt, ein Byte benötigt 2µs Übertragungszeit, somit ergibt sich die Gesamtdauer als 24*2µs*Anzahl_LEDs. Bei 40 LEDs sind dies ungefähr 2 ms.

Die im RAM hinter dem LED-Muster liegenden Daten werden von den WS2812B einfach ins Nirwana weitergeleitet, solange bis ein LOW-Signal von mindestens 50µs (in der Praxis teilweise bereits ab ca. 5µs) anliegt als Kennzeichnung zur Datenübernahme. Ab dann zeigen die WS2812B das eingetaktete LED-Muster an und warten auf neue Daten. In der Initialisierungsphase der Ansteuersoftware beschreiben wir deshalb den kompletten SPI-RAM zunächst mit dem Wert 00 (hex), sodass nach den benutzten LED-Mustern durch die Nullbytes ein LOW-Pegel an SO resultiert. So erfolgt eine Datenübernahme durch die WS2812B. Das Chipselect muss rechtzeitig deaktiviert werden, bevor im SPI-RAM wieder Bytes ungleich Null vorkommen.

Mehr Infos

Vorteile

  • Interrupts müssen während der Datenübertragung nicht gesperrt werden (wie z.B. beim Arduino) und es können nebenher andere zeitkritische Interrupts bedient werden (z.B. Auswertung IR-Fernbedienung oder UART-Eingaben)
  • WS2812B Übetragung läuft selbsttätig ab ohne Controllerbelastung
  • LED-Muster ist im externen SPI-RAM abgelegt, das heißt es ist nicht unbedingt internes RAM für die LEDs notwendig. Dadurch sind auch bei Controllern mit wenig RAM viele LEDs möglich.

Hier finden Sie den Quellcode für die Programmierung der Hosenträger. [8]

Am Anfang des Codes können die Größe des SPI-RAMs in kBytes, die Anzahl LEDs sowie die gewünschte LED-Helligkeit in Prozent angegeben werden.
symbolSPI_RAM_SIZE_KB=128
symbolNUMBER_OF_LEDS=40
symbolLED_BRIGHTNESS_PERCENT=25

Die Definition eines LED-Musters, also das Schreiben ins RAM erfolgt über folgende Makros:

DEFINE_PATTERN_NUMBER(par_patternnumber)legt die Nummer (0-x) des aktuell zu beschreibenden LED-Musters im SPI-RAM fest. Diese Nummer bleibt solange aktiv, bis sie durch erneuten Aufruf neu gesetzt wird.

DEFINE_LED_COLOR(r,g,b)legt die aktuell zu verwendenden Farbanteile rot, grün und blau (jeweils 0-255) fest, die für die LED_PATTERN_xxx Makros verwendet werden. Diese bleiben solange aktiv, bis sie durch erneuten Aufruf neu gesetzt werden.

SELECT_COLOR(x)legt ähnlich wie DEFINE_LED_COLOR die aktuell zu verwendende LED-Farbe fest, jedoch in Form eines Indizes (0-8). Kann z.B. in Schleifen verwendet werden, um einen Effekt nacheinander in verschiedenen Farben ablaufen zu lassen.
0=schwarz bzw. LED aus, 1=rot, 2=gelb, 3=grün, 4=cyan, 5=blau, 6=violett, 7=weiß, 8=schwarz bzw. LED aus

LED_PATTERN_SET_LED(par_lednumber)beschreibt eine LED im SPI-RAM mit der aktuell festgelegten Farbe. Übergabeparameter ist die Nummer der LED (0..[AnzahlLeds-1], im Beispiel also 0-39)

LED_PATTERN_SET_NEXT_LED beschreibt die nächste LED im SPI-RAM mit der aktuell festgelegten Farbe. Dies spart Zeit beim Beschreiben direkt aufeinanderfolgender LEDs eines kompletten Musters, da das SPI-RAM nicht für jede LED neu adressiert werden muss.

LED_PATTERN_FILL beschreibt das aktuelle LED-Muster im SPI-RAM komplett mit der aktuellen Farbe.

LED_PATTERN_END kann optional verwendet werden, um den Datentransfer ins SPI-RAM abzuschließen (CS wird HIGH).

Die Ausgabe eines LED-Musters aus dem SPI-RAM auf die LED-Kette erfolgt durch das Makro SHOW_LEDS(par_shownumber), wobei für par_shownumber die gewünschte Nummer des Musters (0-x) übergeben wird.

Es ist möglich, durch Verwendung von DEFINE_PATTERN mehrere LED-Muster im SPI-RAM abzulegen und diese dann durch SHOW_LEDS auszugeben, ohne die Muster jedes Mal neu berechnen zu müssen.

Im Beispiel wird in der Funktion setup als Muster 1 ein Farbverlauf abgespeichert, der dann in der Hauptschleife ausgegeben wird. Muster 0 wird in der Hauptschleife durch verschiedene Effekte mehrmals neu beschrieben und ausgegeben.

Es muss darauf geachtet werden, dass es innerhalb eines Musters keine unbeschriebenen LEDs (also mit Nullbytes im SPI-RAM) geben darf, da ansonsten die WS2812 aufgrund eines längeren LOW-Pegels vorzeitig einen Reset erkennen und nachfolgende Daten neu einlesen könnten. Ebenso darf es keine Lücken mit Nullbytes zwischen den Mustern geben.

Um Lücken innerhalb eines Musters zu vermeiden, kann man dieses vor dem wahlfreien Beschreiben über LED_PATTERN_FILL mit den aktuell gesetzten RGB-Farbanteilen (oder RGB=0,0,0 für „LEDs aus“) füllen. (rehu [9])


URL dieses Artikels:
https://www.heise.de/-4652922

Links in diesem Artikel:
[1] https://shop.heise.de/make-picaxe-special-2020/Print
[2] https://www.conrad.de/de/p/microchip-technology-23lc1024-i-p-speicher-icpdip-8-sram-1024-kbit-128-k-x-8-651217.html
[3] https://www.reichelt.de/sram-512-kb-64-k-x-8-2-5-5-5-v-so-8-23lc512-i-sn-p199553.html
[4] https://www.heise.de/bilderstrecke/bilderstrecke_4992045.html?back=4652922;back=4652922
[5] https://www.heise.de/bilderstrecke/bilderstrecke_4992045.html?back=4652922;back=4652922
[6] https://www.dm.de/ebelin-haargummis-mini-transparent-p4010355393593.html
[7] https://cpldcpu.wordpress.com/2014/01/14/light_ws2812-library-v2-0-part-i-understanding-the-ws2812/
[8] https://www.heise.de/downloads/18/2/8/3/6/8/1/5/led_hosentraeger_ws2812.bas
[9] mailto:rehu@heise.de