In diesem Beitrag möchte ich speziell auf die 5×5 LED Matrix des RP2040:bit eingehen und dir aufzeigen wie diese programmiert wird. Den Mikrocontroller RP2040:bit habe ich dir bereits im Beitrag Vorstellung RP2040:bit Board vorgestellt, hier möchte ich jedoch etwas tiefer eintauchen.
Ein herzliches Dankeschön geht an meinen aufmerksamen Leser Felix F., der die Inspiration für diesen Beitrag zum RP2040:bit und der 5×5 LED Matrix geliefert hat! Eure Ideen und Anregungen sind mir immer willkommen.
Inhaltsverzeichnis
- Aufbau der 5×5 LED Matrix des RP2040:bit
- Programmieren des RP2040:bit
- kleine Animationen erstellen
- Probleme mit der 5×5 LED Matrix am RP2040:bit und eine Lösung
- Download
- Fazit
Aufbau der 5×5 LED Matrix des RP2040:bit
Schauen wir uns zunächst die LED Matrix genauer an. Es sind 5 LEDs pro Reihe und 5 pro Spalte, das ergibt eine Kombination aus 25 LEDs welche gesteuert werden können.
Die Schaltung hierfür ist folgendermaßen:
Diese Schaltung benötigen wir, um zu verstehen, wie die LED-Matrix funktioniert. Du musst quasi immer zwei Pins am Mikrocontroller manipulieren, damit eine LED aufleuchtet.
Um exemplarisch die LED5 (unten links in der Schaltung) zum Leuchten zu bringen, aktiviere Pin GP2 und deaktiviere Pin GP22. Das Problem dabei ist, dass die gesamte Zeile bereits aktiv ist. Wenn du eine LED in einer anderen Spalte aktivieren möchtest, wird auch die in derselben Zeile aktiviert. Doch dafür habe ich eine Lösung für dich.
Programmieren des RP2040:bit
Der Mikrocontroller RP2040:bit kann in unterschiedlichen Sprachen programmiert werden. Das macht der verbaute Chip RP2040 welcher vom Raspberry Pi Pico kommt möglich. Dir stehen somit sehr viele Möglichkeiten offen. Nachfolgend möchte ich dir zeigen, wie du diese Matrix in Micropython programmierst.
Die einzelnen LEDs kannst du in einem speziellen Muster ansprechen. Dabei nutzen wir in der Programmierung ein Array.
Was ist ein Array?
Zunächst möchte ich dir erläutern, was ein Array ist und wie du dieses behandeln / programmieren kannst. Ein Array ist eine Liste mit Werten. Dabei ist der erste Wert an der Position 0, du zählst also von 0 bis zum Ende. Die Werte in einem Array können bei Micropython beliebig sein, dieses ist nicht in allen Programmiersprachen so gelöst!
def main(): array = [0,1,2,3,4] for wert in array: print(wert) main()
Durch ein Array kannst du recht einfach mit einer ForEach-Schleife durchlaufen:
Zugriff auf ein Wert im Array
Du kannst auch einzelne Werte im Array manipulieren, dazu kannst du auf Werte zugreifen und diese beliebig ändern.
Den Zugriff auf die Werte erhältst du mit der eckigen Klammer hinter dem Namen des Arrays.
arrayName[index] = neuer Wert
Nachfolgend ein kleines Beispiel, in welchem ich den Wert an der zweiten Stelle im Array von 1 auf meinen Namen geändert habe.
def main(): array = [0,1,2,3,4] array[1] = "Stefan" for wert in array: print(wert) main()
Du siehst in dem Reiter Kommandozeile nun das der Wert im Array von 1 auf “Stefan” geändert wurde.
Funktion zum Ansteuern von XY Koordinaten in der LED Maxtrix am RP2040:bit
Ich habe dir soeben erläutert, wie man mit Arrays umgeht und jetzt möchte ich dir zeigen, wie du mit diesem neuen Wissen eine LED an der XY Koordinate ansprechen kannst.
Wir benutzen hierzu ein Array mit 10 Werten. Die ersten 5 Stellen im Array sind die Spalten und die letzten 5 die Zeilen.
ledZeile = [1,0,0,0,0,1,1,0,1,1]
In diesem Fall habe ich die Zeile 3 ausgewählt (erkennbar an der 0) und die erste LED in der Zeile (erkennbar an der 1).
Das Ergebnis ist:
Jetzt können wir dieses in eine Funktion schreiben, damit wir über einen lesbaren Parameter auf die LEDs zugreifen können.
from machine import Pin from time import sleep led_Col=[2,3,4,5,25,7,8,9,21,22]; for ledPin in led_Col: Pin(ledPin, Pin.OUT) ledMatrix = [0,0,0,0,0,1,1,1,1,1] def setLED(zeile, spalte, status): #Da ein Array mit dem Index 0 beginnt, #ziehen wir von dem Wert Spalte einen ab. ledMatrix[spalte-1] = status #Der Index für die Zeilen beginnt nach den ersten #5 Stellen, zu diesem addieren wir den Index der #gewünschten Zeile. ledMatrix[4 + zeile] = 0 if status == 1 else 0 #Um eine Zeile zu aktivieren muss statt eine 1 #eine 0 geschrieben werden. #Funktion zum schreiben der Daten auf die LED Matrix. def updateLEDMatrix(): #Zugriff auf die Variable ledMatrix welche außerhalb #der Funktion liegt. global ledMatrix #Zum Schluss muss nun das Array mit den geänderten #Daten geschrieben werden. #erstellen eines Zählers für den Index im Array mit den #Pins der LEDs. ledPin = 0 #Starten der ForEach Schleife... for status in ledMatrix: #Wenn der Status 0 / also der Wert an der Arrayposition #gleich 0 ist, dann soll der Pin deaktiviert werden. if status == 0: Pin(led_Col[ledPin], Pin.OUT).low() else: #Wenn der Status 1 ist, dann soll der Pin aktiviert werden. Pin(led_Col[ledPin], Pin.OUT).high() #erhöhen des Zählers ledPin = ledPin + 1 #Zurücksetzen der LED Matrix def resetLEDMatrix(): #Zugriff auf die Variable ledMatrix welche #außerhalb der Funktion liegt. global ledMatrix #überschreiben der Matrix mit dem Standard (alles AUS) ledMatrix = [0,0,0,0,0,1,1,1,1,1] #aufrufen der Funktion zum schreiben der Daten updateLEDMatrix() #Aufrufen der Funktion setLED #erster Parameter ist die Zeile, #zweiter Parameter ist die Spalte, #dritter Parameter ist der Status der LED (1 == EIN, 0 == AUS) setLED(5, 5, 1) #Schreiben der Daten auf die Matrix updateLEDMatrix() #eine kleine Pause von 1 Sekunde sleep(1) #zurücksetzen der Matrix resetLEDMatrix() #Neue LED aktivieren setLED(4, 5, 1) #Schreiben der Daten auf die Matrix updateLEDMatrix() sleep(1) resetLEDMatrix()
Wenn wir jetzt dieses kleine Programm ausführen, dann wird unten rechts (Zeile = 5 & Spalte = 5) die LED aufleuchten und danach die LED darüber (Zeile = 4 & Spalte = 5)
Alle Punkte in der LED-Matrix aufleuchten lassen
Mit einer einfachen Schleife können wir jetzt auch alle LEDs in der Matrix aufleuchten lassen.
Der Code manipuliert das Array in einer Schleife so, dass jede LED einmal kurz aufleuchtet, wenn dieses abgeschlossen ist, werden die LEDs Zeilenweise und Spaltenweise aktiviert.
while True: pause = 0.2 #jede LED einmal aufleuchten lassen for zeile in range (1,6): for spalte in range (1,6): setLED(zeile, spalte, 1) updateLEDMatrix() sleep(pause) resetLEDMatrix() #alle Zeilen aufleuchten lassen for zeile in range (1,6): for spalte in range (1,6): setLED(zeile, spalte, 1) updateLEDMatrix() sleep(pause) resetLEDMatrix() #alle Spalten aufleuchten lassen for spalte in range (1,6): for zeile in range (1,6): setLED(zeile, spalte, 1) updateLEDMatrix() sleep(pause) resetLEDMatrix()
kleine Animationen erstellen
Mit dem Code kannst du auch kleine Animationen auf der Matrix erstellen.
In diesem Fall habe ich drei Frames erstellt, wo jeweils ein paar der LEDs aufleuchten.
while True: setLED(1, 1, 1) setLED(5, 5, 1) updateLEDMatrix() sleep(0.25) resetLEDMatrix() setLED(2, 2, 1) setLED(4, 4, 1) updateLEDMatrix() sleep(0.25) resetLEDMatrix() setLED(3, 3, 1) updateLEDMatrix() sleep(0.25) resetLEDMatrix() setLED(2, 2, 1) setLED(4, 4, 1) updateLEDMatrix() sleep(0.25) resetLEDMatrix()
Probleme mit der 5×5 LED Matrix am RP2040:bit und eine Lösung
Wenn du spezielle Muster wie ein Smiley oder ein einfaches X zeichnen möchtest, dann wird es am RP2040:bit etwas komplizierter, aber auch hierfür gibt es eine sehr einfache Lösung.
Es ist theoretisch ausgeschlossen, dass zwei LEDs gleichzeitig leuchten, es sei denn, sie befinden sich an verschiedenen Koordinaten. Dennoch können wir mehrere LEDs gleichzeitig aktivieren, indem wir die Trägheit des menschlichen Auges nutzen. Die LEDs leuchten einfach sehr schnell nacheinander auf, sodass es für uns so aussieht, als ob alle entsprechenden LEDs gleichzeitig leuchten würden. Dabei wird das Programm jedoch extrem schnell ausgeführt.
Beispiele
Hier nun ein paar Beispiele:
#ein X while True: setLED(1, 1, 1) setLED(5, 5, 1) updateLEDMatrix() sleep(0.001) resetLEDMatrix() setLED(2, 2, 1) setLED(4, 4, 1) updateLEDMatrix() sleep(0.001) resetLEDMatrix() setLED(3, 3, 1) updateLEDMatrix() sleep(0.001) resetLEDMatrix() setLED(2, 2, 1) setLED(4, 4, 1) updateLEDMatrix() sleep(0.001) resetLEDMatrix()
#ein lachender Smiley while True: setLED(2, 2, 1) updateLEDMatrix() sleep(0.01) resetLEDMatrix() setLED(2, 4, 1) updateLEDMatrix() sleep(0.001) resetLEDMatrix() setLED(4, 1, 1) updateLEDMatrix() sleep(0.001) resetLEDMatrix() setLED(5, 2, 1) updateLEDMatrix() sleep(0.001) resetLEDMatrix() setLED(5, 3, 1) updateLEDMatrix() sleep(0.001) resetLEDMatrix() setLED(5, 4, 1) updateLEDMatrix() sleep(0.001) resetLEDMatrix() setLED(4, 5, 1) updateLEDMatrix() sleep(0.001) resetLEDMatrix()
Download
Hier die Programme zum download.
Fazit
Der RP2040:bit ist ein cooler Mikrocontroller. Jedoch gibt es derzeit noch keine richtige Dokumentation zu diesem, ich hoffe hiermit konnte hier die Lücke etwas schließen, indem ich aufgezeigt habe, wie die LED Matrix in Micropython programmiert wird.
Solltest du Fragen haben oder Probleme mit anderen Mikrocontrollern so kannst du mir gerne eine Mail an info@draeger-it.blog senden.
Hallo Herr Dräger,
ich beschäftige mich schon seit längerer Zeit mit dem MicroBit und habe mir spaßeshalber mal den RP2040 aus China für ca. 5 € bestellt. Allerdings funktioniert es nur begrenzt mit den bisherigen Editoren für den MicroBit. Das Display habe ich jetzt mal mit Hilfe Ihrer Anleitung angesteuert. Man kann tatsächlich die LEDs spaltenweise auf einen Schlag ansteuern, indem man den Spaltenpin z.B. Pin 2 auf 1 setzt und dann gleichezeitig die Pin 7,8,9,21,22 auf 1 (aus) bzw. 0 (an). Ich habe das mal mit MicroBlocks fun probiert und da muss man die Pausenzeit des angeschalteten Pins 2,3,4,5,25 auf jeweils 3-5 Millisekunden einstellen, dann ergibt es ein flackerfreies Bild.
Merkwürdigerweise funktioniert bei meinem Chip aber die letzte Spalte mit Pin25 nicht, man muss da in MicroBlocks fun die Funktion “setze Nutzer LED” einsetzen (warum, ich weiß es nicht)
Gruß Roland Hirsch