Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Ein Wii Nunchuk mit Arduino verwenden

Komponenten und Verbrauchsmaterialien

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

Über dieses Projekt

Vorwort

Ursprünglich wurde dieser Beitrag auf www.xarg.org veröffentlicht.

Verwenden eines Wii Nunchuk mit Arduino

Wir sind alle mit Gamepads in unseren Händen aufgewachsen, was sie ideal macht, um sie mit buchstäblich jeder möglichen Anwendung zu kombinieren. Eine großartige Erfindung von Nintendo ist der Nunchuk, eine günstige Erweiterung für die Wii U-Fernbedienung. Da es I2C als Transportprotokoll verwendet, ist es einfach, auf die Rohdaten des Controllers zuzugreifen. Da es so einfach ist, dachte ich, es muss eine Standardlösung dafür geben, konnte aber keine stabile Implementierung finden, sondern nur jede Menge Codeschnipsel. Deshalb habe ich mich darauf konzentriert, diese Lücke zu schließen, und hier ist sie. In diesem Artikel werde ich dich durch die Details führen und es für einen Arduino implementieren.

Hardware

Der Nunchuk hat zwei Folientasten, genannt Button C und Button Z. Oben auf dem Gerät befindet sich ein analoger zweiachsiger Joystick und das ganze Gerät ist bewegungsempfindlich, da ein Beschleunigungsmesser Kräfte misst, die auf alle drei Dimensionen wirken. Es wird empfohlen, den Nunchuk mit 3v3 zu betreiben und Sie sollten auf jeden Fall einen Level-Shifter verwenden, wenn Sie diese Spannung nicht liefern können, um die Lebensdauer zu erhöhen. Für dieses Setup benötigst du mindestens die folgenden Teile:

Teile

  • Nintendo Nunchuk (oder Replik)
  • Arduino
  • Level-Shifter (optional)
  • Nunchuk-Adapter (optional)

Original Nunchuk oder Replik

Die große Frage ist, sollte man ein original Nintendo Nunchuk oder eine chinesische Nachbildung kaufen? Um meinen Nunchuk-Fahrer zu testen, habe ich beides gekauft - das Original und eine billige Kopie. Beide Versionen sind alles andere als teuer, aber der Unterschied beträgt etwa 10-15€. Was ich sagen kann ist, dass die Adern des Kabels des original Nunchuk geschirmt sind, was sie robuster gegen Störungen macht. Der Joystick des Originals hat eine höhere Qualität, er kann alle Bewegungen im vollen Wertebereich auflösen, während die Kopie nicht auf minimale Bewegungen reagiert. Auch die Qualität des Beschleunigungsmessers des Originals ist besser. Allerdings habe ich einen Kalman-Filter angewendet, der diese Unterschiede nivelliert. Wenn du also einen langlebigen Controller willst, würde ich zum Original gehen, wenn du nur ein billiges Eingabegerät brauchst, hast du vielleicht Glück mit einer Nunchuk-Kopie.

Nunchuk-Anschluss

Nintendo verbindet alle Peripheriegeräte mit einem proprietären Stecker. Da ich keine Wii habe und die Controller nicht für Spiele verwenden werde, habe ich die Anschlüsse auseinandergerissen. Einen Nunchuk-Adapter bekommt man für ein paar Euro, wenn man diesen drastischen Schritt nicht machen möchte, aber mit etwas Lötgeschick sollte man den Stecker trotzdem reparieren können. Ich empfehle, den Stecker zu öffnen, da Sie sehen können, wie die Drähte mit den Pins verbunden sind. Dies ist besonders bei Nunchuk-Repliken wichtig, da die Drähte beliebig verbunden werden können. Eine andere seltsame Sache ist, dass der ursprüngliche Controller 4 Drähte hat und der Nachbau 5 hat, während der Stecker tatsächlich 6 Pins hat. Okay, machen wir uns an die Arbeit und öffnen den Connector:

Und schneide die Drähte ab:

Wenn Sie frontal auf den Stecker schauen, sehen Sie diese Pins:

Beim Original Nunchuk sind die Farbe und das Pin-Layout des Steckers wie folgt:

  • Grün → SDA
  • nc
  • Rot → 3v3
  • Weiß → GND
  • nc
  • Gelb → SCL

Für den Nunchuk-Klon, den ich bekommen habe, ist folgendes die Farbe und das Pin-Layout des Steckers:

  • Gelb → SDA
  • Schwarz → nc
  • Grün → 3v3
  • Rot → GND
  • nc
  • Weiß → SCL

Wie gesagt, man sollte auf jeden Fall darauf achten, wie die Drähte verlegt sind und nichts nach seiner Farbe verbinden. Die verwendeten Akronyme sind:nc für nicht verbunden, SDA - die Datenleitung (muss mit A4 auf dem Arduino-Board verbunden werden) und SCL - die Uhr (verbunden mit A5). Arduino hat einen Spannungsregler, mit dem wir 3v3 direkt verwenden können. Wenn Sie das WiiChuck oder einen ähnlichen Nunchuk-Adapter verwenden möchten, verbinden Sie 3v3 mit A2 und GND mit A1 - Sie müssen später nunchuk_init_power() . aufrufen um diese Netzteilanschlüsse zu initialisieren. Die folgende Fritzing-Skizze veranschaulicht den Zusammenhang:

Software

Ich habe eine kleine Header-Bibliothek geschrieben, die die Kommunikation mit dem Nunchuk implementiert. Tatsächlich sollten Sie sich keine Gedanken darüber machen, was hinter den Kulissen vor sich geht, es sollte sofort einsatzbereit sein. Wenn dich die Details interessieren, erkläre ich das in einer Minute trotzdem.

Nunchuk-Bibliothek herunterladen

Die Kommunikation mit dem Nunchuk erfolgt über den TWI-Bus, der nur eine andere Bezeichnung für I2C ist (okay, einige Details sind anders, was für unsere Zwecke jedoch egal ist). Die Geschwindigkeit des I2C-Busses ist standardmäßig auf Fast Mode (400kHz) eingestellt. Um den Nunchuk mit Ihrem Arduino zu verwenden, wird nur Folgendes benötigt:

#include #include "nunchuk.h"void setup() { Serial.begin(9600); Wire.begin(); // nunchuk_init_power(); // A1 und A2 sind Netzteil nunchuk_init();}void loop() { if (nunchuk_read()) { // Arbeite mit nunchuk_data nunchuk_print(); } Verzögerung(10);} 

Wenn Sie die mit der Bibliothek gelieferte Verarbeitungsdatei starten, können Sie diesen Kegel mit Ihrem Nunchuk ausbalancieren:

Anstelle von nunchuk_print() Viele Funktionen können verwendet werden, um auf die aktuellen Daten zuzugreifen:

Nunchuk-Funktionen

  • nunchuk_buttonZ(): 1 oder 0, egal ob die Z-Taste gedrückt ist oder nicht
  • nunchuk_buttonC(): 1 oder 0, ob die C-Taste gedrückt ist oder nicht
  • nunchuk_joystickX_raw() / nunchuk_joystickX() nunchuk_joystickY_raw() / nunchuk_joystickY(): Der x- oder y-Wert des Joysticks. Eine Rohversion für jede Funktion ermöglicht den Zugriff auf Daten ohne Kalibrierung.
  • nunchuk_joystick_angle(): Berechnet den Winkel des Joysticks im Bogenmaß.
  • nunchuk_accelX_raw() / nunchuk_accelX() nunchuk_accelY_raw() / nunchuk_accelY() nunchuk_accelZ_raw() / nunchuk_accelZ(): Die x-, y- oder z- Wert des Beschleunigungsmessers. Eine Rohversion für jede Funktion ermöglicht den Zugriff auf Daten ohne Kalibrierung.
  • nunchuk_pitch(): Berechnet den Nickwinkel des Controllers im Bogenmaß.
  • nunchuk_roll(): Berechnet den Rollwinkel des Controllers im Bogenmaß.

Hinweis: Es gibt kein nunchuk_yaw() Funktion, da ein Beschleunigungsmesser nur gerichtete Kräfte und keine Rotationsgeschwindigkeit messen kann. Dieser Umstand begrenzt auch die Neigung auf nur 180° und erzwingt einen falschen Rollwinkel, wenn die Neigung größer als 180° ist.

Die Berechnung des Nick- und Wankwinkels funktioniert ebenfalls unter der vereinfachenden Annahme, dass die einzige Geschwindigkeit, die auf den Regler einwirkt, die Schwerkraft ist. Dies funktioniert, da der Nunchuk entweder still gehalten wird oder eine konstante Geschwindigkeit durch eine äußere Kraft erfährt.

Kalibrierung

Wie in der Funktionsübersicht beschrieben, gibt es jede Funktion des Joysticks und des Beschleunigungsmessers in einer kalibrierten und einer rohen Version. Am Anfang der Bibliotheksdatei definieren einige Konstanten die Nullpositionen. Am besten lesen Sie die Rohmaße Ihres Controllers aus, wenn Sie ihn in neutraler Position halten und passen die Konstanten entsprechend an.

I2C-Protokoll

Der letzte Abschnitt hier behandelt das eigentliche I2C-Protokoll. Wenn Sie nur den Controller verwenden möchten, werden diese Informationen nicht benötigt, aber wenn Sie das Protokoll verstehen möchten, hoffe ich, dass ich Ihnen etwas Zeit sparen kann.

Ich begann mit der Entwicklung, indem ich mit meinem I2C-Scanner nach der tatsächlichen Adresse des Nunchuk suchte, die 0x52 lautet. Das Auslesen von Parametern aus dem Speicher des Nunchuk über den I2C-Bus ist der Kommunikation mit einem normalen I2C-EEPROM ziemlich ähnlich. Bevor die Daten vom Nunchuk gelesen werden können, muss eine Initialisierungssequenz gesendet werden.

Um Daten vom Nunchuk zu lesen, ist es notwendig, die zu lesende Adresse zu senden, da der Controller des Nunchuk die Adresse bei jedem Lesen inkrementiert. Die Daten, an denen wir eigentlich interessiert sind, liegen an der Adresse 0x00 und sind 6 Byte lang. An Adresse 0x20 und 0x30 (scheint eine exakte Kopie der Bytes bei 0x20 zu sein) werden 16 Byte Kalibrierdaten gespeichert. Unter Adresse 0xFA finden Sie die Identnummer des Geräts, die 0xA4200000 für Nunchuck, 0xA4200101 für Classic Controller, 0xA4200402 für Balance usw. ist.

Wenn Daten in den Nunchuk geschrieben werden müssen, ist das Format analog zum Lesebefehl. Das erste Byte ist die Adresse, gefolgt von den eigentlichen Daten.

Lassen Sie uns die tatsächlichen Byte-Sequenzen des Nunchuk für die beschriebenen Funktionen durchgehen:

1. Initialisieren Sie den Nunchuk:

START, 0x40, 0x00, STOP 

Diese Sequenz ist die normale Initialisierungssequenz, die den Verschlüsselungsalgorithmus auf den Standardwert setzt. Jedes Byte, das aus dem Nunchuk gelesen wird, muss dann mit (x ^ 0x17) + 0x17 . entschlüsselt werden . Eine bessere Möglichkeit besteht darin, die Verschlüsselung mit dieser Sequenz zu deaktivieren:

2. Initialisieren Sie den Nunchuk ohne Verschlüsselung:

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

Dies hat den Vorteil, dass die tatsächlichen Daten ohne die Entschlüsselungsformel verwendet werden können und es auch mit Nunchuk-Klonen funktioniert.

3. Lesen Sie die Geräte-ID aus dem Erweiterungsregister:

START, 0xFA, STOPREAD 6 Byte 

Die Daten sind die Ident, die ich bereits erwähnt habe, wenn das angeschlossene Gerät ein Nunchuk- oder Classic-Controller ist und so weiter.

4. Messwerte vom Gerät ablesen:

START, 0x00, STOPREAD 6 Byte 

Was Sie im Gegenzug erhalten, wird in dieser Übersicht beschrieben:

  • Bit-Byte 7 6 5 4 3 2 1 0
  • 1 Joystick-X-Achse [7:0]
  • 2 Joystick Y-Achse [7:0]
  • 3 Beschleunigungsmesser X-Achse [9:2]
  • 4 Beschleunigungsmesser Y-Achse [9:2]
  • 5 Beschleunigungsmesser Z-Achse [9:2]
  • 6 Az [1:0] Ay [1:0] Ax [1:0] ¬Bc ¬Bz

Die Tastenwerte werden also invertiert und die LSB-Bits des Beschleunigungsmessers sind in Byte 6 enthalten. In der Bibliothek kombiniere ich die LSB-Bits mit dem Rest. Ich habe Leute gesehen, die die Werte ohne die LSB-Bits verwendet haben, was eine zu vereinfachte Möglichkeit ist, das Signal stabiler zu machen. Ich bevorzuge ein verrauschtes Signal von einem ADC, das leicht mit einem Komplementär- oder Kalman-Filter gefiltert werden kann, anstatt die Zahlen durch Runden abzuschneiden - wo Sie viele Informationen verlieren.

5. Lesen Sie die aktuellen Kalibrierdaten vom Gerät:

START, 0x20, STOP READ 16byte 

Was Sie im Gegenzug erhalten, wird in dieser Übersicht beschrieben:

Byte

Beschreibung

  • 1 0G-Wert der X-Achse [9:2]
  • 2 0G-Wert der Y-Achse [9:2]
  • 3 0G-Wert der Z-Achse [9:2]
  • 4 LSB des Nullwerts der X-, Y-, Z-Achsen
  • 5 1G-Wert der X-Achse [9:2]
  • 6 1G-Wert der Y-Achse [9:2]
  • 7 1G-Wert der Z-Achse [9:2]
  • 8 LSB von 1G-Wert der X-, Y-, Z-Achse
  • 9 Joystick-X-Achse maximal
  • Mindestens 10 Joystick-X-Achse
  • 11 Joystick-X-Achsen-Mitte
  • 12 Joystick Y-Achse maximal
  • 13 Joystick-Y-Achsen-Minimum
  • 14 Joystick Y-Achsen-Mitte
  • 15 Prüfsumme
  • 16 Prüfsumme

Byte 0-3 speichern die Nullwerte der X-, Y- und Z-Achse, während die Bytes 4-7 die Werte bei 1G (Erdgravitation) speichern. Die Kalibrierdaten werden noch nicht in der Softwareimplementierung verwendet.

Code

  • Code-Snippet Nr. 1
Code-Snippet Nr. 1Nur-Text
#include #include "nunchuk.h"void setup() { Serial.begin(9600); Wire.begin(); // nunchuk_init_power(); // A1 und A2 sind Netzteil nunchuk_init();}void loop() { if (nunchuk_read()) { // Arbeite mit nunchuk_data nunchuk_print(); } Verzögerung(10);}
Github
https://github.com/infusion/Fritzing/tree/master/Nunchukhttps://github.com/infusion/Fritzing/tree/master/Nunchuk

Kundenspezifische Teile und Gehäuse


Herstellungsprozess

  1. Verwenden der IR-Fernbedienung mit Raspberry Pi ohne LIRC
  2. Dimmen von Lichtern mit PWM über Drucktasten
  3. Erstellen von Monitor-Ambilight mit Arduino
  4. Anwesenheitssystem mit Arduino und RFID mit Python
  5. CO2-Überwachung mit K30-Sensor
  6. taubblinde Kommunikation mit 1Sheeld/Arduino
  7. Münzprüfer mit Arduino steuern
  8. DIY-Voltmeter mit Arduino und Smartphone
  9. Herzfrequenzmesser mit IoT
  10. Arduino mit Bluetooth zur Steuerung einer LED!