RGB LED Stick für den PicoCalc

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
  • Related Posts

    Clockwork PicoCalc – Der programmierbare Taschenrechner den ich immer wollte

    Um den PicoCalc ausreichend würdigen zu können ist ein Ausflug in die Vergangenheit von Vorteil. Es gab mal eine Zeit in der Computer im normalen Alltag eines Menschen keine Rolle…

    Wie ich eine Kalorienapp nahezu nur mit KI erstellte

    Am Ende dieses Artikels findet Ihr eine Android App zum Download. Diese App habe ich für mich aus persönlichem Interesse entwickelt. Sie visualisiert den Einfluss von sportlich verbrannten oder durch…

    Schreibe einen Kommentar

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

    You Missed

    Die Wunderwelt der Fire Tablets

    • Von Zuseway
    • Juli 10, 2025
    • 14 views

    Inmitten des beliebten Prime Day-Verkaufstrubels bietet Amazon eine breite Palette an Angeboten, die von Kopfhörern und

    Schätze im digitalen Einkaufsdschungel: Die Amazon Prime Day Deals 2025

    • Von Zuseway
    • Juli 10, 2025
    • 15 views
    Schätze im digitalen Einkaufsdschungel: Die Amazon Prime Day Deals 2025

    Prime Time oder Pixeljagd?

    • Von Zuseway
    • Juli 9, 2025
    • 19 views

    Attraktive Laptop-Angebote während Amazons Prime Day

    Im virtuellen Labyrinth der Schnäppchen

    • Von Zuseway
    • Juli 9, 2025
    • 17 views
    Im virtuellen Labyrinth der Schnäppchen