NodeMCU Neopixel

Motivation

Phail hat eine Lampe gebaut (s. anderes Projekt). Hierfür fehlte zunächst etwas, mit dem man Text anzeigen kann. Mit einem einfachen Lua-Script und der WS2812 Bibliothek der NodeMCU sollte so etwas leicht herstellbar sein.

Showtime

Planung

Die Lampe besteht aus einer Kette Neopixel. Diese sind aufgeteilt in einzelne Ringe à 16 Stück. Die Tücke für dies Vorhaben liegt im Versatz der LEDs. Die aktuelle Lampenmatrix ist also wie folgt aufgebaut (von oben nach unten gibt es insgesamt 20 Ringe - es würde aber auch mit z.Bsp. 10 Ringen funktionieren):

Ring Indizes in Neopixelkette …
20 305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320
10 145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,
09 _129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,
08 113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,
07 __097,098,099,100,101,102,103,104,105,106,107,108,109,110,111,112,
06 081,082,083,084,085,086,087,088,089,090,091,092,093,094,095,096,
05 __065,066,067,068,069,070,071,072,073,074,075,076,077,078,079,080,
04 049,050,051,052,053,054,055,056,057,058,059,060,061,062,063,064,
03 __033,034,035,036,037,038,039,040,041,042,043,044,045,046,047,048,
02 017,018,019,020,021,022,023,024,025,026,027,028,029,030,031,032,
01 __001,002,003,004,005,006,007,008,009,010,011,012,013,014,015,016,

Für den Lampenversatz von Ring zu Ring braucht es einen speziellen Font (ein Test mit ‘Schrägstellen’ eines herkömmlichen Fonts ergab gruselige Resultate …).

Font-Design

In der Font-Erstellung liegt die Hauptarbeit in diesem Projekt. Dazu habe ich ganz traditionell eine Leermatrix mit LibreOffice Draw gemalt und als Vorlage für die ersten 127 Zeichen benutzt (ebenfalls im Draw nach Gefühl ‘gemalt’).

Font Vorlage

Fontbeispiel 1
Fontbeispiel 2

Anschließend werden die Pixel einzeln ausgezählt, zunächst binär, dann hex. Für den hier vorgesehenen 7x9 Font werden je Zeichen 9 Bytes mit 7 Bits verwendet (Bits 7-1, Bit0 wird nicht verwendet).

Die Hex-Werte werden in einer Beschreibungsdatei gesammelt (eigentlich ein ‘misbrauchtes’ C-Sourcefile aus einem anderen Projekt). Mittels eines kleinen (Lua-)Scripts wird daraus ein Binärfile (’np_codes.bin’) auf dem PC erzeugt und zur NodeMCU hochgeladen. Die Datei dient dann als ‘Character-ROM’ (wie schon zu C64er Zeiten …).

Font-Anzeige

Um ein leidlich sanftes Durchschieben des Textes zu erreichen, wird mit einem vergrößerten Puffer gearbeitet. Dies ermöglicht das verdeckte Laden und Einblenden eines neuen Zeichens. Durch zyklisches Schieben wird jetzt das neue Zeichen (und alle anderen Zeichen) langsam (Spalte für Spalte) in den sichtbaren Bereich geschoben.

Ring Indizes in (‘double buffer’) Neopixelkette …
20 571,572,573,574,575,576,577, 578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593, 594,595,596,597,598,599,600
10 271,272,273,274,275,276,277, 278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293, 294,295,296,297,298,299,300,
9 241,242,243,244,245,246,247, 248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263, 264,265,266,267,268,269,270,
8 211,212,213,214,215,216,217, 218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233, 234,235,236,237,238,239,240,
7 181,182,183,184,185,186,187, 188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203, 204,205,206,207,208,209,210,
6 151,152,153,154,155,156,157, 158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173, 174,175,176,177,178,179,180,
5 121,122,123,124,125,126,127, 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, 144,145,146,147,148,149,150,
4 091,092,093,094,095,096,097, 098,099,100,101,102,103,104,105,106,107,108,109,110,111,112,113, 114,115,116,117,118,119,120,
3 061,062,063,064,065,066,067, 068,069,070,071,072,073,074,075,076,077,078,079,080,081,082,083, 084,085,086,087,088,089,090,
2 031,032,033,034,035,036,037, 038,039,040,041,042,043,044,045,046,047,048,049,050,051,052,053, 054,055,056,057,058,059,060,
1 001,002,003,004,005,006,007, 008,009,010,011,012,013,014,015,016,017,018,019,020,021,022,023, 024,025,026,027,028,029,030,

Die Zeichen werden jetzt ganz rechts geladen (Indizes Quadrat 24-30 bis 264-270 für die Ringe 1-9). Ring 10 wird für eine doppelt so schnell umlaufende ‘Spur’ genutzt. Ring 11-19 wird analog mit einer zweiten Textmeldung geladen, in Ring 20 gibt es dann noch eine ‘Spur’.

Das Schieben geschieht dann nach links, jeweils um eine Spalte (also zu Indizes 23,53,83 etc. bis 593).

Hier noch ein Demo-Filmchen …

Erweiterungen

Sofern die NodeMCU Firmware mit Multicast-Erweiterungen genutzt wird, kann der NodeMCU-Client auf einfache Weise mit anzuzeigenden Texten versorgt werden. Hier wird z.Bsp. ein Lua-Script auf einem (PC-)Server ausgeführt, das (z.Bsp.) einen Heise RSS-Feed mitliest und die jeweils zwei aktuellsten Meldungen an alle Multicast-Clients sendet. Im vorliegenden Beispiel erscheinen sie also oben (Ring 11-19) bzw. unten (Ring 1-9).

Master