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

Использование Wii Nunchuk с Arduino

Компоненты и расходные материалы

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

Об этом проекте

Предисловие

Первоначально этот пост был опубликован на сайте www.xarg.org.

Использование Wii Nunchuk с Arduino

Все мы выросли с игровыми приставками в руках, что делает их идеальными для сочетания буквально с любым возможным приложением. Великолепное изобретение Nintendo - это Nunchuk, дешевое расширение для пульта Wii U. Поскольку он использует I2C в качестве транспортного протокола, легко получить доступ к необработанным данным контроллера. Поскольку это так просто, я подумал, что для этого должно быть стандартное решение, но не смог найти стабильную реализацию, а только множество фрагментов кода. Вот почему я сосредоточился на заполнении этого пробела, и вот он. В этой статье я подробно расскажу вам, как реализовать это для Arduino.

Аппаратное обеспечение

Nunchuk имеет две мембранные кнопки, называемые кнопкой C и кнопкой Z. В верхней части устройства находится аналоговый двухосевой джойстик, и все устройство чувствительно к движениям, поскольку акселерометр измеряет силы, действующие во всех трех измерениях. Рекомендуется использовать Nunchuk в режиме 3v3, и вам обязательно следует использовать переключатель уровня, если вы не можете подать это напряжение, чтобы продлить срок его службы. Как минимум, для этой установки вам понадобятся следующие детали:

Детали

  • Nintendo Nunchuk (или копия)
  • Ардуино
  • Сдвиг уровня (необязательно)
  • Адаптер Nunchuk (необязательно)

Оригинальный нунчук или его копия

Большой вопрос в том, стоит ли покупать оригинальный Nintendo Nunchuk или китайскую копию? Чтобы протестировать свой драйвер Nunchuk, я купил и оригинал, и дешевую копию. Обе версии далеко не дорогие, но разница порядка 10-15 €. Что я могу сказать, так это то, что провода кабеля оригинального Nunchuk экранированы, что делает их более устойчивыми к помехам. Джойстик оригинала качественнее, он разрешает все движения во всем диапазоне значений, а копия не реагирует на минимальные движения. Также качество акселерометра оригинала лучше. Однако я применил фильтр Калмана, который нивелирует эти различия. Итак, если вам нужен долговечный контроллер, я бы выбрал оригинал, если вам просто нужно дешевое устройство ввода, вам может повезти с копией Nunchuk.

Соединитель нунчук

Nintendo подключает все периферийные устройства через специальный разъем. Поскольку у меня нет Wii и я не буду использовать контроллеры для чего-то, связанного с играми, я разорвал разъемы. Вы можете получить адаптер Nunchuk за несколько долларов, если вы не хотите делать этот радикальный шаг, но с некоторыми навыками пайки вы все равно сможете отремонтировать вилку. Рекомендую открыть вилку, так как видно, как провода подключены к контактам. Это особенно важно для реплик нунчук, так как провода могут быть подключены произвольно. Еще одна странность в том, что у оригинального контроллера 4 провода, а у реплики 5, а у разъема на самом деле 6 контактов. Ладно, приступим к работе и откроем коннектор:

И отрезаем провода:

Если вы посмотрите на вилку спереди, вы увидите следующие булавки:

Для оригинального Nunchuk следующие цвета и расположение контактов разъема:

  • Зеленый → ПДД
  • nc
  • Красный → 3 на 3
  • Белый → GND
  • nc
  • Желтый → SCL

Для полученного мною клона Nunchuk следующие цвета и расположение контактов разъема:

  • Желтый → ПДД
  • Черный → NC
  • Зеленый → 3 на 3
  • Красный → GND
  • nc
  • Белый → SCL

Как я уже сказал, вам обязательно стоит посмотреть, как проложены провода, и не подключать ничего по цвету. Используемые сокращения: nc для не подключенных, SDA - линия данных (должна быть подключена к A4 на плате Arduino) и SCL - часы (подключена к A5). У Arduino есть стабилизатор напряжения, который позволяет нам напрямую использовать 3v3. Если вы хотите использовать WiiChuck или аналогичный адаптер Nunchuk, подключите 3v3 к A2 и GND к A1 - позже вам потребуется вызвать nunchuk_init_power () для инициализации этих разъемов источника питания. Следующий рисунок Фритцинга иллюстрирует это соединение:

Программное обеспечение

Я написал небольшую библиотеку заголовков, которая реализует связь с Nunchuk. На самом деле, вам не стоит беспокоиться о том, что происходит за кулисами, все должно работать сразу после установки. Если вас интересуют подробности, я все равно объясню это через минуту.

Скачать библиотеку Nunchuk

Связь с Nunchuk осуществляется через шину TWI, которая является просто другим названием для I2C (хорошо, некоторые детали отличаются, однако для наших целей это не имеет значения). Скорость шины I2C по умолчанию установлена ​​в Fast Mode (400 кГц). Чтобы использовать нунчук с вашим Arduino, необходимо только следующее:

  #include  #include "nunchuk.h" void setup () {Serial.begin (9600); Wire.begin (); // nunchuk_init_power (); // A1 и A2 - это источник питания nunchuk_init ();} void loop () {if (nunchuk_read ()) {// Работа с nunchuk_data nunchuk_print (); } delay (10);}  

При запуске файла обработки, поставляемого с библиотекой, вы можете сбалансировать этот конус с помощью своего нунчука:

Вместо nunchuk_print () Для доступа к фактическим данным можно использовать множество функций:

Функции нунчука

  • nunchuk_buttonZ (): 1 или 0, независимо от того, нажата кнопка Z или нет.
  • nunchuk_buttonC (): 1 или 0, независимо от того, нажата кнопка C или нет.
  • nunchuk_joystickX_raw () / nunchuk_joystickX () nunchuk_joystickY_raw () / nunchuk_joystickY (): Значение x или y джойстика. Необработанная версия для каждой функции дает доступ к данным без калибровки.
  • nunchuk_joystick_angle (): Вычисляет угол поворота джойстика в радианах.
  • nunchuk_accelX_raw () / nunchuk_accelX () nunchuk_accelY_raw () / nunchuk_accelY () nunchuk_accelZ_raw () / nunchuk_accelZ (): X-, y- или z- значение акселерометра. Необработанная версия для каждой функции дает доступ к данным без калибровки.
  • nunchuk_pitch (): Вычисляет угол наклона регулятора в радианах.
  • nunchuk_roll (): Вычисляет угол крена регулятора в радианах.

Примечание. Нет nunchuk_yaw () функция, поскольку акселерометр может измерять только направленные силы, но не скорость вращения. Это обстоятельство также ограничивает наклон до 180 ° и приводит к неправильному углу крена, если наклон больше 180 °.

Расчет угла тангажа и крена также работает при упрощенном предположении, что единственная скорость, действующая на контроллер, - это сила тяжести. Это работает, поскольку нунчук либо неподвижен, либо испытывает постоянную скорость от внешней силы.

Калибровка

Как описано в обзоре функций, каждая функция джойстика и акселерометра поставляется с откалиброванной и необработанной версиями. В начале файла библиотеки некоторые константы определяют нулевые позиции. Лучше всего будет прочитать необработанные измерения вашего контроллера, когда вы держите его в нейтральном положении, и соответствующим образом адаптировать константы.

Протокол I2C

В последнем разделе обсуждается фактический протокол I2C. Если вы просто хотите использовать контроллер, эта информация не нужна, но если вы хотите понять протокол, я надеюсь, что смогу сэкономить вам время.

Я начал разработку со сканирования фактического адреса Nunchuk с помощью моего сканера I2C, который равен 0x52. Считывание параметров из памяти Nunchuk через шину I2C очень похоже на обмен данными с обычным I2C EEPROM. Прежде чем данные с нунчука можно будет прочитать, необходимо отправить последовательность инициализации.

Для чтения данных из нунчука необходимо отправить адрес для чтения, так как контроллер нунчука увеличивает адрес при каждом чтении. Данные, которые нас действительно интересуют, находятся по адресу 0x00 и имеют длину 6 байт. По адресам 0x20 и 0x30 (кажется, это точная копия байтов 0x20) хранится 16 байтов данных калибровки. По адресу 0xFA вы можете найти идентификационный номер устройства:0xA4200000 для Nunchuck, 0xA4200101 для Classic Controller, 0xA4200402 для Balance и так далее.

Когда данные необходимо записать в нунчук, формат аналогичен команде чтения. Первый байт - это адрес, за которым следуют фактические данные.

Давайте рассмотрим фактические последовательности байтов Nunchuk для описанных функций:

1. Инициализируйте нунчук:

  НАЧАЛО, 0x40, 0x00, СТОП  

Эта последовательность является нормальной последовательностью инициализации, которая устанавливает алгоритм шифрования по умолчанию. Затем каждый байт, считываемый из нунчука, должен быть расшифрован с помощью (x ^ 0x17) + 0x17 . Лучше всего отключить шифрование с помощью этой последовательности:

2. Инициализируйте нунчук без шифрования:

  НАЧАЛО, 0xF0, 0x55, STOPSTART, 0xFB, 0x00, STOP  

Это имеет то преимущество, что фактические данные можно использовать без формулы дешифрования, и это также будет работать с клонами Nunchuk.

3. Считайте идентификатор устройства из регистра добавочного номера:

  START, 0xFA, STOPREAD 6 байт  

Данные - это идентификатор, который я уже упоминал, если подключенное устройство является контроллером Nunchuk или Classic и так далее.

4. Считайте измерения с устройства:

  НАЧАЛО, 0x00, СТОПЧИТАТЬ, 6 байт  

То, что вы получаете взамен, описано в этом обзоре:

  • Бит-байт 7 6 5 4 3 2 1 0
  • 1 джойстик, ось X [7:0]
  • 2 джойстика, ось Y [7:0]
  • 3 оси X акселерометра [9:2]
  • 4 оси Y акселерометра [9:2]
  • 5-ось Z акселерометра [9:2]
  • 6 Az [1:0] Ay [1:0] Ax [1:0] ¬Bc ¬Bz

Значения кнопок инвертируются, и младшие биты акселерометра содержатся в байте 6. В библиотеке я комбинирую младшие биты с остальными. Я видел людей, использующих значения без битов LSB, что является слишком упрощенным способом сделать сигнал более стабильным. На мой взгляд, я предпочитаю зашумленный сигнал от АЦП, который можно легко отфильтровать с помощью дополнительного фильтра или фильтра Калмана, вместо того, чтобы обрезать числа округлением - при этом вы теряете много информации.

5. Считайте фактические данные калибровки с устройства:

  НАЧАЛО, 0x20, СТОП ЧТЕНИЕ 16 байт  

То, что вы получаете взамен, описано в этом обзоре:

Байт

Описание

  • 1 0G значение оси X [9:2]
  • 2 0G значение оси Y [9:2]
  • Значение 3 0G по оси Z [9:2]
  • 4 младших бита нулевого значения по осям X, Y, Z
  • 5 1 Гбит / с по оси X [9:2]
  • 6 значение 1G по оси Y [9:2]
  • 7 1 Гбит / с по оси Z [9:2]
  • 8 младших разрядов размером 1G по осям X, Y, Z
  • Максимум 9 джойстиков по оси X
  • Минимум 10 джойстиков по оси X
  • 11 Центр оси X джойстика
  • 12 джойстиков по оси Y максимум
  • 13 джойстиков по оси Y минимум
  • 14 Джойстик, ось Y, центр
  • 15 Контрольная сумма
  • 16 Контрольная сумма

Байты 0–3 хранят нулевые значения по осям X, Y и Z, тогда как байты 4–7 хранят значения в 1G (гравитация Земли). Данные калибровки еще не используются в программной реализации.

Код

  • Фрагмент кода №1
Фрагмент кода №1 Обычный текст
 #include  #include "nunchuk.h" void setup () {Serial.begin (9600); Wire.begin (); // nunchuk_init_power (); // A1 и A2 - это источник питания nunchuk_init ();} void loop () {if (nunchuk_read ()) {// Работа с nunchuk_data nunchuk_print (); } delay (10);} 
Github
https://github.com/infusion/Fritzing/tree/master/Nunchukhttps://github.com/infusion/Fritzing/tree/master/Nunchuk

Изготовленные на заказ детали и корпуса


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

  1. Использование ИК-пульта дистанционного управления с Raspberry Pi без LIRC
  2. Затемнение света с ШИМ с помощью кнопки
  3. Создание монитора Ambilight с помощью Arduino
  4. Система посещаемости с использованием Arduino и RFID с Python
  5. Мониторинг CO2 с помощью датчика K30
  6. Слепоглухое общение с 1Sheeld / Arduino
  7. Управление монетоприемником с помощью Arduino
  8. Вольтметр своими руками с использованием Arduino и смартфона
  9. Монитор сердечного ритма с использованием Интернета вещей
  10. Arduino с Bluetooth для управления светодиодом!