Projekt Lavalampe, Teil 2 — Firmware
In Teil 1 habe ich die Hardware meines Projektes einer fernsteuerbaren Lavalampe beschrieben. In diesem zweiten Teil will ich etwas auf die notwendige Firmware eingehen, also das Programm, das notwendig ist, um dem Picaxe Microcontroller die gewünschte Funktionalität beizubringen.
Es gibt dabei zwei Themenkreise im Auge zu behalten:
- Von der seriellen Schnittstelle müssen die Sollgrössen gelesen werden, also die gewünschten Farbintensitäten der drei Grundfarben Grün, Rot und Blau.
- Diese Sollgrössen müssen in Licht des gewünschten Farbtons und der gewüschten Intensität umgesetzt werden. Sprich, die LEDs müssen zum Leuchten gebracht werden.
Ein paar Worte zum Picaxe
Der Picaxe hat einen vorgefertigten Befehlssatz, der BASIC nachempfunden ist und der ziemlich mächtig ist. Beispielsweise lässt sich mit nur einem Befehl eine ganze Reihe von Input-Daten einlesen und Speicherplätzen zuweisen. Allerdings ist die Taktgeschwindigkeit des Mikroprozessors nicht sehr hoch, die Arbeitsgeschwindigkeit beschränkt. Das ist auch verständlich, bei grösseren Arbeitsgeschwindigkeiten würden sich höhere Verlustleistungen ergeben und dann müsste er gekühlt werden, was den Aufwand für ein Gerät mit diesen Prozessoren erheblich in die Höhe treiben würde.
Es gibt den Picaxe in verschiedenen Ausführungen, die sich in Bauform, Gehäusegrössen, und Sonderausstattung wie etwa der Anzahl D/A‑Wandler oder Pulsbreitenmodulatoren unterscheiden. Das kleinste Modell mit 8 Dual-Inline-Anschlüssen hat folgende Pinbelegung:
- 2 Anschlüsse für 5V und Masse (Speisung)
- 2 Anschlüsse für seriellen Ein- und Ausgang. Diese werden für die Programmierung und später für die Farb-Sollvorgaben benutzt. Im Prinzip könnten sie aber bei Bedarf stattdessen auch als normaler digitaler Eingang und als digitaler oder analoger Ausgang benutzt werden.
- 1 digitaler Eingang
- 3 wahlweise Ein- und Ausgänge mit verschiedenen Sonderfunktionen
Hier findest Du das Datenblatt zum PICAXE.
Für den Picaxe steht eine Integrierte Entwicklungsumgebung namens “Picaxe Editor 6″ zur Verfügung, mit der Programme entwickelt, simuliert und auf den Picaxe übertragen werden können. Ebenfalls stehen kostengünstige Prototypenboards zur Verfügung. Ich habe mir dieses Board hier beschafft für meine ersten Gehversuche.
Funktionsprinzip der Firmware
Die Leuchtstärke von LEDs wird nicht daduch gesteuert, dass die Speisespannung variiert wird (das könnte ein analoger Ausgang leisten), sondern man arbeitet mit Pulsbreitenmodulation, englisch Pulse Width Modulation, PWM, genannt. Der von mir verwendete Picaxe-08M2 verfügt über einen PWM-Ausgang, wie man im obigen Bild sieht. Der reicht aber leider nur für eine der drei Grundfarben, nicht für alle drei. Erst mit den deutlich grösseren Modellen 14M2 oder 20M2 hätte ich drei oder sogar vier PWM-Ausgänge zur Verfügung. Ich muss daher die Pulsbreitenmodulation “von Hand” programmieren, was leider nur mit beschränker Geschwindigkeit klappt, was wiederum dazu führt, dass meine LED-Steuerung flimmert. Das ist schade, aber mit dem beschränkten Platz nicht zu vermeiden. Für einen grösseren Picaxe-Baustein würde der Platz im Sockel der Lavalampe nicht ausreichen, dann müsste ein grösseres Lampengehäuse her.
Um die zur Verfügung stehende Rechenleistung optimal auszunutzen, habe ich meine Firmware wie folgt aufgebaut:
Eine grosse Schleife wiederholt sich endlos. Innerhalb dieser Schleife passiert folgendes:
- Alle drei LEDs werden zunächst eingeschaltet, falls die Anzahl Arbeitszyklen überhaupt grösser als Null ist.
- In einer inneren Scheife, die immer gleich häufig durchlaufen wird,
- …wird jede Farbe, deren Leuchtzyklen abgelaufen ist, ausgeschaltet.
- …ausserdem wird jetzt 3 Millisekunden lang auf den Beginn eines Input-Telegramms gewartet. Falls ein “C” erkannt wird, dann wird ein Unterprogramm angesprungen, das den Rest des Telegramms einliest und verarbeitet.
- Nach Ablauf der inneren Schleifenzyklen kehren wir zur äusseren Schleife zurück und der Vorgang beginnt von vorne.
Ein Durchlauf durch die äussere Schleife bestimmt das Flimmern der LEDs. Je kürzer ein Durchgang, desto geringer das Flimmern.
Ein Durchgang durch die innere Schleife wird bestimmt durch die Wartezeit auf den seriellen Input, die regelmässig durchlaufen werden muss, damit der Picaxe Änderungen der Wunschfarbe und ‑Helligkeit, die vom angeschlossenen PC mitgeteilt wird, mitbekommt. Je länger diese Wartezeit ist, desto zuverlässiger werden ankommende serielle Zeichen erkannt. Ich habe mich hier auf 3 Millisekunden festgelegt. Wenn in dieser Zeit ein “C” festgestellt wird, dann wird kurz aus der Schleife gesprungen und drei zusätzliche Bytes eingelesen, als Farbwerte für die drei Grundfarben. Die Anzahl Durchgänge n durch die innere Schleife bestimmt die Anzahl der möglichen Helligkeitsstufen von 0 (“dauernd aus”) bis n+1 (“dauernd ein”).
Die Anzahl innerer Zyklen pro Durchgang der äusseren Schleife bestimmt die “Flimmerfrequenz” der LEDs, und zwar umgekehrt proportional. Das heisst, je weniger die LEDs flimmern sollen, desto weniger häufig darf die innere Schleife durchlaufen werden, und desto weniger Helligkeitstufen sind möglich. Je mehr Helligkeitstufen möglich sein sollen, desto stärker werden die LEDs flimmern. Einen für mein Gefühl sinnvollen Kompromiss meine ich mit 7 inneren Zyklen gefunden zu haben.
Am seriellen Port wird die gewünschte Farbe und Leuchtstärke durch ein “Telegramm” aus vier Bytes übermittelt. Jedes Telegramm wird mit einem “C” eingeleitet und die folgenden drei Bytes sind die Anzahl innerer Zyklen der Grundfarben Rot, Grün und Blau als ASCII-Ziffer. Ein paar Beispiele:
- ‘C000’ — LED ist vollkommen ausgeschaltet, also dunkel
- ‘C888’ — LED ist vollkommen eingeschaltet, leuchtet also weiss
- ‘C800’ — LED leuchtet rot
- ‘C080’ — LED leuchtet grün
- ‘C008’ — LED leuchtet blau
- ‘C440’ — LED leuchtet gelb mit halber Leuchtkraft
- ‘C808’ — LED leuchtet violett mit voller Leuchtkraft
- ‘C740’ — LED leuchtet braun
- und so weiter
Leider ist der serielle Empfänger nicht zuverlässig genug, dass jedes Telegramm sauber empfangen wird. In der Regel muss der Computer das Telegramm mehrmals senden, bis es durchkommt. Eine Quittierung für erfolgreichen Empfang des Telegramms ist in meinem Code momentan nicht vorgesehen.
Verbesserungsmöglichkeiten
Der Code könnte flexibler gestaltet werden, beispielsweise indem die Anzahl innerer Schleifendurchläufe variabel gemacht wird und etwa durch ein anderes Telegramm programmiert werden kann. Damit könnte vom Computer her das Flimmern reduziert werden, wenn nur wenige Helligkeitsstufen benötigt werden.
Eine Quittierung für den Empfang eines Telegramms wäre nützlich, um dem angeschlossenen Computer mitzuteilen, dass er jetzt aufhören kann, sein letztes Telegramm zu wiederholen.
Ausserdem wäre es nett, wenn ein Schalter am Eingang eine Wirkung entfalten würde, etwa Ein- und Ausschalten der LED, oder das Starten eines besonderen Leuchtprogramms der LED.
Natürlich kann mit allen Stellgrössen experimentier werden:
- Taktfrequenz des Prozessors. Aktuell 16 MHz. Je schneller, desto weniger Flimmern. 16 MHz ist für den Picaxe 08M2 das Maximum.
- Anzahl innerer Zyklen für eine Arbeitszyklus. Aktuell 7. Je weniger Zyklen, desto weniger Flimmern. Je mehr innere Zyklen, desto mehr Helligkeitsstufen stehen zur Verfügung.
- Wartezeit auf Telegrammbeginn. Aktuell 3ms. Je länger diese Zeit, desto zuverlässiger werden Telegramme erkannt, aber desto stärker ist das Flimmern.
Listing
Ich will hier nicht das ganze Programm auflisten. Sie können es bei Interesse bei mir nachfragen.