Raspberry Pi project: Magic 8-Ball
Bij dit Raspberry Pi project gaan we met behulp van een Raspberry Pi en Sense HAT een Magic 8-Ball maken!
Deze handleiding behandeld:
- Benodigdheden
- Circuit Maken
- Upgrade en Update
- Nieuw bestand aanmaken
- Programmeren (Tekstversie)
- Programmeren (SenseHat)
- Schudden
- Beginner 40%
- 30-45 min 45%
- Kosten €146,15 55%
Stap 1: Benodigdheden:
Stap 2: Circuit maken
We gaan eerst de Sense HAT vastmaken aan de Raspberry Pi. Dit doe je door de schroefjes van onder de Raspberry Pi aan te brengen en de afstandsbusjes erop vast te draaien, daarna sluiten we de 40 pin GPIO header aan op de Raspberry Pi. Je kan nu de Sense HAT aansluiten 40 pin GPIO header. Daarna maak je vanaf de bovenkant de Sense HAT vast door schroefjes vanaf de bovenkant door de Sense HAT in de afstandsbusjes te draaien. Het zou er zo uit moeten zien:
Stap 3: Update en Upgrade
Update en upgrade eerst je systeem door de volgende commando’s in te voeren in een terminalvenster (terwijl je verbonden bent met internet):
sudo apt-get update
sudo apt-get upgrade
Installeer nu de Sense HAT softwarepakketten:
sudo apt-get install sense-hat
sudo pip-3.2 install pillow
Ten slotte herstart je de Raspberry Pi om om de installatie te voltooien:
sudo reboot
Stap 4: Nieuw Bestand Aanmaken
In dit project ga je je eigen Magic 8 Ball bouwen met behulp van je Raspberry Pi, een Sense HAT en wat Python-code. Een Magic 8 Ball is een spel waarbij je een gesloten vraag stelt, het schudt en het je een voorspelling geeft.
Als je geen Raspberry Pi en Sense HAT hebt, kun je de Sense HAT-emulator hier gebruiken of de ingebouwde Sense HAT-emulator voor Windows gebruiken onder elke stap in dit project.
Een geweldige manier om je code te schrijven en te testen in tussenpozen is het gebruik van IDLE 3, een ontwikkelingsapplicatie voor Python. Je gaat je code schrijven in Python 3.
Klik op Menu > Programmeren > Python 3 (IDLE)Zodra het Python-shellvenster is geladen,
klik je op Bestand en Nieuw bestand. Dit opent een teksteditorvenster waarin je je code kunt schrijven,
opslaan en testen. Sla het lege bestand op als magic8ball.py door te klikken op Bestand en Opslaan als.
Stap 5: Programmeren (Tekstversie)
Een goede manier om je Magic 8 Ball-programma te starten, is door eerst een tekstversie van een Magic 8 Ball-programma te maken. Laten we nadenken over wat een Magic 8 Ball doet. Eerst stel je een vraag, schud je de bal, draai je hem om en lees je een willekeurig gekozen antwoord. Daarom heb je een lijst met antwoorden nodig en een manier om er willekeurig een te kiezen en dat antwoord op het scherm weer te geven.
Allereerst moet je de choice-functie uit de random-bibliotheek en de sleep-functie uit de time-bibliotheek importeren. Typ het volgende in je tekstbestand magic8ball.py:
from random import choice
from time import sleep
Met behulp van de print-functie kun je tekst naar het scherm afdrukken, voor de persoon die je programma gebruikt. Typ:
print("Stel een vraag")
Vervolgens moet er een pauze zijn voordat het programma reageert met een antwoord, zodat de gebruiker een vraag kan stellen. Je kunt de time-bibliotheek gebruiken om het programma te vragen een bepaalde tijd te wachten, bijvoorbeeld zo:
sleep(3)
Het programma zal drie seconden pauzeren. Je kunt deze waarde aanpassen om de tijd langer of korter te maken. Maak nu een lijst met antwoorden die het programma kan geven op de vraag. Lijsten kunnen op dezelfde manier worden benoemd als variabelen; bijvoorbeeld, number = [1, 2, 3, 4]. Deze lijst genaamd ‘number’ bevat vier items. Jouw lijst zal tekstreeksen bevatten die op het scherm worden weergegeven. Deze teksten zullen vrij lang zijn. Om je lijst te maken, typ je:
replies = ['Tekenen wijzen op ja',
'Zonder twijfel',
'Je kunt erop vertrouwen',
'Reken er niet op',
'Het ziet er goed uit',
'Kan het nu niet voorspellen',
'Het is beslist zo',
'Outlook is niet zo goed'
]
Ten slotte is een instructie nodig om willekeurig een item uit de lijst te selecteren en het vervolgens op het scherm weer te geven. Je kunt hiervoor de random-bibliotheek gebruiken door te typen:
print(choice(replies))
Opslaan van je code door te klikken op Bestand en Opslaan. Voer vervolgens je programma uit om te testen of het werkt door te klikken op Uitvoeren en Module uitvoeren. Je zou “Stel een vraag moeten zien” uitvoer moeten zien in het IDLE 3-shellvenster.
Stap 6: Programmeren Sense HAT
Nu je tekst hebt die wordt afgedrukt in het Python 3-shellvenster op je scherm, laten we de code wijzigen zodat de tekst over de LED-matrix op je Sense HAT rolt. Hiervoor moet je de Sense HAT-bibliotheek gebruiken en de print-functies vervangen door de Sense HAT show_message-functie.
Voeg onder de sectie met geïmporteerde modules de volgende regels toe:
from sense_hat import SenseHatsense = SenseHat()
Vervang vervolgens “print” door “sense.show_message” in je code. Er zijn twee plaatsen waar je dit moet doen. Sla je programma op door op Ctrl + S op je toetsenbord te drukken. Druk op F5 om je programma uit te voeren en te testen. Het kan zijn dat de tekst langzaam over de LED-matrix op je Raspberry Pi scrolt. Om de tekst sneller te laten scrollen, kun je “scroll_speed=(0.06)” toevoegen aan je tekstreeksen, zoals dit:
from sense_hat import SenseHat from random import choice from time import sleep sense = SenseHat() sense.show_message("Stel een vraag", scroll_speed=0.06) sleep(3) antwoorden = ['Tekenen wijzen op ja', 'Zonder twijfel', 'Je kunt erop rekenen', 'Reken er niet op', 'Het ziet er goed uit', 'Kan het nu niet voorspellen', 'Het is beslist zo', 'Vooruitzicht is niet zo goed' ] sense.show_message(choice(antwoorden), scroll_speed=0.06)
Stap 7: Schudden
Traditionele Magic 8 Balls vereisen dat de persoon die een vraag stelt, het schudt voordat er een antwoord wordt gegeven. Dit kan worden gesimuleerd met een Sense HAT door gebruik te maken van de accelerometer, die trillingen en beweging meet. Accelerometers zijn te vinden in de meeste smartphones die de richting van het scherm veranderen, afhankelijk van hoe je het apparaat vasthoudt.
Laten we de accelerometer op de Sense HAT gebruiken om eventuele veranderingen in de hoeveelheid g-kracht op elke as (x, y en z) te detecteren voordat het deel van je programma wordt uitgevoerd dat een willekeurig antwoord aan de gebruiker geeft.
while True: x, y, z = sense.get_accelerometer_raw().values()
x = abs(x)
y = abs(y)
z = abs(z)
Let op dat hoofdletters en inspringing erg belangrijk zijn in Python. Zorg ervoor dat je 4 spaties gebruikt om in te springen na een regel met een dubbele punt. Door abs te gebruiken, wordt elk getal omgezet in een positief getal, wat betekent dat het de richting van trilling negeert en kijkt naar de hoeveelheid trilling! Nu is het tijd om een voorwaarde in onze code in te stellen die controleert of de x-, y- en z-assen zijn veranderd (dwz dat het wordt verplaatst) voordat het een willekeurig antwoord selecteert. Als er geen beweging wordt gedetecteerd, wordt er geen antwoord gegeven.
if x > 2 or y > 2 or z > 2 :
sense.show_message(choice(replies))
else:
sense.clear()
Het programma controleert of de assen x, y en z groter zijn dan de waarde 2. Door deze waarde te veranderen, kun je de gevoeligheid van het programma voor beweging aanpassen. Als je wilt dat iemand de Raspberry Pi en Sense HAT echt stevig moet schudden, gebruik dan een hogere waarde. Sla je programma op door op Ctrl + S te drukken op je toetsenbord. Druk op F5 om je programma uit te voeren en te testen. je code zou er als het goed is zo uit moeten zien:
from sense_hat import SenseHat from random import choice from time import sleep sense = SenseHat() sense.show_message("stel een vraag", scroll_speed=0.08) sleep(3) replies = ["JA!", "Nee", "Misschien", "Zeker Weten!", "Tuurlijk Niet!", ] while True: x, y, z = sense.get_accelerometer_raw().values() x = abs(x) y = abs(y) z = abs(z) if x > 2 or y > 2 or z > 2 : sense.show_message(choice(replies)) else: sense.clear()
En dat was het! Is het niet gelukt? Kijk even terug in de vorige stappen om te kijken wat er fout is gegaan. Is het wel gelukt? Neem dan een kijkje bij onze projecten!