Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Подключение 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). Статья охватывает железо, протокол, калибровку и готовую библиотеку.

Оригинал или копия?

Разъём Nunchuk (проприетарный)

Автор рекомендует вскрыть разъём, чтобы увидеть раскладку проводов (цвета могут отличаться!).

Пин (вид спереди)ОригиналКопия (пример)
1Green → SDAYellow → SDA
2NCBlack → NC
3Red → 3.3VGreen → 3.3V
4White → GNDRed → GND
5NCNC
6Yellow → SCLWhite → 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 (детали)

  1. Инициализация с шифрованием: START, 0x40, 0x00, STOP. Чтение требует дешифровки (x ^ 0x17) + 0x17.
  2. Инициализация БЕЗ шифрования (рекомендуется): START, 0xF0, 0x55, STOP → START, 0xFB, 0x00, STOP. Работает и с копиями.
  3. Чтение ID устройства (0xFA): 6 байт, например 0xA4200000 = Nunchuk.
  4. Чтение данных (0x00): 6 байт: JoyX, JoyY, AccX[9:2], AccY[9:2], AccZ[9:2], байт 6 = биты кнопок (инвертированные) + LSB акселерометра.
  5. Калибровочные данные (0x20): 16 байт: нули и 1G для осей, минимум/максимум/центр джойстика, чексуммы.

Ссылки

Производственный процесс

  1. Перехват команд ИК-пульта на Raspberry Pi без LIRC: подход через Python UART
  2. Управление яркостью LED с ШИМ через кнопку на Arduino Mega
  3. Создание потрясающей системы Ambilight для монитора на Arduino
  4. Надежная система учета рабочего времени на Arduino с RFID и Python
  5. Датчик CO2 K30: мониторинг качества воздуха в реальном времени на Arduino
  6. Устройство для общения глухосліпых людей с помощью 1Sheeld и Arduino
  7. Умная копилка: управление монетоприёмником на Arduino Nano
  8. Умный вольтметр на Arduino и смартфоне — простое DIY-проект
  9. IoT-монитор пульса в реальном времени на Arduino и MAX30100
  10. Управление светодиодом по Bluetooth с Arduino: простой DIY-гид