Intégrer une Wii Nunchuk à Arduino : guide pas à pas
Composants et fournitures
| Composant | Quantité | |
|---|---|---|
| Nintendo Nunchuk (ou réplique) | 1 | |
| Convertisseur de niveau logique (SparkFun) | 1 | Recommandé pour alimenter le Nunchuk en 3,3V |
| Arduino UNO | 1 |
À propos du projet
Préface
Cet article a été publié à l'origine sur www.xarg.org.
Utiliser une Wii Nunchuk avec Arduino
Nous avons tous grandi avec des gamepads en main — ils sont idéaux pour piloter n'importe quelle application. La Nunchuk de Nintendo, extension bon marché de la Wiimote, utilise l'I2C : accès facile aux données brutes. Cherchant une implémentation stable, je n'ai trouvé que des bribes de code. J'ai donc comblé ce vide. Ce guide détaille le matériel, le protocole I2C, et fournit une bibliothèque Arduino prête à l'emploi.
Matériel
La Nunchuk comporte :
- 2 boutons membrane : C et Z
- Joystick analogique 2 axes
- Accéléromètre 3 axes (détecte forces/mouvements)
Alimentation recommandée : 3,3V. Utilisez un convertisseur de niveau si votre Arduino est en 5V (Uno, Mega…) pour prolonger la durée de vie du contrôleur.
Pièces minimales
- Nintendo Nunchuk (ou réplique)
- Arduino
- Convertisseur de niveau (optionnel mais recommandé)
- Adaptateur Nunchuk (optionnel, évite de couper le connecteur)
Nunchuk original ou réplique ?
J'ai testé les deux. Différence ~10-15€.
- Original : câble blindé (robuste), joystick meilleure résolution (détecte micro-mouvements), accéléromètre de meilleure qualité.
- Réplique : câble non blindé, joystick moins précis, accéléromètre plus bruité.
Ma bibliothèque applique un filtre de Kalman qui nivelle ces différences. Pour un usage durable : original. Pour prototype pas cher : réplique peut suffire.
Connecteur Nunchuk
Connecteur propriétaire Nintendo. Je n'ai pas de Wii, j'ai coupé le connecteur. Adaptateurs Nunchuk existent (quelques €) si vous préférez. Ouvrir le connecteur permet de voir le câblage réel — crucial pour les répliques où les couleurs sont aléatoires. L'original a 4 fils, la réplique 5, pour 6 broches sur le connecteur.
Vue de face du connecteur (broches) :
Câblage Nunchuk original :
- Vert → SDA
- Broche 2 → nc
- Rouge → 3,3V
- Blanc → GND
- Broche 5 → nc
- Jaune → SCL
Câblage réplique testée :
- Jaune → SDA
- Noir → nc
- Vert → 3,3V
- Rouge → GND
- Broche 5 → nc
- Blanc → SCL
Vérifiez toujours le câblage réel de VOTRE unité — ne vous fiez pas aux couleurs !
Acronymes : nc = non connecté, SDA = ligne données (→ A4 Arduino), SCL = horloge (→ A5 Arduino). L'Arduino fournit du 3,3V via son régulateur. Si vous utilisez un adaptateur WiiChuck : 3,3V sur A2, GND sur A1, puis appelez nunchuk_init_power().
Logiciel
J'ai écrit une petite bibliothèque header-only (nunchuk.h) qui gère la communication. Utilisation simple :
#include <Wire.h>
#include "nunchuk.h"
void setup() {
Serial.begin(9600);
Wire.begin();
// nunchuk_init_power(); // Si alimentation via A1/A2
nunchuk_init();
}
void loop() {
if (nunchuk_read()) {
// Travaillez avec nunchuk_data
nunchuk_print(); // Affiche sur Serial
}
delay(10);
}
Le fichier Processing inclus permet d'équilibrer un cône 3D avec la Nunchuk :
Fonctions de la bibliothèque
nunchuk_buttonZ(): 1 si bouton Z pressé, 0 sinonnunchuk_buttonC(): 1 si bouton C pressé, 0 sinonnunchuk_joystickX()/nunchuk_joystickY(): valeurs calibrées (-128..127)nunchuk_joystickX_raw()/nunchuk_joystickY_raw(): valeurs brutes (0..255)nunchuk_joystick_angle(): angle du joystick en radiansnunchuk_accelX()/nunchuk_accelY()/nunchuk_accelZ(): accélérations calibrées (g)nunchuk_accelX_raw()/nunchuk_accelY_raw()/nunchuk_accelZ_raw(): valeurs brutesnunchuk_pitch(): angle de tangage (pitch) en radiansnunchuk_roll(): angle de roulis (roll) en radians
Note : Pas de nunchuk_yaw() — l'accéléromètre mesure l'accélération (gravité), pas la vitesse angulaire. Le pitch est limité à 180°, le roll devient incorrect au-delà. Calculs basés sur l'hypothèse que seule la gravité agit (contrôleur immobile ou vitesse constante).
Calibration
Chaque fonction joystick/accéléromètre existe en version calibrée et brute. Les constantes de position zéro sont en tête de bibliothèque. Lisez les valeurs brutes en position neutre et ajustez les constantes.
Protocole I2C (détails techniques)
Inutile pour l'utilisation basique, mais utile pour comprendre.
Adresse I2C du Nunchuk : 0x52. Lecture similaire à une EEPROM I2C. Séquence d'initialisation requise avant lecture.
Pour lire les données : envoyer adresse 0x00, lire 6 octets. Le contrôleur incrémente l'adresse à chaque lecture.
- Adresse
0x20et0x30: 16 octets de données de calibration (copie identique) - Adresse
0xFA: identifiant dispositif (ex:0xA4200000= Nunchuk)
Écriture : adresse suivie des données.
1. Initialisation standard (avec chiffrement) :
START, 0x40, 0x00, STOP
Chaque octet lu doit être déchiffré : (x ^ 0x17) + 0x17.
2. Initialisation sans chiffrement (recommandée) :
START, 0xF0, 0x55, STOP
START, 0xFB, 0x00, STOP
Données directement exploitables, compatible répliques.
3. Lecture identifiant dispositif :
START, 0xFA, STOP
READ 6 octets
4. Lecture mesures (6 octets) :
START, 0x00, STOP
READ 6 octets
Structure des 6 octets :
| Octet | Bits 7-0 |
|---|---|
| 1 | Joystick X [7:0] |
| 2 | Joystick Y [7:0] |
| 3 | Accel X [9:2] |
| 4 | Accel Y [9:2] |
| 5 | Accel Z [9:2] |
| 6 | Az[1:0] Ay[1:0] Ax[1:0] ¬Bc ¬Bz |
Boutons inversés (¬Bz, ¬Bc). Les 2 bits de poids faible de chaque axe accéléromètre sont dans l'octet 6. La bibliothèque les recombine. Tronquer ces bits (comme vu parfois) perd de l'information — mieux vaut filtrer (Kalman/complémentaire) le signal bruité.
5. Lecture données de calibration (16 octets à 0x20) :
| Octet | Description |
|---|---|
| 1 | Valeur 0G axe X [9:2] |
| 2 | Valeur 0G axe Y [9:2] |
| 3 | Valeur 0G axe Z [9:2] |
| 4 | LSB valeurs 0G X,Y,Z |
| 5 | Valeur 1G axe X [9:2] |
| 6 | Valeur 1G axe Y [9:2] |
| 7 | Valeur 1G axe Z [9:2] |
| 8 | LSB valeurs 1G X,Y,Z |
| 9 | Joystick X max |
| 10 | Joystick X min |
| 11 | Joystick X centre |
| 12 | Joystick Y max |
| 13 | Joystick Y min |
| 14 | Joystick Y centre |
| 15 | Checksum |
| 16 | Checksum |
Octets 0-3 : valeurs 0G (repos). Octets 4-7 : valeurs 1G (gravité terrestre). Données de calibration non encore exploitées dans la librairie logicielle.
Code
Extrait de code #1 (exemple minimal)
#include <Wire.h>
#include "nunchuk.h"
void setup() {
Serial.begin(9600);
Wire.begin();
// nunchuk_init_power(); // Si alimentation via A1/A2
nunchuk_init();
}
void loop() {
if (nunchuk_read()) {
nunchuk_print();
}
delay(10);
}
Dépôt GitHub
https://github.com/infusion/Fritzing/tree/master/Nunchuk (schéma Fritzing + bibliothèque)
Pièces personnalisées et boîtiers
Processus de fabrication
- Capturer les commandes de télécommande IR sur Raspberry Pi sans LIRC : Approche Python UART
- Contrôler la Luminosité de LEDs par PWM avec un Bouton Poussoir sur Arduino Mega
- Créer un système Ambilight spectaculaire pour moniteur avec Arduino
- Système de pointage RFID fiable avec Arduino et Python (base de données phpMyAdmin)
- Capteur CO2 K30 : Surveillance en temps réel de la qualité de l'air intérieur
- Faciliter la communication sourd-aveugle avec 1Sheeld et Arduino
- Construire une Tirelire Intelligente : Contrôler un Accepteur de Pièces avec Arduino Nano
- Construire un Voltmètre Intelligent avec Arduino et Smartphone – Projet DIY Facile
- Moniteur de Fréquence Cardiaque IoT en Temps Réel avec Arduino et MAX30100