ИК дистанционное управление

Завязка или «Как начинался девайс»

…Когда я пришёл, Виктория сидела на диване, уставившись в телевизор. День выдался тяжёлый, поэтому ей не хотелось ничего делать. Несколько минут мы смотрели какой-то попсовый сериал, потом он закончился, и Вика выключила телевизор. В комнате стало темно. На улице шумел дождь, и от этого казалось, что дома тоже холодно.
Вика поднялась с дивана и принялась, на ощупь, искать выключатель от светильника. Настенный светильник висел, почему-то, не у дивана, а на другой стене и приходилось топать через всю комнату, чтобы зажечь свет. Когда она, наконец, включила его, комната наполнилась тёплым светом лампочки накаливания.
Около меня, на помятой простыне, лежал пульт от телевизора. Нижние кнопки без опознавательных знаков и, скорее всего, не использовались. И тут у меня возникла интересная мысль…
— Вик, а хочешь, я сделаю так, что твой светильник можно будет пультом от ящика включить? Там даже кнопки лишние есть…

Концепция
Наше устройство должно уметь принимать сигнал с ИК-пульта, отличать «свою» кнопку от других, и управлять нагрузкой. Первый и последний пункты простые, как топор. А вот со вторым немного интереснее. Я решил не ограничиваться каким-то конкретным пультом (Почему? – «Не интересно так!»), а сделать систему, которая может работать с разными моделями пультов от разной техники. Лишь бы ИК-приёмник не спасовал, и уверенно ловил сигнал.

Ловить сигнал будем с помощью фотоприёмника TSOP. Причем не каждый приёмник подойдёт – несущая частота должна совпадать с частотой пульта. Несущая частота приёмника указана в его маркировке: TSOP17xx – 17 это модель приёмника, а хх – частота в килогерцах. А несущую частоту пульта можно найти в документации или в инете. В принципе, сигнал будет приниматься, даже если частоты не совпадают, но чувствительность будет фиговой – придётся тыкать пультом прямо в приёмник.

Каждая компания, выпускающая бытовую технику, вынуждена соблюдать стандарты при изготовлении «железа». И частоты модуляции у пультов, тоже стандартные. Зато разработчики отрываются на программной части – разнообразие протоколов обмена между пультом и устройством просто поражает. Поэтому, пришлось придумать универсальный алгоритм, которому плевать на протокол обмена. Работает он так:

В памяти устройства хранятся контрольные точки. Для каждой такой точки нужно записать время и состояние выхода с ИК-приёмника – 0 или 1.
При получении сигнала с пульта, МК будет последовательно проверять каждую точку. Если все точки совпали – то это была та самая кнопка, на которую устройство запрограммировали. А если выход с приёмника хотя-бы в одной точке не совпал с шаблоном, то устройство никак не отреагирует.

Впрочем, баги никто не отменял! Возможно, что, сигнал будет отличаться от шаблона, но
в контрольных точках значения будут одинаковые. Получится ложное срабатывание. Казалось-бы – редкостное западло, и бороться с ним пипец сложно! Но на самом деле не всё так плохо (а местами даже хорошо).

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

Во-вторых мелкий шум (обычно выглядит, как редкие короткие импульсы) в большинстве случаев идёт лесом – ибо если он не попадёт прямо на контрольную точку, то нифига не повлияет на систему. Значит у нас есть естественная защита от шума.

Второй тип ошибок (aka «Пропуск команды») бывает из-за того, что точка расположена слишком близко к фронту импульса (к тому месту, где сигнал на выходе приёмника меняет свой уровень).
Представь себе, что через несколько микросекунд после контрольной точки сигнал должен меняться с HIGH на LOW. А теперь представь, что пульт выдал команду чуть быстрее, чем обычно (довольно часто случается). Фронт импульса сдвинулся во времени, и теперь он происходит ДО контрольной точки! Выход с приёмника не совпадёт с шаблоном и система сбросится.
Чтобы этого не происходило, нужно размещать контрольные точки подальше от фронтов.

«Всё круто» — скажешь ты – «Но откуда мне взять контрольные точки?». Вот и я над этим долго тупил. В результате решил доверить расстановку точек тебе.
На устройстве есть джампер J1. Если при включении он замкнут – устройство будет тупо передавать через UART всё, что выдаёт ИК-приёмник. На другой стороне провода эти данные принимает моя программа, которая выдаёт на экран компа импульсы с TSOP’а. Тебе остаётся только мышкой раскидать по этому графику контрольные точки, и прошить их в EEPROM. Если возможности использовать UART нету, то на помощь приходит джампер J2. Когда он замкнут – устройство не выдаёт данные по UART, а складывает их в EEPROM.

Схема
Простая до безобразия. В качестве контроллера я взял ATTiny2313. Частота 4 мегагерца, от кварца, или внутренней RC цепочки.
На отдельный разъём выведены линии RX и TX для связи, и питание. Туда – же выведен RESET для того чтобы можно было перепрошивать МК, не вынимая из устройства.
Выход фотоприёмника подключается к INT0, он подтянут к питанию через резистор в 33к. Если будут сильные помехи, то можно поставить туда резистор поменьше, например, 10к.
На пинах D4 и D5 висят джамперы. Jumper1 на D5 и Jumper2 на D4.

К пину D6 подцеплен силовой модуль. Причём симистор я взял самый мелкий из тех, что у меня были – BT131. Ток у него 1А – не круто, но зато корпус не слишком большой — ТО92. Для мелкой нагрузки самое то. Опторазвязку я сделал на MOC3023 – у неё нет датчика пересечения нуля, а значит она подходит для плавного управления нагрузкой (здесь я это так и не реализовал).

Порт B почти полностью выведен на разъём – туда можно прицепить индикатор или ещё что-нибудь. Этим-же разъёмом я пользуюсь при прошивке девайса. Пин B0 занят светодиодом.

Питается всё это дело через LM70L05 и диодный мост. То есть на вход можно подавать переменное напряжение, например, с трансформатора. Главное, чтобы оно не превышало 25 Вольт, а то умрёт либо стабилизатор, либо кондер.

Плата получилась вот такая:

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

Прошивка
Устройство может работать в двух режимах. В первом – когда J2 замкнут – оно просто передаёт импульсы с фотоприёмника в UART. С него и начнём:

UART работает на скорости 9600, т.е, при частоте 4МГц в регистр UBRR записываем 25.

…ждём, пока не дёрнется ножка фотоприёмника. Как только она опустилась (изначально-то она болтается на pull-up резисторе) мы запускаем таймер (TIMER/COUNTER1, тот, что на 16 бит) и врубаем прерывание INT0 на любое изменение входа – any logical change (ICS00 = 1). Таймер тикает… ждём.

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

Ещё импульс… выход дёргается… прерывание… запись значения таймера в память… сброс таймера… указатель + 2 (мы пишем два байта за раз)…

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

В конце можно затупить в бесконечный цикл и ждать ресета – миссия выполнена.
А на выходе получится последовательность чисел. Каждое из них – время между изменениями состояния выхода TSOP’a. Зная, с чего началась эта последовательность (А мы знаем! Это перепад с HIGH на LOW), мы можем восстановить всю картину:

Второй режим. Тут мы ловим команды с пульта и управляем нагрузкой.

Прерывания не используются совсем, всё крутится в главном цикле программы. В EEPROM лежат контрольные точки. Каждая из них занимает 1 байт: 7 бит на время от последней точки и 1 бит на состояние выход TSOP’a в этой точке.

После инициализации сидим и ждём, пока TSOP дёрнется. Как только это случилось – читаем из EEPROM первую точку, и в простом цикле тупим столько, сколько там написано. При этом время считаем пачками по 32us. Выйдя из ступора, проверяем – что-там на выходе приёмника.

Если выход не совпал с тем, что мы ожидали – это не наша команда. Можно спокойно дожидаться конца сигнала и начинать всё сначала.

Если выход соответствует нашим ожиданиям – загружаем следующюю точку и проверяем её. Так до тех пор, пока не наткнёмся на точку, время которой = 0. Это значит, что точек больше нет. Значит вся команда совпала, и можно дёргать нагрузку.

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

Софтина
Сначала я думал сделать автоматическое запоминание шаблона. То есть ты замыкаешь джампер, тыкаешь пультом в TSOP, а МК сам расставляет контрольные точки и складывает их в EEPROM. Потом стало ясно, что идея бредовая: более-менее адекватный алгоритм получится чересчур сложным. Или не будет универсальным.

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

Приучаем девайс отзываться на нужную кнопку пульта:

1) Замыкаем перемычку J1.

2) Подключаем UART. Если возможности его подключить нету, то замыкаем джампер J2. Тогда устройство будет скидывать данные в EEPROM.

3) Врубаем питание.

4) Если мы решили юзать UART, то запускаем софт и смотрим на строку состояния (внизу окошка). Там должно быть написано “COM порт открыт”. Если не написано, то ищем косяк в подключении и тыкаем кнопу «Подключить».

5) Берём пульт и тыкаем нужной кнопкой в TSOP. Как только девайс почует, что сигнал пошёл – загорится светодиод. Сразу после этого устройство начнёт передавать по UART (или писать в EEPROM) данные. Когда передача закончилась, светодиод гаснет.

6.1) Если работаем по UART, то жмём кнопу «Загрузить по UART». И радуемся надписи «Загрузил график…» в строке состояния.

6.2) Если работаем через EEPROM, то читаем программатором EEPROM память и сохраняем в *.bin файл. (Именно bin!). Потом нажимаем в программе кнопку «Загрузить .bin» и выбираем файл с EEPROM.

7) Смотрим на загрузившийся график – это сигнал с TSOP’a. На боковой панели есть ползунок – им можно менять масштаб. Теперь тыкаем мышкой по графику – ставим контрольные точки. Правой кнопкой точки удаляются. Только не нужно их ставить слишком близко к фронтам. Получается примерно так:

8) Нажимаем «Сохранить .bin» и сохраняем точки. Потом прошиваем этот файл в EEPROM. Так-как мы запихиваем время между двумя точками в 7 бит, то оно ограничено 4мс. Если время между двумя точками превысит это значение – программа откажется запихивать точки в файл.

9) Снимаем джамперы. Перезагружаем устройство. Готово!

Архив с прошивкой, платой, софтом

Видео с испытаний

87 thoughts on “ИК дистанционное управление”

  1. Риспект за статью!

    Телепатия продолжается. Только утром продумывал схему с ИК, а тут бабах! Статья на ту же тему! Так же как и с серво моторами и др. Видимо, существует какое-то общеэлектронное поле, которое на нас влияет! :-)

      1. Ага. Ну может и так.

        Забыл спросить — есть ли удобная простая провереная схема, чтобы питать подобные микроконтроллерные схемы от 220в, бестрансформаторная?

        1. Есть конденсаторный БП, но лично я его боюсь :) (Там нет развязки от 220В, а значит если что замкнёт — может случиться Ж)
          Ещё есть схемы на TOP-Switch. Но так, ЕМНИП, тоже стоит транс, но импульсный. С ним получается компактнее, чем с обычным трансом.

          А про общеэлектронное поле… незнаю… Вот если-бы меня не доставали всю неделю, то статья была-бы готова раньше.

        2. Возьми зарядник от мобильника. Там компактно все и от 220 работает. Только фильтровать его надо дай боже.

    1. это энергоинформационное поле или ноосфера, которое создают сами люди
      именно благодаря ему разные ученые почти одновременно «открывают» свои открытия
      ну или попросту берут из того поля инфу, которая там до них лежит

  2. А я бы интегрировался с (Win)LIRC’ом — туча уже снятых пультов и формат запоминания посылок как в варианте «сброс принятого по уарт» (а в случае известного программе протокола — тока параметры протокола и бинарные коды кнопок).

    1. Ну LICR нужен для управления компом по ИК. (ЕМНИП)
      А тут задача немного другая, и комп нужен только для настройки устройства.

      1. Я имею в виду содрать оттуда процедуру декодирования, форматы кодов и коды пульта (для туевой хучи пультов притом есть уже готовые файлы кодов, хотя снять новый в винлирке чуть ли не быстрее чем найти готовый на сайте).

  3. А как же куча готовых протоколов, RC-5, NEC, SIRC? Их не проще использовать?
    Тогда требование для обучения наличия компа с самопальной утилитой отпадает в принципе.
    А то все это похоже на ломание уже собранного велосипеда с целью собрать похожий.
    или все чисто из-за «Не интересно так!»?

    1. Ну так задача стоит — ребатать с любым пультом. Без привязки к протоколу. Или я не так вас понял?
      Пусть мой вариант кажется черезчур сложным. Зато он универсальный.

      1. «ребатать» — это у меня мозг в спящий режим потихоньку ухрдит :)))
        там, конечно-же должно быть «работать».

      1. Я специально в архив смотреть полез еще перед вашим ответом. Натурально, спринт в стиле топора :). И хватило ж терпения каждую дорожку выгибать :)

        1. Эээ? Вы же все не думаете, что я действительно их вручную гнул? :)
          Там при разводке, кнопкой ПРОБЕЛ можно менять вид изгибов. Неужели никто не заметил?

          1. Ещё один хинт по Sprint Layout:
            Если нужно изменить какой-то элемент в группе, то делаем так:
            Нажимаем кнопочку «Связи»;
            Наводим мышко на элемент (например отверстие или smd площадка), при этом он выделяется.
            Щелкаем правой кнопкой — режим редактирования связей отключается, а элемент остаётся выделеным.

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

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

    Это надо учитывать, когда создаются данные контрольных точек. Нажать несколько раз и убедиться, что данные идут одни и те же. Если разные — записать идентичную часть.

    1. Кстати ДА! И при таком раскладе простая расшифровка посылки по битам и сравнение с командой, которая записана в памяти идут лесом. Ибо будет работать через раз.
      А контрольные точки рулят. :)

    2. Когда я года три назад проверял все свои пульты (накопилось штук 6 разных), один, кажется PANASONIC, посылал код только раз, при нажатии, потом слал одиночные импульсы, пока кнопку не отпустишь. Видно, на случай залипания, или если случайно пульт чем прижмут. В остальном примерно одинаковы, даже частота заполнения вроде у всех 36КГц оказалась.

      1. Это пульт с кодом повторения. Не такая уж редкая штука, мне несколько раз попадались (хотя пультов я не так много щупал, менее двух десятков).
        Впрочем, девайс сработает на первую посылку. С винлирком хуже — если он поворонил ее (а это не редкость — он считает тайминги сигнала в user-mode, когда кто угодно может забрать проц в самый неподходящий момент) — кнопку придется нажимать заново.

  5. Вопрос по поводу силовой части! я использую силовую часть из этой схемы для включения\выключения паяльника. оптопара МОС3062, симистор ВТ139. Возникла проблемка — я подключил ради експеримента в качестве нагрузки китайский моторчик на 220 В 2 вата и он крутится как при 0В на входе оптопары так и при подаче 5-ти вольт! что бы это могло быть?? значит симистор открыт?

    1. Индуктивная нагрузка. Симистор пробивает. Надо поставить RC цепочку (снаббер) в параллель с симистором.

      1. Впаял снаббер но никакого результата! все также! более того, подключил вместо мотора энергосберегающую лампу! результат тотже! не пойму в чем проблема…
        dcoder — распиновку учёл!

        1. в энергосберегайке тоже индуктивности дофига. Там же дроссельный запуск емнип. С обычной лампочкой все ок?

          1. не пробывал! устройство будет предназначено для отключения моего паяльника)) типо таймер сна! так как я часто забываю его отключить)
            паяльник это индуктивная нагрузка??? там ведь катушка — нагреватель!
            я просто решил пробывать для начала на слабой нагрузке! моторчик у меня на 2 вата всего. а паяльник ЭПСН на 25 ватт.

            только что замерял сопротивление между выводами симистора — всего 480 Ом! это при откл питании и нагрузке

            1. Ну вообще, паяльник больше похож на обычную лампочку, чем на энергосберегайку :) Идуктивности там почти-что нет.

              При проверке сопротивления симистор отпаивался, или измерял прямо на плате?

              1. измерялся на плате! выпаял симистор — там дествительно обрыв! что же тогда? почему оно не хочет отключать нагрузку??
                а обычной лампы щас нету под рукой) но всеже хотелось довести схему до рабочего состояния)

                1. Проверь разводку платы и саму оптопару. Похоже на то, что она пробита, и ток бежит через оба резистора. Отсюда и 480 Ом

                  1. наверное пожог оптопару когда мотор подключил без снаббера! А разводку проверил еще раз — все правильно! завтра прийдется еще одну оптопару покупать..

                    1. оказалось оптопара рабочая, а вот симистор походу пробитый, между одним из контактов и управляющим электродом в обеи стороны сопротивление 150 Ом!

        2. Энергосберегайку я включал и без снаббера. Работало (и сейчас работает).
          Можно отпаять симистор и измерить сопротивление между T1 и T2. Там должен быть обрыв. Если нет, то симистор, скорее всего умер.

  6. Ба! Да этот протокол — SIRC.
    Вообще, есть такая софтина для линуха — lirc. Она умеет управлять ИК, но, главное, в её репозитории есть файлы конфигурации от огроменного количества пультов. Там можно легко и без напрягов узнать коды кнопок, а также форму протокола без всякого манчкинизма с eeprom

  7. Я по другому делал универсальный декодер для команд с пультов.
    Для того чтобы однозначно идентифицировать команду на нужно ее честно декодировать и знать протокол ее передачи. Достаточно получить некий ее слепок.
    Для этого с помощью таймера с модулем захвата(или внешним прерыванием если таймер без захвата) измеряем длительности импульсов от фронта до фронта пришедших с нашего ИК приёмника. Если эта длительность больше некоторого порогового значения, то в переменную служащую буфером приёма (8, 16 или 32 бит) сдвигаем единичный бит. Если меньше — нулевой. Если импульсов нет дольше определенного таймаута — копируем приёмный буфер в другое место и потом что-то делаем с полученным кодом.
    Эксперементально установленное порогового значения с которым сравнивается длительность принятого импульса равняется 12-15 периодов несущей ИК приёмника.
    Такой принцип надёжно работает с кодированием Pulse distanse, Pulse width, Bi-phase(RC5).

    1. Тоже вначале думал замерять длительности импульсов, но меня вот что напугало:
      Если в пакет попадёт шум — лишний импульс, то весь код «поплывёт». Поэтому и решил сделать на точках.

      1. В один пакет попадёт шум, в другой попадёт, а третий будет неискаженным. Если пришел код которого не знаем — ничего не делаем. И всё. Даже если одновременно работают два-три пульта, хоть один из десяти пекетов да примется верно. При 16 битном коде вероятность ложных срабатываний тоже очень мала.
        Я делал робота, управляемого с пульта от телевизора. Им можно было управлять даже если в том же помещении использовалось несколько пультов. Он только несколько «тупил» из-за пропуска комманд.

    1. Интересная конструкция.
      Сам хотел регулировку сделать, но потом упростил.
      А как у вас реализовано обучение?

    1. Как только будет определено, что команда подходит, устройство переключает нагрузку и тупит пару секунд. Я же не буду продолжать держать кнопку, когда увижу, что лампочка загорелась (или вентилятор включился)?!

      К тому-же, если после этих двух секунд ожидания, мы поймаем середину сигнала, то никакой реакции не последует. Ведь точки не совпадут.

      Поэтому, чтобы нагрузка еще раз переключилась, нужно отпустить кнопку и опять нажать.

  8. Зачем эти дурацкие точки, я делал так, просто считаем время между импульсами и получаем набор цифр — задержек, между перепадами сигнала. Далее джампером тупо включаем режим обучения и сканируем два нажатия и запоминаем референсные сигналы (нажатия должны быть короткими что бы не схавать сразу два кода), Два нажатия для того что бы исключить проблему с разными кодами для четных и нечетных нажатий. Далее основной режим высчитываем набор «задержек» для каждого принятого сигнала, и сравниваем с референсами (двумя) и вводим некоторую допустимую погрешность в задержках, что бы отфильтровать девиацию. и все работает безупречно.

    1. А если у нас помехи накладываются на сигнал?
      Например, если сигнал слабый, то импульсы (особенно длинные), могут прерываться. Так и происходит, особенно, если есть внешняя засветка. В таком случае ваш алгоритм посчитает один «разорваный» импульс за два. И весь код сдвинется.

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

      1. У меня не было проблем с помехами, если делать на той микросхеме приемника, она очень хорошо отрабатывает. + можно поставить опять же цифровой фильтр на очень маленькие длительности, помехи они как правило в разы отличаются по длительности от полезного сигнала.

  9. Добрый день! Собрал Ваше устройство, при отладке наблюдаю следующее, при замыкании джампера 1, и подаче питания иногда самостоятельно загорается светодиод и остается в таком положении, при подаче команды с пульта светодиодтоже загорается и не выключается, подключенная программа по R232 ничего не принимает, хотя данные проходят, когда я подключил обычный терминал, то увидел посылку из кажется 105 цифр, первая всегда 38, где у меня ошибка. Подключал как от внешнего кварца так и от внутреннего.

    1. Добрый!
      Слово «иногда» подразумевает, что в других случаях устройство работает нормально?

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

      2) То, что светодиод постоянно горит — это мой косяк. Перепроверил программу, он действительно не отключается. Странно, что при испытаниях я этого не заметил. Поправил, ждите обновления архива с проектом. И ещё, добавил в софтину возможность выбирать COM порт.

      3) То, что программа не принимает данные, это что-то странное. У меня она работала на 2х компах. Правда, на обоих из них стояла программка UserPort. Винда иногда блокирует приложениям доступ к com порту, а UserPort позволяет это обойти. Возможно, дело было именно в этом. Попробуйте установить это прогу.

  10. Проверил я с новой прошивкой, ситуация не изменилась, за исключением того, что теперь светодиод тухнет после приема команды. По прежнему программа пишет «загружать нечего». При использовании терминала COM Port Toolkit приходять данные, я сделал скриншот, нескольких нажатий одной кнопки [URL=http://www.radikal.ru][IMG]http://i003.radikal.ru/1101/bc/e84071a6b0cc.png[/IMG][/URL] я решил схитрить, и эти цифри вручную записать в eeprom, а дальше действовать по второму пути, получился у меня график, но что-то мне кажется что он не правильный, т.к длительность у него такая, что у меня получилось около 400 точек, и естественно что я все не смог установить так, чтобы между ними был интервал меньше 4 мс. Еще хотел уточнить, я использую преобразователь RS-232-USB не может из-за этого быть проблема. И еще может я ошибаюсь при прошивке фьюзов, хотелось бы посмотреть на их вид при прошивании из CVAVR.
    При работе с замкнутым джампером 2, светодиод не должен загораться?

    1. Немного сдвинулось с мертвой точки, после установки UserPort наконец-то начали загружаться точки в программу, я использовал кнопку на пульте от DreamBox 500, сделал 2 лепка, один очень подробный, во втором были пропуски перепадов, в общем там где я очень подробно расставлял точки управление не получилось, а во втором случае идет срабатывание от любого пульта и любой кнопки, буду еще разбираться. Вместо оптрона и BT131 установил маленькое реле, т.к буду коммутировать транс, который питает лампы 12 вольт установленные в шкафу.

  11. Давно хочу сделать что-то подобное. А тут вот…
    Очень интересная конструкция! Только… Хочется большего.
    Разработать свое, наверное, не получится — совсем со свободным временем плохо стало…
    Зато я, наверное, смогу поставить задачу! Может быть, и воспламеню кого?

    Только, плиз, пусть никто это не воспринимает за «барин соизволили». А именно как плодотворную (?) дебютную идею. Итак:

    1) Дивайс должен вписываться в стандартные размеры бытового выключателя (т.е. монтироваться под стандартного размера щиток и вписываться в стандартную распаечную коробку).
    2) Питание должно быть от 220V. Питания должно быть достаточно достаточно не только для микроконтроллера и приемника, но и для подсветки кнопок и ручки валкодера. Гальваническая развязка — приятно, но вовсе не обязательно.
    3) Должна быть возможность настроить конструкцию на любой пульт. Естественно с соответствующей частотой несущей. Как минимум, распознавать сигнал пульта внешним парсером (их много!) и прошивать при программировании. Если конструкция будет обучающейся (включать режим обучения джампером на плате) — это будет просто супер!
    4) Должна быть возможость включить/выключить от руки. Должны быть кнопки на фиксированные значения: «Выключено», «Низкая мощность», «Средняя мощность», «Полная мощность» (аналог двухклавишного выключателя). Как минимум — три кнопки: «Выключено», «Средняя мощность», «Полная мощность».
    5) Регулиировать мощность валкодером. Согласитесь, оно гораздо приятнее, чем стоять, играть кнопками «Больше»-«Меньше» ждать пока установится нужный режим. Желательно ориентироваться на дешевый и доступный валкодер промышленного изготовления. Но, имеючи исходник, желающие смогут приколхозить и самодельные валкодеры.
    6) Алгоритм работы валкодера:
    а) Крутим по часовой — мощность увеличивается, но не больше, чем до значения «максимум».
    б) Крутим против часовой — мощность уменьшается, но не больше, чем до значения «минимум».
    в) Приращение мощности на один шаг валкодера должно прошиваться при программировании.
    г) Режим использования валкодера как абсолютного датчика угла не обязателен. Но если будет возможность включить такой режим — наверное, кому-то это понравится. Тогда, видимо, надо будет дать возможность задать при программировании количество шагов валкодера как «угол полного отклонения», запоминать текущее значение в промежутке между «минимум» и «максимум», и корректно обрабатывать перекручивание валкодера за края диапазона.
    д) Обратная связь по скорости вращения валкодера (имеется в виду зависимость типа «Больше скорость вращения» -> «Больше приращение мощности за 1 шаг», для упрощения точной регулировки) не обязательна. Но, возможно, кому-то понравится.
    7) Но регулирования кнопками «Больше»-«Меньше» надо оставить. Для любителей.
    8) Мощность для каждой кнопки (кроме «Выключено») должна быть прошиваемой при программировании. Да-да, и для «Полная мощность» тоже. Возможно, кто-то захочет ограничить максимально возможную яркость своей люстры. Если будет возможность сохранить на любую из кнопок текущую (установленную в данный момент) мощность — будет отлично! Например, так: нажимаем кнопку и держим 2 секунды. Потом крутим валкодер. После того, как валкодер остается неподвижным NN секунд, за кнопкой закрепилось текущее значение валкодера. Или, возможно, командой «Store» с пульта: установил мощность, нажал «Store», не более чем через N секунд нажал кнопку — значение привязалось к кнопке. Но это лишнюю кнопку на пульте расходовать.
    9) Для любителей же — индикация приема сигнала. Отдельным световым индикатором, или подсветкой одной из кнопок («Выключено»?). Тот же огонек можно использовать для индиации режима «Программирование».
    10) Звуковая индикация (бипер) — вовсе не обязательно.
    11) Программирование (с пульта?) времени включения/выключения освещения (sleep-таймер, будильник) — наименее значимая фича. Хотя и ее, кто-то, наверное, захочет иметь.

    «Прошиваться при программировании» = либо прописать в исходниках (желательно — в виде define) и скомпилировать прошивку, либо указание адреса + диапазон допустимых значений в прошивке.

  12. Извините, у вас же с выхода TSOP инвертированный сигнал выходит по отношению к сигналу с пульта? Или это не так?

    1. Так и есть, но в программе при пострении графика сигнал еще раз переворачивается. Получается, что на графике сигнал соответствует сигналу с пульта.

    1. Сейчас нет возможности замерить, но на вскидку:
      10-15 мА когда нагрузка выключена;
      20-30 мА когда включена.

    1. у меня на AT90s2313 тоже подобная схема собрана, только не ИК, а радиопульт. Так что ,если разбираешься в программировании не сложно будет переделать.

  13. Без переделки кода- не будет, жаль, придется тиньку покупать, в програмировании я не селён.
    dcoder, а можно к этой схемке две кнопки добавить ( или одну) чтобы в ручную включить и выключить можно было, это если пульт куда-то как обычно затеряется.

      1. Прошу прощения за глупый вопрос, сможет ли выдержать BT131 100 Ватт и как рассчитать максимальную (допустимую) мощность нагрузки, зная максимальный ток симистора ? И еще момент, уместно ли использование R4, R5 в SMD корпусах 0805 ?

  14. Какие значения High и Low Fuse прошивать? Led при нажатии кнопки пульта загорается и потом гаснет (как положено), но передача по UART не проходит (использую внутреннюю RC), через EEPROM — Led вообще не реагирует, да и в памяти ничего нет … Прошил на вкл/откл нагрузку на 220В — энергосберегающая лампа на 40W вкл и откл. В чем проблема? Подскажите пож-та.

  15. Хотелось бы обратить внимание на ошибку в схеме. В схеме светодиод висит не на том порту и не той стороной. Если самому рисовать плату, светодиод работать не будет.

  16. К слову, могу предложить тот функционал который стоит реализовать в данной идее:

    дома у родителей есть сенсорный светильник который зажигается\гаснет от короткого прикосновения к сенсору… и при удержании сенсора — плавно прибавляет\убавляет яркость !

    коль мы применяем контроллер для получения команд и симистр для управления нагрузкой то реализовав ШИМ на выходе контроллера и меняя скважность импульсов — можно легко добиться такого эффекта..
    конечно это только для лампочек накаливания, но думаю что такая возможность сделать «интим» свет Виктории бы понравилась :-)

  17. А как сохранить eeprom в формате .bin? Пользуюсь программатором usbasp и GUI к AVRDUDE, не нашел возможности сохранить в .bin ((

  18. Спаял.
    Вроде всё работает, график в программе получаю.
    Непонятно пару моментов.
    1. Светодиод вообще никогда не тухнет. Горит непрерывно, с самого включения, при приёме команды с пульта помыргивает, но потом снова горит. А тут писалось что глюк поборот.
    2. Понатыкал в программе частокол, весьма часто (если верить счётчику внизу, явно чаще 4 мс). Файл спокойно сохранился, программатором спокойно считался (все КС совпали) и в епром залился. А писалось, что программа не даст…
    3. Можно как-то узнать, совпала ли команда, без поключения нагрузки? Светодиод горит всегда. При передаче команды, после заливки епрома, не шелохнётся.
    4. Непонятно зачем нужен джамп 1, если вторым всё делается?.. Вообще тема си… джампа 1 не раскрыта.

    1. Со светодиодом понятно… К ноге я его к той подключил, к 12-й, но подключил как на схеме — катодом к МК — а не как подразумевалось в третьей комбинации на плате — анодом.
      dcoder, можешь сделать для меня инверсию в коде для светодиода?
      И исправил бы статью. Косяк то сильный.

      1. Короче, 3 дня секаса.
        Выяснил:
        а) Светодиод на схеме и плате включён вообще не так.
        б) джампики на схеме и плате перепутаны.
        в) девайс полный ППЦ.

        Добился таки получения сигнала с пульта: http://s019.radikal.ru/i644/1206/70/56de0592f734.gif
        Расставил точки: http://s017.radikal.ru/i427/1206/56/60d0cd25cd54.gif
        Загрузил бин. И нифига. Пульт не узнаёт.
        Пробовал несколько кнопок, ставить точки часто и редко, в бубен бить — пофиг. Лампа не горит, светодиод не дёргается.

        Накидал тестовую прошивку — дёргать лапкой с задержкой — силовая часть работает. Лампочку включает.

        Так что с распознаванием пультов у софтины полная Ж…

  19. Здравствуйте. Разбирал исходник на ассемблере и не нашел в нем обьявления массива _Data_array. Подскажите, пожалуйста, где он. Заранее спасибо.

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

Ваш e-mail не будет опубликован.

Перед отправкой формы:
Human test by Not Captcha