Inhalt
- Nicht Ihr gewöhnliches Hello World Tutorial
- Der Pi
- Das Breakout Board
- Der Code: Gesamtbild
- Der Code: Importe
- Der Code: GPIO-Setup
- Der Code: Spielfunktion
- Die volle Spielfunktion
- Der Code: Rufen Sie die Funktion auf
- Der ganze Code
- Videodemonstration
Ich liebe es, Ratschläge zu geben, wie man programmiert und wie man Gadgets verwendet, um coole Projekte zu erstellen.
Nicht Ihr gewöhnliches Hello World Tutorial
Ich weiß nichts über dich, aber da ich mir selbst das Programmieren beigebracht habe, stoße ich immer wieder auf die gleichen Arten von Tutorials in jeder Sprache: "Hallo Welt" und "Wie man ein Adressbuch erstellt". Während beide großartig sind, um die Grundlagen zu lernen, mag ich keine willkürlichen Projekte, selbst wenn es mich lehrt.
Als ich letztes Jahr meinen Raspberry Pi 2 bekam, beschloss ich, Python damit zu lernen, und ich würde sicherlich nicht nur 'Hello World'-Tutorials machen. Das Ergebnis meines Projekts ist ein Spiel, bei dem Benutzereingaben über die GPIO-Pins von Schaltflächen auf meinem Steckbrett abgerufen werden. In diesem Tutorial werden wir dieses Spiel neu erstellen und versuchen zu lernen, was genau wir mit jeder Codezeile machen, anstatt am Ende nur ein einfaches Spiel zu kopieren, einzufügen und zu spielen.
Der Pi
Lass uns anfangen.
Ich mache das alles auf einem Raspberry Pi 2 mit Raspbian Jessie. Der Pi ist über ein Ethernet-Kabel mit meinem lokalen Netzwerk verbunden (wenn Sie den WI-FI-Adapter haben, funktioniert das genauso gut), und ich werde von meinem MacBook Pro aus darauf zugreifen. Sie können dies alles lokal auf dem Pi tun, wenn Sie es an einen Monitor, eine Tastatur und eine Maus angeschlossen haben.
Das Breakout Board
Lassen Sie uns unser Breakout-Board einrichten. Wenn Sie es nicht wissen, geht das Board auf dem langen Weg von oben nach unten. Jede horizontale Reihe ist dieselbe Verbindung, sodass alles, was horizontal nebeneinander liegt, gleichzeitig mit Strom versorgt wird.
Ich habe ein Bild meines tatsächlichen Breakout-Boards und eine digitale Wiedergabe der allgemeinen Idee beigefügt. Das digitale Design wurde in Fritzing-Software erstellt. Es ist keine perfekte Wiedergabe, da es nicht die Option bot, den Schuster einzuschließen, aber es bringt den Punkt auf den Punkt.
Die LEDs sind wie folgt angeschlossen. Rot ist über einen 220 Ω-Widerstand (Rot, Rot, Braun, Gold-Farbcode) positiv mit Pin 27 und negativ mit 3 V negativ verbunden. Stellen Sie sicher, dass Sie einen Widerstand verwenden, da sonst Ihre LED wahrscheinlich ausgeblasen wird. Grün ist über einen 220 Ω-Widerstand positiv mit Pin 22 und negativ mit 3 V negativ verbunden. Der obere Knopf ist positiv mit 17 und negativ mit Masse verbunden. Der untere Knopf ist positiv mit 18 und negativ mit Masse verbunden.
Lassen Sie uns zunächst darüber sprechen, was unser Endziel ist. Wenn das Spiel gestartet wird, wird auf dem Terminalbildschirm ein Absatz angezeigt, der die Geschichte einer Zeitbombe erzählt. Als einzige Person muss der Spieler entscheiden, ob er den roten oder den blauen Draht abschneiden soll (in diesem Fall sind die Drähte die Knöpfe auf dem Breakout-Board). Wenn der Benutzer eine Taste drückt, blinkt entweder ein rotes oder grünes Licht und eine Glückwunsch- oder Fehlermeldung auf dem Bildschirm. Um dieses Spiel wirklich zufällig zu machen, verwenden wir einen Zufallszahlengenerator und einige grundlegende Berechnungen, um festzustellen, welche Schaltfläche die richtige ist und welche zum Tod vieler unschuldiger Zuschauer führt.Der Code: Gesamtbild
Der Code: Importe
OK, lass uns zu den lustigen Sachen kommen.
Zuerst müssen wir die Frameworks importieren, die wir in diesem Spiel verwenden werden: zufällig, zeitlich und gpio.
#Import Frameworks aus Random Import Randint Import RPi.GPIO als GPIO Importzeit
Ich füge immer Kommentare hinzu, um sicherzustellen, dass ich mich daran erinnere, was jeder Block tut, wenn ich später zurückkehre (oder wenn jemand dies jemals sieht).
Um die Größe und die Rechenanforderungen zu begrenzen, importieren wir nur den Randint-Teil des Random-Frameworks. Dies ist keine so große Sache in einem so kleinen Programm wie diesem, aber es ist eine gute Praxis, sich darauf einzulassen.
Um die Interaktion mit dem GPIO-Framework zu vereinfachen, importieren wir es als GPIO. GPIO ist jetzt eine Variable, die uns daran hindert, jedes Mal RPi.GPIO zu schreiben. Sie können den Variablennamen nach Belieben ändern.
Wir brauchen ein paar Sekunden, in denen wir während dieses Spiels verzögern oder warten, damit wir Zeit importieren.
Der Code: GPIO-Setup
Jetzt müssen wir dem Pi mitteilen, welche Pins wir für dieses Projekt verwenden werden. Denken Sie daran, dass wir für dieses Projekt keine direkte Verbindung zu den Komponenten herstellen, sondern diese über ein Breakout-Board mit einem CanaKit 40-poligen T-förmigen Schuster abbilden.
#GPIO Setup GPIO.setwarnings (False) GPIO.setmode (GPIO.BCM) GPIO.setup (17, GPIO.IN, pull_up_down = GPIO.PUD_UP) #Top Button GPIO.setup (18, GPIO.IN, pull_up_down = GPIO. PUD_UP) #Bottom Button GPIO.setup (27, GPIO.OUT) #Red GPIO.setup (22, GPIO.OUT) #Green
Zunächst deaktivieren wir die GPIO-Warnungen. Der Code funktioniert ohne diese Zeile, aber Sie erhalten jedes Mal eine Warnung, wenn Sie ihn ausführen. Ignorieren Sie ihn daher am besten.
Jetzt müssen wir dem Code mitteilen, dass wir ihn dem Breakout Board zuordnen. Ich bin ehrlich, ich verstehe diesen Teil nicht vollständig. Ich weiß nur nicht, dass wir diese Codezeile einfügen müssen, damit sich unsere Zahlen besser ausrichten können.
Die letzten 4 Zeilen machen alle dasselbe, sie teilen dem Pi mit, welche Pins wir verwenden und welche Zeit des Geräts sich am anderen Ende der Pin-Schaltung befindet: Eingang oder Ausgang.
Der Code: Spielfunktion
Jetzt können wir eine Funktion erstellen. Lassen Sie uns eine Minute über Funktionen sprechen. Funktionen nehmen viele Anweisungen und verwandeln sie in eine einzelne 'Variable' (nicht die richtige Terminologie, aber gehen Sie mit mir darauf ein), die Sie später aufrufen können. In diesem Fall teilen wir dem Programm mit, was das Spiel ist, aber wir lassen es nicht laufen, bis wir dazu bereit sind. Auf diese Weise können wir das Spiel auch stoppen oder zusätzliche Funktionen hinzufügen, wenn wir dies später möchten.
Da diese Funktion sehr lang ist, werde ich die Codesegmente in kürzere Segmente aufteilen. Denken Sie daran, ist alles Teil der Spielfunktion. Ich werde den vollständigen Funktionscode sowie den vollständigen Programmcode später einfügen. Aber ich möchte niemanden auf einmal mit einer Menge Code überwältigen.
def game ():
Zuerst definieren wir unsere Funktion und geben ihr einen Namen. Ich habe mich entschieden, hier wirklich kreativ zu sein und es Spiel zu nennen.
# Zufallszahl x = Randint (0,9) # Bestimmen Sie, ob die Zahl gerade oder ungerade ist. Y = x% 2
Jetzt wählen wir eine Nummer. Da wir Randint verwendet haben, ist die Zahl eine Ganzzahl (das bedeutet keine Dezimalstellen für diejenigen unter Ihnen, die Mathe hassen), und in Klammern übergeben wir 0, 9 als Argumente. In diesem Fall beträgt der Bereich der Ganzzahlen 0-9. Realistisch gesehen könnten wir (1, 2) tun und die Ganzzahl auf 1 oder 2 beschränken, aber wir tun dies, um unser Lernen zu verbessern, also gehen wir mit 0-9.
Jetzt müssen wir es auf eine 50/50-Option bringen. Ich entschied mich dafür, indem ich feststellte, ob die Zahl gerade oder ungerade war. Dazu verwenden wir eine Funktion namens Modulo, dargestellt durch%. Wiederum gibt Modulo für Nicht-Mathematiker den Rest eines Teilungsproblems zurück, also 27/5 = 5 Rest 3 und 27% 5 = 3. Dies kann ungerade oder gerade bestimmen, weil wir wissen, dass eine gerade Zahl geteilt durch 2 hat kein Rest, daher ist jede gerade Zahl Modulo 2 0.
In diesem Fall ist x unsere zufällige Ganzzahl, daher machen wir y zu unserer Gleichung, um ungerade oder gerade zu bestimmen. Y ist also x% 2, was bedeutet, dass die einzigen möglichen Ergebnisse, die y liefern könnte, 0 oder 1 sind. Jetzt haben wir unsere 50/50-Option.
#Story print "Sie gehen eines Tages beiläufig die Straße entlang, wenn Sie aus dem Nichts eine tickende Zeitbombe bemerken, die explodieren kann. Sie erinnern sich sofort an die Tage Ihres Bombengeschwaders und stürzen in Aktion. Sie haben die Bombe fast entschärft, aber Sie müssen Wählen Sie jetzt: roter oder blauer Draht. Sie haben 10 Sekunden Zeit. " time.sleep (1) print "Mit Bedacht wählen"
Jedes gute Spiel braucht eine Geschichte. Hier geben wir die Geschichte einfach im Klartext in das Terminalfenster aus. Dann warten wir 1 Sekunde und fordern den Benutzer auf, mit Bedacht zu wählen.
#Button Steuert while (GPIO.input (17) == True oder GPIO.input (18) == True): #Hören Sie auf die Eingabe über die Schaltflächen topButton = GPIO.input (17) bottomButton = GPIO.input (18) if ( topButton == False): #Top-Taste gedrückt, wenn (y == 0): #Wenn die Zahl gerade war und Sie die obere Taste gedrückt haben, verlieren Sie den Druck ("Sie sind gescheitert. Unzählige Menschen sind aufgrund Ihrer Inkompetenz und Ihnen gestorben wurden auf nichts als ein paar subatomare Partikel reduziert, die für das menschliche Auge kaum sichtbar sind. ") GPIO.output (27, GPIO.HIGH) time.sleep (.3) else: #Wenn die Zahl ungerade war und Sie die Taste gedrückt haben Top Button, du gewinnst. print ("Gut gemacht! Sie haben die Bombe erfolgreich entschärft und viele Leben gerettet. Sie sind ein internationaler Held!") GPIO.output (22, GPIO.HIGH) time.sleep (.3)
Nun der Code für die Tasten. Beachten Sie, dass beim Drücken einer Taste false zurückgegeben wird. Wenn nicht gedrückt, ist es wahr. Für mich scheint es ein wenig rückwärts zu sein, aber es wurde von jemandem entworfen, der schlauer ist als ich.
Dieses Spiel wird in einer while-Schleife ausgeführt, die besagt, dass der Pi weiterhin auf die Eingabe wartet, während eine der Tasten nicht gedrückt wird.
Um den Code zu vereinfachen, habe ich jede GPIO-Tasteneingabe als eine englische benannte Variable deklariert, damit sie sich nicht merken muss, welche Nummer welche ist. Die Variablen 'topbutton' und 'bottomombutton' entsprechen ihrer Position auf dem Breakout Board.
Jetzt verwenden wir eine if / elif-Anweisung. Ich habe es hier zwischen zwei Segmenten aufgeteilt, um das Lesen zu erleichtern. Die obere Taste gewinnt, wenn der Benutzer sie drückt und die Zufallszahl von früher ungerade ist. Wenn sie den oberen Knopf drücken und die Zahl gerade ist, verlieren sie. Wir sagen also, wenn der Benutzer die obere Taste berührt, prüfen wir, ob y gleich 0 ist (Zufallszahl war gerade), drucken die Verlustmeldung aus und schalten das rote Licht ein. Andernfalls (also ist y 1 oder die Zufallszahl war ungerade) wird die Gewinnmeldung angezeigt und das grüne Licht eingeschaltet.
Dies ist das erste Mal, dass wir die GPIO.output-Funktion verwenden. Bei LEDs geben wir entweder HIGH für Ein oder LOW für Aus aus. Da wir GPIO früher als Variable eingerichtet haben, können wir einfach GPIO.output (Pin-Nummer, HIGH oder LOW) sagen, um das Licht ein- oder auszuschalten.
Der time.sleep (.3) verhindert, dass der Computer Ihren Bildschirm mit Tausenden von Sieg- oder Fehlermeldungen füllt. Sie haben genug Zeit, um den Finger vom Knopf zu nehmen.
elif (bottomButton == False): #Button-Taste gedrückt, wenn (y == 1): #Wenn die Zahl ungerade war und Sie die untere Taste gedrückt haben, verlieren Sie. print ("Sie haben versagt. Unzählige Menschen sind aufgrund Ihrer Inkompetenz gestorben und Sie wurden auf nur wenige subatomare Partikel reduziert, die für das menschliche Auge kaum sichtbar sind.") GPIO.output (27, GPIO.HIGH) time. sleep (.3) else: #Wenn die Zahl gerade war und Sie den unteren Knopf gedrückt haben, gewinnen Sie. print ("Gut gemacht! Sie haben die Bombe erfolgreich entschärft und viele Leben gerettet. Sie sind ein internationaler Held!") GPIO.output (22, GPIO.HIGH) time.sleep (.3) time.sleep (.3) # Lassen Sie das Licht für 0,3 Sekunden GPIO.output (22, GPIO.LOW) eingeschaltet. # Grün ausschalten GPIO.output (27, GPIO.LOW) # Rot ausschalten
Jetzt führen wir die gleiche Berechnung durch, mit Ausnahme der unteren Schaltfläche. Dieser Abschnitt wird ignoriert, wenn die obere Taste gedrückt wird, und der vorherige Abschnitt wird ignoriert, wenn die untere Taste gedrückt wird. Das ist das Schöne an if-Aussagen.
Beachten Sie, dass wir eine elif-Anweisung anstelle von just und else verwenden. Andernfalls würde jede Eingabe akzeptiert, außer das Drücken der oberen Taste, sodass sie ausgeführt würde, wenn nichts gedrückt würde. Wir möchten jedoch, dass es nur ausgeführt wird, wenn wir den einen oder anderen Knopf gedrückt haben. Daher verwenden wir elif.
Nach den Berechnungen, um festzustellen, ob der Spieler gewonnen oder verloren hat, und der Wartezeit von 0,3 Sekunden schaltet der Pi beide LEDs aus. Es sollte nur 1 LED leuchten, entweder rot oder grün, je nachdem, ob das Spiel gewonnen oder verloren wurde, aber es tut nicht weh, eine bereits ausgeschaltete auszuschalten. Der Pi nimmt keine Änderung vor. Dies garantiert nur, dass nach dem Spiel kein Licht mehr an ist.
print "Exiting Game" zurück
Erinnern Sie sich, dass ich sagte, dies sei eine Schleife, die lief, solange nicht mindestens eine Taste gedrückt wurde? Wenn Sie beide Tasten drücken, wird die Schleife verlassen und das Programm beendet. Hier drucken wir in das Terminalfenster, dass das Spiel geschlossen wird. Der Rückgabebefehl beendet das Programm tatsächlich.
Die volle Spielfunktion
def game (): #Random Number x = randint (0,9) #Bestimmen Sie, ob die Zahl gerade oder ungerade ist y = x% 2 #Story print "Sie gehen eines Tages beiläufig die Straße entlang, wenn Sie aus dem Nichts ein Ticken bemerken Zeitbombe, bereit zu explodieren. Sie erinnern sich sofort an die Tage Ihres Bombengeschwaders und stürzen sich in Aktion. Sie haben die Bombe fast entschärft, aber Sie müssen jetzt wählen: roter oder blauer Draht. Sie haben 10 Sekunden Zeit. " time.sleep (1) print "Mit Bedacht auswählen" #Button Controls while (GPIO.input (17) == True oder GPIO.input (18) == True): #Hören Sie auf die Eingabe über die Schaltflächen topButton = GPIO.input (17 ) bottomButton = GPIO.input (18) if (topButton == False): # Top-Taste gedrückt if (y == 0): #Wenn die Zahl gerade war und Sie die obere Taste gedrückt haben, verlieren Sie den Druck ("Sie sind fehlgeschlagen Unzählige Menschen sind aufgrund Ihrer Inkompetenz gestorben und Sie wurden auf nur wenige subatomare Partikel reduziert, die für das menschliche Auge kaum sichtbar sind. ") GPIO.output (27, GPIO.HIGH) time.sleep (.3) else : #Wenn die Zahl ungerade war und Sie den unteren Knopf gedrückt haben, gewinnen Sie. print ("Gut gemacht! Sie haben die Bombe erfolgreich entschärft und viele Leben gerettet. Sie sind ein internationaler Held!") GPIO.output (22, GPIO.HIGH) time.sleep (.3) elif (bottomButton == False): #Button-Taste gedrückt, wenn (y == 1): #Wenn die Zahl ungerade war und Sie die untere Taste gedrückt haben, verlieren Sie. print ("Sie haben versagt. Unzählige Menschen sind aufgrund Ihrer Inkompetenz gestorben und Sie wurden auf nur wenige subatomare Partikel reduziert, die für das menschliche Auge kaum sichtbar sind.") GPIO.output (27, GPIO.HIGH) time. sleep (.3) else: #Wenn die Zahl gerade war und Sie den unteren Knopf gedrückt haben, gewinnen Sie. print ("Gut gemacht! Sie haben die Bombe erfolgreich entschärft und viele Leben gerettet. Sie sind ein internationaler Held!") GPIO.output (22, GPIO.HIGH) time.sleep (.3) time.sleep (.3) # Lassen Sie das Licht für 0,3 Sekunden GPIO.output (22, GPIO.LOW) an. # Grün ausschalten GPIO.output (27, GPIO.LOW) # Rot ausschalten
Der Code: Rufen Sie die Funktion auf
Nachdem die Funktion endlich geschrieben ist, können wir sie aufrufen und das Spiel spielen. Für diese Funktion sind keine Argumente erforderlich. Wir nennen es einfach, damit der Pi weiß, dass es Zeit zum Spielen ist.
Der ganze Code
#Import Frameworks aus Random Import Randint Import RPi.GPIO als GPIO Importzeit #GPIO Setup GPIO.setwarnings (False) GPIO.setmode (GPIO.BCM) GPIO.setup (17, GPIO.IN, pull_up_down = GPIO.PUD_UP) #Top Button GPIO.setup (18, GPIO.IN, pull_up_down = GPIO.PUD_UP) #Bottom Button GPIO.setup (27, GPIO.OUT) #Red GPIO.setup (22, GPIO.OUT) #Green def game (): # Zufallszahl x = Randint (0,9) #print (x) #Bestimmen Sie, ob die Zahl gerade oder ungerade ist y = x% 2 #Story print "Sie gehen eines Tages beiläufig die Straße entlang, wenn Sie aus dem Nichts eine tickende Zeit bemerken Bombe, bereit zu explodieren.Sie erinnern sich sofort an Ihre Bombengeschwadertage und stürzen sich in Aktion. Sie haben die Bombe fast entschärft, aber Sie müssen jetzt wählen: roter Draht oder blauer Draht. Sie haben 10 Sekunden Zeit. "Time.sleep (1) print" Mit Bedacht auswählen "#Button Controls while (GPIO.input (17) == True oder GPIO.input (18) == True): #Hören Sie auf die Eingabe über die Schaltflächen topButton = GPIO.input (17) bottomButton = GPIO.input (18) if (topButton == False): # Top-Taste gedrückt if (y == 0): #Wenn die Zahl gerade war und Sie die obere Taste gedrückt haben, verlieren Sie print ("Sie sind gescheitert. Unzählige Menschen sind aufgrund Ihrer Inkompetenz gestorben und auf nur wenige subatomare Partikel reduziert worden, die für das menschliche Auge kaum sichtbar sind.") GPIO.output (27, GPIO.HIGH) time. sleep (.3) else: #Wenn die Zahl ungerade war und Sie den unteren Knopf gedrückt haben, gewinnen Sie. print ("Gut gemacht! Sie haben die Bombe erfolgreich entschärft und viele Leben gerettet. Sie sind ein internationaler Held!") GPIO. Ausgabe (22, GPIO.HIGH) time.sleep (.3) elif (bottomButton == False): #Button-Taste gedrückt, wenn (y == 1): #Wenn die Zahl ungerade war und Sie die untere Taste gedrückt haben, verlieren Sie . print ("Sie haben versagt. Unzählige Menschen sind aufgrund Ihrer Inkompetenz gestorben Sie wurden auf nichts als ein paar subatomare Partikel reduziert, die für das menschliche Auge kaum sichtbar sind. ") GPIO.output (27, GPIO.HIGH) time.sleep (.3) else: #Wenn die Zahl gerade und war Wenn Sie den unteren Knopf gedrückt haben, gewinnen Sie. print ("Gut gemacht! Sie haben die Bombe erfolgreich entschärft und viele Leben gerettet. Sie sind ein internationaler Held!") GPIO.output (22, GPIO.HIGH) time.sleep (.3) time.sleep (.3) # Lassen Sie das Licht für 0,3 Sekunden GPIO.output (22, GPIO.LOW) an. # Grün ausschalten. GPIO.output (27, GPIO.LOW) # Rot ausschalten. Red Print "Exiting Game" return game ()
Videodemonstration
Unten habe ich ein Video eingefügt, das sowohl den Terminalbildschirm als auch die LEDs und Tasten zeigt. Es gibt eine zusätzliche Funktion, die in unserem Tutorial nicht behandelt wird. Es gibt ein blinkendes Licht, das einen Countdown darstellt, der die Zeit begrenzt, die der Spieler benötigt, um eine Wahl zu treffen. Irgendwann mache ich vielleicht ein Tutorial, wie man diese Funktion hinzufügt, aber da sie noch nicht perfekt funktioniert, werde ich diesen Teil vorerst weglassen.
Dieser Artikel ist genau und nach bestem Wissen des Autors. Der Inhalt dient nur zu Informations- oder Unterhaltungszwecken und ersetzt nicht die persönliche Beratung oder professionelle Beratung in geschäftlichen, finanziellen, rechtlichen oder technischen Angelegenheiten.