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 807 times, 1 visits today)

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

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

    Действительно, интересно — нужно себе записать в планы!

  2. nikolyan

    Хочу предложить разработать довольно полезное, на мое мнение устройство.+к нему нужна будет программа.Очень часто компьютера не бывает под рукой, ну или нужна отладка определенной схемы, где нужен для запуска юарт сигнал.Как пример-многие авиамодельные схемы требуют юарт.Тоесть если мне нужно просто двигатель запустить,задать его скорость надо дать команду.Некоторые цветомузыкальные схемы требуют определенных посылок…Работу программы вижу так:нажимаем кнопку на пульте, в таблицу считывается ее код.Напротив пишем-то что мы хотим видеть на юарт выходе, записываем в флешь память.Как это организовать понятия не имею, но считаю устройство будет очень полезным.

  3. psv

    Добавил в основной программе после:
    PutByte («*»)
    PutByte (IR_BTempH)
    PutByte (IR_BTempL)

    следующее:
    0->IR_BTempH
    0->IR_BTempL

    Теперь при помехах приходит 0x2A 0x00 0x00, что решает мою проблему.

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

    Понял, буду разбираться.

  5. psv

    Да дело не в помехах — пусть мусор приходит — я его отсею. Но приходит то что осталось в буфере, т.е. последний код. И приходит раз 30 за час. Вот если-бы после отправки кода писать в буфер 00 или ff и пусть себе шлет при помехе — было-бы удобнее.

    Забыл поблагодарить за сайт. Очень нравится. Спасибо за труд.

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

    Через некоторое время буду алгоритм улучшать, а пока стоит попробовать погасить помехи любыми доступными средствами. Еще можно поменять TSOP на другой тип.

  7. psv

    Доброго времени суток. Собрал прибор, 2х байтный вариант. Возникла следующая проблема: через некоторое время после нажатия кнопки пульта (1мин, 5мин, 10мин) прибор отсылает код последней нажатой кнопки. Очевидно, не корректно обрабатываются помехи. Возможно ли подправить алгоритм? Спасибо.

  8. 78L05

    Это было месяз с копейками назад, сейчас этот пульт покоится на свалке, т.к. телек реагирует правильно и на посылки с кодом 0 и нормальными сообщениями (однобитными)

  9. 78L05

    встречал ещё проблему такую: пульт передает по каналу код с адресом 1 и сообщение содержит нечто странное, причём длина сообщения у каждой кнопки разная. Долго думал, что к чему, пока не переключил терминал в режим ASCII. Представьте себе: пульт передает например «MENU» в виде 4-х посылок по очереди))) Это пульт от какого-то китайского телека, на панели нарисована эмблема «лыж» (LG), но меню китайско-английское. Полезная вещь — UART. Так то я долго пытался записать в EEPROM всё сообщение, всё дурдом получался

  10. Patriot69

    Добрый день. Заменил TSOP1836 на ilms5360 теперь все как по маслу.
    Спасибо !

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

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

    Я так понимаю UART работает нормально? может такое быть, что помехи на линии UART мешают нормальной передаче по порту.

    А как себя поведет на этой плате вот это —
    http://www.getchip.net/posts/076-upravlenie-nagruzkami-pri-pomoshhi-ir-pulta-attiny13/

  12. Patriot69

    Да пульты разные. Код какгда как либо чередуется гдето черезь раз 5 либо разный.

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

    Это происходит с разными пультами? Код выскакивает случайный (каждый раз другой)?

  14. Patriot69

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

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

    Спасибо за проделанную работу — исходник добавил к статье.

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

    Алгоритм работы не секрет и он частями уже описывался. На данный момент я его согласовываю с алгоритмом ир-сети (по мере появления свободного времени). Закончу — будет статья, но если нужна помощь раньше — буду рад помочь.

  17. svgr

    @GetChiper
    Мне кажется, что стоит публично описать, а там, возможно, и реализация от кого подтянется. Тут ведь надо поймать «порыв» (свободное время + желание + необходимость), а оно редко складывается.
    В принципе, мне так или иначе придётся делать ус-во управления 2 RGB лентами с ИК-управлением. Так, что мог бы тоже попытаться переписать (но без гарантий).
    Попробовал AlgorithmBuilder — затрахался стрелочки вырисовывать. На CVAVR я бы уже всё сделал, а там успел только 3 условия нарисовать (да и то не оптимально, а перерисовывать — вообще влом). Так же непонятно как изменить тип контроллёра (У меня будет ~ Mega8/16) что бы исходник работал (начинает ругаться на прерывание таймера, вроде, при смене контроллёра).

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

    С удовольствием опишу алгоритм работы, если кто возьмётся реализовать подобную штуку на си.

  19. svgr

    Не… Что ASM — птичий язык, что Algorith Builder — птичий язык в картинках. Результат один — исходник как бы есть, но его всё равно, что нет. Гораздо больше пользы было бы от описания алгоритма работы, чем от такого исходника.
    Реально ли допилить статью, добавив такое описание? Уж больно хочется прикрутить «любой пульт», токма совсем в иному устройству… А использовать 2 МК только из-за невозможности поправить прошивку — это изврат. )

  20. Dr. Alex

    @anatoliy
    Согласен насчёт языка. Ну хотя-бы на каком-нибудь другом, но….более читабельном((((( Так интересно посмотреть исходный код, но нифига не разобрать…..

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

    ! UPDATE
    Для однобайтового варианта сделал небольшой апдейт. Изменения коснулись алгоритма получения байта IR-посылки. В данном варианте вычисляется хэш-сумма со всей посылки, а в старом варианте просто берется последние 8 бит IR-посылки. Поэтому если есть у Вас есть какие проблемы со старой прошивкой – попробуйте новую (или наоборот).

  22. PoisonNT

    все заработало !!!! протупил при розводке :)жду девайса на 8 нагрузок на атини 2312

  23. alex55498

    @GetChiper
    Да, на счет генерации 16-ти битного хеш ключа нажатой клавиши неплохая идея. Думаю этого должно хватить для генерации уникальных кодов в рамках пульта.

    На сколько я понимаю алгоритм заключается в том, что идет замер длины каждого импульса и генерация на основе этого кода. Верно? Поэтому девайс позиционируется как универсальный? 😉

    Мне кажется если брать длительности каждого импульса и накладывать их на общий 16ти-битный результат по xor, то мы тоже получим с большой вероятностью уникальный код.

  24. derik536

    @anatoliy
    Зря вы так на счет АлгоритмБилдера говорите — самый короткий код получается при небольшой сноровке что очень важно для МК с малыми размерами памяти и позволяет ЛЮБОМУ интуитивно писать сложные программы без особых знаний любых других языков.

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

    Скоро подправлю алгоритм — будет лучше. Сейчас в однобайтовом варианте берется последний байт посылки пульта (в двухбайтовом — два последних) — этого обычно хватает. Но раз этого мало — сделаю что-то вроде хеш суммы всей посылки пульта.

    Теоретически разница между 36 и 38кГц есть — частотные характеристики TSOP довольно остры, но на практике я этого не замечаю.

  26. alex55498

    Я слегка обломался из-за того, что не все пульты дают уникальные коды своих клавиш.
    Лучше всего себя повел пульт BBK DVD. Почти все кнопки дают уникальные.
    Мне нужен IR Control для включения нагрузки с улицы, но чтоб всякие левые не могли ее включить, я хотел сделать что-то вроде набора PIN кода с пульта. Для пультов, например, сони цифровые клавиши отпадают.

    Я еще не втыкал в алгоритм, но может у пультов сони посылка длиннее, чем ты, GetChiper, замеряешь? И этот девайс из-за этого не чувствует разницы?

    + Насколько критично, что например у меня TSOP работает на 36 кГц, а пульт скажем на 38?

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

    1 А зачем это нужно?
    2 Это проблема универсализации и данной версии прошивки. Есть решение как получить более достоверные кода кнопок — в следующих версиях реализую.

  28. alex55498

    Собрал такое же устройство, но по своей разводке.
    Автору конечно респект.

    Но есть некоторые вопросы:
    1. как понять пульт RC5 или нет?
    2. На нескольких пультах (Sony DVD, Philips (TV, DVD)) разные кнопки дают один и тот же код даже для трехбайтовой прошивки. Например пульт Sony DVD дает для кнопок 1,2,3,4 один и тот же код 2A 05 C9. — как с этим бороться?

    Спасибо

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

    «сделать hex файл с 5сек задержкой» Поподробней — не понял про что идет речь.

  30. tab437

    Собрал это устройство работает замечательно.Пожалуста не могли бы вы сделать hex файл с 5сек задержкой.Сталнулся с несколькими TSOP точного имени не знаю(с надписью SC SM0038 и SC SM3386 datasheet не нашел) очень чувствительные даже прикратковременном попадании ИК луча.
    Думаю это будет, нужно и от помех, которые создают люминесцентные лампы.

  31. IROBOT

    А можно скрин фьюзов в авр студии-просто шью через неЁ.
    Вот так у меня в программе
    HIGH-0xFF
    LOW-0x7A

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

    Спасибо, в следующей реализации попробую что-то сделать с этим.
    А версия прошивки однобайтовая или двухбайтовая?

  33. Ghjuhfvvf

    На RC5 кнопки 1,2 и 4,5 выдают один и тот же код (остальные совпадения замечены не были :))

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

    Буду описывать работу 1W-IR сети сделаю подробное описание алгоритма.

  35. Ghjuhfvvf

    Пришлите, пожалуйста, алгоритм на «Преобразователь IR-сигналов от пультов в UART». Очень хочется разобраться, а то не все понятно.
    Спасибо… ksw381@gmail.ru

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

    Алгоритм работы отправил geovas по почте — работает человек. Доделает — отпишется.

  37. Ghjuhfvvf

    GetChiper :

    geovas :
    AB – для меня не супер, но что уж тут поделаешь, раскурю! Пора бы и мне уже забабахвать платку, а то уже скоро июнь… Надо успеть до июня.

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

    Ждем, не дождемся алгоритма …

  38. derik536

    @anatoliy
    С чего это АВ=(а-ля-ассемблер только в графической форме)»птичий язык»? Это вам скорее «неуд» что только на Си зациклены.

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

    А уже приспособил 🙂
    Скоро будет статья.

  40. Ghjuhfvvf

    Собрал схему для включения ламп дневного света. Включается и выключается с любой кнопки любого пульта ДУ, если она нажата в течение 2 сек (чтоб не реагировала на пульт телевизора и на включение других источников света). Вот бы приспособить Ваш алгоритм на распознавание кнопок, было бы класс… Над распознаванием мучаюсь уже долго 🙂

  41. Ghjuhfvvf

    Заработало! Сначала показывал один и тот же код, пока разобрался с Fuse. Поменял CKDIV8 и теперь показывает разные коды кнопок ПДУ. Если нетрудно, указывайте, пожалуйста, значения HighFuse и LowFuse. Спасибо за статью. Было бы вообще хорошо, если бы описали алгоритм, чтоб разобраться в AB 🙂

  42. geovas

    2 anatoliy именно 🙂
    2 GetChiper — если опишите алгоритм, я бы занялся! На следующей недели время для этого будет.

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

    geovas :

    AB – для меня не супер, но что уж тут поделаешь, раскурю! Пора бы и мне уже забабахвать платку, а то уже скоро июнь… Надо успеть до июня.

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

  44. geovas

    AB — для меня не супер, но что уж тут поделаешь, раскурю! Пора бы и мне уже забабахвать платку, а то уже скоро июнь… Надо успеть до июня.

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

    anatoliy :

    Ещё совет реализуйте Multi-processor Communication Mode!

    Есть такая идея — я в раздумьях 🙂 …

  46. anatoliy

    Ещё совет реализуйте Multi-processor Communication Mode! Ато все устройства у вас с UART а юзеру их надо как-то связывать. И еще алгоритм взаимодействия! Там адбитраж итд.

  47. anatoliy

    В принципе зачёт! А вот за программирование на AB (птичий язык) неуд 😀 так бы хоть в код глянул! А тут увы и АХ 🙁

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