Conrad 4019631150011 Operation Manual [de]

POWERED BY
HANDBUCH
TM
15001-1 HB_U1.qxp_Layout 1 27.04.17 10:02 Seite 1
Adventskalender 2017 für
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 üb­rigens aus den beiden englischen Begriffen Mine (= Bergbau, Rohstoffab­bau) 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 brin­gen 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 Elemen­te 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üs­sen, 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 miteinan­der 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 dar­gestellt, das die Flussrichtung vom Pluspol zum Minuspol oder zur Masselei­tung angibt. Eine LED lässt in der Durchflussrichtung nahezu beliebig viel Strom durch, sie hat nur einen sehr geringen Widerstand. Um den Durch­flussstrom zu begrenzen und damit ein Durchbrennen der LED zu verhin­dern, wird üblicherweise zwischen dem verwendeten GPIO-Pin und der Anode der LED oder zwischen Kathode und Massepin ein 220-Ohm-Vorwi­derstand 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 elektroni­schen 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 sil­berfarben – 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 farbi­gen Ringe auf Widerständen.
Farbe Widerstandswert in Ohm
1. Ring (Zehner)
Silber 10
Gold 10 Schwarz 0 10 Braun 1 1 10 Rot 2 2 10 Orange 3 3 10
Gelb 4 4 10 Grün 5 5 10
Blau 6 6 10
Violett 7 7 10
Grau 8 8 10
Weiß 9 9 10
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 dage­gen 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 Schutz­widerstand 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 Rasp­berry Pi liefert. Diese Pins dürfen aber nicht mit einem GPIO-Eingang ver­bunden 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-Versi­on 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 forma­tieren: 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 ko­pieren.
4. SD-Karte aus dem PC nehmen, in den Raspberry Pi stecken und boo­ten. 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 set­zen, 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 unsi­cheren 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 an­geschlossen 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 Ab­bildung 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 Brow­ser 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 Dateimana­ger-Menü unter Ansicht die Option Versteckte anzeigen eingeschaltet sein.
Minecraft™
MinecraftTM, das beliebte Weltenbauer-Spiel, ist in der aktuellen Raspbi­an-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 Roh­stoffe zu verarbeiten und daraus andere Dinge zu bauen. Der Spieler über­nimmt 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äh­rend 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 Flug­hö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 jeder­zeit 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 verlas­sen oder über ein Symbol links oben auf die Sicht eines außenstehen­den 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 zurechtfin­den. 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 Pro­gramm 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-Pro­gramm 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 Adventskalen­der, 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 vorin­stalliert, sogar in zwei verschiedenen Versionen. Python 3 ist nicht, wie der Name vermuten lässt, einfach eine neuere Version von Python 2. Die Spra­chen 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 funk­tioniert. 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 Down­load 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üs­sen 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 je­des 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 Funk­tionen 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 Eigen­schaften 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 Be­zeichnungen 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 vorgegebe­nem 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 Bedin­gung 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 ma­chen. 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 Ent­scheidungen zu beenden.
p = mc.player.getTilePos()
Die eingerückten Zeilen werden in jedem Schleifendurchlauf einmal ausge­fü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öt­ze gezählt. Im Gegensatz zu vielen bekannten 3-D-Programmen hat die ho­rizontale 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 er­gibt. 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 if­Abfrage 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.
else: GPIO.output(18, True) GPIO.output(23, False)
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 War­nungen 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 überneh­men 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
mc = minecraft.Minecraft.create() rot = 0 gelb = 1 gruen = 2 Ampel=[18,23,25]
GPIO.setmode(GPIO.BCM) GPIO.setup(Ampel[rot], GPIO.OUT, initial=True) GPIO.setup(Ampel[gelb], GPIO.OUT, initial=False) GPIO.setup(Ampel[gruen], GPIO.OUT, initial=False)
try: while True: p = mc.player.getTilePos() mat = mc.getBlock(p.x, p.y-1, p.z) if mat==42: GPIO.output(Ampel[gelb],True) time.sleep(0.6) GPIO.output(Ampel[rot],False) GPIO.output(Ampel[gelb],False) GPIO.output(Ampel[gruen],True) time.sleep(2) GPIO.output(Ampel[gruen],False) GPIO.output(Ampel[gelb],True) time.sleep(0.6) GPIO.output(Ampel[gelb],False) GPIO.output(Ampel[rot],True) time.sleep(2)
except KeyboardInterrupt: GPIO.cleanup()
Der Ampelzyklus
Farbe(n) Zeit
Rot/Gelb 0.6 sek Grün 2.0 sek Gelb 0.6 sek Rot 2.0 sek
Drei LEDs simulieren eine Ampel am Raspberry Pi.
So funktioniert das Programm
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 Num­mern der drei Listenelemente werden in den drei Variablen rot, gelb und
gruen gespeichert und können so sehr einfach zugeordnet werden.
GPIO.setup(Ampel[rot], GPIO.OUT, initial=True)
GPIO.setup(Ampel[gelb], GPIO.OUT, initial=False) GPIO.setup(Ampel[gruen], GPIO.OUT, initial=False)
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 aus­gibt, wird die Endlosschleife in eine try:…except:-Konstruktion einge­bettet, die am Ende die GPIO-Ports wieder schließt.
p = mc.player.getTilePos()
Am Anfang speichert die Endlosschleife wieder in jedem Durchlauf die Posi­tion 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 verwen­deten Blöcke ist 42.
== ist nicht gleich =
Das doppelte Gleichheitszeichen == steht für eine Gleichheitsabfrage, das einfache Gleichheitszeichen = wird dagegen für Variablenzuweisungen ver­wendet.
GPIO.output(Ampel[gelb],True) time.sleep(0.6)
Steht die Spielfigur auf einem Block mit dieser Material-ID, beginnt der Am­pelzyklus, indem die gelbe LED zusätzlich zu der bereits leuchtenden roten eingeschaltet wird. Danach wartet das Programm 0,6 Sekunden.
GPIO.output(Ampel[rot],False) GPIO.output(Ampel[gelb],False) GPIO.output(Ampel[gruen],True) time.sleep(2)
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 Zwi­schenphasen Rot/Gelb und Gelb.
GPIO.output(Ampel[gruen],False) GPIO.output(Ampel[gelb],True) time.sleep(0.6) GPIO.output(Ampel[gelb],False) GPIO.output(Ampel[rot],True) time.sleep(2)
Anschließend schaltet die Ampel über Gelb auf Rot und wartet wieder 2 Se­kunden, 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 Tastenkombina­tion [Strg]+[C] abbricht.
Am Ende eines Programms sollten alle verwendeten GPIO-Pins wieder zu­rückgesetzt werden, um Warnungen beim nächsten Programmstart zu vermeiden. Die letzte Zeile dieses Programms erledigt das für alle vom Pro­gramm initialisierten GPIO-Pins auf einmal. Pins, die von anderen Program­men 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 katho­lischen 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ßen­verkehrsgesetz werden Verkehrsampeln als ‚Lichtsignalanlage‘, ab­gekü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 Wie­dervereinigung abgeschafft, da es nicht den Richtlinien für Lichtsi­gnalanlagen (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äs­sigen Geschwindigkeit auf der Straße abhängen:
Geschwindigkeit Gelbphase
50 km/h 3 sek. 60 km/h 4 sek. 70 km/h 5 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 Dis­kriminierung, dass das grüne Licht unter dem roten Licht hängt und haben die Ampel mehrfach beschädigt. Die Zerstörungswut ende­te 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 Spielfi­gur Steve betritt. In der MinecraftTM-Welt gibt es für diesen Tag keine Num­mer. 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
mc = minecraft.Minecraft.create() LED = 18
GPIO.setmode(GPIO.BCM) GPIO.setup(LED, GPIO.OUT, initial=False)
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 Durch­lauf 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 aus­gelesen, 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 aufblin­ken, 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 Materi­al block.SNOW.id aus der Bibliothek mcpi.block ist. Die Zeichenfolge
!= steht in Python für ungleich.
GPIO.output(LED, True) time.sleep(0.1) GPIO.output(LED, False)
Ist das der Fall, wird die LED für 0,1 Sekunden eingeschaltet und danach wie­der aus.
mc.setBlock(p.x, p.y, p.z, block.SNOW)
Jetzt wird ein Block an den aktuellen Koordinaten gesetzt. Das verwende­te 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
Lauicht 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 Pro­gramm 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 ausge­löst. In diesem Programm funktioniert das auch, wenn Sie einen anderen Block aus dem gleichen Material mit dem Schwert anschlagen. Die Koordi­naten 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 Sekun­den aufblinken. Diese Schleife läuft genau einmal, danach wartet die Haupt­schleife wieder, dass ein Block angeschlagen wird.
Das Programm läuft, bis der Benutzer in der Python-Shell die Tastenkom­bination [Strg]+[C] drückt. Zum Schluss werden die GPIO-Pins zurückge­setzt.
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 Verbin­dung 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.
bl = mc.getBlockWithData(hit.pos.x, hit. pos.y, hit.pos.z)
TM
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 Eigen­schaft 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 fol­genden 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 Schal­ter 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 undefi­nierten 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 herun­terziehen.
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
mc = minecraft.Minecraft.create() t1 = 8
GPIO.setmode(GPIO.BCM) GPIO.setup(t1, GPIO.IN, GPIO.PUD_DOWN)
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 Ver­bindung 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 be­kommt der GPIO-Pin den Wert True, da er über den Taster mit +3,3 V ver­bunden wird.
p = mc.player.getTilePos()
Jetzt wird die Position der Spielfigur in der Variablen p gespeichert.
mc.setBlocks(p.x-1, p.y, p.z-1, p.x+1, p.y, p.z+1, block.SAND)
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 meh­rere Schichten von Blöcken anlegt. Danach startet die Endlosschleife neu.
Das Programm läuft, bis der Benutzer in der Python-Shell die Tastenkombina­tion [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 Schal­tungen. 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 Experi­ment 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 Glei­che 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 Puls­weitenmodulation (PWM) bezeichnete Technik erzeugt ein pulsierendes Si­gnal, 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.
Links: Tastverhältnis 50 % – rechts: Tastverhältnis 20 %.
Bauteile
1 Steckbrett
1 LED rot mit eingebautem Vorwiderstand
1 LED gelb mit eingebautem Vorwiderstand
1 Drahtbrücke
2 GPIO-Verbindungskabel
Zwei LEDs, an einem GPIO-Pin angeschlossen.
Die Drahtbrücke wird dazu verwendet, zwei Kontaktreihen des Steckbretts zu verbinden, um so zwei LEDs an einem GPIO-Pin des Raspberry Pi anzu­schließ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
mc = minecraft.Minecraft.create() LED = 23
GPIO.setmode(GPIO.BCM) GPIO.setup(LED, GPIO.OUT, initial=False)
pwm = 0 l = GPIO.PWM(LED, 50) l.start(pwm)
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 Verbin­dung 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 GPIO­Pin über die Variable LED festgelegt, die Frequenz ist 50 Hertz (Schwingun­gen 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 Interferen­zen 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 Tast­verhä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-Si­gnal 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.
Spielfigur Steve schlägt auf die Pfeilsymbole
Der Tag 7 in der MinecraftTM-Welt
Die Minecraft™-Blocktypen
Material ID Material ID
AIR 0 STONE_SLAB 44 STONE 1 BRICK_BLOCK 45 GRASS 2 TNT 46 DIRT 3 BOOKSHELF 47 COBBLESTONE 4 MOSS_STONE 48 WOOD_PLANKS 5 OBSIDIAN 49 SAPLING 6 TORCH 50 BEDROCK 7 FIRE 51 WATER_FLOWING 8 STAIRS_WOOD 53 WATER 8 CHEST 54 WATER_STATIONARY 9 DIAMOND_ORE 56 LAVA_FLOWING 10 DIAMOND_BLOCK 57 LAVA 10 CRAFTING_TABLE 58 LAVA_STATIONARY 11 FARMLAND 60 SAND 12 FURNACE_INACTIVE 61 GRAVEL 13 FURNACE_ACTIVE 62 GOLD_ORE 14 DOOR_WOOD 64 IRON_ORE 15 LADDER 65 COAL_ORE 16 STAIRS_COBBLESTONE 67 WOOD 17 DOOR_IRON 71 LEAVES 18 REDSTONE_ORE 73 GLASS 20 SNOW 78 LAPIS_LAZULI_ORE 21 ICE 79 LAPIS_LAZULI_BLOCK 22 SNOW_BLOCK 80 SANDSTONE 24 CACTUS 81 BED 26 CLAY 82 COBWEB 30 SUGAR_CANE 83 GRASS_TALL 31 FENCE 85 WOOL 35 GLOWSTONE_BLOCK 89 FLOWER_YELLOW 37 BEDROCK_INVISIBLE 95 FLOWER_CYAN 38 STONE_BRICK 98 MUSHROOM_BROWN 39 GLASS_PANE 102 MUSHROOM_RED 40 MELON 103 GOLD_BLOCK 41 FENCE_GATE 107 IRON_BLOCK 42 GLOWING_OBSIDIAN 246 STONE_SLAB_DOUBLE 43 NETHER_REACTOR_
CORE247
Loading...
+ 30 hidden pages