CODING WORLD RASP JP SPIELE Instructions [de]

Page 1
Raspberry Pi Projekt
Raspberry Pi Projekt
LED Matrix
LED Matrix
Spiele Programmieren
Spiele Programmieren
Jugend Programmiert
Jugend Programmiert
Page 2
Alle Schaltungen, Programme und Bauteile wurden vorher von uns geprüft. Trotzdem können wir leider Fehler im Buch, den Schaltungen oder Programmen nicht ausschließen. Bei Fragen oder Problemen gibt es unten die Kontaktmöglichkeiten. Mehr Informationen findest du auch auf der Internetadresse der Seitenzahl.
LEDs
LEDs sollten nicht aus kurzer Distanz direkt angesehen werden. Ein direkter Blick kann zu Schäden an den Netzhäuten führen. Dies kann gefährlich sein, auch wenn die Verletzungen nicht sofort klar erkennbar sind. Die LEDs dürfen nur wie in den Anleitungen beschrieben verwendet werden, höhere Ströme oder Stromspannungen sind zu vermeiden.
Dieses Produkt entspricht den geltenden Europäischen Richtlinien und trägt ein CE-Kennzeichen. Der richtige Gebrauch ist in dem beiliegenden Buch erklärt.
Baue Schaltungen immer wie beschrieben auf, achte auch auf die verschiedenen GPIO Pins vom Raspberry Pi.
Herausgeber
Jugend Programmiert Coding World UG (haftungsbeschränkt) | Homwer.com Obdrupstraße 23 A, 24986 Mittelangeln www.codingworld.io Support: support@cw42.de Feedback: feedback@cw42.de
→ cw42.de/matrix/1
Game Machine - Die 8 x 8 LED Matrix in Action
Page 3
Moin Moin und Willkommen
In diesem Kit werden wir uns mit der 8 x 8 LED Matrix mit dem max7219 Chip beschäftigen. Oder Kurz (LED) Matrix. Da einfaches LEDs An- und Ausschalten auf Dauer doch recht langweilig werden kann, werden wir uns auch damit beschäftigen, wie wir Daten ausgeben können und am Ende sogar kleine Spiele damit programmieren. Dafür ist in diesem Kit Folgendes enthalten:
8 x 8 LED Matrix mit max7219 6 x Große Push Buttons 10KΩ Widerstände
Inhalte Seite
Matrix Anschließen Und Programmieren 2
Der Digitale Würfel 6
Wir nennen es Kunst 9
Snake Programmieren 11
Highscore 20
Matrix anschließen und Programmieren
Mit der 8 x 8 LED Matrix und dem max7219 Chip können wir insgesamt 64 LEDs ansteuern. Dank dem max7219 Chip auf der Matrix müssen wir dabei nicht jede LED einzeln ansprechen, sondern können uns nur mit diesem Chip unterhalten. Dieser übernimmt dann für uns das Ansprechen der einzelnen LEDs. Für die Kommunikation von Chip zum Raspberry Pi brauchen wir noch SPI. Wenn du das noch nicht aktivierst hast, solltest du das jetzt machen! Mehr Infos gibt es auch auf cw42.de/spi
Jetzt müssen wir noch die benötigten Bibliotheken dafür installieren. Das
→ cw42.de/matrix/2
Game Machine - Die 8 x 8 LED Matrix in Action
Page 4
machen wir mit den folgenden Terminalbefehlen.
Jetzt, da die Bibliothek richtig installiert ist, müssen wir uns nur noch darum kümmern, das Display an den Raspberry Pi anzuschließen.
Anschlüsse Raspberry Pi Anschlüsse LED Matrix
5V 1 - VCC
GND 2 - GND
$ git clone https://github.com/rm-hull/max7219.git
1
$ cd max7219
1
$ sudo apt-get install python-dev python-pip
1
$ sudo pip install spidev
1
$ sudo python setup.py install
1
$ cd
1
Bash
Bash
Bash
Bash
Bash
Bash
→ cw42.de/matrix/3
Game Machine - Die 8 x 8 LED Matrix in Action
Page 5
GPIO 10 (MOSI) 3 - DIN
GPIO 8 (SPI CE0) 4 - CS
GPIO 11 (SPI CLK) 5 - CLK
Zum Testen kannst du das Beispiel Programm ausführen, das bei der Bibliothek dabei ist.
Wenn du alles richtig angeschlossen hast, solltest du jetzt bei dir auf der Matrix einen bewegenden Text sehen. In diesem Beispiel werden die Funktionen gezeigt, welche die Matrix hat. Mit Str/Ctrl + c kannst du das Programm beenden. Doch natürlich wollen wir jetzt auch zu unserem ersten eigenen Programm kommen.
Wenn du das Programm ausführst, sollte bei dir zuerst der Text "Moin Moin" und dann die "1" ausgegeben werden. Doch erstmal das Programm erklärt. In Zeile 1 importieren wir die benötigten Bibliotheken. Da wir nicht die ganze max7219 Bibliothek brauchen, können wir in Zeile 1 mit max7219.led den benötigten Teil noch genauer spezifizieren und mit as led kürzen wir das Ganze ab.
In Zeile 3 legen wir dann die Grundlagen für das spätere Arbeiten und Speichern in der Variablen matrix das Objekt zum Erstellen der Display Daten. Objekte haben wir schon kurz behandelt. Objekte sind sehr vielseitig und haben bestimmte Funktionen, welche wir auf das Objekt ausführen.
$ sudo python max7219/examples/matrix_test.py
1
import max7219.led as led
matrix = led.matrix()
matrix.show_message("MOIN MOIN")
matrix.letter(0, ord("1"))
1 2 3 4 5 6 7
Bash
Python
→ cw42.de/matrix/4
Game Machine - Die 8 x 8 LED Matrix in Action
Page 6
In Zeile 5 rufen wir dann die Funktion .show_message() auf. Mit dieser können wir einen Text auf der Matrix wiedergeben, welcher sich mit einer Laufschrift über den Bildschirm bewegt. Hier übergeben wir als ersten Parameter nur den Text, der dargestellt werden soll.
In Zeile 7 stellen wir auch wieder etwas dar, benutzen dafür aber die
.letter() Funktion. Diese braucht mindestens zwei Parameter, zuerst die
Matrix und dann den Buchstaben/Zahl. Doch wir können keine direkten Text übergeben, sondern müssen das zuerst in einen Unicode umwandeln. Ein Unicode ist eine standardisierte Nummer für Zeichen. Dafür können wir einfach die ord() Funktion benutzen.
Aber natürlich gibt es noch weitere Funktionen, die wir benutzen können.
Funktion
.brightness() Mit dieser Funktion lässt sich die Helligkeit der
LEDs regeln. Als Parameter kann ein Wert zwischen 0 und 15 übergeben werden.
.clear() Löscht die gesamten Eingaben, keine LED leuchtet
mehr
.scroll_left() Verschiebt alle Eingaben nach Links
.scroll_right() Verschiebt alle Eingaben nach Rechts
.invert(1) Invertiert die Eingaben des Displays. Heißt, ein
Buchstabe würde nicht mehr angezeigt werden, sondern nur der Ausschnitt
.orientation() Dreht die Matrix, mögliche Werte sind: 0, 90, 180,
270
.pixel(x, y,
value )
Schaltet eine einzelne LED. Parameter 1: X Position; Parameter 2: Y Position; Parameter 3 ob die LED leuchten soll (1 = leuchtet)
→ cw42.de/matrix/5
Game Machine - Die 8 x 8 LED Matrix in Action
Page 7
Diese Funktion müssen immer auf das Matrix Objekt aufgerufen werden. Also: matrixObjekt.funktion() .
Der Digitale Würfel
Als Grundlage brauchst du die angeschlossene Matrix aus der vorherigen Anleitung. Insgesamt werden wir die Schaltung um vier große Taster erweitern.
Anschlüsse Raspberry Pi Anschlüsse Breadboard
GPIO14 Taster 1
GND + 10KOhm Taster 1
GPIO15 Taster 2
GND + 10KOhm Taster 2
GPIO18 Taster 3
GND + 10KOhm Taster 3
→ cw42.de/matrix/6
Game Machine - Die 8 x 8 LED Matrix in Action
Page 8
GPIO23 Taster 4
GND + 10KOhm Taster 4
Bei den Tastern müssen immer die Pins mit einander verbunden werden die am nächsten zueinander liegen.
Wenn du das Programm ausführst, sollte zuerst nur ein Fragezeichen zu sehen sein, wenn du jetzt aber den Taster drückst, der an den GPIO Pin 14 angeschlossen ist, sollte jedesmal eine zufällige Zahl zwischen 1 und 6 angezeigt werden. Also ähnlich einem normalen Würfel, nur dass du dir die Arbeit beim Würfeln sparst ;)
import RPi.GPIO as gpio import max7219.led as led from random import randint import time
gpio.setmode(gpio.BCM) taster = 14 gpio.setup(taster,gpio.IN,pull_up_down=gpio.PUD_UP)
matrix = led.matrix()
def neue_zahl(channel):
matrix.letter(0, ord(str(randint(1,6))))
gpio.add_event_detect(taster, gpio.RISING, callback=neue_zahl
matrix.letter(0, ord("?"))
while True:
time.sleep(0.1)
1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16 17 18 19 20
Python
→ cw42.de/matrix/7
Game Machine - Die 8 x 8 LED Matrix in Action
Page 9
Schritt für Schritt
In den ersten vier Zeilen importieren wir erstmal die benötigten Bibliotheken.
In Zeile 6-8 kümmern wir uns um die Logik des Tasters, mit dem wir nachher immer eine neue Zahl erstellen, das sollte dir ziemlich bekannt vorkommen.
In Zeile 10 erstellen wir in der Variablen matrix ein neues Objekt der 8x8 Matrix.
In Zeile 12 und 13 erstellen wir unsere eigenen Funktion und nennen diese passenderweise neue_zahl(). Warum wir den Parameter setzen müssen, erfahren wir in Zeile 15/16. In Zeile 13 wird dann eine neue zufällige Zahl zwischen 1 und 6 mit randint(1,6) erstellt. Diese Zahl übergeben wir mit der .letter() Funktion an das Display.
In Zeile 15 verbinden wir die Eingaben von dem Taster mit der Funktion. Mit
gpio_event_detect können wir auf ein bestimmtes Ereignis bei einem
GPIO Pin warten. Der erste Parameter ist der GPIO Pin, in unserem Fall 14. Der zweite Parameter ist das Ereignis. Es gibt da die Möglichkeiten
gpio.RISING und gpio.FALLING . Mit Ereignis wird dabei eine
Veränderung gemeint. Heißt, wenn Strom fließt, wo vorher kein Strom geflossen ist und das Gleiche gibt es auch noch andersherum. Da Strom fließt, wenn der Taster gedrückt wird, benutzen wir gpio.RISING . Wir können mit callback=name_der_funktion noch übergeben, welche Funktion dafür aufgerufen werden soll. Diese bekommt als Parameter dann auch den GPIO, der sich verhindert, übergeben. Das heißt, wir können auch mehrere GPIO Pins mit .gpio_add_event() verbinden. Nochmal zusammengefasst sagen wir mit dieser Funktion, dass sobald Strom fließt, die Funktion neue_zahl() aufgerufen werden soll.
Der Hauptteil des Programmes ist damit fertig, aber wenn du das Programm jetzt ausführen würdest, passiert nichts, denn die Funktion wird erst aufgerufen, wenn der Taster gedrückt wird. Damit das Programm nicht einfach durchläuft und aufhört, haben wir dafür noch eine while-Schleife in Zeile 19 und 20 eingebaut. Diese macht nichts anderes als einfach zu laufen und das Programm so am Leben zu halten.
→ cw42.de/matrix/8
Game Machine - Die 8 x 8 LED Matrix in Action
Page 10
Damit die Matrix nicht am Anfang leer ist, rufen wir in Zeile 17 die
.letter() Funktion auf und übergeben ein Fragezeichen.
Und damit ist dieses kleine Programm auch schon fertig erklärt. Es zeigt, mit welchen kleinen Möglichkeiten wir Dinge wie Würfeln besser machen können ;)
Wir nenne es Kunst
Bevor wir uns an das erste Spiel machen, wollen wir erstmal eine kleine Wiederholung machen und dabei noch ein wenig abstrakte Kunst erzeugen. Deswegen fangen wir mit dem nächsten Programm einfach mal an.
Wenn du dieses Programm ausführst, sollte dir abstrakte Kunst auf der Matrix angezeigt werden.
Bis zur while-Schleife in Zeile 8 sollte dir alles bekannt vorkommen. Das Ziel ist recht einfach: wir wollen jede einzelne LED in der Matrix ansprechen und dann mit randint(0,1) darüber zufällig die LED an- und wieder ausschalten. Doch dafür müssen wir erstmal alle Reihen und Spalten durchgehen. Dazu benutzen wir zuerst die for-Schleife in Zeile 9, um alle Zeilen durchzugehen. Die for-Schleife kann das nicht direkt, wir müssen erst einen kleinen Umweg machen. Mit range(8) erstellen wir eine Liste mit den Zahlen 0 bis 7. Wenn wir diese mit print() ausgeben, würde Folgendes
import RPi.GPIO as gpio import max7219.led as led from random import randint import time
matrix = led.matrix()
while True:
for i in range(8): for j in range(8): matrix.pixel(i,j,randint(0,1)) time.sleep(0.0002)
1
2
3
4
5
6
7
8
9 10 11 12
Python
→ cw42.de/matrix/9
Game Machine - Die 8 x 8 LED Matrix in Action
Page 11
Zahlen 0 bis 7. Wenn wir diese mit print() ausgeben, würde Folgendes im Terminal erscheinen: [0, 1, 2, 3, 4, 5, 6, 7] . Mit der for-Schleife können wir also Objekte in der Liste durchgehen. Diese wird dann in i gespeichert. Heißt, beim ersten Mal ist i gleich 0, beim zweiten Mal ist i gleich 1 und so weiter.
Das Selbe machen wir in Zeile 10 nochmal, damit wir auch die ganzen Spalten durchgehen. Diese werden in der Variable j gespeichert. In Zeile 11 müssen wir dann nur noch die .pixel() -Funktion aufrufen und übergeben dann die x und y Koordinaten, die in den Variablen i und j gespeichert sind. Als dritten Parameter wird dann noch der Zufallsgenerator übergeben.
Damit der Spaß auch nicht zu schnell zu Ende ist, übergeben wir in Zeile 12 zusätzlich noch eine kleine Pause. Die Pausenzeiten kannst du natürlich auch noch weiter variieren und auf deine eigenen Bedürfnisse anpassen.
Von der Kunst zum Bild
Jetzt haben wir uns genug mit der Kunst beschäftigt. Natürlich können wir auch selbst eigene Bilder erstellen. Eine Möglichkeit dafür ist das Benutzen von multidimensionalen Listen. Während eine Liste so aufgebaut ist:
gibt es hier noch eine Dimension mehr:
Dabei gilt das gleiche Nummerierungsprinzip. Heißt, print[liste[1]) gibt 5 aus. Weil es das zweite Element ist. (Auch hier wird bei 0 angefangen zu zählen). print(mListe[1]) gibt [5,4] aus und print(mListe[1][1]) gibt 4 aus. Diese multidimensionale Liste eignet sich auch perfekt, um viele x und y Koordinaten zu speichern. So haben wir auch unsere Krake nachgebaut.
liste = [1,5,2]
1
mListe = [[1,2], [5,4]]
1
import max7219.led as led import time
device = led.matrix()
1
2
3
4
Python
Python
Python
→ cw42.de/matrix/10
Game Machine - Die 8 x 8 LED Matrix in Action
Page 12
Damit die Krake leserlich bleibt, haben wir für jede Zeile auf der Matrix eine neue Zeile im Code gemacht. In Zeile 14 und 15 geben wir diese dann auch. Über die uns schon bekannte for-Schleife gehen wir zuerst jede Unterliste durch und nehmen dann in Zeile 15 mit i[ß] und i[1] die Koordinaten für Krake. Am Ende kommt dann unser Logo raus. Sieht ein wenig pixelig aus, hat dafür aber auch seinen ganzen eigenen Charme.
Snake Programmieren
Jetzt haben wir schon so viel mit der Matrix gearbeitet, dass es jetzt an der Zeit ist, diese auch mal wirklich praktisch einzusetzen. Wir werden dafür ein Snake Spiel programmieren. Das Spielprinzip von Snake ist recht simpel. Es gibt eine Schlange, die mit Pfeiltasten bewegt werden kann. Außerdem gibt es einen Apfel. Wen die Schlange einen Apfel gegessen hat, wird diese länger und ein neuer Apfel erscheint. Das Spiel ist dann verloren, wenn die Schlange sich selbst oder die Wand berührt. Je mehr Äpfel die Schlange gegessen hat, desto länger wird sie und auch die Bewegungen werden schneller. Denn mit den Pfeiltasten kann nur die Richtung festgelegt werden, aber nicht, wann sich die Schlange bewegt. Heißt, es wird immer schwieriger. Die Matrix eignet sich perfekt, um so ein Spiel darzustellen. Der Apfel ist eine einzelne angeschaltete LED, eine Schlange besteht natürlich auch aus LEDs und wird so auch immer länger. Wenn der Spieler gestorben ist, wird das angezeigt, ebenso wie die Punktezahl, die der Spieler erreicht hat. Um ein neues Spiel zu starten, muss dann nur eine Taste gedrückt
krake = [[2,1],[3,1],[4,1],[5,1], [1,2],[3,2],[4,2],[6,2], [1,3],[2,3],[3,3],[4,3],[5,3],[6,3], [1,4],[3,4],[4,4],[5,4],[6,4], [1,5],[6,5], [1,6],[2,6],[3,6],[4,6],[5,6],[6,6], [0,7],[1,7],[3,7],[4,7],[6,7],[7,7]]
for i in krake:
device.pixel(i[0],i[1],1)
5
6
7
8
9 10 11 12 13 14 15
→ cw42.de/matrix/11
Game Machine - Die 8 x 8 LED Matrix in Action
Loading...