Integración de Wii Nunchuk con Arduino: Guía paso a paso (I2C)
Componentes y materiales
| Componente | Cantidad | Notas |
|---|---|---|
| Nintendo Nunchuk (original o réplica) | 1 | Original: cables blindados, joystick y acelerómetro mejores. |
| Arduino (UNO, Nano, etc.) | 1 | Cualquiera con I2C (A4=SDA, A5=SCL). |
| Level Shifter (bidireccional) / Conversor lógico | 1 | Recomendado: Nunchuk funciona a 3.3V. Si Arduino es 5V, protege el dispositivo. |
| Adaptador Nunchuk (opcional) | 1 | Evita cortar el conector propietario. |
Sobre el proyecto
El Wii Nunchuk es un mando barato y versátil: joystick analógico 2 ejes, 2 botones (C, Z), acelerómetro 3 ejes. Se comunica por I2C (dirección 0x52). Este artículo proporciona una librería completa y estable (nunchuk.h) para leer todos sus datos con calibración, filtrado Kalman y funciones de ángulo (pitch/roll).
Conexión del conector Nunchuk
El conector propietario tiene 6 pines. Al abrirlo (o usar adaptador), el cableado típico es:
| Pin (vista frontal) | Original (color) | Réplica (color) | Función |
|---|---|---|---|
| 1 | Verde | Amarillo | SDA |
| 2 | NC | Negro | NC |
| 3 | Rojo | Verde | 3.3V |
| 4 | Blanco | Rojo | GND |
| 5 | NC | NC | NC |
| 6 | Amarillo | Blanco | SCL |
¡Verifica siempre con multímetro! Los colores varían en réplicas.
Con level shifter: lado HV (Arduino 5V) ↔ lado LV (Nunchuk 3.3V). SDA/SCL cruzados. Alimentación: 3.3V del Arduino → LV, GND común.
Si usas adaptador "WiiChuck": conecta sus pines 3.3V y GND a A2 y A1 del Arduino respectivamente, y llama a nunchuk_init_power() en setup.
Software: Librería Nunchuk
Descarga: GitHub (incluye nunchuk.h y ejemplo Processing).
Uso básico
#include <Wire.h>
#include "nunchuk.h"
void setup() {
Serial.begin(9600);
Wire.begin();
// nunchuk_init_power(); // Si usas adaptador WiiChuck (A1=GND, A2=3.3V)
nunchuk_init();
}
void loop() {
if (nunchuk_read()) {
// Datos disponibles en nunchuk_data struct
nunchuk_print(); // Vuelca a Serial para debug
// O usa funciones individuales:
// int joyX = nunchuk_joystickX(); // -128..127 calibrado
// int accZ = nunchuk_accelZ(); // 0..255 calibrado
// float pitch = nunchuk_pitch(); // radianes
// float roll = nunchuk_roll(); // radianes
// bool btnZ = nunchuk_buttonZ();
// bool btnC = nunchuk_buttonC();
}
delay(10);
}
Funciones principales
nunchuk_buttonZ(),nunchuk_buttonC(): 1/0 pulsado.nunchuk_joystickX(),nunchuk_joystickY(): calibrados (-128..127). Versiones_raw()sin calibrar.nunchuk_joystick_angle(): ángulo joystick (rad).nunchuk_accelX(),nunchuk_accelY(),nunchuk_accelZ(): calibrados (0..255, 128=0g). Versiones_raw().nunchuk_pitch(),nunchuk_roll(): ángulos inclinación (rad). No hay yaw (acelerómetro no mide rotación).
Calibración
Al inicio de nunchuk.h hay constantes para posición neutra (zero) y 1G. Ejecuta el ejemplo, mira valores _raw() en reposo y ajusta las constantes para tu unidad.
Protocolo I2C (detalles técnicos)
Dirección: 0x52. Velocidad Fast Mode (400kHz).
- Inicialización con encriptación:
START, 0x40, 0x00, STOP. Cada byte leído debe descifrarse:(x ^ 0x17) + 0x17. - Inicialización SIN encriptación (recomendada):
Funciona con clones y evita descifrado.START, 0xF0, 0x55, STOP START, 0xFB, 0x00, STOP - Leer ID dispositivo:
START, 0xFA, STOP → READ 6 bytes. Nunchuk = 0xA4200000. - Leer medidas (6 bytes):
START, 0x00, STOP → READ 6 bytes.- Byte 1: Joy X [7:0]
- Byte 2: Joy Y [7:0]
- Byte 3: Acc X [9:2]
- Byte 4: Acc Y [9:2]
- Byte 5: Acc Z [9:2]
- Byte 6: Az[1:0] Ay[1:0] Ax[1:0] ¬Bc ¬Bz (botones invertidos, LSB acelerómetros)
- Leer calibración (16 bytes):
START, 0x20, STOP → READ 16 bytes. Contiene zero-G, 1G, min/max/center joystick, checksums.
Piezas personalizadas (opcional)
Soporte impreso 3D para montar Nunchuk en proyectos (archivo STL en sección CAD).
Proceso de manufactura
- Capturar comandos de mando IR en Raspberry Pi sin LIRC: enfoque Python UART
- Control de Brillo LED con PWM mediante Pulsador en Arduino Mega
- Crea un Impresionante Sistema Ambilight para Monitor con Arduino
- Sistema de Asistencia RFID Fiable con Arduino y Python
- Sensor K30 CO₂: Monitorización en tiempo real de la calidad del aire interior
- Facilitar la comunicación sordo‑ciego usando 1Sheeld y Arduino
- Alcancía Inteligente: Controla un Aceptador de Monedas con Arduino Nano
- Construye un Voltímetro Inteligente con Arduino y Smartphone – Proyecto DIY Fácil
- Monitor de Frecuencia Cardíaca IoT en Tiempo Real con Arduino y MAX30100
- Controla un LED por Bluetooth con Arduino – Guía DIY paso a paso
- Brazo Robótico de 6 Grados de Libertad Controlado por Nunchuk con Arduino