12x12 LED Matrix mit CH32V003
FQua
Die Möglichkeiten
des CH32V003 so richtig ausreizen, das war das Ziel im folgenden Projekt. In Anlehnung an
die bisherigen Beispiele zu Charlieplexing muss es doch möglich sein noch mehr
LEDs anzusteueren. Die MCU CH32V003 hat 20 Anschlüsse (Pins), von denen 2 für
Spannung (VCC 5V oder 3.3V) und Masse (GND) verwendet werden. Weitere 2
Anschlüsse sind reserviert für die Programmierung (SWDIO => Pin PD1) und
Reset (Pin PD7). Demnach könnte man mit den verbleibenden 16 Pins 16x(16-1) =
240 LEDs mittels Charlieplexing steuern. Mit ein wenig Zurückhaltung werden in
diesem Projekt jedoch "nur" 12x12 = 144 LEDs in einer quadratischen
Matrix mit 13 Pins angesteuert ( mit 13 Pins maximal 13x(13-1) = 156 möglich).
Dann sind noch 3 Pins frei für einen Toggle Button zum Umschalten von
Programmen und 2 für analoge Inputs mit z.B. Potis (PA1 und PA2). Dies alles
ist in einer Platine realisiert, die mit EasyEda entworfen wurde, siehe oberes
Bild. Im Schaltungslayout ist jede
Zuleitung mit einem 1k Ohm Widerstand abgesichert. Der Stromfluss geht dann
immer über 2 Widerstände. Der Grund dieser Anordnung ist, dass bei
Fehlprogrammierung von Anschlüssen mit OUTPUT High und OUTPUT Low ein
Kurzschluss vermieden wird.

Das
Platinenlayout ist mit all diesen vielen Verbindungen sehr komplex. Daher wurde
die Anordnung der Spaltenansteuerung für kurze Verbindungswege zur MCU
angepasst in der Reihenfolge PC7, PC6, PC5, PC4, PC3, PC2, PC1, PC0, PD2, PD3,
PD6, PD5, PD4. Damit die Programmierung möglichst einfach ist möchte man gerne
in einem xy-Koordinatensystem arbeiten. Das heisst, es wird ein Pinmapping
erforderlich, welches die Pins den entsprechenden LEDs zuordnet. Für jede LED
ist zudem jeweils ein Paar definiert für OUTPUT High und OUTPUT Low, während
alle anderen Pins auf Input gesetzt sind (und somit hochohmig
"stromlos", also inaktiv sind). Für diese Paarungen wurden zwei 12x12
Matrizen erstellt, in denen die jeweiligen zugehörigen xy-Koordinaten den
Positionen in den Matrizen entsprechen. In diesen Matrizen stehen lediglich die
Indizes der Pinreihenfolge des Boards. So kombiniert wird in der Programmierung
lediglich mit xy-Koordinaten umgegangen, während das gekoppelte Pinmapping den
Rest automatisch anpasst.
Die Programmierung
erfolgt zunächst in der Arduino IDE. Ein erstes Beispiel ist der
"Rundlauf" von Einzel-LEDs (https://youtube.com/shorts/Atq2ClczQT0). Ein weiteres Beispiel für das
(zumindest für das Auge) gleichzeitige leuchten von mehreren LEDs ist das
animierte Herzschlagbeispiel (https://www.youtube.com/shorts/WDBSgnXAdHs), wobei tatsächlich zu jedem Zeitpunkt jeweils nur 1 LED
leuchtet. Dies erfolgt aber in solch schnellem Wechsel, dass das menschliche
Auge das Aufleuchten als gleichzeitig empfindet. Die einzelnen Bildsequenzen
werden aus vordefinierten 12x12 Pixelmatrizen ausgelesen. Natürlich können auch
Zahlen und Buchstaben dargestellt werden, sofern die entsprechenden
Pixelmatrizen vorhanden sind. Dies ist in dem weiteren Beispiel
"Countdown" (https://youtube.com/shorts/fW1NnSXQA_M),zu finden. Dies kann natürlich auch noch zu Lauftext
erweitert werden.

Letztendlich
können auch interaktive Spiele programmiert werden mit Verwendung der 2 Potis
für analogen INPUT und der Toggle Button als eine Art Trigger. Dazu passt das
Beispiel PingPong, dokumentiert mit Video (https://youtube.com/shorts/_hdsiktkmV8) Die 2 Schläger
werden mit den Potis verschoben und mit dem Toggle Button kann die
Geschwindigkeit stufenweise erhöht werden.Eine andere
Möglichkeit ist das legendäre Space Invaders Spiel. Der Spielablauf ist dann
aber nicht mehr so einfach zu programmieren. Oder aber ein Oszilloskop
entwickeln. Die Signaleingabe könnte auf einem der Potis erfolgen, die
Anpassung der Einstellungen mit dem jeweils anderen Poti und dem Toggle Button.
Das ist dann etwas für ein späteres Projekt.
12x12_Muster_mit_Herz_animiert.zip