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



