LED-Spielereien

Basteleien mit einzelnen LEDs. Für LED-Matrizen von >20 LEDs siehe jener Artikel.

Schweißlicht

Nicht für die Modelleisenbahn, sondern für einen Doktorhut. Simuliert das Lichtbogenschweißen. Mittels ATtiny13. Ansonsten dasselbe, was man auch aus China kaufen kann. Nur 1-kanalig und ziemlich lausig, was den Ruhestrombedarf angeht.

Schaltung

An PB4 (Pin 3) ist eine weiße LED ohne Vorwiderstand nach Masse (Pin 4) angeschlossen. Gespeist wird der Controller durch 4 NiMH-Akkus, also nominell 4,8 V. Zusätzlich ist via Koppelkondensator ein kleiner Lautsprecher angeschlossen, um ein „echtes“ Knistergeräusch zu haben. Alle anderen Pins sind unbenutzt bzw. frei zur ISP-Programmierung.

Software

Siehe Archiv. Der C-Quelltext ist gerade mal 33 Zeilen lang. Der meiste Kode und die größte Rechenlast entsteht durch das Einbinden von rand() aus der Standardbibliothek.

Leuchtpfeil

Um Besucher oder Kinder in einem Verkehrsgarten den richtigen Weg zu weisen, sind einander verkettete LEDs (in Pfeilform) optimal, wenn sie nicht zufällig blinken, sondern in Kette an- und ausgehen. Die vorliegenden Module (Einzelpfeile) habe eine Speisespannung von 5..12 Volt.

Konventionelle Lösung

Da nicht nur ein einzelner Lichtpunkt durchlaufen soll, scheidet eine Lösung mit 4017 (dekadischer Zähler mit dekodierten Ausgängen) aus. Hingegen bietet sich der 4015 (2x 4-bit-Seriell-Parallel-Schieberegister) an. Mit 4093 als Taktgenerator.
Schaltplan
Das erste 4093-Gatter generiert den Schiebetakt, mithin die Zeit von einer LED zu nächsten, etwa 200 ms. Das zweite 4093-Gatter generiert die Hell- und Dunkelzeit, über Dioden entkoppelte zwei Potenziometer getrennt einstellbar, im Sekundenbereich.

An den Ausgängen hängen npn-Emitterfolger ohne weitere Widerstände, um die Strom fressenden LEDs von den CMOS-Ausgängen zu bereiben.

Eigenschaften und Vorteile:

Mit Mikrocontroller

Wenn 6 Ausgänge genügen, dann kann man vorteilhaft einen 8-beinigen Mikrocontroller verwenden. (Hochvolt-Programmiergerät steht zur Verfügung.) Hier tat es ein ATtiny13, der gerade in der Bastelkiste herumlag. Aus an dessen Ausgänge müssen Treibertransistoren, diesmal in Emitterschaltung und mit Basisvorwiderständen. Außerdem sollte ein Festspannungsregler (78L05) vorgesehen werden, wenn die LEDs mitsamt der Schaltung aus 12 V versorgt werden sollen.
Schaltplan
Die Firmware ist so simpel, dass ich sie diesmal in Assembler erstellt habe. Nicht avrasm2, sondern gnu-assembler. Dadurch lassen sich in speziellen Sections die Fuse-Werte für den Programmer ablegen. Siehe Quelltext! (Der Gebrauch der lokalen Marken mag etwas gewöhnungsbedürftig sein.)

Fließende Übergänge (per PWM) lassen sich nur mit der Mikrocontroller-Lösung realisieren.

Rundumleuchte

Für den Modellbau sollte eine blaue Rundumleuchte im Maßstab 20:1 her. Klar, dass man so ein Ding mit 7 mm Fußdurchmesser nicht mehr mit Lampe und motorisiertem Reflektorspiegel bauen kann. Schade!

Daher eine Abfolge rundum angeordneter, hinreichend gerichtet abstrahlender SMD-LEDs sowie eine Ansteuerung, die fließende Übergänge realisiert. Also ganz klar ein Mikrocontroller-Problem. Die LEDs können direkt am Controller betrieben werden, da die Stromaufnahme nicht allzu groß ist. Der Controller kommt fürs erste ins Fahrzeuginnere, ein Einbau ins Zentrum der Rundumleuchte ist ziemlich fummelig und erst in Kleinserie beherrschbar. Hierzu wäre eine flexible Leiterplatte nötig.

Schaltplan Multiplex und Charlieplex

Der erste Entwurf geht von einem Hochvolt-programmierten Mikrocontroller aus. Dabei kann der RESET-Anschluss nur sinnvoll nach GND steuern. Allerdings ist die High-Treiberfähigkeit von PB5/RESET unzureichend! Schon daher ist von so einer Lösung abzuraten.

Charliplexing führt zur Einsparung eines Portpins und damit zur „Schonung“ des Reset-Anschlusses zur ISP-Programmierung. Jede LED kann antiparallel-zweifarbig sein.

Dazu gibt es Eagle-Schaltpläne. Firmware wurde entwickelt, ist woanders.

Mehr LEDs

Mit 14 SMD-LEDs Bauform 0603 und 14 mm Platinendurchmesser ist dieser Entwurf sogar einigermaßen „handlich“, aber auch eher für Modelle im Maßstab 10:1 oder solide Gartenzwerge: Auch hier wurde auf Charliplex gesetzt.
Schaltplan

Hier habe ich auch mal die Platine geroutet, das Ergebnis ist hier zu sehen:

 
Platinentwurf und Bestückung (Vorder- und Rückseite)

Die Frage nun: Wer baut's?

Hier Eagle-Schaltplan und -Board. Firmware wurde dort entwickelt.

Die Umlaufrichtungsumschaltung erfolgt hier durch — RESET!! Oder Einschalten. Denn der Mikrocontroller kann die Reset-Ursache finden und im EEPROM einen Taktteiler realisieren. Der Widerstand R1 drosselt schließlich die Umlaufgeschwindigkeit. Dann liest der A/D-Wandler einen Wert kleiner 0x3FF.

RGB-LED-Kette mit WS2812

RGB-LEDs mit eingebautem WS2812-Controller haben einen Dateneingang und einen Ausgang zur Kaskadierung. Damit sind sie hervorragend für Lichtzeilen geeignet und ein beliebtes Bastelobjekt, vor allem für Ebay- und Alibaba-Einkäufer.

Zu ihrer Ansteuerung wird in jedem Fall ein Mikrocontroller benötigt.

An den bisher vorgefundenen, durchaus sehr pfiffigen Lösungen gab es zwei k.-o.-Kriterien:

Zwei Mini-Platinen, eine mit ATtiny45 und eine mit ATtiny85, dienten als Ausgangspunkt. Den USB-Bootloader micronucleus habe ich auf Teufel-komm-raus nicht zur Funktion gebracht, also habe ich die V-USB-basierte Firmware einfach „nackt“ aufgesetzt.

Screenshot des Windows-Programms

Ein treiberloses Windows-Programm mit 8 KByte Größe macht den Chip mit der LED-Kette bedienbar. Wie gewünscht findet keine Animation statt, sondern es werden einfach feste RGB-Werte eingestellt.

Die Firmware und Software mit Quellen (V-USB ist extra). Das HID-Protokoll ist recht simpel: Ein länglicher Feature-Report liest oder schreibt alle RGB-Werte (in WS2812-typischer GRB-Reihenfolge) vom bzw. zum Mikrocontroller. Ein zusätzlicher Output-Report von 4 Byte Nettodatenlänge adressiert ein GRB-Tripel zum Verändern. Der Mikrocontroller schreibt „im Hintergrund“ alle Datenänderungen in seinen EEPROM.

Einzelne WS2812-RGB-LED an ATtiny10

Dieser Aufbau mit dem 6-beinigen ATtiny9 oder ATtiny10 erforderte von Tim Böschke das V-USB unter 1 KByte zu pressen.

Das Bild zeigt meinen raumgreifenden Probeaufbau. Von den beiden WS2812 ist nur die blau leuchtende angeschlossen. Die rote LED dient zur Spannungs­reduktion auf 3,3 V für den Mikro­controller sowie als Stromanzeige. Der 10-kΩ-Wider­stand verbindet 5 V mit D– zur Low-Speed-Geräte­erkennung. Der Mikro­controller selbst sitzt auf einem roten Stück Pappe, dessen Beinchen ich mit Einzel­adern eines Abschirm­geflechts verlängert habe. Damit diese Ver­länge­rungen ins­besondere in der Programmier­fassung hand­habbar sind, sind an deren Enden abgeschnittene LED-Beinchen angelötet. Auch an den Enden des USB-Kabels von einer alten Computer­maus habe ich derartige Beinchen angelötet. Das macht sich beim Einsatz auf Steck­brettchen so optimal.

Weil das Original auf Github keine HEX-Datei beigelegt hat (und für den Gelegenheits­bastler evtl. schwierig zu compilieren ist, weil leider die verwendete Versions­nummer von avr-gcc nicht dabei steht), habe ich hier meine Version mit HEX-Datei.

Und da steht beschrieben, wie ich's in den Chip hinein­bekommen habe: Mit meinem eigenen Brenn­programm.

Schließlich habe ich noch ein Windows-Konsolenprogramm dazu geschrieben, mit dem man die LED per Kommando­zeilen­parameter (RGB-Wert wie in HTML, etwa #808000 für gelb) setzen kann. Um den Chip in der Schaltung mit der Firmware an libusb-0.1 zu binden, habe ich das Paket libusb-win32-bin-1.2.6.0.zip herunter­geladen und daraus das Programm inf-wizard.exe benutzt.

Da der ATtiny10 keinen EEPROM hat, kann dieser die letzte Einstellung nicht speichern. Beim Anstecken an USB bleibt die LED daher erst mal dunkel. Relativ einfach erscheint die Erweiterung auf bis zu 256 gleichfarbig leuchtende WS2812-LEDs durch schnelle Wiederholung der 24-Bit-Ausgabe wie im Artikel unten.

Software-Erweiterung August 2020

Da libusb unter Windows 10/64 nicht so recht zum Laufen zu bringen war, habe ich mich in WinUSB ausprobiert. Zunächst habe ich im Visual Studio holper-di-polter ein Beispielprogramm erstellt, welches schließlich auf die LED zugreifen konnte. Um den Quelltext MSVC6-kompatibel zu halten, habe ich die entsprechenden Include-Dateien aus dem Windows-10-WDK auf die wenigen notwendigen Zeilen zusammengekürzt und ins C++-Programm eingefügt. Und die winusb.dll dynamisch geladen, damit's trotzdem noch unter Windows 98 oder Windows 2000 funktioniert. Dementsprechend wurde auch libusb0.dll dynamisch geladen, um diese DLL auch unter Windows 10 nicht mehr vorhalten zu müssen.

Das „Unbekannte Gerät“ muss im Geräte-Manager mit dem Treiber „WinUSB“ verknüpft werden. Eine selbstgemachte INF-Datei (mit der eigenen Interface-GUID) ist nicht erforderlich; die Software kämmt einfach alle USB-Geräte durch. Dadurch klappt's auch ohne Code-Signing und/oder Reboot.

WinUSB ist im Gegensatz zu libusb deutlich einfacher in der Anwendung. Schade dass man libusb so unnötig kompliziert gestrickt hatte. Nun ja, man sollte nicht das SetupDi-Geraffel von Microsoft unverändert übernehmen, sonst wäre libusb wieder einfacher.

Hier ist es. Zum automatischen Laden von winusb (und Nutzung mit webusb) fehlt der Firmware Platz für die recht umfangreichen Deskriptoren. Das würde die Steuerung durch einen Web-Browser ermöglichen, heutzutage (2021) alles außer Firefox und IE.

800 WS2812 testen

Problem: Heutzutage werden miniaturisierte WS2812, die als Ardino-Gedöhns sattsam bekannten RGB-LEDs mit seriellem Interface, in Spulen von 800 Stück (Bandlänge 5 m, 160 LED/m, Abstand 6,25 mm) geliefert. Bei der Waren­eingangs­kontrolle soll die Spule getestet werden. Die gängigen Arduinos streiken, ohne dass man im Build­prozess informiert wird warum: Zu wenig RAM für die übliche Implementierung! Es werden beim linearen Herausschieben aus dem RAM für 800 LEDs 3×800 = 2400 Byte RAM benötigt. Ein Arduino Uno hat aber nur 2 KByte RAM.

Deppen-Lösung: Man nehme einen 32-Bit-Controller.

Richtige Lösung: Man wirft die 💩 Arduino-Software mitsamt 💩 Libraries über Bord und macht eine angepasste, RAM sparende Lösung gefälligst mit C++-Templates und nicht mit #define! (Das zweite Jahrtausend ist schon lange vorbei, wir sind im dritten.) Hier genügen 3 Bytes, um einfach die gleiche Farbe auf alle 800 LEDs zu repetieren.

Kurz und knapp: Ein WinAVR-Projekt. Als eigentliches Problem erwies sich die Stromversorgung der Spule: Bei Vollaussteuerung auch nur einer Farbe bricht die Spannung der „Schnecke“ im Innern auf knapp 2 V zusammen, was sich in seltsamen Verhalten und „Rotverscheibung“ bemerkbar macht. Dieses Testprogramm verwendet deshalb nur kleine Werte, und so funktioniert es wunderbar.

Andere LED-Projekte