Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Een Wii Nunchuk gebruiken met Arduino

Componenten en benodigdheden

Nintendo Nunchuk
× 1
SparkFun Level Shifter
× 1
Arduino UNO
× 1

Over dit project

Voorwoord

Oorspronkelijk werd dit bericht gepubliceerd op www.xarg.org.

Een Wii Nunchuk gebruiken met Arduino

We zijn allemaal opgegroeid met gamepads in onze handen, waardoor ze ideaal zijn om ze te combineren met letterlijk elke mogelijke toepassing. Een geweldige uitvinding van Nintendo is de Nunchuk, een goedkope uitbreiding voor de Wii U-afstandsbediening. Omdat het I2C als transportprotocol gebruikt, is het gemakkelijk om toegang te krijgen tot de onbewerkte gegevens van de controller. Omdat het zo eenvoudig is, dacht ik dat er een standaardoplossing voor moest zijn, maar ik kon geen stabiele implementatie vinden, maar alleen heel veel codefragmenten. Daarom concentreerde ik me op het opvullen van deze leemte en hier is het dan. In dit artikel zal ik je door de details leiden en het implementeren voor een Arduino.

Hardware

De Nunchuk heeft twee membraanknoppen, genaamd knop C en knop Z. Bovenop het apparaat zit een analoge twee-assige joystick en het hele apparaat is gevoelig voor bewegingen, aangezien een versnellingsmeter krachten meet die op alle drie de dimensies werken. Het wordt aanbevolen om de Nunchuk met 3v3 te gebruiken en je moet zeker een niveauverschuiver gebruiken als je die spanning niet kunt leveren om de levensduur te verlengen. Voor deze opstelling heb je minimaal de volgende onderdelen nodig:

Onderdelen

  • Nintendo Nunchuk (of replica)
  • Arduino
  • Niveauverschuiver (optioneel)
  • Nunchuk-adapter (optioneel)

Originele Nunchuk of replica

De grote vraag is, moet je een originele Nintendo Nunchuk of een Chinese replica kopen? Om mijn Nunchuk-stuurprogramma te testen, kocht ik beide - het origineel en een goedkope kopie. Beide versies zijn verre van duur, maar het verschil is ongeveer 10-15 €. Wat ik wel kan zeggen is dat de draden van de kabel van de originele Nunchuk afgeschermd zijn, waardoor ze robuuster zijn tegen storingen. De joystick van het origineel heeft een hogere kwaliteit, kan alle bewegingen in het volledige bereik van waarden oplossen, terwijl de kopie niet reageert op minimale bewegingen. Ook de kwaliteit van de accelerometer van het origineel is beter. Ik heb echter een Kalman-filter toegepast, die deze verschillen egaliseert. Dus als je een controller wilt die lang meegaat, zou ik voor het origineel gaan, als je alleen een goedkoop invoerapparaat nodig hebt, heb je misschien geluk met een Nunchuk-kopie.

Nunchuk-connector

Nintendo sluit alle randapparatuur aan met een eigen stekker. Omdat ik geen Wii heb en de controllers niet zal gebruiken voor iets dat met gamen te maken heeft, heb ik de connectoren uit elkaar gehaald. Je kunt een Nunchuk-adapter krijgen voor een paar dollar, als je deze drastische stap niet wilt doen, maar met wat soldeervaardigheden zou je de plug toch moeten kunnen repareren. Ik raad aan om de stekker te openen, omdat je kunt zien hoe de draden op de pinnen zijn aangesloten. Dit is vooral belangrijk voor Nunchuk-replica's, omdat de draden willekeurig kunnen worden aangesloten. Een ander vreemd ding is, de originele controller heeft 4 draden en de replica heeft er 5, terwijl de connector eigenlijk 6 pinnen heeft. Oké, laten we aan het werk gaan en de connector openen:

En knip de draden af:

Als je frontaal op de stekker kijkt, zie je deze pinnen:

Voor de originele Nunchuk is het volgende de kleur en pin-lay-out van de connector:

  • Groen → SDA
  • nc
  • Rood → 3v3
  • Wit → GND
  • nc
  • Geel → SCL

Voor de Nunchuk-kloon die ik heb gekregen, is het volgende de kleur en pin-lay-out van de connector:

  • Geel → SDA
  • Zwart → nc
  • Groen → 3v3
  • Rood → GND
  • nc
  • Wit → SCL

Zoals ik al zei, moet je zeker kijken naar hoe de draden zijn aangelegd en niets op kleur aansluiten. De gebruikte acroniemen zijn:nc voor niet aangesloten, SDA - de datalijn (moet worden aangesloten met A4 op het Arduino-bord) en SCL - de klok (verbonden met A5). Arduino heeft een spanningsregelaar gekregen, waarmee we 3v3 direct kunnen gebruiken. Als je de WiiChuck of een vergelijkbare Nunchuk-adapter wilt gebruiken, verbind dan 3v3 met A2 en GND met A1 - je zult later nunchuk_init_power() moeten aanroepen om deze voedingsconnectoren te initialiseren. De volgende Fritzing-schets illustreert het verband:

Software

Ik heb een kleine header-bibliotheek geschreven, die de communicatie met de Nunchuk implementeert. U hoeft zich eigenlijk geen zorgen te maken over wat er achter de schermen gebeurt, het zou direct uit de doos moeten werken. Als je geïnteresseerd bent in de details, zal ik dit toch zo uitleggen.

Nunchuk-bibliotheek downloaden

De communicatie met de Nunchuk verloopt via de TWI-bus, wat gewoon een andere naam is voor I2C (oké, sommige details zijn anders, maar dat maakt voor ons doel niet uit). De snelheid van de I2C-bus is standaard ingesteld op Fast Mode (400kHz). Om de Nunchuk met je Arduino te gebruiken, heb je alleen het volgende nodig:

#include #include "nunchuk.h"void setup() { Serial.begin(9600); Draad.begin(); // nunchuk_init_power(); // A1 en A2 zijn voeding nunchuk_init();}void loop() {if (nunchuk_read()) { // Werk met nunchuk_data nunchuk_print(); } vertraging(10);} 

Bij het starten van het verwerkingsbestand dat bij de bibliotheek is geleverd, kunt u deze kegel in evenwicht brengen met uw Nunchuk:

In plaats van nunchuk_print() veel functies kunnen worden gebruikt om toegang te krijgen tot de actuele gegevens:

Nunchuk-functies

  • nunchuk_buttonZ(): 1 of 0, of de Z-knop is ingedrukt of niet
  • nunchuk_buttonC(): 1 of 0, of de C-knop is ingedrukt of niet
  • nunchuk_joystickX_raw() / nunchuk_joystickX() nunchuk_joystickY_raw() / nunchuk_joystickY(): De x- of y-waarde van de joystick. Een onbewerkte versie voor elke functie geeft toegang tot gegevens zonder kalibratie.
  • nunchuk_joystick_angle(): Berekent de hoek van de joystick in radialen.
  • nunchuk_accelX_raw() / nunchuk_accelX() nunchuk_accelY_raw() / nunchuk_accelY() nunchuk_accelZ_raw() / nunchuk_accelZ(): De x-, y- of z- waarde van de versnellingsmeter. Een onbewerkte versie voor elke functie geeft toegang tot gegevens zonder kalibratie.
  • nunchuk_pitch(): Berekent de hellingshoek van de controller in radialen.
  • nunchuk_roll(): Berekent de rolhoek van de controller in radialen.

Opmerking: Er is geen nunchuk_yaw() functie, aangezien een versnellingsmeter alleen richtingskrachten kan meten en geen rotatiesnelheid. Deze omstandigheid beperkt ook de pitch tot slechts 180° en dwingt de rolhoek om verkeerd te zijn wanneer de pitch groter is dan 180°.

De berekening van de hellings- en rolhoek werkt ook onder een vereenvoudigende veronderstelling, dat de enige snelheid die op de controller inwerkt, de zwaartekracht is. Dit werkt omdat de Nunchuk ofwel stil wordt gehouden of een constante snelheid ervaart van een externe kracht.

Kalibratie

Zoals beschreven in het functieoverzicht komt elke functie van de joystick en de accelerometer met een gekalibreerde en een ruwe versie. Aan het begin van het bibliotheekbestand definiëren enkele constanten de nulposities. Het beste zou zijn om de ruwe metingen van uw controller te lezen, wanneer u deze in neutrale positie houdt, en de constanten dienovereenkomstig aan te passen.

I2C-protocol

De laatste sectie hier bespreekt het eigenlijke I2C-protocol. Als je alleen de controller wilt gebruiken, is deze informatie niet nodig, maar als je het protocol wilt begrijpen, hoop ik dat ik je wat tijd kan besparen.

Ik begon met ontwikkelen door te scannen naar het werkelijke adres van de Nunchuk met mijn I2C-scanner, die 0x52 is. Het uitlezen van parameters uit het geheugen van de Nunchuk via de I2C-bus is vrij gelijkaardig aan de communicatie met een normale I2C EEPROM. Voordat de gegevens van de Nunchuk kunnen worden gelezen, moet een initialisatiereeks worden verzonden.

Om gegevens van de Nunchuk te lezen, is het noodzakelijk om het adres te verzenden om van te lezen, aangezien de controller van de Nunchuk het adres bij elke leesactie verhoogt. De gegevens waar we eigenlijk in geïnteresseerd zijn, liggen op adres 0x00 en zijn 6 bytes lang. Op adres 0x20 en 0x30 (lijkt een exacte kopie te zijn van de bytes op 0x20), worden 16 bytes aan kalibratiegegevens opgeslagen. Op adres 0xFA vindt u het identificatienummer van het apparaat, dat is 0xA4200000 voor Nunchuck, 0xA4200101 voor Classic Controller, 0xA4200402 voor Balance enzovoort.

Wanneer gegevens naar de Nunchuk moeten worden geschreven, is het formaat analoog aan het leescommando. De eerste byte is het adres, gevolgd door de feitelijke gegevens.

Laten we de feitelijke bytereeksen van de Nunchuk doornemen voor de beschreven functies:

1. Initialiseer de Nunchuk:

START, 0x40, 0x00, STOP 

Deze volgorde is de normale initialisatievolgorde, die het coderingsalgoritme als standaard instelt. Elke byte die uit de Nunchuk wordt gelezen, moet vervolgens worden gedecodeerd met (x ^ 0x17) + 0x17 . Een betere manier is om versleuteling uit te schakelen met deze volgorde:

2. Initialiseer de Nunchuk zonder codering:

START, 0xF0, 0x55, STOPSTART, 0xFB, 0x00, STOP 

Dit heeft als voordeel dat de daadwerkelijke gegevens gebruikt kunnen worden zonder de decryptieformule en het werkt ook met Nunchuk-klonen.

3. Lees de apparaat-ID uit het extensieregister:

START, 0xFA, STOPREAD 6 byte 

De gegevens zijn de ident, die ik al noemde, als het aangesloten apparaat een Nunchuk- of Classic-controller is, enzovoort.

4. Lees metingen van het apparaat:

START, 0x00, STOPREAD 6 byte 

Wat je ervoor terugkrijgt staat beschreven in dit overzicht:

  • Bitbyte 7 6 5 4 3 2 1 0
  • 1 Joystick X-as [7:0]
  • 2 Joystick Y-as [7:0]
  • 3 versnellingsmeter X-as [9:2]
  • 4 versnellingsmeter Y-as [9:2]
  • 5 versnellingsmeter Z-as [9:2]
  • 6 Az [1:0] Ay [1:0] Ax [1:0] ¬Bc ¬Bz

Dus de knopwaarden zijn omgekeerd en de LSB-bits van de accelerometer zitten in byte 6. In de bibliotheek combineer ik de LSB-bits met de rest. Ik heb mensen de waarden zien gebruiken zonder de LSB-bits, wat een te vereenvoudigde manier is om het signaal stabieler te krijgen. Voor mij geef ik de voorkeur aan een signaal met ruis van een ADC, dat gemakkelijk kan worden gefilterd met een complementair of een Kalman-filter in plaats van de getallen af ​​te snijden door af te ronden - waardoor je veel informatie verliest.

5. Lees actuele kalibratiegegevens van het apparaat:

START, 0x20, STOP LEZEN 16byte 

Wat je ervoor terugkrijgt staat beschreven in dit overzicht:

Byte

Beschrijving

  • 1 0G-waarde van X-as [9:2]
  • 20G-waarde van Y-as [9:2]
  • 30G-waarde van Z-as [9:2]
  • 4 LSB van nulwaarde van X-, Y-, Z-assen
  • 5 1G-waarde van X-as [9:2]
  • 6 1G-waarde van Y-as [9:2]
  • 7 1G-waarde van Z-as [9:2]
  • 8 LSB van 1G-waarde van X,Y,Z-assen
  • 9 Joystick X-as maximum
  • 10 Joystick X-as minimaal
  • 11 Joystick X-as midden
  • 12 Joystick Y-as maximum
  • 13 Joystick Y-as minimaal
  • 14 Joystick Y-as midden
  • 15 controlesom
  • 16 Controlesom

Byte 0-3 slaat de nulwaarden van de X-, Y- en Z-as op, terwijl bytes 4-7 de waarden op 1G (aardegravitatie) opslaan. De kalibratiegegevens worden nog niet gebruikt in de software-implementatie.

Code

  • Codefragment #1
Codefragment #1Platte tekst
#include #include "nunchuk.h"void setup() { Serial.begin(9600); Draad.begin(); // nunchuk_init_power(); // A1 en A2 zijn voeding nunchuk_init();}void loop() {if (nunchuk_read()) { // Werk met nunchuk_data nunchuk_print(); } vertraging(10);}
Github
https://github.com/infusion/Fritzing/tree/master/Nunchukhttps://github.com/infusion/Fritzing/tree/master/Nunchuk

Aangepaste onderdelen en behuizingen


Productieproces

  1. IR-afstandsbediening gebruiken met Raspberry Pi zonder LIRC
  2. Licht dimmen met PWM met drukknop
  3. Maak Monitor Ambilight met Arduino
  4. Aanwezigheidssysteem met Arduino en RFID met Python
  5. CO2-monitoring met K30-sensor
  6. Doofblinde communicatie met 1Sheeld/Arduino
  7. Bedien muntvangers met Arduino
  8. DIY voltmeter met Arduino en smartphone
  9. Hartslagmeter met IoT
  10. Arduino met Bluetooth om een ​​LED te bedienen!
  11. Nunchuk-gestuurde robotarm (met Arduino)