Gebruik een Wii Nunchuck om Python Turtle te besturen

In deze tutorial laat ik je zien hoe je een Wii-nunchuck-adapter op een Raspberry Pi kunt aansluiten en Python kunt gebruiken om de schildpadmodule te besturen.

Deze tutorial werkt met zowel officiële nunchucks van Nintendo of van derden. De nunchuck is een goede multi-use invoer voor een Raspberry Pi, omdat deze goedkoop kan worden opgehaald en een joystick, een accelerometer met drie assen en twee knoppen in een mooie, ergonomisch vriendelijke controller kan bevatten.

Vereisten

Om de nunchuck met de Pi te laten werken, heb je nodig:

  • Een Raspberry Pi met SD-kaart vooraf geïnstalleerd met Raspbian (raadpleeg de tutorial Hoe een SD-kaart te flashen voor Raspberry Pi als je moet)
  • Een Nintendo-nunchuck
  • Een adapter zoals MultiChuck
  • Of vrouwelijke verbindingsdraden, soldeerbout, soldeer en elektrische tape om het gewricht te bedekken

Je Nunchuck aansluiten

Als je je moedig voelt, geniet van het loskoppelen van de connectors en reservecontrollers hebt, kun je de draden direct aansluiten op de Raspberry Pi GPIO-pinnen. Omdat elke connector anders gekleurde draden kan gebruiken, is het het beste om de controller te openen om de bedradingskleuren uit te werken.


Bedrading van de 

In mijn controller heb ik de volgende draden, aangezien dit een externe controller is, let op de kleuren en de pinnen waarmee ze verbinden, omdat de kans groot is dat ze heel anders kunnen zijn dan de connector in mijn voorbeeld.

  • Grond-Bruin
  • Seriële gegevens-Roze
  • Seriële klok-Geel
  • Vermogen (VDD)-Wit
  • Addon Detect-Blauw-Niet gebruikt
Een voorbeeld van de kabelbout

Knip de eindconnector af die u in de Wiimote steekt, verwijder de plastic coating om de blootliggende draden bloot te leggen. Soldeer elke draad aan een vrouwelijke hulpdraad en gebruik vervolgens elektrische tape om te voorkomen dat de gesoldeerde verbindingen elkaar raken. Zodra u zeker weet dat elke kleur overeenkomt met de respectieve draad, sluit u deze rechtstreeks aan op de i2c- en stroompinnen op de Pi.

Als je je niet dapper voelt, of als je geen controller hebt, kun je altijd een adapter zoals de MultiChuck-adapter gebruiken om je controller op je Pi aan te sluiten zonder de connector op te offeren.

Een MultiChuck-adapter gebruiken

De Raspberry Pi instellen

i2c is standaard niet ingeschakeld, hiervoor zijn twee bestanden nodig. Het eerste bestand schakelt het seriële protocol in en de tweede start de seriële driver wanneer de Raspberry Pi opstart.

Om het eerste bestand te bewerken, typt u dit in bij de LXTerminal venster of Stopverf als u op afstand verbinding maakt: sudo nano / etc / modules

Toevoegen I2C-dev en I2C-bcm2708 aan het einde van het bestand zodat het er zo uitziet:

Bestanden bewerken op de Raspberry Pi

Controle-X om de wijzigingen op te slaan, Y om te bevestigen en invoeren opslaan in het bestand.

Om vervolgens de driver bij het opstarten in te schakelen, typt u:

sudo nano /etc/modprobe.d/raspi-blacklist.conf

voeg dan een toe # naar het begin van elke regel, zodat het er zo uitziet:


Bestanden bewerken op de Raspberry Pi

Nog een keer Controle-X om de wijzigingen op te slaan, Y om te bevestigen en invoeren opslaan in het bestand. Dat zijn de veranderingen die nodig zijn om de Raspberry Pi te laten praten over het i2c-protocol. Volgend type:

start opnieuw op met sudo

om de wijzigingen door te voeren.

De vereiste bibliotheken installeren

Zodra de Raspberry Pi opnieuw is opgestart, opent u LXTerminal opnieuw. Het laatste wat je nu moet doen is de Python-modules installeren om de communicatie tussen Python en i2c te verwerken:

sudo apt-get update sudo apt-get install python-smbus -y

Om het verwerken van de nunchuck-gegevens gemakkelijker te maken, heb ik een module gemaakt die in uw script kan worden geïmporteerd. Open LXTerminal en typ de volgende opdracht om het te downloaden.

wget https://raw.githubusercontent.com/Boeeerb/Nunchuck/master/Raspberry%20Pi/nunchuck.py

Nunchuck-gegevens lezen

Nu heb je alle benodigde bibliotheken en modules, test of het werkt. Terwijl hij nog steeds binnen is LXTerminal, typ in

sudo python

om de interactieve Python-console te starten, kunnen we hiermee een snelle test met Python schrijven. 

van nunchuck import nunchuck wii = nunchuck () wii.raw ()

Als alles werkt zoals het hoort, zou je een reeks nummers zoals deze moeten verwachten:

testen

De cijfers komen overeen met de uitgangen van de joystick, accelerometer en status van de knoppen. 

Wii.raw () zal je een afdruk geven van elk - beginnend aan de linkerkant heb je:
[Joystick X, Joystick Y, Accelerometer X, Accelerometer X, Accelerometer X, Gemengde gegevens met knoppen Z en C]

Ik heb ook afzonderlijke functies voor elk van deze toegevoegd om het schrijven van je eigen scripts veel gemakkelijker te maken.

wii.raw () # Retourneert alle gegevens in raw wii.joystick () # Retourneert alleen de X- en Y-posities van de joystick wii.accelerometer () # Retourneert X-, Y- en Z-posities van de accelerometer wii.button_c () # Retourneert True als de knop C wordt ingedrukt, False if not wii.button_z () # Geeft True als de knop Z wordt ingedrukt, False if not wii.joystick_x () # Retourneert alleen de X-positie van de joystick wii.joystick_y () # Retourneert alleen de Y-positie van de joystick wii.accelerometer_x () # Retourneert alleen de X-positie van de accelerometer wii.accelerometer_y () # Retourneert alleen de Y-positie van de accelerometer wii.accelerometer_z () # Retourneert alleen de Z-positie van de accelerometer wii. schaal (waarde, min, max, uit_min, uit_max) # Werkt hetzelfde als Arduino Map, perfect voor het veranderen van waarden die op een andere schaal worden teruggebracht, dwz -100 - +100

Je kunt het uitproberen met een lus door het volgende in a te typen sudo python troosten. Hierdoor wordt de huidige positie van de joystick weergegeven, dus typ deze in en verplaats de joystick rond om te zien hoe de cijfers veranderen.

from nunchuck import nunchuck from time import sleep wii = nunchuck () while True: wii.joystick () sleep (0.2)

Turtle gebruiken

Nu heb je je Nunchuck verbonden met de Raspberry Pi, de bibliotheken en modules geïnstalleerd en getest dat het werkt, ik zal je laten zien hoe je er iets leuks mee kunt doen. 

Python, op de Raspberry Pi, wordt geïnstalleerd met de Schildpad module waarmee iedereen snel en eenvoudig patronen kan maken door een paar regels code toe te voegen. Omdat het heel gemakkelijk is om te beginnen, laat ik je zien hoe je de nunchuck gebruikt om een ​​schildpad te besturen.

Voor de volgende sectie die ik zal gebruiken nutteloos om de Python-code te schrijven, maar omdat het seriële protocol beheerdersrechten vereist, moet je teruggaan naar LXTerminal nogmaals en typ:

sudo idle

Klik het dossier dan Nieuw raam. Het nieuwe venster is waar de Python-code naartoe gaat. persing F5 zal de code uitvoeren. Voeg de code van vroeger toe om slaap- en nunchuck-modules te importeren, samen met de schildpad.

from nunchuck import nunchuck from time import sleep import turtle wii = nunchuck () turtle.setheading (90) while True: if wii.joystick_y () < 100: turtle.backward(10) if wii.joystick_y() > 160: turtle.forward (10) als wii.joystick_x () < 100: turtle.left(10) if wii.joystick_x() > 160: turtle.right (10)
script nunchuckturtle.py

Nadat u de code hebt ingevoerd, drukt u op F5 om het uit te voeren. U wordt vervolgens gevraagd om het bestand op te slaan, dus geef het een toepasselijke naam. Er verschijnt nu een venster met een kleine zwarte driehoek, je bent nu klaar om het uit te proberen, dus geef de joystick een test.


In de code die u hebt gebruikt, importeren de eerste vier regels de benodigde modules en starten de nunchuck klaar om te worden gebruikt. turtle.setheading (90) zal de pijl naar boven wijzen, zoals 0 wijst naar rechts. Het volgende blok begint een lus voor altijd-terwijl het waar is:. Python controleert of de positie van de joystick zich boven of onder een bepaald getal bevindt en verplaatst de schildpadcursor respectievelijk.

Knoppen toevoegen

Nu heb je beweging, ik zal je laten zien hoe je wat extra interactiviteit kunt toevoegen door de C en Z toetsen. Sommige handige functies zijn om het scherm leeg te maken en de pen op te tillen, zodat u zich kunt verplaatsen zonder een lijn te tekenen.

from nunchuck import nunchuck from time import sleep import turtle wii = nunchuck () penstate = 0 turtle.setheading (90) while True: if wii.joystick_y () < 100: turtle.backward(10) if wii.joystick_y() > 160: turtle.forward (10) als wii.joystick_x () < 100: turtle.left(10) if wii.joystick_x() > 160: turtle.right (10) if wii.button_c () == True: turtle.setposition (0,0) turtle.setheading (90) turtle.clear () if wii.button_z () == True: if penstate = = 0: turtle.up () penstate = 1 else: turtle.down () penstate = 0 slaapstand (0.2)


druk op F5 om het nieuwe script op te slaan en te starten en de knoppen te testen. Knop C zal het scherm wissen en de positie van de cursor resetten, terwijl Z zal de pen optillen en neerzetten, zodat u kunt beginnen en stoppen met het tekenen van een lijn.

De nunchuck gebruiken om te tekenen

Ik deel de knopcode uit zodat je begrijpt wat er gebeurt als je op de knop drukt. 

Wanneer u op drukt C knop, komt terug als waar en zal de schildpad terug draaien zodat deze naar boven wijst, verplaats de schildpad dan terug naar het midden van het scherm en maak tenslotte het scherm leeg. 

Wanneer u op drukt Z knop, wordt een variabele opgeslagen om de status van de pen te onthouden, en til de pen op om te stoppen met tekenen, of plaats de pen terug om door te gaan met tekenen.

Conclusie

Ik hoop dat je in deze tutorial de kennis hebt opgedaan om te gaan toepassen wat je hebt geleerd om uit te breiden wat dat met de nunchuck kan doen. 

Sommige dingen die kunnen worden gedaan, zoals besturingsrobots, maken games zoals snake of schakelen zelfs LED's in die zijn verbonden met de GPIO-pinnen van een Raspberry Pi.