Document ID: /fineweb-2-swissfilter-quality_10-filterrobots/filtered/03122.jsonl.gz/2435

LED-Man
Einführung
Hardware
Damit ein Spielfeld erstellt werden kann, muss die Matrix eine gewisse Minimalgrösse aufweisen, damit man auch "Mauern" einbauen kann, damit man sich nicht einfach "kreuz und quer" bewegt. Um das Spielfeld zu vergrössern, wird der Rand des Feldes mit einer "automatischen" Mauer versehen, so dass man nicht "durchgehen" kann. Je nach Variante kann man natürlich auch dort "Löcher" vorsehen, durch die man auf die andere Seite des Spielfeldes gelangt. Um die Mauern, Feinde, Bonuspunkte usw. gut unterscheiden zu können, sind farbige LEDs von Vorteil, doch es geht auch mit einfarbigen LEDs, indem man diese je nach Funktion unterschiedlich ansteuert (blinkend / gedimmt / spezielles Blinkmuster). Für die LED-Matrix gibt es verschiedene Grössen und Hersteller. Ich habe mich für ein 8x16-Feld entschieden, da ich dieses besitze, doch bei der Programmierung kann man die Spielfeldgrösse natürlich über Variablen bestimmen und entsprechend strecken oder kürzen, wobei dies bei den Mauern natürlich berücksichtigt werden muss. Eine LED-Matrix wird normalerweise über einen Bus angesteuert, damit man die Anzahl überhaupt handeln kann. Bei mir ist es der I2C-Bus, welcher nur 2 Leitungen braucht, dafür halt nicht sehr schnell ist. Als Ansteuer-Baustein wird der HT16K33 von Holtek verwendet.
HT16K33
Dieser Baustein kann in verschiedneen Modi benutzt werden und könnte Tastaturen verarbeiten oder auch die berühmten 7-Segment-Anzeigen, doch in diesem Fall soll er die Ansteuerung der LED-Matrix übernehmen. Folgende Daten sind dabei wichtig/informativ:
- Betriebsspannung von 5V.
- Anschluss über I2C.
- Reset wenn VDD für min. 20 Milliseunden auf 0V.
- I2C-Adresse lässt sich über die Lötbrücken A0, A1 und A2 auf die Adressen 0x70 bis 0x77 einstellen.
- Die Anschlüsse können bei Bedarf durchgeschlauft werden.
- Der Baustein arbeitet mit 400kHz.
- Das Modul lässt sich mit einem "S"-Bit-Befehl in den Standby-Betrieb bringen und von dort wieder holen.
- Es gibt einen 16x8-Bit RAM-Speicher, welcher die Zustände der LEDs speichert und sich entsprechend auslesen lässt
- Dimmen der LED in 16 Stufen über PWM möglich. Leider geht dies nur jeweils fürs gesamte Board, so dass man es nicht für einzelne LEDs nutzen kann.
- Blinken der LED wäre in 3 Stufen möglich, doch leider auch nur das gesamte Board. Entsprechend kann man nur Effekte hervorrufen, wenn man einzelne LEDs über den Code blinken lässt, doch hier muss man herausfinden, wie schnell und genau dies funktioniert.
Verbindung
Das Modul besitzt bei mir nur 4 Anschlüsse und zwar VCC, SDA, SDC und GND. Die Speisung kommt an Pin1 beim Raspi, da das Modul 5V braucht. GND an Pin5 für den Ground. SDA liegt auf Pin4 und SCL auf Pin6. Ich empfehle, um keinen Kurzschluss zu provozieren, den Raspi herunterzufahren und vom Strom zu trennen, bevor man das Modul verbindet.
Nachdem der Raspi wieder gestartet hat, sollte mit
i2cdetect -y 1 die Matrix an Adresse 70 auftauchen. Sollte man schon andere Module haben und diese auch diese Adresse belegen, muss man die Adresse über die Lötpunkte anpassen. Dies wird im verlinkten Datenblatt gezeigt. Da ich nur ein Gerät angehängt habe, kann ich die Standardadresse verwenden. Sollte der Befehl nicht funktionieren, dann zuerst I2C korrekt einrichten.
Anschliessend kann man etwa den entsprechenden Treiber von Adafruit installieren mit
https://docs.circuitpython.org/projects/ht16k33/en/latest/. Wenn der Befehl nicht erfolgreich durchläuft, muss man pip3 vorher installieren, doch normalerweise ist das schon installiert.
Nun kann man testen, ob das Board funktioniert. Dies sieht man im Programm
LEDTest.py, welche einfach eine LED aktiviert. Bei meinem Board wird mit diesem Treiber das Board als 8x8x2 angesprochen. Entsprechend kann man mit den Werten in der Matrix bestimmen, ob die linke 8x8, die rechte 8x8 oder beide 8x8 LED leuchten sollen. Dies ist zwar schwieriger zu implementieren als eine reine 8x16 Matrix, da man in 2 "Ebenen" arbeiten muss, doch es funktioniert prinzipiell.
LEDTest2.py Laut circuitpython müsste es aber auch einfach als 16x8 funktionieren. Kann ich testen, wenn ich soweit bin.
Software
Anforderungen
Nach dem erfolgreichen Test der Verbindung und des Moduls, muss man sich Gedanken machen, wie das Ganze ablaufen soll. Ich habe mich dabei auf das Projekt "PIE MAN" im Kapitel 6 des Buches Raspberry Pi Projects gestützt, wobei man durch die fehlende Grafik aber viel weglassen kann. Hier daher die wichtigsten Punkte:
- Steuerung über Computertasten oder Taster an den Inputs (Joystick)
- LED-Matrix farbig oder gedimmt/pulsierend
- LED-Mtrix 8x8 oder grösser, wobei die Skalierung entsprechend angepasst werden kann
- Ledman muss alle aktiven Punkte fressen, um das Level zu beenden
- Powerups sind möglich, um die "bösen" LEDs zu "fressen"
- Böse LEDs können Ledman "fressen"
- Anschluss eines Piepsers oder Lautsprechers ist optional möglich
- Wände verhindern ein beliebiges "Durchlaufen", wobei die "Aussenhülle" der Matrix eine Wand darstellt. Durchgänge können als optionale Erweiterung implementiert werden.
- Die "bösen" LEDs können sich zufällig oder geplant bewegen. Optional versuchen sie Ledman zu verfolgen oder vor ihm zu flüchten.
- Punkte / Highscore kann optional auf der erweiterten Matrix oder am Ende des Spiels angezeigt werden.
- Start des Spiels auf Tastendruck. Pause ist optional möglich. Info dass Pause ist optional möglich.
- Neue Levels mit höherer Geschwindigkeit oder anderem Layout optional möglich
Module
Um das Projekt erfolgreich zu gestalten, muss es in Module unterteilt werden, welche man jeweils getrennt testen kann. Erst anschliessend werden die Module zu einem gesamten zusammengefügt und komplett getestet.
Ledman bewegen
Im Verbindungstest wurde ersichtlich, wie man eine LED an einer beliebigen Position ansteuert und wieder ablöscht, indem man einfach die entsprechende Position angibt und als Wert eine 1 = EIN oder 0 = AUS setzt. Die Variante mit zusätzlichen Feldern auf einer erweiterten Matrix lassen wir hier einmal weg.
Entsprechend wird einfach die Tastatur abgefragt. Die Verarbeitung eines Joysticks mit entsprechenden Inputs wird später einfach über eine
or-Verknüpfung erweitert. Der Code wird im Beispiel
Ledman_bewegen.py gezeigt.