Heiniger-Net

Projekt Lavalampe, Teil 2 — Firmware

In Teil 1 habe ich die Hard­ware meines Pro­jek­tes ein­er fern­s­teuer­baren Lavalampe beschrieben. In diesem zweit­en Teil will ich etwas auf die notwendi­ge Firmware einge­hen, also das Pro­gramm, das notwendig ist, um dem Picaxe Micro­con­troller die gewün­schte Funk­tion­al­ität beizubringen.

Es gibt dabei zwei The­menkreise im Auge zu behalten:

  1. Von der seriellen Schnittstelle müssen die Soll­grössen gele­sen wer­den, also die gewün­scht­en Farbin­ten­sitäten der drei Grund­far­ben Grün, Rot und Blau.
  2. Diese Soll­grössen müssen in Licht des gewün­scht­en Farbtons und der gewüscht­en Inten­sität umge­set­zt wer­den. Sprich, die LEDs müssen zum Leucht­en gebracht werden.

Ein paar Worte zum Picaxe

Der Picaxe hat einen vorge­fer­tigten Befehlssatz, der BASIC nachemp­fun­den ist und der ziem­lich mächtig ist. Beispiel­sweise lässt sich mit nur einem Befehl eine ganze Rei­he von Input-Dat­en ein­le­sen und Spe­icher­plätzen zuweisen. Allerd­ings ist die Tak­t­geschwindigkeit des Mikro­prozes­sors nicht sehr hoch, die Arbeits­geschwindigkeit beschränkt. Das ist auch ver­ständlich, bei grösseren Arbeits­geschwindigkeit­en wür­den sich höhere Ver­lustleis­tun­gen ergeben und dann müsste er gekühlt wer­den, was den Aufwand für ein Gerät mit diesen Prozes­soren erhe­blich in die Höhe treiben würde.

Es gibt den Picaxe in ver­schiede­nen Aus­führun­gen, die sich in Bau­form, Gehäuseg­rössen, und Son­der­ausstat­tung wie etwa der Anzahl D/A‑Wandler oder Puls­bre­it­en­mod­u­la­toren unter­schei­den. Das kle­in­ste Mod­ell mit 8 Dual-Inline-Anschlüssen hat fol­gende Pinbelegung:

Hier find­est Du das Daten­blatt zum PICAXE

Für den Picaxe ste­ht eine Inte­gri­erte Entwick­lung­sumge­bung namens “Picaxe Edi­tor 6″ zur Ver­fü­gung, mit der Pro­gramme entwick­elt, simuliert und auf den Picaxe über­tra­gen wer­den kön­nen. Eben­falls ste­hen kostengün­stige Pro­to­typen­boards zur Ver­fü­gung. Ich habe mir dieses Board hier beschafft für meine ersten Gehversuche.

Funktionsprinzip der Firmware

Die Leucht­stärke von LEDs wird nicht daduch ges­teuert, dass die Speis­es­pan­nung vari­iert wird (das kön­nte ein analoger Aus­gang leis­ten), son­dern man arbeit­et mit Puls­bre­it­en­mod­u­la­tion, englisch Pulse Width Mod­u­la­tion, PWM, genan­nt. Der von mir ver­wen­dete Picaxe-08M2 ver­fügt über einen PWM-Aus­gang, wie man im obi­gen Bild sieht. Der reicht aber lei­der nur für eine der drei Grund­far­ben, nicht für alle drei. Erst mit den deut­lich grösseren Mod­ellen 14M2 oder 20M2 hätte ich drei oder sog­ar vier PWM-Aus­gänge zur Ver­fü­gung. Ich muss daher die Puls­bre­it­en­mod­u­la­tion “von Hand” pro­gram­mieren, was lei­der nur mit beschränker Geschwindigkeit klappt, was wiederum dazu führt, dass meine LED-Steuerung flim­mert. Das ist schade, aber mit dem beschränk­ten Platz nicht zu ver­mei­den. Für einen grösseren Picaxe-Baustein würde der Platz im Sock­el der Lavalampe nicht aus­re­ichen, dann müsste ein grösseres Lam­p­enge­häuse her.

Um die zur Ver­fü­gung ste­hende Rechen­leis­tung opti­mal auszunutzen, habe ich meine Firmware wie fol­gt aufgebaut:

Eine grosse Schleife wieder­holt sich end­los. Inner­halb dieser Schleife passiert folgendes:

  1. Alle drei LEDs wer­den zunächst eingeschal­tet, falls die Anzahl Arbeit­szyklen über­haupt gröss­er als Null ist.
  2. In ein­er inneren Scheife, die immer gle­ich häu­fig durch­laufen wird,
  3. …wird jede Farbe, deren Leuchtzyklen abge­laufen ist, ausgeschaltet.
  4. …ausser­dem wird jet­zt 3 Mil­lisekun­den lang auf den Beginn eines Input-Telegramms gewartet. Falls ein “C” erkan­nt wird, dann wird ein Unter­pro­gramm ange­sprun­gen, das den Rest des Telegramms ein­li­est und verarbeitet.
  5. Nach Ablauf der inneren Schleifen­zyklen kehren wir zur äusseren Schleife zurück und der Vor­gang begin­nt von vorne.

 

Ein Durch­lauf durch die äussere Schleife bes­timmt das Flim­mern der LEDs. Je kürz­er ein Durch­gang, desto geringer das Flimmern.

Ein Durch­gang durch die innere Schleife wird bes­timmt durch die Wartezeit auf den seriellen Input, die regelmäs­sig durch­laufen wer­den muss, damit der Picaxe Änderun­gen der Wun­sch­farbe und ‑Hel­ligkeit, die vom angeschlosse­nen PC mit­geteilt wird, mit­bekommt. Je länger diese Wartezeit ist, desto zuver­läs­siger wer­den ank­om­mende serielle Zeichen erkan­nt. Ich habe mich hier auf 3 Mil­lisekun­den fest­gelegt. Wenn in dieser Zeit ein “C” fest­gestellt wird, dann wird kurz aus der Schleife gesprun­gen und drei zusät­zliche Bytes ein­ge­le­sen, als Farb­w­erte für die drei Grund­far­ben. Die Anzahl Durchgänge n durch die innere Schleife bes­timmt die Anzahl der möglichen Hel­ligkeitsstufen von 0 (“dauernd aus”) bis n+1 (“dauernd ein”).

Die Anzahl inner­er Zyklen pro Durch­gang der äusseren Schleife bes­timmt die “Flim­mer­fre­quenz” der LEDs, und zwar umgekehrt pro­por­tion­al. Das heisst, je weniger die LEDs flim­mern sollen, desto weniger häu­fig darf die innere Schleife durch­laufen wer­den, und desto weniger Hel­ligkeit­stufen sind möglich. Je mehr Hel­ligkeit­stufen möglich sein sollen, desto stärk­er wer­den die LEDs flim­mern. Einen für mein Gefühl sin­nvollen Kom­pro­miss meine ich mit 7 inneren Zyklen gefun­den zu haben.

Am seriellen Port wird die gewün­schte Farbe und Leucht­stärke durch ein “Telegramm” aus vier Bytes über­mit­telt. Jedes Telegramm wird mit einem “C” ein­geleit­et und die fol­gen­den drei Bytes sind die Anzahl inner­er Zyklen der Grund­far­ben Rot, Grün und Blau als ASCII-Zif­fer. Ein paar Beispiele:

 

Lei­der ist der serielle Empfänger nicht zuver­läs­sig genug, dass jedes Telegramm sauber emp­fan­gen wird. In der Regel muss der Com­put­er das Telegramm mehrmals senden, bis es durchkommt. Eine Quit­tierung für erfol­gre­ichen Emp­fang des Telegramms ist in meinem Code momen­tan nicht vorgesehen.

Verbesserungsmöglichkeiten

Der Code kön­nte flex­i­bler gestal­tet wer­den, beispiel­sweise indem die Anzahl inner­er Schleifendurch­läufe vari­abel gemacht wird und etwa durch ein anderes Telegramm pro­gram­miert wer­den kann. Damit kön­nte vom Com­put­er her das Flim­mern reduziert wer­den, wenn nur wenige Hel­ligkeitsstufen benötigt werden.

Eine Quit­tierung für den Emp­fang eines Telegramms wäre nüt­zlich, um dem angeschlosse­nen Com­put­er mitzuteilen, dass er jet­zt aufhören kann, sein let­ztes Telegramm zu wiederholen.

Ausser­dem wäre es nett, wenn ein Schal­ter am Ein­gang eine Wirkung ent­fal­ten würde, etwa Ein- und Auss­chal­ten der LED, oder das Starten eines beson­deren Leucht­pro­gramms der LED.

Natür­lich kann mit allen Stell­grössen exper­i­men­tier werden:

 

Listing

Ich will hier nicht das ganze Pro­gramm auflis­ten. Sie kön­nen es bei Inter­esse bei mir nach­fra­gen.

Die mobile Version verlassen