MinecraftTM ist eines der beliebtesten Computerspiele weltweit – und das,
obwohl es kein wirkliches Spielziel hat. Gerade die offene Spielwelt, in der
jeder für sich Landschaften bauen und eigene Träume verwirklichen kann,
fasziniert über 100 Millionen Spieler weltweit. Der Spieltitel setzt sich übrigens aus den beiden englischen Begriffen Mine (= Bergbau, Rohstoffabbau) und craft (= verarbeiten) zusammen. Und genau darum geht es auch
in MinecraftTM: Es gilt, Rohstoffe aus der Landschaft abzubauen und sie zu
neuen Landschaften oder Objekten zu verarbeiten.
Neben den bekannten Versionen für PC und verschiedene Spielkonsolen
gibt es Minecraft
installiert. Die Raspberry-Pi-Version bietet einen großen Vorteil, sie ist über
eine eigens entwickelte Schnittstelle in der Programmiersprache Python
programmierbar. Python ist ebenfalls auf dem Raspberry Pi vorinstalliert
und ermöglicht unter anderem die Ansteuerung externer Hardware. So ist
es auf dem Raspberry Pi möglich, mit MinecraftTM LEDs zum Blinken zu bringen oder mit Hardwaretasten und Sensorkontakten die Spielfigur „Steve“ in
MinecraftTM zu steuern.
Dieser Adventskalender enthält jeden Tag ein kleines Hardwareexperiment
für den Raspberry Pi, dazu das passende Python-Programm und Elemente in der Minecraft
berry Pi 2 oder 3 und der aktuellen Version des Betriebssystems Raspbian.
Die wichtigsten Bauteile kurz
erklärt
Steckbrett
Für den schnellen Aufbau elektronischer Schaltungen, ohne löten zu müssen, enthält der Adventskalender ein Steckbrett. Hier können elektronische
Bauteile direkt in ein Lochraster gesteckt werden.
Die Verbindungen auf dem Steckbrett.
TM
auch auf dem Raspberry Pi – und sogar kostenlos vor-
TM
-Welt. Alle Experimente funktionieren mit dem Rasp-
Bei diesem Steckbrett sind alle äußeren Längsreihen über Kontakte (X und
Y) miteinander verbunden. Diese Kontaktreihen werden oft als Plus- und
Minuspol zur Stromversorgung der Schaltungen genutzt. In den anderen
Kontaktreihen sind jeweils fünf Kontakte (A bis E und F bis J) quer miteinander verbunden, wobei in der Mitte der Platine eine Lücke ist. So können hier
größere Bauelemente eingesteckt und nach außen hin verdrahtet werden.
LED
LEDs werden in Schaltungen mit einem pfeilförmigen Dreieckssymbol dargestellt, das die Flussrichtung vom Pluspol zum Minuspol oder zur Masseleitung angibt. Eine LED lässt in der Durchflussrichtung nahezu beliebig viel
Strom durch, sie hat nur einen sehr geringen Widerstand. Um den Durchflussstrom zu begrenzen und damit ein Durchbrennen der LED zu verhindern, wird üblicherweise zwischen dem verwendeten GPIO-Pin und der
Anode der LED oder zwischen Kathode und Massepin ein 220-Ohm-Vorwiderstand eingebaut. Dieser Vorwiderstand schützt auch den GPIO-Ausgang
des Raspberry Pi vor zu hohen Stromstärken. Die LEDs im Adventskalender
haben den Vorwiderstand bereits eingebaut und können daher direkt an die
GPIO-Pins angeschlossen werden.
Schaltplan einer LED mit Vorwiderstand.
LED in welcher Richtung anschließen?
Die beiden Anschlussdrähte einer LED sind unterschiedlich lang. Der längere
ist der Pluspol, die Anode, der kürzere die Kathode. Einfach zu merken: Das
Pluszeichen hat einen Strich mehr als das Minuszeichen und macht damit
den Draht optisch etwas länger. Außerdem sind die meisten LEDs auf der
Minusseite abgeflacht, vergleichbar mit einem Minuszeichen. Auch leicht zu
merken: Kathode = kurz = Kante.
Widerstand
Widerstände werden zur Strombegrenzung an empfindlichen elektronischen Bauteilen sowie als Vorwiderstände für LEDs verwendet. Die Maßeinheit für Widerstände ist Ohm. 1.000 Ohm entsprechen einem Kiloohm,
abgekürzt kOhm. 1.000 kOhm entsprechen einem Megaohm, abgekürzt
MOhm. Oft wird für die Einheit Ohm auch das Omega-Zeichen Ω verwendet.
Die farbigen Ringe auf den Widerständen geben den Widerstandswert an.
Mit etwas Übung sind sie deutlich leichter zu erkennen als winzig kleine
Zahlen, die man nur noch auf ganz alten Widerständen findet.
Die meisten Widerstände haben vier solcher Farbringe. Die ersten beiden
Farbringe stehen für die Ziffern, der dritte bezeichnet einen Multiplikator
und der vierte die Toleranz. Dieser Toleranzring ist meistens gold- oder silberfarben – Farben, die auf den ersten Ringen nicht vorkommen. Dadurch
ist die Leserichtung immer eindeutig. Der Toleranzwert selbst spielt in der
Digitalelektronik kaum eine Rolle. Die Tabelle zeigt die Bedeutung der farbigen Ringe auf Widerständen.
FarbeWiderstandswert in Ohm
1. Ring
(Zehner)
Silber10
Gold10
Schwarz010
Braun1110
Rot2210
Orange3310
Gelb4410
Grün5510
Blau6610
Violett7710
Grau8810
Weiß9910
2. Ring
(Einer)
3. Ring
(Multiplikator)
−2
= 0,01±10 %
−1
= 0,1±5 %
0
= 1
1
= 10±1 %
2
= 100±2 %
3
= 1.000
4
= 10.000
5
= 100.000±0,5 %
6
= 1.000.000±0,25 %
7
= 10.000.000±0,1 %
8
= 100.000.000±0,05 %
9
= 1.000.000.000
4. Ring
(Toleranz)
In welcher Richtung ein Widerstand eingebaut wird, ist egal. Bei LEDs dagegen spielt die Einbaurichtung eine wichtige Rolle.
GPIO-Verbindungskabel
Alle farbigen Verbindungskabel haben auf der einen Seite einen dünnen
Drahtstecker, mit dem sie sich auf die Steckplatine stecken lassen. Auf der
anderen Seite befindet sich eine Steckbuchse, die auf einen GPIO-Pin des
Raspberry Pi passt.
Pinbelegung der GPIO-Pins.
Sicherheitsmaßnahmen
Auf keinen Fall sollte man irgendwelche GPIO-Pins miteinander verbinden
und abwarten, was passiert.
Nicht alle GPIO-Pins lassen sich frei programmieren. Einige sind für die
Stromversorgung und andere Zwecke fest eingerichtet.
Einige GPIO-Pins sind direkt mit Anschlüssen des Prozessors verbunden, ein
Kurzschluss kann den Raspberry Pi komplett zerstören. Verbindet man über
einen Schalter oder eine LED zwei Pins miteinander, muss immer ein Schutzwiderstand dazwischengeschaltet werden. Eine Ausnahme bilden die LEDs
mit eingebautem Vorwiderstand.
Für Logiksignale sollte immer Pin 1 verwendet werden, der +3,3 V liefert und
bis 50 mA belastet werden kann. Pin 6 ist die Masseleitung für Logiksignale.
Pin 2 und Pin 4 liefern +5 V zur Stromversorgung externer Hardware. Hier
kann so viel Strom entnommen werden, wie das USB-Netzteil des Raspberry Pi liefert. Diese Pins dürfen aber nicht mit einem GPIO-Eingang verbunden werden.
Heute im Adventskalender
1 Steckbrett (SYB 46)
1 LED rot mit eingebautem Vorwiderstand
2 GPIO-Verbindungskabel
Raspberry Pi vorbereiten
Um den Raspberry Pi in Betrieb zu nehmen, braucht man:
USB-Tastatur und Maus
HDMI-Kabel für Monitor
Netzwerkkabel
MicroSD-Karte mit Betriebssystem Raspbian Jessie
Micro-USB-Handyladegerät als Netzteil (mindestens 1.000 mA,
besser 2.000 mA)
Das Netzteil wird als Letztes angeschlossen, denn damit schaltet sich der
Raspberry Pi automatisch ein. Es gibt keinen eigenen Ein-/Ausschalter.
Betriebssysteminstallation in Kürze
Für alle, die ihren Raspberry Pi noch nicht mit der aktuellen Raspbian-Version betriebsbereit haben, folgt hier die Systeminstallation in zehn Schritten:
1. NOOBS (mindestens Version 2.0.0) von www.raspberrypi.org/downloads
auf den PC herunterladen und Zip-Archiv auf die Festplatte entpacken.
2. Wurde die SD-Karte bereits benutzt, mit SD-Formatter im PC neu formatieren: www.sdcard.org/downloads/formatter_4. Dabei Format Size Adjust-
ment einschalten (die SD-Karte muss mindestens 4 GByte groß sein).
3. Die Dateien und Unterverzeichnisse von NOOBS auf die SD-Karte kopieren.
4. SD-Karte aus dem PC nehmen, in den Raspberry Pi stecken und booten. Ganz unten Deutsch als Installationssprache wählen. Damit wird
automatisch auch die deutsche Tastatur ausgewählt. Das Häkchen
beim vorausgewählten Raspbian-Betriebssystem setzen und oben
links auf Install klicken. Nach Bestätigung der Sicherheitsinformation,
dass die Speicherkarte überschrieben wird, startet die Installation, die
einige Minuten dauert.
5. Nach abgeschlossener Installation bootet der Raspberry Pi neu.
6. Im Menü unter Einstellungen das Tool Raspberry-Pi Konfiguration starten.
7. Auf der Registerkarte Lokalisierung im Feld Zeitzone festlegen die Op-
tionen Europe und Berlin auswählen. Sprachumgebung und Tastatur
sollten automatisch auf Deutsch gesetzt sein.
8. Auf der Registerkarte Schnittstellen den Schalter SSH auf Aktiviert setzen, wenn Sie vom PC über das Netzwerk Daten auf den Raspberry Pi
übertragen wollen.
9. Auf OK klicken und den Raspberry Pi über den Menüpunkt Shutdown
neu booten. Eine eventuell auftauchende Warnung wegen eines unsicheren Passworts kann ignoriert werden.
LED leuchtet
Für das erste Experiment wird kein Programm benötigt. Der Raspberry Pi dient
hier nur als Stromversorgung für die LED. Das Experiment zeigt, wie LEDs angeschlossen werden. Achten Sie darauf, dass die LED richtig herum eingebaut
ist. Die Kathode (der kurze Draht) steckt in der Längsschiene des Steckbretts,
die in den meisten Schaltungen als Masseleitung verwendet wird (in der Abbildung ganz rechts). Die abgebildete Schaltung lässt die LED rot leuchten.
Bauteile
1 Steckbrett
1 LED rot mit eingebautem Vorwiderstand
2 GPIO-Verbindungskabel
Dateien zum Download
Die im Adventskalender verwendeten Programme, die MinecraftTM-Welt sowie
die Aufbauzeichnungen der Schaltungen in Farbe gibt es unter www.buch.cd.
Tragen Sie für dieses Produkt im Eingabefeld den Code 15001-1 ein.
Öffnen Sie die Webseite direkt mit dem vorinstallierten Browser auf dem Raspberry Pi und laden Sie die Zip-Datei in das
Home-Verzeichnis /home/pi herunter.
Starten Sie den Dateimanager auf dem Raspberry Pi. Dieser zeigt
beim Start automatisch das Home-Verzeichnis an. Klicken Sie
mit der rechten Maustaste auf die heruntergeladene Zip-Datei
und wählen Sie im Kontextmenü Hier entpacken.
Kopieren Sie mit dem Dateimanager die Dateien der Minecraft
adventskalender in das Verzeichnis /home/pi/.minecraft/
games/com.mojang/minecradftWorlds auf dem Raspberry Pi.
Da sich in den abgedruckten Code-Beispielen Zeilenumbrüche nicht immer
vermeiden ließen, haben wir sie mit einem Pfeil (
Diese Pfeile sind nicht Bestandteil des Codes.
) kenntlich gemacht.
TM
-Welt
Um das Verzeichnis der MinecraftTM-Welten zu sehen, muss im Dateimanager-Menü unter Ansicht die Option Versteckte anzeigen eingeschaltet sein.
Minecraft™
MinecraftTM, das beliebte Weltenbauer-Spiel, ist in der aktuellen Raspbian-Version bereits vorinstalliert. In MinecraftTM erkundet man eine schier
endlose Welt, die aus einfachen Würfeln erbaut ist. Die Blöcke bestehen aus
verschiedenen Materialien und können abgebaut werden, um sie als Rohstoffe zu verarbeiten und daraus andere Dinge zu bauen. Der Spieler übernimmt die Rolle der Spielfigur Steve und steuert diese. Dabei kann man die
Szene aus Steves Perspektive sehen oder aus Sicht einer Kamera von außen
darauf blicken.
2. Mit vier auch aus anderen Spielen bekannten Buchstabentasten be-
wegt man sich: mit [W] nach vorne, mit [S] nach hinten, mit [A] nach
links und mit [D] nach rechts. Bei Stufen im Gelände steigt man während der Bewegung automatisch nach oben oder unten.
3. Mit der [Leertaste] kann man in die Höhe springen. Drückt man die
[Leertaste] zweimal kurz hintereinander, wird auf den Flugmodus
umgeschaltet. In diesem Modus schwebt man und ist nicht mehr an
den Boden gebunden. Im Flugmodus steigt man durch längeres Drücken der [Leertaste] weiter nach oben.
4. Umgekehrt duckt man sich mit der linken [Umschalt]-Taste etwas
nach unten. Im Flugmodus verringert man mit dieser Taste die Flughöhe.
5. Die Taste [E] öffnet das Inventar, in dem jede Menge unterschiedlicher
Blöcke zum Bau zur Verfügung stehen. Acht verschiedene Blöcke oder
Werkzeuge sind in der Inventarleiste am unteren Bildschirmrand jederzeit verfügbar. Hier wählt man mit den Tasten [1] bis [8] oder mit dem
Mausrad das gewünschte Objekt aus.
6. Ein Klick mit der linken Maustaste entfernt den angeklickten Block, ein
Klick mit der rechten Maustaste platziert einen Block des gewählten
Typs an der angeklickten Position.
7. Die [Esc]-Taste blendet ein Menü ein, über das man das Spiel verlassen oder über ein Symbol links oben auf die Sicht eines außenstehenden Betrachters wechseln kann.
8. Die [Tab]-Taste befreit die Maus aus dem Minecraft
TM
-Fenster, wenn
man zwischendurch in ein anderes Programm wechseln möchte.
Die erste LED leuchtet am Raspberry Pi.
Wer MinecraftTM kennt, wird sich auch in der Pi Edition schnell zurechtfinden. Die Steuerung des Spiels und die Bewegungen in der Spielwelt laufen
sehr ähnlich. Wer Minecraft
TM
bis jetzt nicht kennt, braucht sich nur wenige
Tasten zu merken:
1. Mit der Maus dreht man sich, ohne eine Maustaste zu drücken, um
die eigene Achse und neigt den Blick nach oben oder unten. Das Spiel
reagiert sehr schnell, man muss also aufpassen, dass man sich beim
Drehen nicht „überschlägt“.
Ausschnitt aus der MinecraftTM-Welt des Adventskalenders.
Heute im Adventskalender
1 LED grün mit eingebautem Vorwiderstand
1 GPIO-Verbindungskabel
LED leuchtet beim Betreten einer
bestimmten Fläche
Das Experiment des 2. Tags lässt die grüne LED leuchten, wenn man mit der
Figur eine grüne Fläche betritt, die sich in der vorgegebenen Minecraft
Welt bei der Nummer 2 befindet. Gesteuert wird das Ganze über ein Programm in Python.
TM
-
Zwei LEDs am Raspberry Pi.
Die Python 3 Shell IDLE
Das Programm
Das Programm zeigt wichtige Techniken der Python-Programmierung, die
Sie für die weiteren Programme brauchen werden. Um ein Python-Programm mit MinecraftTM nutzen zu können, muss MinecraftTM bereits laufen.
Verlassen Sie das MinecraftTM-Fenster mit der Taste [Tab], wechseln Sie
dann in die Python-Shell und starten Sie dort das Programm mit der Taste
[F5]. Danach können Sie mit einem einfachen Klick in das MinecraftTM-Fens-
ter ins Spiel zurückkehren.
#!/usr/bin/python
import mcpi.minecraft as minecraft
import RPi.GPIO as GPIO
Die grüne Fläche neben der 2 lässt die LED leuchten.
Bauteile
1 Steckbrett
1 LED rot mit eingebautem Vorwiderstand
1 LED grün mit eingebautem Vorwiderstand
3 GPIO-Verbindungskabel
Heute verwenden wir, wie bei allen Experimenten in diesem Adventskalender, ein Steckbrett zum Aufbau der Schaltung. Die in der Abbildung untere
Längsreihe wird als Masseleitung verwendet und ist mit dem GND-Pin des
Raspberry Pi verbunden. Die LEDs sind mit der Kathode (dem kurzen Draht)
in dieser Kontaktreihe eingesteckt.
Die Programmiersprache Python ist auf dem Raspberry Pi ebenfalls vorinstalliert, sogar in zwei verschiedenen Versionen. Python 3 ist nicht, wie der
Name vermuten lässt, einfach eine neuere Version von Python 2. Die Sprachen verwenden teilweise eine andere Syntax. Programme sind also nicht
eins zu eins kompatibel. Viele externe Bibliotheken sind nur für eine der
beiden Versionen erhältlich. Entwickler von Python-Programmen müssen
ihren Nutzern also immer mitteilen, mit welcher Version ein Programm funktioniert. Wir verwenden in diesem Adventskalender immer das moderne
Python 3.
Starten Sie im Menü unter Entwicklung das Programm Python 3. IDLE ist eine
komplette Python-Shell und Entwicklungsumgebung. Für den Start in die
Programmierung sind keine zusätzlichen Komponenten nötig.
Öffnen Sie über File/Open das Programm 02mc_led01.py aus dem Download oder gehen Sie in der Python-Shell über File/New in ein neues Fenster
und tippen Sie das Programm ein.
mc = minecraft.Minecraft.create()
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
GPIO.setup(23, GPIO.OUT)
while True:
p = mc.player.getTilePos()
if (p.x<=1 and p.x>=-1 and p.z<=-2 and p.z >=-4):
GPIO.output(23, True)
GPIO.output(18, False)
else:
GPIO.output(18, True)
GPIO.output(23, False)
So funktioniert das Programm
#!/usr/bin/python
Python-Programme, die über die Kommandozeile gestartet werden, müssen am Anfang immer obige Zeile enthalten. Bei Programmen, die nur über
die Python-Shell gestartet werden, ist das nicht nötig. Aus Gründen der
Kompatibilität sollten Sie sich aber angewöhnen, diese Zeile am Anfang jedes Python-Programms einzutragen.
import mcpi.minecraft as minecraft
import RPi.GPIO as GPIO
Ein großer Vorteil von Python ist die einfache Erweiterbarkeit um neue Funktionen aus Funktionsbibliotheken. Für nahezu jede Aufgabe gibt es bereits
fertige Bibliotheken, sodass Sie viele Standardaufgaben nicht mehr selbst zu
lösen brauchen. Die Bibliothek mcpi.minecraft wird für die Verbindung
zu Minecraft
Bibliothek RPI.GPIO wird für die Unterstützung der GPIO-Pins importiert.
mc = minecraft.Minecraft.create()
Diese Zeile ist in jedem Programm enthalten, das Minecraft
generiert ein Python-Objekt für das laufende MinecraftTM-Spiel. Objekte
sind weit mehr als nur einfache Variablen. Sie können verschiedene Eigenschaften haben und über Methoden beeinflusst werden. Methoden werden
durch einen Punkt getrennt direkt hinter dem Objektnamen angegeben.
Verschiedene Methoden dieses Objekts können dann ins Spiel eingreifen
oder Daten aus dem Spiel auslesen.
GPIO.setmode(GPIO.BCM)
Die Bibliothek RPi.GPIO unterstützt zwei Methoden zur Bezeichnung der
Pins. Im Modus BCM werden die bekannten GPIO-Portnummern verwendet,
die auch in Scratch genutzt werden. Im Modus BOARD entsprechen die Bezeichnungen den Pinnummern auf der Raspberry-Pi-Platine. Üblicherweise
wird BCM verwendet.
GPIO.setup(18, GPIO.OUT)
GPIO.setup(23, GPIO.OUT)
Die Funktion GPIO.setup initialisiert einen GPIO-Pin als Ausgang oder
als Eingang. Der erste Parameter bezeichnet den Pin je nach vorgegebenem Modus BCM oder BOARD mit seiner GPIO-Nummer oder Pinnummer.
Der zweite Parameter kann entweder GPIO.OUT für einen Ausgang oder
GPIO.IN für einen Eingang sein.
while True:
Schleifen mit while laufen so lange, wie die danach angegebene Bedingung wahr ist. Da die Bedingung hier einfach True lautet, also immer wahr
ist, läuft die Schleife endlos.
TM
benötigt. Hier sind alle Steuerungsfunktionen enthalten. Die
TM
nutzt. Sie
Einrückungen sind in Python wichtig
In den meisten Programmiersprachen werden Programmschleifen oder
Entscheidungen eingerückt, um den Programmcode übersichtlicher zu machen. In Python dienen diese Einrückungen nicht nur der Übersichtlichkeit,
sondern sind für die Programmlogik sogar zwingend nötig. Dafür braucht
man in dieser Sprache keine speziellen Satzzeichen, um Schleifen oder Entscheidungen zu beenden.
p = mc.player.getTilePos()
Die eingerückten Zeilen werden in jedem Schleifendurchlauf einmal ausgeführt. Diese Zeile liest die Koordinaten des Minecraft
TM
-Klotzes aus, auf dem
die Spielfigur gerade steht, und schreibt diese in die Variable p.
Das MinecraftTM-Koordinatensystem
Koordinaten in MinecraftTM werden in Rastereinheiten in der Größe der Klötze gezählt. Im Gegensatz zu vielen bekannten 3-D-Programmen hat die horizontale Ebene in Minecraft
oben in die Luft.
Die Spielfigur soll die kleine grüne Fläche neben der gemauerten 2 betreten.
Diese Fläche liegt in der x-Achse zwischen den Koordinaten –1 und 1, in der
z-Achse zwischen 2 und 4. Ob die Figur dort steht, wird mit einer if-Abfrage
geprüft:
if (p.x<=1 and p.x>=-1 and p.z<=-2 and p.z >=-4):
Innerhalb der if-Abfrage sind vier Bedingungen mit and verknüpft. Sie
müssen alle gleichzeitig wahr sein, damit die Abfrage im Ganzen wahr ergibt. p.x liefert die x-Koordinate des in p gespeicherten Punkts, p.z liefert
die z-Koordinate.
GPIO.output(23, True)
GPIO.output(18, False)
Die eingerückten Zeilen werden immer dann ausgeführt, wenn die ifAbfrage wahr liefert.
Die Funktion GPIO.output setzt den Status eines GPIO-Pins. Jeder Pin
kann auf zwei verschiedene Zustände gesetzt werden. True schaltet den
Pin ein, False schaltet ihn wieder aus. Diese Zeilen schalten die LED an
GPIO-Pin 23 ein und die LED an GPIO-Pin 18 aus.
Ergibt die if-Abfrage nicht wahr, weil die Spielfigur außerhalb der grünen
Fläche steht, wird der zweite Teil der Abfrage hinter else ausgeführt.
Diese Zeilen schalten, entgegengesetzt zum ersten Teil der Abfrage, die LED
an GPIO-Pin 18 ein und die LED an GPIO-Pin 23 aus.
TM
x- und z-Koordinaten. Die y-Achse zeigt nach
Starten Sie das Programm mit der Taste [F5]. Eventuell auftauchende Warnungen wegen verwendeter GPIO-Ports können Sie ignorieren. Die rote
LED leuchtet. Bewegen Sie die Spielfigur auf die grüne Fläche neben der 2,
leuchtet die grüne LED. Verlässt die Spielfigur diese Fläche wieder, leuchtet
erneut die rote LED.
Spielfigur Steve steht auf der grünen Fläche
Spielfigur Steve steht außerhalb der grünen Fläche
Heute im Adventskalender
1 LED gelb mit eingebautem Vorwiderstand
1 GPIO-Verbindungskabel
Ampel auf einer Straße
Das Experiment des 3. Tags stellt eine Ampel dar. Stellen Sie sich mit der
Spielfigur auf die Haltelinie, und die Ampel schaltet auf Grün.
Die in MinecraftTM aufgebaute Ampel kann nicht wirklich leuchten. Dies übernehmen drei LEDs.
Bauteile
1 Steckbrett
1 LED rot mit eingebautem Vorwiderstand
1 LED gelb mit eingebautem Vorwiderstand
1 LED grün mit eingebautem Vorwiderstand
4 GPIO-Verbindungskabel
Das Programm
Das Programm 03mc_ampel01.py schaltet einen Ampelzyklus auf den
drei LEDs, wenn die Spielfigur auf dem Wartebalken auf der Straße steht.
#!/usr/bin/python
import mcpi.minecraft as minecraft
import RPi.GPIO as GPIO
import time
Zusätzlich zu den bereits bekannten Bibliotheken wird die Bibliothek time
importiert, die verschiedene Funktionen zur Berechnung von Zeiten enthält.
Damit werden die Wartezeiten zwischen den Ampelphasen erstellt.
rot = 0
gelb = 1
gruen = 2
Ampel=[18,23,25]
Um die GPIO-Pins im Programm besser unterscheiden und das Programm
leichter an einen anderen Schaltungsaufbau anpassen zu können, werden
die Pinnummern am Anfang in einer Liste Ampel[] gespeichert. Die Nummern der drei Listenelemente werden in den drei Variablen rot, gelb und
gruen gespeichert und können so sehr einfach zugeordnet werden.
Die drei GPIO-Pins werden über die Liste als Ausgänge eingerichtet. Der
zusätzliche Parameter initial schaltet die rote LED ein und die beiden
anderen aus.
try:
while True:
Um zu vermeiden, dass Python beim Programmstart GPIO-Warnungen ausgibt, wird die Endlosschleife in eine try:…except:-Konstruktion eingebettet, die am Ende die GPIO-Ports wieder schließt.
p = mc.player.getTilePos()
Am Anfang speichert die Endlosschleife wieder in jedem Durchlauf die Position der Spielfigur in der Variablen p.
mat = mc.getBlock(p.x, p.y-1, p.z)
Die Methode mc.getBlock() liest die Material-ID des Blocks unterhalb
der Spielfigur aus. Dazu wird von der y-Koordinate 1 subtrahiert.
if mat==42:
Jeder Block hat ein typisches Material. Diese Materialien haben alle einzelne
Nummern. Die Material-ID der für den Wartebalken auf der Straße verwendeten Blöcke ist 42.
== ist nicht gleich =
Das doppelte Gleichheitszeichen == steht für eine Gleichheitsabfrage, das
einfache Gleichheitszeichen = wird dagegen für Variablenzuweisungen verwendet.
GPIO.output(Ampel[gelb],True)
time.sleep(0.6)
Steht die Spielfigur auf einem Block mit dieser Material-ID, beginnt der Ampelzyklus, indem die gelbe LED zusätzlich zu der bereits leuchtenden roten
eingeschaltet wird. Danach wartet das Programm 0,6 Sekunden.
Anschließend werden die rote und die gelbe LED aus- und die grüne LED
eingeschaltet. In diesem Zustand wartet die Ampel 2 Sekunden. Auch bei
realen Verkehrsampeln dauert die Grünphase deutlich länger als die Zwischenphasen Rot/Gelb und Gelb.
Anschließend schaltet die Ampel über Gelb auf Rot und wartet wieder 2 Sekunden, bevor die Endlosschleife einen weiteren Durchlauf startet.
except KeyboardInterrupt:
GPIO.cleanup()
Die letzten beiden Zeilen sind nicht mehr eingerückt, sie werden erst dann
ausgeführt, wenn der Benutzer die Endlosschleife mit der Tastenkombination [Strg]+[C] abbricht.
Am Ende eines Programms sollten alle verwendeten GPIO-Pins wieder zurückgesetzt werden, um Warnungen beim nächsten Programmstart zu
vermeiden. Die letzte Zeile dieses Programms erledigt das für alle vom Programm initialisierten GPIO-Pins auf einmal. Pins, die von anderen Programmen initialisiert wurden, bleiben davon unberührt. So wird der Ablauf dieser
anderen möglicherweise parallel laufenden Programme nicht gestört.
Spielfigur Steve steht auf dem Wartebalken vor der Ampel
Tag 3 in der MinecraftTM-Welt
Schon gewusst...?
Der Begriff ‚Ampel‘ kommt von dem mittelhochdeutschen Wort
‚ampulla‘ und bezeichnet ein kleines Gefäß für Öl oder andere
Flüssigkeiten. Im Mittelalter wurde damit das Ewige Licht in katholischen Kirchen bezeichnet. Die ersten Verkehrsampeln hingen an
Drahtseilen über Kreuzungen und sahen daher ähnlich aus.
Die offizielle Bezeichnung von Verkehrsampeln ist nach § 43 der
deutschen Straßenverkehrsordnung (StVO) ‚Lichtzeichenanlage‘,
abgekürzt: LZA. In der österreichischen Straßenverkehrsordnung
und in der Signalisationsverordnung (SSV) zum Schweizer Straßenverkehrsgesetz werden Verkehrsampeln als ‚Lichtsignalanlage‘, abgekürzt: LSA, bezeichnet. Eine ‚Lichtzeichenanlage‘ ist in Österreich
dagegen eine Anlage an Bahnübergängen.
In Deutschland dürfen Radfahrer bei roter Ampel rechts von einem
Radweg auf einen anderen abbiegen, wenn dabei keine Fahrbahn
überquert wird. In den Niederlanden ist das nur erlaubt, wenn ein
entsprechendes Zusatzschild an der Ampel angebracht ist.
Ampeln in der DDR hatten teilweise eine Grün/Gelb-Phase zwi-
schen den Phasen Grün und Gelb. Dieses Signal wurde mit der Wiedervereinigung abgeschafft, da es nicht den Richtlinien für Lichtsignalanlagen (RiLSA) entspricht.
Das ostdeutsche Ampelmännchen entsprach ebenfalls nicht den
RiLSA und wurde an vielen Stellen umgebaut. Nach Protesten
aus der Bevölkerung wurden die Richtlinien angepasst und das
Ost-Ampelmännchen nachträglich wieder für zulässig erklärt.
Die Dauer der roten und grünen Ampelphasen wird je nach Situ-
ation unterschiedlich eingestellt. Die Rot/Gelb-Phase dauert eine
Sekunde. Für Gelb gibt es Vorgaben in den RiLSA, die von der zulässigen Geschwindigkeit auf der Straße abhängen:
GeschwindigkeitGelbphase
50 km/h3 sek.
60 km/h4 sek.
70 km/h5 sek.
In Düsseldorf gibt es Fußgängerampeln mit Gelbsignal.
Alle Ampeln weltweit haben die gleiche Anordnung der Lichter:
Rot oben, Grün unten - mit einer Ausnahme: Das rote Licht der
Tipperary-Hill-Ampel in Syracuse, USA ist unten, das grüne oben.
Anhänger der irischstämmigen Bevölkerung empfanden es als Diskriminierung, dass das grüne Licht unter dem roten Licht hängt und
haben die Ampel mehrfach beschädigt. Die Zerstörungswut endete erst, nachdem die Anordnung der Lichter umgedreht wurde.
Heute im Adventskalender
1 LED blau mit eingebautem Vorwiderstand
Steve lässt es schneien
Das Experiment des 4. Tags lässt es auf jedem Feld schneien, das die Spielfigur Steve betritt. In der MinecraftTM-Welt gibt es für diesen Tag keine Nummer. Bewegen Sie die Spielfigur auf eine möglichst freie Fläche, bevor Sie
das Programm starten.
Auf allen Feldern, die die Spielfigur betreten hat, liegt Schnee.
Bauteile
1 Steckbrett
1 LED blau mit eingebautem Vorwiderstand
2 GPIO-Verbindungskabel
Das Programm
Das Programm 04mc_schnee01.py legt Schnee auf jedes Feld, das die
Spielfigur Steve betritt.
#!/usr/bin/python
import mcpi.minecraft as minecraft
import mcpi.block as block
import RPi.GPIO as GPIO
import time
try:
while True:
p = mc.player.getTilePos()
mat = mc.getBlock(p.x, p.y, p.z)
if mat!=block.SNOW.id:
GPIO.output(LED, True)
time.sleep(0.1)
GPIO.output(LED, False)
mc.setBlock(p.x, p.y, p.z, block.SNOW)
except KeyboardInterrupt:
GPIO.cleanup()
Die blaue LED zeigt an, dass die Spielfigur ein Schneefeld angelegt hat.
So funktioniert das Programm
import mcpi.block as block
Zusätzlich zu den bereits bekannten Bibliotheken wird die Bibliothek mcpi.
block importiert, die die Materialien für Minecraft
hält, sodass man sich keine Nummern zu merken braucht.
LED = 18
Der GPIO-Pin für die LED wird wieder in einer Variablen gespeichert, um die
Schaltung leichter umbauen zu können.
GPIO.setup(LED, GPIO.OUT, initial=False)
Dieser Pin wird als Ausgang definiert und die LED am Anfang ausgeschaltet.
try:
while True:
p = mc.player.getTilePos()
mat = mc.getBlock(p.x, p.y, p.z)
Auch dieses Programm besteht aus einer Endlosschleife, die in jedem Durchlauf die Position der Spielfigur in der Variablen p und das Material des Blocks
in der Variablen mat speichert. Schnee ist kein vollständiger Block, sondern
nur eine dünne Schicht, die auf einem anderen Block liegt. Um zu prüfen,
ob die Spielfigur im Schnee steht, wird deshalb das Material des Blocks ausgelesen, der die Koordinaten der Spielfigur hat, und nicht das Material des
Blocks darunter.
Immer wenn die Spielfigur nicht im Schnee steht, soll die LED kurz aufblinken, und dann soll das Feld mit Schnee bedeckt werden. Man könnte auch
einfach das Feld, auf dem die Spielfigur steht, immer mit Schnee bedecken,
unabhängig davon, ob vorher Schnee darauf lag. Die LED würde dann aber
auch immer leuchten.
if mat!=block.SNOW.id:
Diese if-Abfrage prüft, ob das gespeicherte Material ungleich dem Material block.SNOW.id aus der Bibliothek mcpi.block ist. Die Zeichenfolge
Ist das der Fall, wird die LED für 0,1 Sekunden eingeschaltet und danach wieder aus.
mc.setBlock(p.x, p.y, p.z, block.SNOW)
Jetzt wird ein Block an den aktuellen Koordinaten gesetzt. Das verwendete Material block.SNOW entspricht der Material-ID 78. Danach startet die
Endlosschleife den nächsten Durchlauf und überprüft erneut, ob Steve auf
Schnee steht. Das Programm läuft, bis der Benutzer in der Python-Shell die
Tastenkombination [Strg]+[C] drückt. Zum Schluss werden die GPIO-Pins
zurückgesetzt.
Laufen Sie, nachdem Sie das Programm ausprobiert haben, über das Feld
und schlagen Sie die Schneeblöcke mit dem Schwert wieder weg, um eine
freie Spielfläche zu bekommen.
TM
-Blöcke im Klartext ent-
Heute im Adventskalender
1 GPIO-Verbindungskabel
Lauicht beim Schlag auf einen
Minecraft™-Klotz
Das Programm des 5. Tags schaltet eine kurze Lauflichtsequenz ein, wenn
die Spielfigur auf einen bestimmten Klotz schlägt, der neben der Nummer
5 in der MinecraftTM-Welt steht. Hat die Spielfigur das Schwert in der Hand,
kann sie mit einem Klick der linken Maustaste Blöcke zerschlagen. Ein Klick
mit der rechten Maustaste löst in Python ein Event aus, worauf das Programm beliebig reagieren kann.
Das Programm
Das Programm 05mc_led02.py liest die MinecraftTM-Ereignisse, die
durch Schläge auf Blöcke ausgelöst werden. Schlägt die Spielfigur auf einen
Block aus dem Material GOLD_ORE, wird eine Lauflichtsequenz ausgelöst.
#!/usr/bin/python
import mcpi.minecraft as minecraft
import mcpi.block as block
import RPi.GPIO as GPIO
import time
mc = minecraft.Minecraft.create()
LED = [18,23,25,7]
GPIO.setmode(GPIO.BCM)
for i in LED:
GPIO.setup(i, GPIO.OUT, initial=False)
try:
while True:
for hit in mc.events.pollBlockHits():
bl = mc.getBlockWithData(hit.pos.x, hit.
pos.y, hit.pos.z)
if bl.id == block.GOLD_ORE.id:
for i in LED:
GPIO.output(i,True)
time.sleep(0.05)
GPIO.output(i,False)
except KeyboardInterrupt:
GPIO.cleanup()
Diese Zeile speichert den an einer bestimmten Position getroffenen Block
in die Variable bl.
if bl.id == block.GOLD_ORE.id:
Wenn das Material dieses Blocks GOLD_ORE ist, wird der Lichteffekt ausgelöst. In diesem Programm funktioniert das auch, wenn Sie einen anderen
Block aus dem gleichen Material mit dem Schwert anschlagen. Die Koordinaten des Blocks werden nicht geprüft.
for i in LED:
GPIO.output(i,True)
time.sleep(0.05)
GPIO.output(i,False)
Eine Schleife lässt die vier LEDs kurz hintereinander für jeweils 0,05 Sekunden aufblinken. Diese Schleife läuft genau einmal, danach wartet die Hauptschleife wieder, dass ein Block angeschlagen wird.
Das Programm läuft, bis der Benutzer in der Python-Shell die Tastenkombination [Strg]+[C] drückt. Zum Schluss werden die GPIO-Pins zurückgesetzt.
Beim Schlag auf diesen Klotz blinken die LEDs.
Bauteile
1 Steckbrett
1 LED rot mit eingebautem Vorwiderstand
1 LED gelb mit eingebautem Vorwiderstand
1 LED grün mit eingebautem Vorwiderstand
1 LED blau mit eingebautem Vorwiderstand
5 GPIO-Verbindungskabel
So funktioniert das Programm
LED = [18,23,25,7]
Sobald die bereits bekannten Bibliotheken importiert sind und die Verbindung zu Minecraft
verwendeten GPIO-Pins angelegt.
for i in LED:
GPIO.setup(i, GPIO.OUT, initial=False)
Diese GPIO-Pins werden als Ausgänge initialisiert und ausgeschaltet.
try:
while True:
for hit in mc.events.pollBlockHits():
Die Hauptschleife des Programms liest jetzt in jedem Schleifendurchlauf die
Liste der Events, die durch Schwertschläge auf Blöcke ausgelöst werden. Die
Variable hit erhält unter anderem die Koordinaten des getroffenen Blocks.
hergestellt ist, wird eine Liste mit den vier für die LEDs
Vier LEDs als Lauflicht auf dem Steckbrett.
Heute im Adventskalender
1 Taster
Minecraft™-Blöcke mit einer Taste
bauen
Das Programm des 6. Tags baut MinecraftTM-Blöcke, wenn man auf einen
Taster drückt. Bei jedem Druck auf den Taster werden neun Blöcke in einer
quadratischen Anordnung (3 × 3) gebaut, und die Spielfigur wird anschließend mittig darauf gestellt. Durch mehrfaches Drücken der Taste lassen sich
so Türme bauen.
Das Programm verwendet das Material Sand, das eine besondere Eigenschaft hat. Die meisten Minecraft
beliebigen y-Koordinate bauen, wohingegen Sandblöcke immer bis auf den
Boden herunterfallen. Dadurch kann man mit dem Programm und kleinen
Bewegungen Hügellandschaften erzeugen.
Eine einfache Hügellandschaft, die das Programm erstellt hat.
Bauteile
1 Steckbrett
1 Taster
2 GPIO-Verbindungskabel
GPIO-Ports können nicht nur Daten ausgeben, zum Beispiel über LEDs,
sondern auch zur Dateneingabe verwendet werden. Dazu müssen sie im
Programm als Eingang definiert werden. Zur Eingabe verwenden wir im folgenden Projekt einen Taster, der direkt auf die Steckplatine gesteckt wird.
Der Taster hat vier Anschlusspins, wobei je zwei gegenüberliegende (großer
TM
-Blöcke lassen sich frei in der Luft an jeder
Abstand) miteinander verbunden sind. Solange die Taste gedrückt ist, sind
alle vier Anschlüsse miteinander verbunden. Im Gegensatz zu einem Schalter rastet ein Taster nicht ein. Die Verbindung wird beim Loslassen sofort
wieder getrennt.
Liegt auf einem als Eingang definierten GPIO-Port ein +3,3-V-Signal an, wird
es als logisches True bzw. 1 ausgewertet.
Ein Druck auf den Taster verbindet in unserer Schaltung den GPIO-Pin 8 mit
+3,3 V. Lässt man den Taster wieder los, bekommt der Eingang einen undefinierten Zustand, was in der Digitalelektronik nicht passieren darf. Für solche
Fälle verfügen alle GPIO-Pins über sogenannte Pull-down-Widerstände, die
einen Eingang, an dem kein Signal anliegt, automatisch auf False herunterziehen.
Ein Taster auf dem Steckbrett.
Das Programm
Neben der Zahl 6 in der MinecraftTM-Welt befindet sich eine große graue Fläche, auf der man die aus Sand aufgebauten Klötze besser erkennen kann als
auf der Sandfläche. Das Programm 06mc_taster01.py baut bei jedem
Druck auf den Taster neun Blöcke in einer quadratischen Anordnung (3 × 3)
rund um die aktuelle Position der Spielfigur und stellt die Spielfigur anschließend mittig darauf.
#!/usr/bin/python
import mcpi.minecraft as minecraft
import mcpi.block as block
import RPi.GPIO as GPIO
import time
try:
while True:
if GPIO.input(t1)==True:
p = mc.player.getTilePos()
mc.setBlocks(p.x-1, p.y, p.z-1, p.x+1, p.y,
p.z+1, block.SAND)
mc.player.setPos(p.x, p.y+1, p.z)
time.sleep(0.2)
except KeyboardInterrupt:
GPIO.cleanup()
So funktioniert das Programm
t1 = 8
Sobald die bereits bekannten Bibliotheken importiert sind und die Verbindung zu Minecraft
GPIO-Pin in der Variablen t1 gespeichert.
GPIO.setup(t1, GPIO.IN, GPIO.PUD_DOWN)
Dieser GPIO-Pin wird als Eingang initialisiert, und der auf dem Raspberry Pi
eingebaute Pull-down-Widerstand wird eingeschaltet.
try:
while True:
if GPIO.input(t1)==True:
Die Endlosschleife wartet darauf, dass der Taster gedrückt wird. Dabei bekommt der GPIO-Pin den Wert True, da er über den Taster mit +3,3 V verbunden wird.
p = mc.player.getTilePos()
Jetzt wird die Position der Spielfigur in der Variablen p gespeichert.
Die Funktion setBlocks() setzt in Form eines Kubus mehrere Blöcke auf
einmal. Dazu brauchen nur zwei gegenüberliegende Ecken dieses Kubus
angegeben zu werden. Der Kubus ist hier 3 × 3 Einheiten in der Fläche groß
und eine Einheit dick.
mc.player.setPos(p.x, p.y+1, p.z)
Jetzt wird die Spielfigur eine Einheit nach oben versetzt, sie befindet sich
dann in der Mitte auf den neu angelegten Blöcken.
time.sleep(0.2)
Das Programm wartet 0,2 Sekunden, um Tastenprellen zu vermeiden. So
wird sichergestellt, dass ein etwas längeres Drücken des Tasters gleich mehrere Schichten von Blöcken anlegt. Danach startet die Endlosschleife neu.
Das Programm läuft, bis der Benutzer in der Python-Shell die Tastenkombination [Strg]+[C] drückt. Zum Schluss werden die GPIO-Pins zurückgesetzt.
TM
hergestellt ist, wird der für den Taster verwendete
Achtung
Verwenden Sie nie die +5-V-Pins des Raspberry Pi für Logiksignale in Schaltungen. 5 V würden die GPIO-Eingänge überlasten und den Raspberry Pi
beschädigen.
Heute im Adventskalender
1 Schaltdraht
Der Schaltdraht wird für verschiedene Experimente benötigt, um Brücken
zwischen verschiedenen Kontaktreihen auf dem Steckbrett herzustellen.
Schneiden Sie den Draht mit einem kleinen Seitenschneider je nach Experiment auf die passenden Längen ab. Um die Drähte besser in die Steckplatine
stecken zu können, empfiehlt es sich, sie leicht schräg abzuschneiden, sodass
eine Art Keil entsteht. Entfernen Sie an beiden Enden auf einer Länge von
etwa einem halben Zentimeter die Isolierung.
LEDs dimmen
LEDs können zwei verschiedene Zustände annehmen, ein und aus. Das Gleiche gilt für die als digitale Ausgänge definierten GPIO-Ports. Demnach wäre
es theoretisch nicht möglich, eine LED zu dimmen.
Mit einem Trick erreicht man es dennoch, die Helligkeit einer LED an einem
digitalen GPIO-Port zu regeln. Lässt man eine LED schnell genug blinken,
nimmt das menschliche Auge dies nicht mehr als Blinken wahr. Die als Pulsweitenmodulation (PWM) bezeichnete Technik erzeugt ein pulsierendes Signal, das sich in sehr kurzen Abständen ein- und ausschaltet. Die Spannung
des Signals bleibt immer gleich, nur das Verhältnis zwischen Level False
(0 V) und Level True (+3,3 V) wird verändert. Das Tastverhältnis gibt das
Verhältnis der Länge des eingeschalteten Zustands zur Gesamtdauer eines
Schaltzyklus an. Je kleiner das Tastverhältnis, desto kürzer ist die Leuchtzeit
der LED innerhalb eines Schaltzyklus. Dadurch wirkt die LED dunkler als eine
permanent eingeschaltete LED.
Die Drahtbrücke wird dazu verwendet, zwei Kontaktreihen des Steckbretts
zu verbinden, um so zwei LEDs an einem GPIO-Pin des Raspberry Pi anzuschließen. Das ist möglich, um beide LEDs genau gleich zu schalten. Schließen Sie nicht zu viele LEDs auf diese Weise an einem GPIO-Pin an, dieser
kann überlastet werden. Zwei oder drei LEDs funktionieren aber problemlos.
Das Programm
Das Programm 07mc_pwm01.py zeigt, wie PWM-Signale mit Python
ausgegeben werden. Neben der Zahl 7 in der MinecraftTM-Welt sind zwei
stilisierte Pfeile in den Boden eingelassen. Der Pfeil nach oben lässt beim
Daraufschlagen mit dem Schwert die LED schrittweise heller leuchten, der
andere lässt sie jedes Mal einen Schritt dunkler leuchten.
#!/usr/bin/python
import mcpi.minecraft as minecraft
import mcpi.block as block
import RPi.GPIO as GPIO
import time
try:
while True:
for hit in mc.events.pollBlockHits():
bl = mc.getBlockWithData(hit.pos.x, hit.
pos.y, hit.pos.z)
if bl.id == block.GOLD_ORE.id and pwm<100:
pwm += 10
if bl.id == block.IRON_ORE.id and pwm>0:
pwm -= 10
l.ChangeDutyCycle(pwm)
time.sleep(0.1)
except KeyboardInterrupt:
l.stop()
GPIO.cleanup()
So funktioniert das Programm
LED = 23
Sobald die bereits bekannten Bibliotheken importiert sind und die Verbindung zu Minecraft
Pin in der Variablen LED gespeichert.
GPIO.setup(LED, GPIO.OUT, initial=False)
TM
hergestellt ist, wird der für die LED verwendete GPIO-
Dieser GPIO-Pin wird als Ausgang initialisiert und ausgeschaltet.
pwm = 0
Das Tastverhältnis des PWM-Signals wird in der Variablen pwm gespeichert
und am Anfang auf 0 gesetzt.
l = GPIO.PWM(LED, 50)
Die Funktion GPIO.PWM() aus der GPIO-Bibliothek ist entscheidend für die
Ausgabe von PWM-Signalen. Diese Funktion benötigt zwei Parameter, den
GPIO-Pin und die Frequenz des PWM-Signals. In unserem Fall wird der GPIOPin über die Variable LED festgelegt, die Frequenz ist 50 Hertz (Schwingungen pro Sekunde).
Warum 50 Hertz die ideale Frequenz für PWM sind
Das menschliche Auge nimmt Lichtwechsel schneller als 20 Hertz nicht
mehr wahr. Da das Wechselstromnetz in Europa eine Frequenz von
50 Hertz nutzt, blinken viele Beleuchtungskörper mit dieser Frequenz,
die vom Auge nicht wahrgenommen wird. Würde eine LED mit mehr
als 20 Hertz, aber weniger als 50 Hertz blinken, käme es zu Interferenzen mit anderen Lichtquellen, wodurch der Dimmeffekt nicht mehr
gleichmäßig erschiene.
GPIO.PWM() erzeugt ein Objekt, das in der Variablen l gespeichert wird.
l.start(pwm)
Die Methode start() startet die Generierung des PWM-Signals. Dazu
muss noch ein Tastverhältnis angegeben werden. In unserem Fall ist das Tastverhältnis 0, was vorher in der Variablen pwm gespeichert wurde. Die LED ist
also immer ausgeschaltet. Python verwendet für PWM Werte zwischen 0 und
100, die direkt dem Prozentsatz der eingeschalteten Zeit des Pins innerhalb
eines Frequenzzyklus entsprechen. Ein PWM-Wert von 25 schaltet die LED
also ein Viertel der Zeit ein, die übrigen drei Viertel des Zyklus aus.
try:
while True:
for hit in mc.events.pollBlockHits():
bl = mc.getBlockWithData(hit.pos.x, hit.
pos.y, hit.pos.z)
Die Hauptschleife des Programms wartet wieder darauf, dass der Spieler mit
dem Schwert auf einen Block schlägt, und speichert diesen Block dann als
Objekt bl.
if bl.id == block.GOLD_ORE.id and pwm<100:
pwm += 10
Besteht der getroffene Block aus dem Material GOLD_ORE, ist es also der
Pfeil nach oben, wird der PWM-Wert bei jedem Schlag um 10 erhöht. Dies
soll aber nur passieren, solange der PWM-Wert noch kleiner als 100 ist, da
höhere Werte nicht verarbeitet werden können. Ein PWM-Signal von 100
entspricht einer voll eingeschalteten LED.
if bl.id == block.IRON_ORE.id and pwm>0:
pwm -= 10
Schlägt der Spieler auf einen Block aus dem Material IRON_ORE, also den
Pfeil nach unten, wird der PWM-Wert bei jedem Schlag um 10 verringern,
solange er noch größer als 0 ist.
l.ChangeDutyCycle(pwm)
time.sleep(0.1)
Unabhängig davon, was diese Abfragen ergeben haben, wird das PWM-Signal auf den neuen Wert gesetzt und danach eine Zehntelsekunde gewartet.
Solche Wartezeiten werden in Schleifen eingefügt, damit der Raspberry Pi
nicht vollständig damit beschäftigt ist, das Python-Programm auszuführen.
In diesem Fall würde sich Minecraft
TM
deutlich träger verhalten.
except KeyboardInterrupt:
l.stop()
GPIO.cleanup()
Beim Drücken der Tastenkombination [Strg]+[C] auf der Tastatur wird vor
dem Zurücksetzen der GPIO-Pins noch das PWM-Signal beendet.