
Vorwort
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
Game Machine - Die 8 x 8 LED Matrix in Action

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
Game Machine - Die 8 x 8 LED Matrix in Action

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
$ sudo apt-get install python-dev python-pip
1
$ sudo pip install spidev
1
$ sudo python setup.py install
1
Bash
Bash
Bash
Bash
Bash
Bash
Game Machine - Die 8 x 8 LED Matrix in Action

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
Game Machine - Die 8 x 8 LED Matrix in Action

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)
Game Machine - Die 8 x 8 LED Matrix in Action

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
Game Machine - Die 8 x 8 LED Matrix in Action

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
Game Machine - Die 8 x 8 LED Matrix in Action

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.
Game Machine - Die 8 x 8 LED Matrix in Action

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
Game Machine - Die 8 x 8 LED Matrix in Action

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.
mListe = [[1,2], [5,4]]
1
import max7219.led as led
import time
device = led.matrix()
1
2
3
4
Game Machine - Die 8 x 8 LED Matrix in Action

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
Game Machine - Die 8 x 8 LED Matrix in Action