Använda en Wii Nunchuck till Control Python Turtle

I denna handledning visar jag dig hur du ansluter en Wii nunchuckadapter till en Raspberry Pi och använder Python för att styra sköldpaddsmodulen.

Denna handledning fungerar med både officiella Nintendo eller 3rd party nunchucks. Nunchucken är en bra mångsidig ingång för en Raspberry Pi, eftersom de kan hämtas billigt och innehåller en joystick, en treaxlig accelerometer och två knappar i en fin ergonomiskt vänlig kontroller.

Krav

För att få nunchucken att springa med Pi måste du:

  • En Raspberry Pi med SD-kort förinstallerat med Raspbian (se handledningen Hur man blinkar ett SD-kort för Raspberry Pi om du behöver)
  • En Nintendo nunchuck
  • En adapter som MultiChuck
  • Eller kvinnliga jumperkablar, lödstryk, löd och eltape för att täcka fogen

Hakar upp din Nunchuck

Om du känner dig modig, njut av att koppla bort kontakterna och ha extra kontroller kan du ansluta ledningarna direkt upp till Raspberry Pi GPIO-stiften. Eftersom varje kontakt kan använda olika färgade ledningar är det bäst att öppna kontrollenheten för att uträtta ledningsfärgerna.


Anslutning av 

I min styrenhet har jag följande ledningar, eftersom det här är en tredjeparts controller, noterar de färger och stiften som de ansluter till, eftersom chansen är att de kan vara väldigt annorlunda än kontakten i mitt exempel.

  • Jord-Brun
  • Seriedata-Rosa
  • Serieklocka-Gul
  • Power (VDD)-Vit
  • Addon Detect-Blå-Ej använd
Ett exempel på kabeldragningen

Klipp av den ändkontakt som du ansluter till Wiimote, ta bort plastbeläggningen för att exponera de nakna ledningarna. Löd varje kabel till en kvinnlig jumpertråd, använd sedan elektriskt band för att skydda de lödda lederna från att röra varandra. När du är säker på att varje färg matchar sin respektive tråd, anslut den direkt till i2c och pinnen på Pi.

Om du inte känner dig modig eller om du inte har en kontroller som du kan spara, kan du alltid använda en adapter som MultiChuck Adapter för att ansluta din styrenhet till din Pi utan att förlora kontakten.

Använda en MultiChuck-adapter

Ställa in Raspberry Pi

i2c är inte aktiverat som standard, detta kräver redigering av två filer. Den första filen aktiverar seriella protokollet och den andra kommer att starta seriell drivrutin när Raspberry Pi stöter upp.

För att redigera den första filen, skriv den här till LXTerminal fönster eller Kitt om du ansluter fjärråtkomst: sudo nano / etc / modules

Lägg till I2C-dev och I2C-bcm2708 till slutet av filen så det ser ut så här:

Redigera filer på Raspberry Pi

Ctrl-X för att spara ändringarna, Y för att bekräfta och Stiga på att spara till filen.

Därefter skriver du om du vill aktivera drivrutinen vid start.

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

lägg sedan till en # till början av varje rad så det ser ut så här:


Redigera filer på Raspberry Pi

Igen Ctrl-X för att spara ändringarna, Y för att bekräfta och Stiga på att spara till filen. Det är de förändringar som behövs för att Raspberry Pi ska prata över i2c-protokollet. Nästa typ:

sudo omstart omstart

för att tillåta ändringarna att träda i kraft.

Installera de obligatoriska biblioteken

När Raspberry Pi har startat, öppna LXTerminal igen. Det sista att göra nu är att installera Python-modulerna för att hantera kommunikationen mellan Python och i2c:

sudo apt-få uppdatering sudo apt-get install python-smbus -y

För att göra hanteringen av nunchuck-data enklare har jag skapat en modul som kan importeras till ditt skript. Öppna LXTerminal och skriv följande kommando för att ladda ner det.

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

Läser Nunchuck Data

Nu har du alla bibliotek och moduler som krävs, testa att det fungerar. Medan du fortfarande är i LXTerminal, Skriv in

sudo python

för att starta den interaktiva Python-konsolen. Med hjälp av detta kan vi skriva ett snabbtest med Python. 

från nunchuck import nunchuck wii = nunchuck () wii.raw ()

Om allt fungerar som det borde du borde förvänta dig att se en uppsättning tal så här:

Testning

Siffrorna motsvarar utgångarna på joysticken, accelerometern och tillstånden på knapparna. 

Wii.raw () kommer att ge dig en utskrift av varje-börjar till vänster har du:
[Joystick X, Joystick Y, Accelerometer X, Accelerometer X, Accelerometer X, Blandade data som innehåller knappar Z och C]

Jag har också lagt till enskilda funktioner för var och en av dem för att göra skrivning av egna skript mycket enklare.

wii.raw () # Returnerar all data i raw wii.joystick () # Returnerar bara X- och Y-positionerna på joysticken wii.accelerometer () # Returnerar accelerationsmätarens accelerationsmätare x, Y och Z wii.button_c () # Returnerar sant om C-knappen trycks in, False om inte wii.button_z () # Returnerar sant om Z-knappen trycks in, False om inte wii.joystick_x () # Returnerar bara X-läget på joysticken wii.joystick_y () # Returnerar bara Jo-positionen på joysticken wii.accelerometer_x () # Returnerar bara X-positionen för accelerometer wii.accelerometer_y () # Returnerar bara Y-positionen för accelerometern wii.accelerometer_z () # Returnerar bara Z-positionen för accelerometer wii. skala (värde, min, max, out_min, out_max) # Fungerar på samma sätt som Arduino Map, perfekt för att ändra värden som returneras till en annan skala, dvs -100 - +100

Du kan prova en ut med en slinga genom att skriva följande in till en sudo python trösta. Detta kommer att mata ut joystickens nuvarande position, skriv in det och flytta joysticken runt för att se siffrorna ändras.

från nunchuck import nunchuck från tidpunkten import sömn wii = nunchuck () medan sant: wii.joystick () sömn (0.2)

Använda Turtle

Nu har du fått din Nunchuck ansluten till Raspberry Pi, installerat bibliotek och moduler och testat det fungerar, jag ska visa dig hur man gör något roligt med det. 

Python, på Raspberry Pi, kommer installeras med Sköldpadda modul för att göra det möjligt för alla att skapa mönster snabbt och enkelt genom att lägga till några rader kod. Så som det är väldigt lätt att gå, visar jag dig hur du använder nunchucken för att styra en sköldpadda.

För nästa avsnitt ska jag använda På tomgång för att skriva Python-koden, men eftersom det seriella protokollet kräver administratörsrättigheter måste du gå tillbaka till LXTerminal igen och skriv:

sudo tomgång

Klick Fil sedan Nytt fönster. Det nya fönstret är där Python-koden går. Brådskande F5 kommer att köra koden. Lägg till koden från tidigare för att importera sömn- och nunchuck-moduler, tillsammans med sköldpaddan.

från nunchuck import nunchuck från tidpunkten import sova import sköldpadda wii = nunchuck () turtle.setheading (90) medan True: om wii.joystick_y () < 100: turtle.backward(10) if wii.joystick_y() > 160: turtle.forward (10) om wii.joystick_x () < 100: turtle.left(10) if wii.joystick_x() > 160: turtle.right (10)
nunchuckturtle.py script

När du har skrivit in koden trycker du på F5 att köra den. Du kommer då att bli ombedd att spara filen, så ge den ett lämpligt namn. Ett fönster kommer nu att dyka upp med en liten svart triangel, du är nu redo att prova det så ge joysticken ett test.


I den kod du har använt importerar de fyra första raderna de moduler som behövs och initierar nunchucken redo att användas. turtle.setheading (90) pekar pilen uppåt, som 0 pekar mot höger. Nästa block startar en evigt loop-medan det är sant:. Python kontrollerar om joysticken är över eller under ett visst tal och flyttar sköldpaddsmarkören.

Lägga till knappar

Nu har du rörelse, jag visar dig hur man lägger till extra interaktivitet genom att använda C och Z knappar. Vissa funktioner som är praktiska att ha kommer att vara att rensa skärmen och även lyfta pennan upp så att du kan röra dig utan att dra en linje.

från nunchuck import nunchuck från tidpunkten import sova import sköldpadda wii = nunchuck () penstate = 0 turtle.setheading (90) medan True: om wii.joystick_y () < 100: turtle.backward(10) if wii.joystick_y() > 160: turtle.forward (10) om wii.joystick_x () < 100: turtle.left(10) if wii.joystick_x() > 160: turtle.right (10) om wii.button_c () == True: turtle.setposition (0,0) turtle.setheading (90) turtle.clear () om wii.button_z () == True: om penstate = = 0: turtle.up () penstate = 1 annat: turtle.down () penstate = 0 sleep (0.2)


Tryck F5 att spara och starta det nya skriptet och testa knapparna. Knapp C kommer att rensa skärmen och återställa markörens position, medan Z lyfter upp och sätter ner pennan så att du kan börja och sluta dra en linje.

Använda nunchucken att rita

Jag bryter ner knappkoden så att du förstår vad som händer när du trycker på knappen. 

När du trycker på C knappen, som kommer tillbaka som Sann och kommer att vända sköldpaddan tillbaka så den pekar uppåt, sedan flytta sköldpaddan tillbaka till mitten av skärmen och slutligen rensa skärmen. 

När du trycker på Z knappen, en variabel lagras för att komma ihåg penningens tillstånd och antingen lyfta upp pennan för att sluta ritning eller placera pennan igen för att fortsätta ritning.

Slutsats

Jag hoppas i denna handledning du har fått kunskapen att börja tillämpa vad du har lärt dig för att utöka vad som kan göras med nunchucken. 

Några saker som kan göras, såsom kontrollrobotar, skapa spel som orm eller till och med släcka lysdioder på och av som är anslutna till GP10-stift av en Raspberry Pi.