Накопилось у меня некоторое количество радиоуправляемых игрушек, из тех, которые покупать своим двум детям нельзя: один пульт управляет всем в округе, никакого разделения ни по частотам, ни по кодам. Одновременно играть не получится. У меня эти игрушки работают на частоте 27mhz, но аналогичные могут работать на частотах 35, 40, 49 mhz по тому же простейшему протоколу, о котором и пойдет речь дальше.

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

Моя идея заключалась в том, чтобы сделать USB девайс, на который можно передавать с компьютера коды команд, а это устройство каждую команду закодирует и выдаст в эфир RC-машинке.

Первым этапом я решил убедиться самостоятельно насколько описанное в вышеприведенном посте подходит к моим RC-игрушкам. Как у автора поста, так и у меня, все игрушки базировались на комплекте популярных микросхем RX-2 для приемника и TX-2 для передатчика. Эти микросхемы имеют 5 входов для считывания кнопок нажатия, которые они кодируют и передают в эфир на выходной каскад. Таким образом, к примеру, нажатие кнопки "вперед" микросхема кодирует следующим образом: заголовок, состоящий из 4 длинных импульсов с заполнением 75% и сам код нажатия - десять коротких импульсов с заполнением 50%.

Список кодов комманд

Мое оборудование использовало следующий набор команд:

  • Forward: 10 pulses

  • Reverse: 40 pulses

  • Right: 64 pulses

  • Left: 58 pulses

  • Forward/Left: 28 pulses

  • Forward/Right: 34 pulses

  • Reverse/Left: 52 pulses

  • Reverse/Right: 46 pulses

Но было несколько пультов на 27 mhz, которые не работали или работали не корректно с моими игрушками. В интернетах я нашел другой набор команд для подобного оборудования (возможно, для другого набора микросхем, не разбирался).

  • Forward: 16 pulses

  • Reverse: 40 pulses

  • Forward/Left: 28 pulses

  • Forward/Right: 34 pulses

  • Reverse/Left: 52 pulses

  • Reverse/Right: 46 pulses

Итак, я набросал код на C++ для микроконтроллера Atmel AVR Attiny 2313 чтобы убедиться, что эта логика работает. Выходной пин микроконтроллера я подключил к выходному каскаду пульта игрушки чтобы не собирать радиочастотную схему самостоятельно. Эту точку легко найти по пину 8 микросхемы TX-2: именно он является выходом закодированных импульсов нужной длины, которые подаются в этот каскад. Тут можно было бы даже просто взять ножовку и выпилить все кнопки вместе с микросхемой TX-2, но они для подобных экспериментов не мешают поэтому оставил как есть.

Связь с компьютером через USB

Для связи с компьютером я использовал библиотеку vusb, набросав на универсальной плате обвес по следующей схеме:

Получился вот такой девайс:

Отладка

Код я написал, но вот работать как нужно он отказался. Для отладки пришлось задействовать запылившийся Saleae Logic Analyser. Так я смог заставить соответствовать длины импульсов с моего контроллера тому, что выдавала микросхема TX-2 и тогда все прекрасно заработало.

На фото можно увидеть визуально как кодируется сигнал "вперед", который имеет в своем теле 10 импульсов:

  • 4 длинных импульса заголовок: каждый ~1.3ms высокий уровень and ~0.5ms низкий уровень сигнала с 75% заполнением: ~1.8ms всего.

  • 10 коротких импульсов: каждый 0.5ms высокий and 0.5ms низкий.

В случае передачи другого кода заголовок остается тем же, а 10 коротких импульсов заменяются на соответствующее другому коду количество.

Код на C++

Для компьютера я сделал программу, которая в цикле читает клавиатуру, кодирует и передает в USB контроллеру. Исходные коды для микроконтроллера и для PC я выложил в общий доступ. Компилировал используя gcc на Linux Gentoo, на Windows не проверял.

Github

Комментарии (7)


  1. dcoder_mm
    07.10.2021 18:19
    +2

    Насколько точно ей нужно выдерживать несущую, интересно? Можно ли сделать формирование несущей и пакетов из VGA сигнала? (иначе недостаточно безумно)


    1. SergeyNovak Автор
      07.10.2021 19:18
      +2

      Несущая очень примерно нужна. На таких пультах даже кварца нет. Одни пишут что у них заголовки по 2000 микросекунд, у меня пульт выдает 1800 микросекунд. Сделал аналогично в 1800 и у меня заработало.

      Когда буду играть с этим монстром вновь, попробую испытать пределы разноса несущей, которые машинка все еще будет улавливать. И тогда можно будет переходить на управление через VGA сигнал с помощью воспроизведения программ, записанных на DVD диски c через древний плеер.


      1. quwy
        07.10.2021 21:41

        На приемной стороне у этих игрушек используется сверхрегенератор, у которого очень широкая полоса пропускания (сотни кГц при несущей 27 МГц), поэтому и кварца нет, он просто не нужен при такой полосе.


  1. Boris_92
    08.10.2021 11:23

    в тегах С++
    по тесту в статье встречаемся упоминание С++

    Лезешь в репу гита - main.c и обычный код на С.


  1. usa_habro_user
    09.10.2021 07:53

    Мне как-то для "экспериментов" (ну, назовем это так ;) понадобилась достаточно большая платформа, притом на больших колесах. Поискал по Amazon/eBay/Ali - цены какие-то "недеццкие", от $100 и выше (за нужные мне размеры). Но случайно увидел на пост-Xmas sale здоровенный RC трак за $9.99 (типа, original price $49.99). Я выкинул из него всю радиочасть, и приспособил туда ESP32 с DC motor driver-ом - получилось весьма просто, но очень "шикарно". Хочу найти это шасси в подвале, и поэкспериментировать в плане алгоритмов автоматической газонокосилки - по газону, даже не стриженному, в свое время, эта машинка ездила весьма неплохо.


    1. SergeyNovak Автор
      10.10.2021 07:12
      +1

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


  1. SergeyNovak Автор
    10.10.2021 11:42

    Случайно отклонил и стер вопрос по поводу не проще ли будет управлять через оптрон микросхемой TX-2, программно нажимая кнопки.

    Если уже используется микроконтроллер чтобы получать комманды с USB, то TX-2 дублирует фунционал по кодированию нажатий. Эта микросхема после написания пары десятков строк кода просто не нужна. Тем более, код очень простой, но открывает возможности для тюнинга таких как регулирование таймингов, использование нештатных кодов. В общем, можно и кнопки нажимать, но не так интересно.