Анализ протокола игрушечного вертолёта на ИК-управлении

Недавно друг притащил ко мне простенький игрушечный вертолёт:

Управляется он не по радио, а посредством инфракрасных сигналов. На самом вертолёте стоит обычный ДУ-приёмник, а значит используется несущая частота в 36-40кГц, и не составит труда разобраться в структуре сигналов, которые посылает пульт, чем я и решил заняться.

Сразу скажу, что вся эта затея изначально не имела никакого смысла, это просто статья о том, как развлекаются айтишники 🙂

После анализа сигнала с помощью ДУ-приёмника стало ясно, что используется модифицированный протокол пультов ДУ от Sony, который выглядит примерно так:
image

В протоколе Sony сначала посылается стартовый сигнал длительностью в 2,4мс, а затем передаются данные, которые кодируются длительностью паузы между сигналами: логический ноль — это 600 микросекунд, логическая единица — 1200 микросекунд.

В протоколе вертолётика отличается только длительность временных интервалов. Стартовый бит — примерно 2мс, ноль — 300 микросекунд, единица — 600 микросекунд. Увы, забыл сделать скриншот временной диаграммы. Таким образом передаются 4 байта. Оставалось только выяснить — за что они отвечают?

Делалось это тупо опытным путём. Выяснилось, что данные передаются старшими битами вперёд, а байты это:

  • Первый — поворот влево-вправо (разница в скорости вращения основных пропеллеров)
  • Второй — движение вперёд-назад (управление пропеллером на хвосте)
  • Третий — тяга вверх (скорость вращения пропеллеров)
  • Четвёртый — положение ручки калибровки поворота, непонятно, зачем оно вообще передаётся

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

Если передать значения 128, 128, 254, 128 (0x80, 0x80, 0xFE, 0x80), то верторёт на полной скорости взлетает вертикально вверх. Плавно изменяя третий байт можно заставить его зависнуть в воздухе на одной высоте. Уменьшаем первый байт — вертолёт поворачивает влево, увеличиваем — вправо. Увеличиваем второй байт — летим вперёд, уменьшаем — назад. Всё достаточно просто, оставалось воспроизвести эти сигналы так, чтобы вертолёт поверил, что им управляет настоящий пульт.

У меня уже было самодельное устройство, которое имитировало пульты ДУ для управления телевизором и ресивером, не составило особого труда модифицировать его прошивку так, чтобы он посылал сигналы вертолётику. И ура, оно заработало!

Дальше было интересно это как-то использовать, например, управлять им с помощью каких-то необычных устройств. Выбор пал на виимоут и нунчак от Nintendo Wii, тем более там ещё и акселерометры есть. Если кто не в курсе, виимоут подключается к Wii через обычный блютус, соответственно без особых проблем его можно подключить и к компьютеру. Правда, видится он только как неизвестное HID устройство, а не игровой контроллер, но под Windows уже есть утилита, которая умеет с ним работать — GlovePIE.

На скорую руку был написан скрипт для GlovePIE, который позволял с помощью виимоута управлять курсором мыши. Моя же программа читала текущие координаты мыши и посылала данные на роутер, который передавал их в сеть моего умного дома (о ней я писал в другой статье), к которой уже был подключен ДУ-передатчик. Как ни странно, вся эта система работала быстро и стабильно.

Надо сказать, что таким образом управлять вертолётом стало гораздо удобнее, т.к. на родном пульте ручка тяги пружинит и стремится вернуться в первоначальное положение.

Видео этого безумия:

Комментарии

Добавить комментарий