Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР 124, АПРЕЛЬ 2009 г.

Инфракрасная лень. Управлять с пульта можно не только телевизором

Евгений «Vshmuk» Бейсембаев (diver@edu.ioffe.ru)




Устав вставать с дивана, чтобы в очередной раз выключить свет в комнате, я задумался, как можно облегчить себе жизнь. Взгляд упал на инфракрасный пульт управления от старого телевизора. «Почему бы не поуправлять светом с его помощью?» - подумал я. И взялся за реализацию идеи.

Конечно, в продаже есть нормальные, «цивильные» системы дистанционного управления светом в комнатах. Обычно они идут в комплекте, – как части разрекламированного «умного дома». Но мы же хакеры? Поэтому будем делать умный дом своими руками, что в разы дешевле и интереснее.

Пульт

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

Начнем с пульта. Любой ПДУ для нас, как электронщиков, имеет две характеристики. Это частота модуляции, так называемая несущая, и метод кодирования сигнала.
С частотой все просто – это то, насколько быстро «моргает» излучатель. Как правило, попадаются частоты 36 кГц, 38 кГц и 40 кГц. А вот с методами модуляции придется повозиться, так как каждый производитель использует свой протокол. Не факт, что метод кодирования, использовавшийся на моем пульте, подойдет к твоему. Лично я тыкал в кнопки и смотрел сигнал с приемника на осциллографе. У тебя осцильника может и не быть, но информация в интернете по протоколам разных производителей ищется очень легко. В любом случае – подробнее по ним читай далее, в отдельной главе.

 

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

Контроллер

Схему я делал на оказавшемся под рукой Atmel AT91SAM7X128. Это очень крутой МК архитектуры ARM7. Главный его плюс – не нужен программатор: контроллер замечательно шьется через встроенный USB-порт. А вообще, «Атмелы» всегда славились продвинутой периферией в своих контроллерах. Поэтому советую приобрести хотя бы один, поверь, для него найдется применение в любой задаче. Конкретно в нашем случае, такая примитивная функция, как расшифровка сигнала с пульта и воспроизведение некоторых действий, могла бы решиться намного более простым 8-битным контроллером, а использование AT91SAM7X - пушка в вопросе обстреливания воробьев. Но за дешевизной мы не гонимся, а гонимся за удобством программирования, наглядностью и переносимостью на другие проекты.

Итак, контроллер в нашей задаче должен иметь, как минимум:

  • Один логический вход, куда мы будем подключать ИК-сенсор;
  • Один логический выход, где будет висеть реле для включения света в комнате. Если хочешь сделать контроллер «умнее», то на досуге приделай к нему ЖК-дисплей с выводимой информацией (для управления ему понадобится еще около 8-ми логических выводов);
  • Из периферии - один таймер для замера задержек.

Датчик

Также понадобится ИК-датчик на нужную тебе несущую частоту. Добывается он в магазинах электроники, барахолках или в старых телевизорах/видиках. Скорее всего, называться он будет Vishay TSOP18XX (на XX кГц). Питается от 5 или 3,3 В, внутри имеет все необходимые фильтры и усилители, а на выход отдает уже нормальный логический сигнал, который можно без посредников заводить на логическую ножку микросхемы.

Датчик выбирай совместимым по несущей частоте с твоим ПДУ. Настроенный на другую частоту тоже будет работать, но только если светить в него в упор. У моего Sony RM-836 несущая равна 36 кГц, соответственно, и сенсор я купил TSOP1836, – он наиболее часто используемый.

Реле

Наша задача - рулить довольно мощной и питающейся от большого напряжения нагрузкой (освещением в комнате, например). Естественно, слабый и работающий от 3,3 В микроконтроллер не сможет зажечь лампочку, да и 220 вольтам в нашей схеме пока что взяться неоткуда. Для решения таких задач и были придуманы реле (от relay – «эстафета»). Эти приборы могут малыми силами замыкать и размыкать схему, по которой течет большой ток. Классический вариант - электромагнитное реле (с магнитом внутри, коммутирующим нашу цепь притягиванием к себе так называемого якоря).

Вообще, термином «реле» можно с натяжкой обозвать любой выключатель, даже тот, что висит на стенке, приводится в действие рукой и включает освещение.
У электромагнитных реле есть недостаток. Из-за наличия движущихся частей и электромагнита сами релюшки будут требовать немаленькое напряжение и потреблять нехилый ток, который микросхема выдать не в силах. Делать всякие мегаусиления не будем, а воспользуемся так называемыми твердотельными реле. Они требуют на вход TTL (3,3-5 В) логику и могут коммутировать переменные токи до нескольких ампер. Внешне они могут выглядеть как обыкновенные MOSFET-транзисторы с местом для прикручивания радиатора, а внутри являются тиристорами в паре.

В нашей лаборатории уже есть реле, сделанные из тиристоров 25TTS фирмы Vishay (http://www.vishay.com/docs/94384/94384.pdf). Ты тоже можешь подобрать себе подобное в магазинах/на барахолках, только следи за максимальным пропускаемым током (Мощность лампочки=Ток*Напряжение, не забыл?), а также – возможностью работать с переменным напряжением и минимальным током на затвор. Полагаю, придется привесить на вход реле еще один транзистор, но это не больно :).

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

Протоколы

Если частоты модуляции в ИК-пультах хоть как-то стандартизированы, то с протоколами что-то не сложилось. Любая компания-производитель выдумывает свои собственные.

«Низкоуровневых» протоколов распространено два. Это RC5 (так называемый манчестерский код), использующийся Philips, и Sony, изобретенный фирмой Sony.
Протокол Манчестера часто используется в линиях передачи данных, когда увеличение заряда или «яркости» линии чревато «ослеплением» сенсора (подробнее – смотри врезку). Вкратце, единица представляется переходом из 1 в 0, а ноль - из 0 в 1.

Протокол Sony, в отличие от RC5, не кодирует данные переходами из состояния в состояние, а использует для этого их длительности (!). Например, сначала идет одиночный импульс «1», а потом, в зависимости от передаваемого, одиночная или двойная пауза (вообще, что считать паузой, а что импульсом - вопрос спорный, транзистор внутри сенсора все равно все инвертирует). Скажем, единица будет выглядеть как «1-0-0», а ноль - как «1-0».

С «высокоуровневыми» протоколами – в разы сложнее. Поверх низкоуровневых модуляций уже передаются те самые данные, которые и отличают одну нажатую кнопку от другой. Здесь советовать что-либо сложно, количество стартовых/стоповых бит, LSB/MSB очередности и разделение команды-данные всегда будет свои. Тычь осциллографом в сенсор, изучай передаваемые данные, ну и про Google тоже забывать не стоит. Полагаю, протоколы для большинства пультов уже расшифрованы и лежат в открытом доступе.

Будешь читать алгоритм - не путай низкоуровневые нули и единицы (свечение pulse и space) с логическими, получаемыми после расшифровки.

Алгоритм

У меня оказался пульт от телевизора Sony ХХХ, поэтому прошивку для контроллера я писал, исходя из местного протокола. За «единичный интервал» берем 0,6 мс, тогда стартовый ноль - это 4 интервала, единица занимает 1+2 интервала, а ноль - 1+1.Последовательность действий в моем случае примерно такова:

  • Ставим прерывание на срабатывание в 0 (когда данные не передаются, транзистор в датчике закрыт, на ножке единица).
  • Оказавшись внутри прерывания, сбрасываем и запускаем таймер.
  • Ставим прерывание на 1. Стартовый ноль должен быть длиной 2.4 мс.
  • Внутри прерывания замеряем, сколько натикал таймер:
  • Если натикало около 2.4 мс, то мы поймали полезные данные;
  • Если нет, то поймали что-то не то.
  • [Метка!] В любом случае, ставим прерывание снова на 0, да к тому же сбрасываем счетчик (если продолжаем принимать пакет).
  • Сработать оно должно примерно через 0.6 мс. Если прерывание настало через другой промежуток времени, то сбрасываем состояние. А если через 0.6, – то мы поймали одиночную единицу. Следующая последовательность наконец-то сообщит нам, что имел в виду пульт. Сбрасываем счетчик и ставим прерывание на 1.
  • В нем смотрим, через какой промежуток времени мы тут оказались. Если через 1.2 мс, то к нам приехала единица, а если через 0.6 - то нолик. Запихиваем его в «командный» байт ногами вперед (LSB) и идем циклом в метку [Метка!].
  • Как приняли 7 командных бит, принимаем 5 адресных.
  • По протоколу через 40 мкс пульт повторяет последовательность, поэтому если хочешь дополнительной надежности - приступай к действию только после второй повторенной команды.
  • Ну, а если все биты совпали с тем, что мы ожидаем, то производим действие (например, пищим лампочкой).

Как-то так. Страшно, но в готовом коде букв будет в разы меньше.

Сборка и испытание

У меня уже была отладочная плата на контроллере ARM7. Вся периферия – отключена, к одному цифровому входу была привешена OUT-ножка датчика, а к выходу я временно привесил динамик-пищалку, чтобы не играться с высоким напряжением раньше времени. Datasheet порекомендовал мне привесить конденсатор 4.7 мкФ между питанием и землей датчика, ну а я был как бы не против.

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

Аплодисменты!

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

Да, минусы в моем проекте тоже есть.Во-первых, устройство не умеет снаружи конфигурироваться через USB или UART. Захочешь поменять кнопку, на которую будет реагировать контроллер, - перекомпилируй и перепрошивай все по новой. Сам контроллер тоже слишком крут для таких задач. Я его выбрал за универсальность, но в готовом «серийном» устройстве, висящем в шкафу на стенке, понятно, придется использовать что-нибудь подешевле.

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

Реле и драйверы

Несмотря на плюсы твердотельных реле, минусов у них тоже более чем достаточно.Во-первых, ток управления в большинстве случаев требуется такой, какой ножка микроконтроллера выдать не в состоянии - просто сгорит. Во-вторых, многим релюшкам требуется 5В на включение, тогда как МК твой выдает только 3,3 В (по спецификации CMOS). В общем, я тебе категорически не рекомендую подключать релюшку напрямую к контроллеру, даже если тока с напряжением достаточно. Правильнее и дешевле - включать его через полевой транзистор! Для наших задач подойдет любой, например, IRML2803 фирмы International Rectifier.

Теперь о том, как выбрать реле. Первая попавшаяся релюшка KSD210AC8 фирмы Cosmo Electronics уже подходит нам (http://cosmo-ic.com/object/products/KSD210AC8.pdf). Управляется, минимум, 4 вольтами, поэтому надо добыть 5 или 12 вольт, но на плате они всяко есть.То, что управляет чем-то мощным (у нас это – реле), по терминологии зовется драйвером. В данном случае драйвер - просто полевой транзистор.

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

Протоколы Манчестер и EFM

Допустим, тебе надо по очень длинной линии с кучей помех (неважно, оптическая она или просто медный провод) передать кучку единиц. Стартовые и стоповые биты не спасут от обилия сигналов с «высоким уровнем», и датчик/триггер на том конце линии просто перестает адекватно воспринимать данные. Поэтому для сред с высоким уровнем помех используются так называемые self-clocking модуляции.

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

Что-то подобное используется и в кодировании данных на CD-ROM, где 8 бит каждого байта по таблице переводятся в избыточные 14 с тем принципом, что любые две единицы разделяются, минимум, двумя и, максимум, десятью нулями. Вместе с дополнительными тремя битами, склеивающими байты, мы получаем равномерно «серую» поверхность диска, поэтому сенсор всегда явно различает темные (темнее серого) и светлые (светлее серого) участки.

Википедия предлагает небольшие обзорные статьи по теме:

Внутренности сенсора

Инфракрасный датчик - довольно сложное устройство. Для начала, в нем есть фотодиод, реагирующий на ИК-часть спектра. Напрямую аналоговый сигнал с фотодиода на контроллер посылать не имеет смысла - он просто все свободное время будет оцифровывать картинку и пытаться извлечь из нее данные. Поэтому в датчик уже включены фильтры и демодулятор, дергающий в итоге за базу транзистора. Как только поймается единица, транзистор откроется, и вывод OUT закоротится с землей GND - тогда контроллер видит переход состояний и запускает прерывание.

Аппаратные прерывания

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

Содержание
загрузка...
Журнал Хакер #151Журнал Хакер #150Журнал Хакер #149Журнал Хакер #148Журнал Хакер #147Журнал Хакер #146Журнал Хакер #145Журнал Хакер #144Журнал Хакер #143Журнал Хакер #142Журнал Хакер #141Журнал Хакер #140Журнал Хакер #139Журнал Хакер #138Журнал Хакер #137Журнал Хакер #136Журнал Хакер #135Журнал Хакер #134Журнал Хакер #133Журнал Хакер #132Журнал Хакер #131Журнал Хакер #130Журнал Хакер #129Журнал Хакер #128Журнал Хакер #127Журнал Хакер #126Журнал Хакер #125Журнал Хакер #124Журнал Хакер #123Журнал Хакер #122Журнал Хакер #121Журнал Хакер #120Журнал Хакер #119Журнал Хакер #118Журнал Хакер #117Журнал Хакер #116Журнал Хакер #115Журнал Хакер #114Журнал Хакер #113Журнал Хакер #112Журнал Хакер #111Журнал Хакер #110Журнал Хакер #109Журнал Хакер #108Журнал Хакер #107Журнал Хакер #106Журнал Хакер #105Журнал Хакер #104Журнал Хакер #103Журнал Хакер #102Журнал Хакер #101Журнал Хакер #100Журнал Хакер #099Журнал Хакер #098Журнал Хакер #097Журнал Хакер #096Журнал Хакер #095Журнал Хакер #094Журнал Хакер #093Журнал Хакер #092Журнал Хакер #091Журнал Хакер #090Журнал Хакер #089Журнал Хакер #088Журнал Хакер #087Журнал Хакер #086Журнал Хакер #085Журнал Хакер #084Журнал Хакер #083Журнал Хакер #082Журнал Хакер #081Журнал Хакер #080Журнал Хакер #079Журнал Хакер #078Журнал Хакер #077Журнал Хакер #076Журнал Хакер #075Журнал Хакер #074Журнал Хакер #073Журнал Хакер #072Журнал Хакер #071Журнал Хакер #070Журнал Хакер #069Журнал Хакер #068Журнал Хакер #067Журнал Хакер #066Журнал Хакер #065Журнал Хакер #064Журнал Хакер #063Журнал Хакер #062Журнал Хакер #061Журнал Хакер #060Журнал Хакер #059Журнал Хакер #058Журнал Хакер #057Журнал Хакер #056Журнал Хакер #055Журнал Хакер #054Журнал Хакер #053Журнал Хакер #052Журнал Хакер #051Журнал Хакер #050Журнал Хакер #049Журнал Хакер #048Журнал Хакер #047Журнал Хакер #046Журнал Хакер #045Журнал Хакер #044Журнал Хакер #043Журнал Хакер #042Журнал Хакер #041Журнал Хакер #040Журнал Хакер #039Журнал Хакер #038Журнал Хакер #037Журнал Хакер #036Журнал Хакер #035Журнал Хакер #034Журнал Хакер #033Журнал Хакер #032Журнал Хакер #031Журнал Хакер #030Журнал Хакер #029Журнал Хакер #028Журнал Хакер #027Журнал Хакер #026Журнал Хакер #025Журнал Хакер #024Журнал Хакер #023Журнал Хакер #022Журнал Хакер #021Журнал Хакер #020Журнал Хакер #019Журнал Хакер #018Журнал Хакер #017Журнал Хакер #016Журнал Хакер #015Журнал Хакер #014Журнал Хакер #013Журнал Хакер #012Журнал Хакер #011Журнал Хакер #010Журнал Хакер #009Журнал Хакер #008Журнал Хакер #007Журнал Хакер #006Журнал Хакер #005Журнал Хакер #004Журнал Хакер #003Журнал Хакер #002Журнал Хакер #001