LED-Man: Unterschied zwischen den Versionen
K (→HT16K33) |
|||
Zeile 1: | Zeile 1: | ||
== Einführung == | == Einführung == | ||
Inspiriert von [https://de.wikipedia.org/wiki/Pac-Man Pacman] soll auf einer [[ | Inspiriert von [https://de.wikipedia.org/wiki/Pac-Man Pacman] soll auf einer [[Raspberry Pi#LED|LED]]-[https://www.mikrocontroller.net/articles/LED-Matrix Matrix] ein Spielfeld entstehen, auf welcher man alle leuchtenden Punkte "fressen" muss, ohne von den "bösen" LEDs erwischt zu werden. | ||
== Hardware == | == Hardware == | ||
Zeile 6: | Zeile 6: | ||
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). | 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. | 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 [[ | Eine LED-Matrix wird normalerweise über einen Bus angesteuert, damit man die Anzahl überhaupt handeln kann. Bei mir ist es der [[Raspberry Pi#I2C|I<sup>2</sup>C]]-Bus, welcher nur 2 Leitungen braucht, dafür halt nicht sehr schnell ist. | ||
Als Ansteuer-Baustein wird der [https://www.alldatasheet.com/datasheet-pdf/pdf/439619/HOLTEK/HT16K33.html HT16K33] von [https://en.wikipedia.org/wiki/Holtek Holtek] verwendet. | Als Ansteuer-Baustein wird der [https://www.alldatasheet.com/datasheet-pdf/pdf/439619/HOLTEK/HT16K33.html HT16K33] von [https://en.wikipedia.org/wiki/Holtek Holtek] verwendet. | ||
=== HT16K33 === | === HT16K33 === | ||
Dieser Baustein kann in | Dieser Baustein kann in verschiedenen 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. | ||
Die Details zum Baustein findet man auf der [[I2C|I<sup>2</sup>C-Seite]]. | |||
=== Verbindung === | === Verbindung === | ||
Das Modul besitzt bei mir nur 4 Anschlüsse und zwar V<sub>CC</sub>, 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. | Das Modul besitzt bei mir nur 4 Anschlüsse und zwar V<sub>CC</sub>, 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 <code>i2cdetect -y 1</code> 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 [[Raspberry Pi#I2C|I<sup>2</sup>C]] korrekt einrichten. Anschliessend kann man etwa den entsprechenden Treiber von [https://docs.circuitpython.org/projects/ht16k33/en/latest/ Adafruit] installieren mit <code>https://docs.circuitpython.org/projects/ht16k33/en/latest/</code>. Wenn der Befehl nicht erfolgreich durchläuft, muss man [[Python#Installaton 2|pip3]] vorher installieren, doch normalerweise ist das schon installiert. | ||
Nachdem der Raspi wieder gestartet hat, sollte mit <code>i2cdetect -y 1</code> 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 [[ | |||
Anschliessend kann man etwa den entsprechenden Treiber von [https://docs.circuitpython.org/projects/ht16k33/en/latest/ Adafruit] installieren mit <code>https://docs.circuitpython.org/projects/ht16k33/en/latest/</code>. Wenn der Befehl nicht erfolgreich durchläuft, muss man [[Python# | |||
Nun kann man testen, ob das Board funktioniert. Dies sieht man im Programm <code>LEDTest.py</code>, | Nun kann man testen, ob das Board funktioniert. Dies sieht man im Programm <code>LEDTest.py</code>, welches 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. <code>LEDTest2.py</code> Laut [https://docs.circuitpython.org/projects/ht16k33/en/latest/ circuitpython] müsste es aber auch einfach als 16x8 funktionieren. Kann ich testen, wenn ich soweit bin. | ||
== Software == | == Software == | ||
=== Anforderungen === | === 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 [[ | 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 [[Links und Bücher|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) | * Steuerung über Computertasten oder Taster an den Inputs (Joystick) | ||
* LED-Matrix farbig oder gedimmt/pulsierend | * LED-Matrix farbig oder gedimmt/pulsierend |
Aktuelle Version vom 16. März 2024, 21:38 Uhr
Einführung
Inspiriert von Pacman soll auf einer LED-Matrix ein Spielfeld entstehen, auf welcher man alle leuchtenden Punkte "fressen" muss, ohne von den "bösen" LEDs erwischt zu werden.
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 verschiedenen 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.
Die Details zum Baustein findet man auf der I2C-Seite.
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
, welches 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.