Подключение Wii Nunchuk к Arduino: полное руководство (I2C, калибровка, библиотека)
Компоненты и материалы
| Nintendo Nunchuk (оригинал или копия) | 1 | |
| Уровневый преобразователь (Logic Level Shifter) | 1 | Рекомендуется для 5V Arduino |
| Arduino UNO (или другая 5V плата) | 1 |
О проекте
Wii Nunchuk — дешёвый и функциональный контроллер: 2 кнопки (C, Z), 2-осевой джойстик, 3-осевой акселерометр. Интерфейс — I2C (адрес 0x52). Статья охватывает железо, протокол, калибровку и готовую библиотеку.
Оригинал или копия?
- Оригинал: экранированные провода, точный джойстик, качественный акселерометр. Дороже на 10–15€.
- Копия: может не реагировать на малые движения джойстика, шумнее акселерометр. Но с фильтром Кальмана разница сглаживается.
- Для долгой жизни — оригинал; для разовых проектов — копия подойдёт.
Разъём Nunchuk (проприетарный)
Автор рекомендует вскрыть разъём, чтобы увидеть раскладку проводов (цвета могут отличаться!).
| Пин (вид спереди) | Оригинал | Копия (пример) |
|---|---|---|
| 1 | Green → SDA | Yellow → SDA |
| 2 | NC | Black → NC |
| 3 | Red → 3.3V | Green → 3.3V |
| 4 | White → GND | Red → GND |
| 5 | NC | NC |
| 6 | Yellow → SCL | White → SCL |
SDA → A4, SCL → A5 на Arduino. Питание 3.3V (на Uno — пин 3.3V). Если используете адаптер WiiChuck: 3.3V→A2, GND→A1, вызовите nunchuk_init_power().
Уровневый сдвигатель
Nunchuk рассчитан на 3.3V. На 5V Arduino обязателен двунаправленный сдвигатель (SDA/SCL), иначе контроллер быстро выйдет из строя.
Программная часть
Библиотека
Автор написал заголовочный файл nunchuk.h (доступен на GitHub). Использование:
#include <Wire.h>
#include "nunchuk.h"
void setup() {
Serial.begin(9600);
Wire.begin();
// nunchuk_init_power(); // если питание через A1/A2
nunchuk_init();
}
void loop() {
if (nunchuk_read()) {
// Данные доступны через функции ниже
nunchuk_print(); // вывод в Serial для отладки
}
delay(10);
}
Основные функции API
| Функция | Возвращает |
|---|---|
nunchuk_buttonZ() | 1/0 — нажата ли Z |
nunchuk_buttonC() | 1/0 — нажата ли C |
nunchuk_joystickX() / _raw() | X джойстика (калиброванное / сырое) |
nunchuk_joystickY() / _raw() | Y джойстика |
nunchuk_joystick_angle() | Угол джойстика (рад) |
nunchuk_accelX() / _raw() | X акселерометра |
nunchuk_accelY() / _raw() | Y акселерометра |
nunchuk_accelZ() / _raw() | Z акселерометра |
nunchuk_pitch() | Тангаж (рад) |
nunchuk_roll() | Крен (рад) |
Yaw (рыскание) недоступно — акселерометр не измеряет вращение.
Калибровка
В начале библиотеки константы нулевых положений. Лучше считать сырые значения в нейтрали и скорректировать их.
Протокол I2C (детали)
- Инициализация с шифрованием:
START, 0x40, 0x00, STOP. Чтение требует дешифровки(x ^ 0x17) + 0x17. - Инициализация БЕЗ шифрования (рекомендуется):
START, 0xF0, 0x55, STOP→START, 0xFB, 0x00, STOP. Работает и с копиями. - Чтение ID устройства (0xFA): 6 байт, например
0xA4200000= Nunchuk. - Чтение данных (0x00): 6 байт: JoyX, JoyY, AccX[9:2], AccY[9:2], AccZ[9:2], байт 6 = биты кнопок (инвертированные) + LSB акселерометра.
- Калибровочные данные (0x20): 16 байт: нули и 1G для осей, минимум/максимум/центр джойстика, чексуммы.
Ссылки
- Библиотека и примеры: GitHub
- Fritzing-схема в разделе CAD.
Производственный процесс
- Перехват команд ИК-пульта на Raspberry Pi без LIRC: подход через Python UART
- Управление яркостью LED с ШИМ через кнопку на Arduino Mega
- Создание потрясающей системы Ambilight для монитора на Arduino
- Надежная система учета рабочего времени на Arduino с RFID и Python
- Датчик CO2 K30: мониторинг качества воздуха в реальном времени на Arduino
- Устройство для общения глухосліпых людей с помощью 1Sheeld и Arduino
- Умная копилка: управление монетоприёмником на Arduino Nano
- Умный вольтметр на Arduino и смартфоне — простое DIY-проект
- IoT-монитор пульса в реальном времени на Arduino и MAX30100
- Управление светодиодом по Bluetooth с Arduino: простой DIY-гид