05 августа 2021

Когда пультов больше чем рук

Обновлено 19.08.2021 

Универсальный обучаемый пульт или как не стать Шивой Многоруким

(картинка из Интернета)

Что умеет пульт.

Обучаемый пульт - это пульт, который может запомнить ИК-посылку от другого пульта и потом пытаться ее воспроизвести. Но поскольку форматов команд пультов в мире многое множество - задача становится нетривиальной. Особенно для микроконтроллера ATMEGA8.

Но я надеюсь, что я эту проблему решил хотя бы частично.

Краткие зарактеристики:
Контроллер ATMEGA8A
30 кнопок
Питание 3-5 вольт
Индикация напряжения батарейки, контроль посылки (2 светодиода - красный и зеленый)
Потребление в ждущем режиме ~2 мкА

Пульт распознает несколько распространенных форматов и пытается их эмулировать согласно спецификациям. Неизвестные форматы так же анализируются и пытаются воспроизводиться.

Распознаваемые форматы с эмуляцией согласно спецификаций:

  • SONY (SIRC-12, -15, -20 bit), 40 кГц
  • NEC, 38 кГц
  • SAMSUNG, 38 кГц
  • SHARP, 38 кГц
  • JVC, 38 кГц
  • RC5 (Philips), 36 кГц
Типовые форматы, эмулируются с несущей 38 кГц :

  • Формат с постоянными паузами, кодирование осуществляется длиной импульса, возможен отдельный стартовый импульс (как у SONY). До 64 бит данных.
  • Формат с постоянными импульсами, кодирование осуществляется длиной паузы, возможен отдельный стартовый импульс и стартовая пауза (как у NEC). До 64 бит данных.
  • Формат с постоянными импульсами, кодирование различными длинами пауз (как SHARP). До 64 бит данных.
  • Формат с постоянным периодом следования импульсов, кодирование длиной импульса.
Нераспознаваемые форматы эмулируются с несущей 38 кГц.

  • Такие форматы посылок пульт так же пытается записать, анализируя длины импульсов и пауз, что бы их потом воспроизвести. В зависимости от сложности формата пульт может сохранить до 16 или до 32 импульсов. Про такое сохранение будет чуть ниже.

Изначально пульт был сделан в 12-кнопочном варианте, в корпус автомобильного пультика на руль. Но потом схема "повзрослела" до 30 кнопок.

К повторению предлагается вариант в 21-кнопочный китайский пульт "IR remote control HX1838 for Arduino" либо макси-версия - 30-кнопочный пульт с тактовыми кнопками - плата размерами 115*40 мм. 



История разработки.

Так сложилось, что автомобиль мне достался в "бомж"-комплектации.
Т.е. была минимальная аудиоподготовка, но никакой магнитолы не было. 

В качестве головного устройства был выбран Prology DVS-1140.

Основные причины выбора - картинка с камеры заднего вида и поддержка флешки и SD. 

В комплекте к этому "комбайну" шел пультик. Такая себе вафелька об 40 кнопках. Причем все кнопки на ощупь одинаковые.

Ни разу не эргономичный. На ощупь пользоваться практически невозможно. Что автоматически приводит к невозможности использования пульта в движении. И был куплен на Али универсальный обучаемый пульт с креплением на руль. Вот такой. Цена вопроса - порядка $4.

10 кнопок (кнопки управления громкостью на обратной стороне) + кнопка обучения.

Прекрасно обучился и был очень удобен. Где то год. Потом стал глючить, а после и вовсе перестал работать. Свежая батарейка не помогала. Пульт вроде обучался, при посылке команды что то отправлял (было видно на камере телефона), но никакое устройство не реагировало на эту посылку.
И пульт на долгое время был закинут в долгий ящик. Но мысль о восстановлении пульта осталась. 

И вот дошли руки вдохнуть в пульт новую жизнь.

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


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

Где то я уже видел перевод процессора в режим обучения.
Почувствуй себя Сарой Коннор :) Тудум-тум-тудум! 

"И восстанут пульты из пепла ядерного огня,
и начнется война за управление телевизорами!"

Универсальный обучаемый пульт.

Анализ протоколов.

Протоколы ИК-управления бывают разные. Но большинство протоколов сводится к тому, что пульт отправляет данные, шифруя их длительностями импульсов ИК-излучения и/или пауз между импульсами. Так же информационной посылке может предшествовать стартовый импульс индивидуальной длительности. Кроме того, в подавляющем большинстве современных протоколов импульс подразумевает не постоянное свечение инфракрасного светодиода, а модуляцию несущей частоты этими импульсом. И для различных протоколов эта частота тоже отличается. 
Например, для RC5 это 36 кГц, для NEC, Samsung - 38 кГц, Sony использует 40 кГц... Есть и другие, более экзотические форматы с несущей аж до 56 кГц.
Модуляция позволяет приемнику более четко отличать посылку от пульта от внешней засветки и помех. Кроме того, это позволяет при сохранении средней мощности увеличить ток через излучающий диод, что способствует увеличению дальности.

В данной конструкции в качестве базовой несущей частоты для неизвестных протоколов используется 38 кГц. Однако для известных форматов частота несущей устанавливается соответственно формату.
Для обучения пульта используется приемник на частоту 38 кГц (типа TSOP1838, HX1838, VS1838, HX1838, VS1838). Он удовлетворительно принимает как 36, так и 40 кГц...

Форматов достаточно много разных. Вот, например, RC5. 
Так называемое би-фазное, манчестерское кодирование. Легко распознается, легко декодируется.


Или формат с фиксированной паузой между импульсами (Sony).
Тут четко отслеживается стартовый импульс и далее импульсы различной длины с фиксированными паузами.


Формат с фиксированным импульсом и разными паузами (NEC, туда же JVC, Samsung и т.д.)...
Тут тоже есть стартовый импульс, стартовая пауза, дальше идут импульсы, а информация кодируется паузами между импульсами.


Формат с кодированием информации длинами пауз (Sharp). Видно, что в посылке есть три длительности - пауза 1, пауза 2 и импульс.


Еще вариант кодирования. Информация кодируется длиной импульса при фиксированном периоде следования импульсов.


На вышеприведенных графиках (кстати реальных, снятых логическим анализатором) видно, что различные длительности импульсов, пауз, стартового импульса и стартовой паузы достаточно сильно отличаются друг от друга по длительности. Как минимум в 2 раза. Зачастую эти все длительности еще и кратны самой короткой.
Это позволяет, записав сигнал в виде длительностей импульсов и длительностей пауз в буферный массив, проанализировать и сгруппировать эти длительности. Допуска ±25% в большинстве случаев достаточно, что бы отличить одну длительность от другой. Ну, во всяком случае, у меня сбоев при корректном приеме посылки не было. 

Полученные длительности складываются в массив. Длительностям в буферном массиве проставляются индексы, после чего можно уже работать с массивом индексов. Это легче и, в случае 8-битной ATMEGA8  - еще и быстрее.

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

Из вышеприведенных графиков видно, что количество упорядоченных длительностей - от двух до четырех. Четыре - это хорошо. Ибо кодируется двумя битами.
Неизвестный протокол с двумя длительностями кодируется вообще одним битом на длительность посылки/паузы, с тремя или четырьмя - двумя битами.

В пульте запланировано 30 кнопок. EEPROM в ATMEGA8 - 512 байт. Из них занято служебной информацией 10 байт. Если оставшуюся информацию поделить на 30 кнопок - получится 16 байт данных на кнопку.

Эти 16 байт делятся так:

Тип сохраненной посылки - 1 байт.
Число информационных импульсов - 1 байт
Массив измеренных длительностей - 4 байта
Период тактового генератора    - 1 байт
Длительность паузы между посылками - 1 байт.

Остается 8 байт для записи данных. Или 64 бита. 

Для известных форматов это позволяет сохранить 64 бита данных.

Простая математика показывает, что для неизвестных форматов, когда сохраняются длительности и посылок, и пауз, при 2-битном кодировании мы можем сохранить максимум 32 индекса длительностей. В реалиях это будет максимум 31 индекс - 16 импульсов и 15 пауз. При 1-битном кодировании (когда длительностей всего две) - можем сохранить до 63 индексов длительностей. (32 импульса, 31 пауза).

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

Схема.


Ну и традиционно - схема в PDF.

Кнопки подключены к контроллеру матрицей 2 х 15. Примененный контроллер из самого энергосберегающего режима может выйти только подачей низкого уровня на вход INT0 или INT1.
INT1 занят фотоприемником. Остается INT0. Соответственно, первый провод - столбец матрицы кнопок подключен ко входу INT0, а второй заведен на него же через диод. К сожалению, такое подключение не позволит распознать одновременное нажатие кнопок в одной строке (SW1 и SW16, например). Приоритетными будут первые 15 кнопок. Но для дистанционки это не критично.

Кнопка SW1 - особая. Длительное её нажатие (более 2.5 сек) вводит пульт в режим обучения.
Соответственно, для этой кнопки програмно отключен автоповтор команд при удержании кнопки. Остальные 29 кнопок - абсолютно равнозначны с точки зрения программы. И при самостоятельном разведении платы их можно разместить как угодно, в каком угодно порядке и конфигурации. К размещению кнопки SW1 тоже требований нет, но для удобства пользования спец-функцией эту кнопку целесообразно разместить где то с краю клавиатурного поля. Например, я в двух версиях платы эту кнопку ставил в левую верхнюю позицию. 
При обучении пульта на эту кнопку можно повесить команду, не требующую длительного нажатия и удержания кнопки. Например, включение/выключение, выбор входа, воспроизведение/пауза  и т.д.

Если планируется урезанная версия пульта на меньшее число кнопок - можно убирать любые кнопки, кроме SW1 (иначе не получится перевести пульт в режим обучения).

Ко входу прерывания INT1 подключен фотоприемник. Для уменьшения потребляемого тока питание фотоприемника включается только при обучении пульта. 

Питание контроллера дополнительно развязано диодом и конденсаторами C2, C3, что бы помехи по питанию при передаче команды не так сильно влияли на работу контроллера. В качестве развязывающего диода применен SS14 - достаточно мощный (40 В, 1 А) диод Шоттки. Как ни странно, на малых токах у него падение напряжения меньше, нежели у изначально запланированного мелкого BAT46.

Печатная плата.

Разработано 2 варианта печатной платы.

Вариант номер один.  

"Сферическая плата в вакууме". Размер 115 х 40 мм, на 30 тактовых кнопок. Разводка односторонняя, со сравнительно небольшим количеством перемычек.



Герберы.

Вариант номер два.

Разводка платы сделана под китайский пультик.

Хинт: Если у китайцев брать набор - пульт плюс приемник - то фотоприемник отдельно можно не искать. Если повезет, то на платке приемника еще и красненький светодиод типоразмера 0805 есть.


Особенности платы. Родная китайская плата имеет толщину около 0.9 мм. Соответственно, свою плату нужно делать тоже на тонком (0.8 - 1.0мм) текстолите. Поскольку верхняя сторона платы по совместительству еще и плоскость для наклейки лицевой плёнки с резинками - на этой стороне не должно быть никаких выступающих элементов. 

Переходные в идеале нужно запаять совсем-совсем тонким проводом (волоском из мгтф, например) с минимальным числом припоя. Через переходные ходят только сигналы опроса клавиатуры, силовых цепей там нет. Контактные площадки залудить  минимальным количеством припоя и потом, возможно, пройтись по ним потоком воздуха из паяльного фена, что бы все наплывы/бугорки убрались. 

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

Фотоприемник. Китайский приемник слишком толстый, почти 5.5 мм. А пространство между платой и нижней поверхностью корпуса - 4 мм. Соответственно, что бы не искать дорогие плоские приемники (а такие у Vishay есть), в нижней плоскости корпуса  сверлится отверстие под линзу приемника. Можно просверлить 2 мм сверлом, а потом изнутри выбрать фаску более толстым. Так же с приемника можно ободрать его металлический экран. Тоже выиграется до 1 мм.

Герберы.

Фьюзы и прошивка.

Фьюзы :

Кому ближе циферки - то вот:

High 0xD1
Low  0xE4

 Прошивка.

Для прошивки необходимо подпаять к соответствующим контактным площадкам проводки от программатора - Землю (GND), MO(MOSI), MI(MISO), SCK, Reset.
+5 вольт от программатора подключить к "+" контакту отсека батарейки. Батарейку при этом необходимо вынуть. 
Если программатор поддерживает логические уровни 3.3 вольта при прошивке, "+" от программатора можно не подключать к пульту, а прошивать при вставленной батарейке.

На версии платы под мелкий китайский пультик я вывел еще отдельно пятачок + питания, что б было легче подать питание от программатора.  

Краткая инструкция по обучению пульта и его использованию.

Подача питания на пульт.
Данные о сохраненных командах хранятся в EEPROM контроллера. Для проверки целостности данных используется контрольная сумма.
При подаче питания пульт включит зеленый контрольный диод и проверит сохраненные в EEPROM данные.
Если данные валидны - через время порядка 0,2 сек светодиод погаснет и пульт перейдет в режим энергосбережения.
Если данных нет или они невалидны - загорится красный светодиод, пульт отформатирует EEPROM под требуемую структуру хранения информации. Через время чуть больше секунды светодиод погаснет, пульт перейдет в режим энергосбережения.

Режим пульта.
В обычном режиме нажатие на кнопку пульта отправляет записанную на эту кнопку команду.

При этом на время отправки команды загорается зеленый контрольный светодиод или, если напряжение батарейки ниже 2.7 вольта - красный. Все кнопки, кроме первой, при удержании отправляют повтор команды, пока нажата кнопка. При нажатии кнопки SW1 "Set" пульт отправит команду и один повтор, далее будет отсчитываться время для перехода в режим обучения.
Если на кнопке нет записанной команды - кратковременно загорается контрольный светодиод, никакой отправки данных не происходит.

Режим обучения.
Длительное удержание (более 2.5 секунд) кнопки SW1 "Set" переводит пульт в режим обучения. При нажатии и удержании кнопки через 2.5 секунды загорается красный светодиод. После отпускания кнопки начинают мигать красный и зеленый светодиоды. В этом режиме пульт включает фотоприемник и ожидает посылку от внешнего пульта.

В течение 6 секунд необходимо направить внешний пульт на фотоприемник и нажать необходимую кнопку.
Если пульт корректно распознал команду - начнет часто мигать зеленый светодиод и необходимо в течение 6 секунд нажать кнопку на пульте, на которую необходимо записать принятую команду. Зеленый светодиод загорается и горит чуть больше секунды. Данные о принятой команде сохраняются в EEPROM.
Если в течение 6 секунд не нажимать никакую кнопку - пульт вернется в режим ожидания.
После сохранения команды пульт вернется в режим обучения и будет ожидать следующую команду от внешнего пульта.
Если пульт команду не распознал - на время порядка секунды загорается красный светодиод, сигнализируя об ошибке, после чего пульт вернется в режим обучения и будет ожидать следующую команду от внешнего пульта.
Если в течение 6 секунд никакая команда пультом не была принята - пульт перейдет в режим ожидания.

Удаление сохраненных команд.
Для удаления с какой либо кнопки сохраненной на ней команды необходимо перевести пульт в режим обучения.
В режиме обучения (мигают красный и зеленый диоды) необходимо нажать кнопку, с которой необходимо удалить сохраненную команду. Красный диод начнет часто мигать и в течение 2 секунд нужно нажать кнопку SW1 "Set" для подтверждения удаления команды.
При успешном удалении сохраненной команды загорится зеленый светодиод на время чуть больше секунды, команда будет стерта из энергонезависимой памяти.
Если в течение этих двух секунд не нажимать ничего или нажать любую другую кнопку (не SW1) - удаления не произойдет, пульт вернется в режим обучения.

_____________________________________________________

Ну и видеообзор от Юрия Нефедова, повторившего мелкий пульт


_____________________________________________________

Ну и подъехала статья на Коте.


11 комментариев:

  1. Честно скажу. Практической потребности в подобном пульте нет, к счастью, все штатные пульты работают. Но попробовать создать умную машину, с возможностью получения удовольтвия от сборки изделий автора, а так же возможности поэкспериментировать и прочувствовать новое, для себя. А это удовлетворение главной движущей силы прогресса "детской потребности" узнать, а как там оно внутри этой "штуковины" и через почему, она такая "вумная"
    Одним словом. Бум делать, Бум!

    ОтветитьУдалить
  2. Сделал этот чудо пульт. Умный "чертяка", все запомнил и работает безошибочно. Очень рекомендую к повторению. Скоро Али завалят этими устройствами, там ушлые воришки.

    ОтветитьУдалить
  3. Установил новую прошивку автора. Очень удачное обновление. Сейчас Пультик понимает все пульты, имеющиеся в доме(Panasonik,…) Спасибо автоы, за труды!

    ОтветитьУдалить
  4. Шагаю в ногу со временем. Заканчиваю делать последний вариант автора, Пульт 21Кнопка. Понравился вариант корпуса, недорогой и был в местном магазинчике. Количество кнопок тоже устроило. Большое спасибо Автору за его творчество и интересные разработки!

    ОтветитьУдалить
  5. Доброго здравия! Уважаемый Автор,приобрсти платку у Вас есть такая возможность?

    ОтветитьУдалить
    Ответы
    1. Приветствую. Я не заказывал платы для пультов. Соответственно, и торговать нечем.

      Удалить
    2. Принято спасибо за ответ

      Удалить
  6. А можно исходник? Для развития... Учусь я. mikhail09p gav gmail.

    ОтветитьУдалить
    Ответы
    1. Пока исходник закрыт.
      Для развития могу ответить на вопросы.

      Удалить
  7. Присоединяюсь к просьбе об исходнике :-)

    ОтветитьУдалить
    Ответы
    1. Присоединяюсь к своему прошлому ответу - исходники закрыты.
      Но на вопросы могу ответить.

      Удалить