071-Преобразователь IR-сигналов от пультов в UART.

Автор: | 09.05.2011

Пришло время обкатать новую универсальную плату для IR устройств.  Для начала соберем что-то несложное. Решил сделать преобразователь IR сигналов от бытовых пультов в UART команды — давно обещал. Это устройство показательно для блога – это именно готовое решение для Вашего проекта, поэтому постараюсь сделать его максимально полезным.

Как должно работать это устройство?
Да очень просто! Устройство принимает команду от бытового IR пульта и после обработки выдает ее код через UART. Вроде не на чем заморочиться, но давайте сделаем устройство более гибким, чем просто преобразователь RC5 в UART или NEC в UART. Не вижу смысла в создании устройства, под которое потом нужно еще и пульт подбирать! А почему не сделать устройство, работающее с любыми пультами, которые равномерно засеивают наши квартиры? Именно такое устройство мы и сделаем!

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

Программа универсального IR-приемника работает следующим образом:
— программа делает замеры периодов импульсов пришедших от TSOP;
— в начале посылки создается «шаблон» по одному из периодов;
— далее все периоды сравниваются с этим шаблоном и получают или 0 или 1 в результате сравнения.

Достоинства очевидны:
— устройство видит все пульты;
— получаемый код нажатой клавиши будет одного формата для разных пультов (легче с ним потом будет работать);
— код алгоритма не требователен к ресурсам — нужен только один восьми битный таймер и ножка с прерыванием.

Не очевидные недостатки:
— так как нет привязки к какому либо IR-протоколу, то невозможно проверить сообщение на ошибки – свой код будут выдавать даже явно сбойные посылки (об этом придется позаботиться Вам в программах работающими с этим устройством);
— устройство не знает когда заканчивается посылка – оно судит об окончании по длительной паузе, а значит будет некоторая задержка передачи кода команды по UART (порядка 20мС);

Сборка преобразователя.
Наш преобразователь будет работать на универсальной плате для IR устройств. Вот ее схема:

Схема IR driver

Сборку этой платы я описывал ранее – не буду повторяться.
Если нужно собрать — перечитываем страничку драйвера.

Нужные нам сигналы будут располагаться на следующих выводах:

Пинаут платы IR драйвера

Для создания преобразователя нам необходимо лишь запрограммировать микроконтроллер. После программирования подаем 5В на схему и устройство готово к работе!

Параметры UART:
— скорость 9600;
— размер посылки 8бит;
— 1 стоп бит;
— без бита четности.

Я сделал два варианта прошивки.
Первый вариант – простой. По UART выдается код нажатой клавиши пульта в виде одного байта. В виду того, что нажатой клавише соответствует только один байт, на принимающей стороне (Ваш электронный проект) очень легко будет обрабатывать посылки. Но с другой стороны при однобайтном отображении нажатой клавиши пульта возможны ситуации, когда две разные клавиши пульта (или разных пультов) выдадут одинаковой код.

Для устранения этого недостатка я сделал второй вариант прошивки — она выдает на каждую нажатую клавишу двух байтовый код (слово). Причем, перед каждым кодом посылается символ «*» — это должно помочь при приеме сообщения на принимающей стороне. Общий вид сообщения передаваемого по UART при приеме очередного кода будет следующим: «*хх», где хх-двухбайтовый код нажатой клавиши.

Обе прошивки при подаче питания на устройство выдают по UART строку «OK!» и мерцают светодиодом. При приеме IR сигнала (любого) светодиод мерцает.

Простой вариант прошивки — однобайтовый:
071-T13-IR-to-UART-1B.zip (2978 Загрузок)
071-T13-IR-to-UART-FuseBits.png (5025 Загрузок)
Как правильно прошить AVR фьюзы

Для однобайтового варианта сделал небольшой апдейт. Изменения коснулись алгоритма получения байта IR-посылки. В данном варианте вычисляется хэш-сумма со всей посылки, а в старом варианте просто берется последние 8 бит IR-посылки. Поэтому если есть у Вас есть какие проблемы со старой прошивкой — попробуйте новую (или наоборот).
071-T13-IR-to-UART-1B-Hash.zip (2443 Загрузки)
071-T13-IR-to-UART-FuseBits.png (5025 Загрузок)
Как правильно прошить AVR фьюзы

Расширенный вариант прошивки – двухбайтовый («*хх»):
071-T13-IR-to-UART-3B.zip (Одна Загрузка)
071-T13-IR-to-UART-FuseBits.png (5025 Загрузок)
Как правильно прошить AVR фьюзы

 

Файлы:
071-source-T13-IR-to-UART-1B.zip (3218 Загрузок)
071-source-T13-IR-to-UART-3B.zip (3097 Загрузок)
071-source-IR-to-UART-1B-Hash.zip (Одна Загрузка)

Ссылки:
069-Универсальная плата-IR Driver на ATtiny13.

 

Вариант программы на CVAVR.
Автор Сергей Петров (svgr) Admin*ggbest.ru (* — сами знаете на что заменить).

Сергей проделал большую работу — реализовал алгоритм преобразователя на СИ (CVAVR).
UniIR_CVAVR.zip (3258 Загрузок)

От автора:
Прошивка соответствует представленной схеме. Может быть зашита в плату без каких-либо изменений. Единственной «особенностью» в данном случаи будет инверсия светодиода из-за транзистора (он будет всё время гореть, гаснуть только во время приёма IR-посылок. при желании, исправляется в коде). Ножка PB4, аналогично, является выходом программного UART, скорость передачи, аналогично, 9600 бод (может быть изменена в исходнике — см. config.h). Основная работа происходит в файле stx_demo.c. Там обрабатываются прерывания с TSOP, производятся сравнения длительности первой «информационной» посылки с остальными посылками в пакете. Прочитанный код посылается по UART в формате, аналогичном 2-байтовой прошивке: * + 2 байта кода нажатой клавиши. Остальные пины микроконтроллера не используются и могут быть применены на усмотрение пользователей. Прошивка рассчитана на частоту 9,6МГц (внутренний RC-генератор).

(Visited 12 809 times, 2 visits today)

071-Преобразователь IR-сигналов от пультов в UART.: 72 комментария

  1. GetChiper Автор записи

    Это устройство одно из первых, на котором отрабатывался алгоритм, и тут хеш 8-ми битный. Позже стало понятно, что 8-ми бит для хеша маловато. Во-первых, случалось совпадали хеши пары кнопок на одном пульте и, во-вторых, довольно часто совпадали хеши на разных пультах. 16-ти битный хеш позволяет уйти от этих проблем.

    И, к стати, двухбайтный вариант устройства этой статьи тоже сделан по другому (без CRC16) алгоритму.

  2. Bob Key

    «Последние варианты моего IR-алгоритма используют CRC16 с полиномом 0×8005 (начальное значение 0xFFFF)» = всё понятно, но непонятно, почему тогда результат хэша 8-ми битный, а не 16-ти?

  3. GetChiper Автор записи

    Последние варианты моего IR-алгоритма используют CRC16 с полиномом 0x8005
    (начальное значение 0xFFFF)
    Это стандартный CRC-16-IBM (используется в Modbus, USB …)
    Если нужен сам алгоритм в Алгоритм Билдере, Вы найдете его в последних моих устройствах. Если нужен другой язык программирования, то готовых библиотек и описаний в сети море.

    Вообще, любой из широко используемых CRC, можно применять — все они будут работать хорошо https://ru.wikipedia.org/wiki/%D0%A6%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B8%D0%B7%D0%B1%D1%8B%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4

  4. Bob Key

    CRC я знаю как вычислять, а по какой формуле вычисляется хэш?

  5. GetChiper Автор записи

    Описания теории, как такового не делал, но суть простая — измеряются периоды единицы и нуля ИК-посылки и вместо того чтобы просто эти значения «складывать» в байт (или слово) из этих значений высчитывается хеш. Например те-же CRC-алгоритмы хорошо подходят для этих целей.

  6. Bob Key

    Запустил с пол-пинка все 3 версии программы на меге48 — автору ЗАЧЁТ! Просьба дать ссылку на теорию варианта с хэшем, раньше не встречался с этим.
    Желаю успехов в творчестве!

  7. GetChiper Автор записи

    Ну, в общем, так и должно быть «кнопки друг от друга отличаются и коды стабильны»

    А как по Вашему устройство должно работать?

  8. MEGA

    @GetChiper
    Попробывал другие версии — тожесамое) но я так понял так и должно быть — если переключить терминал в HEX то в принципе нормально. главное что кнопки друг от друга отличаются и коды стабильны))

  9. GetChiper Автор записи

    За Си-версию я ничего сказать не могу — не я делал. Для проверки можете просто прошить HEX

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

  10. MEGA

    Забыл написать что я использую версию для CVAVR

  11. MEGA

    Хорошая штука вышла и полезная) Хочу использовать в своей разработке, но для начала собрал на макете эту схему вроде и работает и нет: в порт приходят сообщения не очень понятные: «*А?» (это ёще из понятных) — так и должно быть или нужно в HEX просмотр переключить? (хоть и приходят эти кракозяблы но стабильно одни и теже)-порт настроен нормально, так как слово ОК! приходит нормально)). И ещё — в исходнике увидел что используется вачдог-таймер — я так понимаю его включить нужно? — но если его включить то МК постоянно уходит на сброс — соответственно в порт постоянно летит «ОК!»

  12. GetChiper Автор записи

    Да, есть пульты которые чередуют посылки в автоповторе (меняя определенный бит в повторяемой посылке). Тут ничего не поделаешь.

  13. usatorrent

    Я получаю данные по uart,но с пульта двд плеера philips каждая кнопка выдает 2 кода.они чередуются.это нормально,есть такое в пультах?

  14. ewgeny

    Наваял на работе контроллер управления двумя ветвями вентиляции. На днях возникла мысль прицепить к контроллеру (Мега8515) блочок IR-UART преобразователя, чтобы рулить работой системы с телевизионного пульта. И тут обнаружились грабли…
    Сам преобразователь, подключенный через UART-USB на СР2101 к компьютеру — работает прекрасно, коды кнопок принимаются исправно. Если слать с компьютера через USB-UART байтики на контроллер — тоже порядок, контроллер их видит. Но, прицепив IR-UART к этому контроллеру, имеем неправильную передачу данных. Т.е. с выхода Тини13 до входа Rx Меги8515 происходит искажение байтов. Например, вместо 0хА8 контроллер получает 0х90 или 0хА0. Длина шлейфа 5 сантиметров ))) Кто-нибудь пробовал прицеплять IR-UART ко входу другого контроллера?

  15. GetChiper Автор записи

    Конденсаторы керамика на микроконтроллере и на питание TSOPа стоят? Скорей всего — это проблемы с помехами. Может TSOP сильно отличается от частоты пульта?

  16. ur5got

    Собрал сегодня навесным монтажом USB-UART на TINY2313 по Вашей схеме (со стабилитронами). Заработал сразу. Подключил к нему IR to UART на Tiny13 и прога IRControl стала работать, но… При нажатии на кнопки на пульте прога очень часто неоднозначно определяет IR-код нажатой кнопки. Например, нажатие одной и той же кнопки на пульте (громкость +) может выдать код A4E0, 929B, 2BFC, 589C и другие! И такое впечатление, что код зависит от того, куда направлен пульт. Пробовал 4 разных пульта. С какими-то лучше, с другими хуже. Соответственно и управление получается «кривоватым». Что бы это значило и как с этим бороться? Прошивка ТИНИ13 для двух байт.

  17. GetChiper Автор записи

    Вход преобразователя не должен иметь малое сопротивление. Ток ножки TxD должен быть не большой и на 300 Ом не должно проседать напряжения. Может что с преобразователем? Попробуйте уменьшит до 100 Ом — меньше не стоит.

  18. ur5got

    Собрал преобразователь IR-сигналов от пультов в UART на ТИНИ13. Прошил прошивкой для двух байт. Подключаю через преобразователь USB-UART на OTI6858 (готовая платка для мобильника). Подключаю платку USB-UART к компу, а к ней платку IR-UART. При запуске проги IRControl комп вылетает в «синий экран» и перегружается. На двух других компах (XP SP3 и Win98) — аналогично. Выяснил, что происходит это из-за платки USB-UART на OTI6858. Хотя с другими прогами эта платка нормально работает. Например в Гипертерминале я могу наблюдать посылки с пульта от ТВ. Подключил другой преобразователь USB-UART на СР2102. IRControl с ним нормально запускается, порт открывает, но на пульт не реагирует (статус Идут данные — молчит). Хотя контрольный светодиод на платке IR-UART стабильно отзывается миганием на команды с пульта и на выходе LOAD A (TxD) (непосредсвенно на пин 3 тини13) появляются импульсы. А вот после резистора 300 Ом (на входе платы USB-UART) что-то не то. Такое впечатление, что тини13 не просаживает вход RxD USB-UART до низкого уровня. Как быть? Уменьшить 300 Ом?

  19. GetChiper Автор записи

    Нужно брать не период первого пилотного импульса (он большой и по любому будет больше любого из информационных бит), а период одного из первых информационных импульсов. Я беру третий период от начала посылки. Этот период нужно взять за эталон и дальше сравнивать с ним все остальные принятые периоды. Если последующий принятый период равняется эталону (конечно, с небольшим допуском. примерно +15% -15%) то он принимается за единицу, если нет — 0.

  20. StepanenkoVE

    Добрый день, уважаемый GetChiper,на днях решил разобраться с IR передачей. Взял для примера исходники этой статьи, но никак не могу разобраться с форматом пакета. Правильно ли я понимаю: Если больше измеренного периода пилота, то это единица, если меньше, то ноль? Если да, то как должно работать
    if (CurCNT > Hi_Ref | CurCNT < Lo_Ref)
    IR_BTemp |= 1;
    Тут значения меньше (Lo_Ref) получаются тоже единицей. В вашем исходнике так же…

  21. GetChiper Автор записи

    Да, такое возможно и есть алгоритмы как это реализовать — подумаю по свободе.

  22. RodenGT

    Всех с наступающим НОВЫМ ГОДОМ!!! У меня возникла мысль, по моему из этой платы может выйти неплохой датчик присутствия (конечно если заменить светодиод на IR). Так как в программировании хоть со словарём, хоть без оного я не жилец, прошу Вас развить эту, может быть и бредовую идею.

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