LED-Man: Unterschied zwischen den Versionen

Aus m-wiki
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: „== Einführung == Inspiriert von [https://de.wikipedia.org/wiki/Pac-Man Pacman] soll auf einer LED-[https://www.mikrocontroller.net/articl…“)
 
Zeile 20: Zeile 20:
* Es gibt einen 16x8-Bit RAM-Speicher, welcher die Zustände der LEDs speichert und sich entsprechend auslesen lässt
* Es gibt einen 16x8-Bit RAM-Speicher, welcher die Zustände der LEDs speichert und sich entsprechend auslesen lässt
* Dimmen der LED in [[Raspberry_Pi#LED_dimmen|16 Stufen über PWM]] möglich.
* Dimmen der LED in [[Raspberry_Pi#LED_dimmen|16 Stufen über PWM]] möglich.
=== 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.
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.
Nun kann man testen, ob das Board funktioniert. Dies sieht man im Programm <code>LEDTest.py</code>, 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. <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 ==
=== 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 [[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)
* 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 <code>or</code>-Verknüpfung erweitert. Der Code wird im Beispiel <code>Ledman_bewegen.py</code> gezeigt.

Version vom 2. August 2022, 00:08 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 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.

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.