
Da im Gehäuse des PicoCalc viel Platz ist, eignet er sich hervorragend dazu um etwas in ihn einzubauen. Da ich schon seit Jahren mit aufwendigen LED Animationen für RGB LED Streifen und Panels experimentiere, habe ich zufällig noch ein paar Adafruit NeoPixel Stick 8x 5050 RGB LED herum liegen. An so einen habe ich an einer Seite ein paar Drähte angelötet und die abisolierten und verzinnten Enden in den PicoCalc in seinen Expansion Port gesteckt. Flugs ein kleines Programm geschrieben und schon konnte ich mit MMBasic den Stick steuern!
Adafruit NeoPixel Stick 8x 5050 RGB LED gibts für 7,95 Euro bei Reichelt.
oder so ähnliche für nur 2,60 Euro
NeoPixel Stick mit 8 WS2812 5050 RGB LEDs bei BerryBase.
Nach dem ersten Experiment war schnell klar, dass ich den Stick unbedingt in das Gehäuse des PicoCalc kleben und über ein paar Kabel direkt an den Raspberry Pi Pico löte. Das ist eine nahezu natürliche Ergänzung für den PicoCalc, sieht super aus und mit MMBasic lässt er sich wunderbar programmieren.
Man könnte denken der PicoCalc ist schon so geliefert worden. Und die Steckkontakte des Expansion Port bleiben frei für andere Zwecke, zum Beispiel um eine LED ein- und auszuschalten. Das funktioniert prima, da die RGB LEDs ein ganz spezielles Protokoll und eine genau definierte Frequenz von 800 kHz benötigen, um korrekt angesteuert zu werden. Wenn man also nicht gerade am GP28 noch einen RGB LED Streifen oder ein Panel ansteuern möchte ist alles fein.
Voraussetzungen für diese Modifikation ist allerdings die Fähigkeit löten zu können oder es wenigstens zu lernen versuchen.
Übersicht:
Hier seht ihr wie ich mit doppelseitigem Klebeband, welches ich noch einmal aufeinander gefaltet habe, den Stick am unteren Rand in das Gehäuse geklebt habe und welche Kabel wo angelötet werden:
Und hier die Stelle am Raspberry Pi Pico, an dem die anderen Kabelenden angelötet werden:
Kabelfarbe | Raspberry Pi Pico | RGB LED Stick |
Rot | 3V3 | 5VDC |
Grün | GB28 | DIN |
Blau | GND | GND |
Um den Stick zu programmieren müsst Ihr in MMBasic einen Array deklarien der so groß ist wie der Stick oder eine RGB LED Kette groß bzw. lang ist:
Dim INTEGER b%(LEDCOUNT – 1)
Eine einzelne Zelle des Arrays könnt Ihr dann mit Farbwerten beschreiben:
b%(i) = (red% * &H10000) + (green% * &H100) + blue%
Und mit:
Device WS2812 W, GP28, LEDCOUNT, b%()
auf den Strip ausgeben.
Noch ein paar Hinweise
Es gibt LED Strips mit einer zusätzlichen weißen LED zu den 3 Grundfarben und ohne. Je nachdem müsst Ihr für den Buchstaben W einen anderen anderen nehmen. Bei mir ist es ein Strip mit weißer LED.
O = original WS2812
B = WS2812B
S = SK6812
W = SK6812W (RGBW)
Jede einzelne RGB LED des Strips hat einen eigenen winzigen Controller, der die gesetzte Farbe kennt und auch hält, wenn Ihr das MMBasic Programm beendet. Dazu müsst Ihr im Code ein einziges Kommentarzeichen setzen.
Ihr braucht keinen PicoCalc für die tollen Effekte! Ein Raspberry Pi Pico, ein RGB Strip und ein einzelner Taster reichen. Wenn Ihr den Taster abfragt und bei jedem Tastendruck eine Animation weiter schaltet, könnt Ihr völlig ohne PicoCalc eine coole Effektlampe haben.
Programmiert Euch Eure eigene Taschenlampe!
Viel Spaß! Und erwähnt mich, wenn Ihr Eure Projekte zeigt!
Hier ist mein Programm mit den ganzen Effekten:
' Light Show mit Menue und Effekten ' fuer PicoMite BASIC Const LEDCOUNT = 8 ' Array fuer WS2812 RGB-Werte Dim INTEGER b%(LEDCOUNT - 1) ' Globale Arrays fr OceanEffect Dim INTEGER wave%(LEDCOUNT - 1) Dim INTEGER dirOcean%(LEDCOUNT - 1) Dim INTEGER temp%(LEDCOUNT - 1) Dim INTEGER i%, position%, direction% Dim INTEGER red%, mode%, speed% Dim STRING k$ ' Initialisierung direction% = 1 position% = 0 speed% = 100 mode% = 0 ' Array initialisieren For i% = 0 To LEDCOUNT - 1 b%(i%) = 0 Next i% ' LEDs auf einen einheitlichen ' Farbwert setzen Sub SetAllLEDs(red%, green%, blue%) Local INTEGER i For i = 0 To LEDCOUNT - 1 b%(i) = (red% * &H10000) + (green% * &H100) + blue% Next i Device WS2812 W, GP28, LEDCOUNT, b%() End Sub ' Larson Scanner Animation Sub LarsonScanner Local INTEGER i Do For i = 0 To LEDCOUNT - 1 red% = (b%(i) >> 16) And &HFF red% = red% * 0.4 b%(i) = (red% * &H10000) Next i b%(position%) = (255 * &H10000) Device WS2812 W, GP28, LEDCOUNT, b%() position% = position% + direction% If position% = LEDCOUNT Then position% = LEDCOUNT - 2 direction% = -1 End IF If position% < 0 Then position% = 1 direction% = 1 End IF Pause speed% Loop Until Inkey$ <> "" End Sub ' Statisches Licht mit Dimmen ' per Cursortasten Sub StaticLight(baseR%, baseG%, baseB%) Local INTEGER brightness%, r%, g%, b% Local STRING k$ brightness% = 255 Do r% = (baseR% * brightness%) / 255 g% = (baseG% * brightness%) / 255 b% = (baseB% * brightness%) / 255 SetAllLEDs r%, g%, b% k$ = Inkey$ Select Case k$ Case Chr$(130) brightness% = Min(brightness% + 15, 255) Case Chr$(131) brightness% = Max(brightness% - 15, 0) Case Else If k$ <> "" Then Exit Do End Select Pause 100 Loop End Sub ' Zufaellige Vollfarben (0 oder 255 ' pro Kanal) fuer jede LED Sub RandomColors Local INTEGER i, red, green, blue Local STRING k$ Do For i = 0 To LEDCOUNT - 1 red = 255 * (Rnd > 0.5) green = 255 * (Rnd > 0.5) blue = 255 * (Rnd > 0.5) b%(i) = (red * &H10000) + (green * &H100) + blue Next i Device WS2812 W, GP28, LEDCOUNT, b%() Pause 300 k$ = Inkey$ If k$ <> "" Then Exit Do Loop End Sub ' Binaerzaehler 0255 auf 8 LEDs in Gruen ' (Wert 127), Bit 0 an LED7, wiederhol. Sub BinaryCount Local INTEGER value% Local INTEGER bit% Local INTEGERmask Local INTEGERledIndex% Local STRING k$ Do For value% = 0 To 255 For bit% = 0 To LEDCOUNT - 1 mask = (value% >> bit%) And 1 ledIndex% = (LEDCOUNT - 1) - bit% If mask = 1 Then b%(ledIndex%) = (0 * &H10000) + (31 * &H100) + 0 Else b%(ledIndex%) = 0 EndIf Next bit% Device WS2812 W, GP28, LEDCOUNT, b%() Pause speed% k$ = Inkey$ If k$ <> "" Then Exit Sub Next value% Loop End Sub ' Blauer Wellenefekt SUB OceanEffect LOCAL INTEGER i% LOCAL INTEGER offset% LOCAL INTEGER direction% LOCAL INTEGER brightness% LOCAL SINGLE waveVal offset% = 0 direction% = 1 DO FOR i% = 0 TO LEDCOUNT - 1 ' Sanfter Sinusverlauf – in Grad, ' konvertiert zu Radiant waveVal = SIN(RAD(((i% - (LEDCOUNT \ 2)) + offset%) * 30)) * 15 + 16 brightness% = INT(waveVal) IF brightness% < 0 THEN brightness% = 0 IF brightness% > 31 THEN brightness% = 31 ' Blauton entsprechend setzen b%(i%) = (0 * &H10000) + (0 * &H100) + (brightness% * 8) NEXT i% ' LEDs senden DEVICE WS2812 W, GP28, LEDCOUNT, b%() PAUSE speed% ' Welle bewegen offset% = offset% + direction% IF offset% MOD 8 = 0 THEN direction% = -direction% IF INKEY$ <> "" THEN EXIT SUB LOOP END SUB ' Unheimliche Begegnung mit der dritten Art (Kommunikationsversuch) Sub CommunicationEffect Local INTEGER brightness%, brightnessStep%, i% Local INTEGER r%, g%, bValue%, mixColor% Local INTEGER ledIndexPair%, freq% Local STRING k$ brightnessStep% = 32 Do ' Zufälliges LED-Paar: 0, 2, 4 oder 6 ledIndexPair% = 2 * INT(RND * (LEDCOUNT \ 2)) If ledIndexPair% > LEDCOUNT - 2 Then ledIndexPair% = LEDCOUNT - 2 ' Zufällige kräftige Farbe (mind. ein Kanal ≠ 0) Do r% = 255 * (Rnd > 0.5) g% = 255 * (Rnd > 0.5) bValue% = 255 * (Rnd > 0.5) Loop Until r% + g% + bValue% > 0 ' >>>>> Farbwert zu Tonfrequenz <<<<< freq% = 200 + ((r% + g% + bValue%) / 3) 'Play Tone freq%, freq% ' Aufdimmen For brightness% = 0 To 255 Step brightnessStep% For i% = 0 To LEDCOUNT - 1 b%(i%) = 0 Next i% mixColor% = ((r% * brightness%) / 255) * &H10000 mixColor% = mixColor% + ((g% * brightness%) / 255) * &H100 mixColor% = mixColor% + (bValue% * brightness%) / 255 b%(ledIndexPair%) = mixColor% b%(ledIndexPair% + 1) = mixColor% Device WS2812 W, GP28, LEDCOUNT, b%() Pause speed% If Inkey$ <> "" Then Exit Sub Next brightness% ' Abdimmen For brightness% = 255 To 0 Step -brightnessStep% For i% = 0 To LEDCOUNT - 1 b%(i%) = 0 Next i% mixColor% = ((r% * brightness%) / 255) * &H10000 mixColor% = mixColor% + ((g% * brightness%) / 255) * &H100 mixColor% = mixColor% + (bValue% * brightness%) / 255 b%(ledIndexPair%) = mixColor% b%(ledIndexPair% + 1) = mixColor% Device WS2812 W, GP28, LEDCOUNT, b%() Pause speed% If Inkey$ <> "" Then Exit Sub Next brightness% Loop End Sub ' Hauptmenue und Ablaufsteuerung Do CLS Print "Light Show" Print "----------" Print "Aktuelle Geschwindigkeit: "; speed%; " ms" Print Print "1. Geschwindigkeit aendern" Print "2. Weisses Licht" Print "3. Gelbes Licht" Print "4. Zufallsfarben" Print "5. Larson Scanner (Rot)" Print "6. Binaerzaehler (Gruen)" Print "7. Meeresrauschen (Blau)" Print "8. Kommunikationseffekt" Print "9. Alles Aus" Print "0. Beenden" Print Print "Waehle mit Taste 1-9..." Do k$ = Inkey$ Loop Until k$ <> "" Select Case k$ Case "1" Print "Neue Geschwindigkeit (ms, z.B. 10-1000):" Input speed% If speed% < 10 Then speed% = 10 End IF If speed% > 1000 Then speed% = 1000 End IF Print "Geschwindigkeit auf "; speed%; " ms gesetzt." Pause 1000 Case "2" Do While Inkey$ <> "": Loop StaticLight 255, 255, 255 Case "3" Do While Inkey$ <> "": Loop StaticLight 255, 127, 0 Case "4" Do While Inkey$ <> "": Loop RandomColors Case "5" Do While Inkey$ <> "": Loop LarsonScanner Case "6" Do While Inkey$ <> "": Loop BinaryCount Case "7" Do While Inkey$ <> "": Loop OceanEffect Case "8" Do While Inkey$ <> "": Loop CommunicationEffect Case "9" SetAllLEDs 0, 0, 0 Case "0" Print "Beende Programm..." SetAllLEDs 0, 0, 0 Exit Do Case Else Print "Ungueltige Eingabe!" Pause 1000 End Select Loop