Tsop датчик ардуино

RoboCraft

В данной статье хочу рассказать о том, как не вникая в дебри протоколов различных пультов ДУ мы сможем без проблем подружить их с нашей ардуино нажатием одной кнопки.

Не посчитайте, что я с пренебрежением отношусь к протоколам. Дело в том, что ДУ много, протоколов то же, скетч и желание чтобы все работало — одно. Поэтому применим принцип универсальности =)

Требование к пультам и датчикам все же есть. Они должны работать на одной частоте. В нашем случае — 36 кГц (наиболее распространенный). Разновидностей TSOP312** несколько, по маркировке — 2 последние цифры. Я другие не пробовал, но есть надежда, что скетч справится с разными, т.к. принцип работы не завязан на частоту сигнала.

Использовать будем датчик TSOP31236 (аналог TSOP1736). Подключить его можно по данной схеме:

К сути скетча… Принцип его работы заключается в записи интервалов времени как сигнала HIGH так и LOW полученных датчика, который в свою очередь принял ИК сигнал от ДУ. Последовательность этих сигналов конфигурируем в массив, который мы потом сравниваем с опорным массивом. Опорный массив — это массив, записанный с используемого ДУ. Это нужно для того, чтобы избавиться от привязкам протоколу, а также позволит не учитывать частоту работы датчика (только в теории — у меня других датчиков и ДУ нет). При сравнении этих массивов находим отличия, и в зависимости от места и количества этих отличий будет формировать индивидуальный код команды ДУ.

Чтобы не приходилось при каждом включении ардуино заново дружить ее с ДУ при записаи опорного массива он автоматом попадет в EEPROM. При включении Ардуино он читается из EEPROM.

Наконец сам код =):

Соберем просейшую схему, где к 10 пину подключена кнопка, 3-я нога датчика -> 9-й пин, 2-> Vcc, 1-> Gnd через резистор 100 Ом. Повесить конденсаторы рекомендуется, но если нет — не криминал. Кнопка нам понадобится для того, чтобы подружить ДУ с ардуиной, а именно записать опорный массив.

Запускаем скетч, нажимаем кнопку или подаем (1) на 10 pin, нажимаем на ДУ какую-нибудь кнопку, возвращаем (0) на 10 pin. Все, опорный массив задан. Теперь при нажатии любой кнопки на ДУ получаем индивидуальный ее код. При нажатии кнопки, которой задали массив получим код 0.

Внимание. В выложенном коде закомментирован вывод массивов. Это строки 108 — 118.

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

Еще надо отметить пару особенностей. Некоторые ДУ при нажатии одной кнопки выдают разные коды. У меня есть пару пультов от ТВ и один от кондиционера. На одном ДУ от ТВ все кнопки не меняют своего кода. На другом — два кода на кнопке, они чередуются. Пульт от кондиционера может выдавать по 5 разных кодов на кнопке. Т.е. кнопка увеличивает вращения дуйки с каждым нажатием, и следовательно выдает новый код, в зависимости от желаемой скорости.

Также некоторые ДУ при удержании кнопки повторно отправляют команду, некоторые отправляют команду повтора. Т.е. ты нажал на кнопку, сначала идет команда кнопки, потом команда повтора одинаковая для всех. Это необходимо учесть при написании программ.

Решил в академических целях написать библиотеку под это все. Называться будет IR

Источник

IR транскодер на Arduino

В случае если захват выдаёт сообщение “IR code too long. Edit IRremoteInt.h and increase RAWLEN” библиотеку придётся немного исправить — увеличив размер буфера для команд. Для пульта которым планируется управлять достаточно знать 32 битный код команды, стоит обратить внимание что на некоторых пультах код зажатой клавиши отличается от той же кнопки в режиме нажал и отпустил. Такие кнопки потребуют двух значений. Сводим полученные коды в удобную для вас таблицу. В ту же таблицу сохраняем коды для пульта донора в сыром виде.
Подключаем к Arduino инфракрасный светодиод и пишем простейшую программу которая получает инфракрасный сигнал с заданным кодом и отправляет другой код через светодиод. Резистор на 82 выбран из соображений того что валялось под рукой. Для встраиваемого устройства его можно смело увеличивать до 200 Ом а если передатчик должен быть дальнобойным то придётся дополнить его нехитрым транзисторным каскадом, иначе тока от Arduino обязательно не хватит.

При наличии кодов команд от обеих пультов код транскодера приобретает следующий вид

Запускаем скетч, заливаем в Arduino. Как ни странно после запуска одна команда проходит, после чего все последующие устройством игнорируются. Чтобы не связываться с отладкой добавляем в цикл мигалку на 13 пине и видим что после первой попытки отправить команду плата зависает. Что же, значит не всё так гладко в одновременном использовании передачи и приёма ИК сигнала в одном проекте. Немного покопавшись в используемых таймерах выясняется что так как и отправка и приём использует общий таймер то после начала отправки код должен подождать пока отправка не закончится. Можно эмпирически добавить задержку в пол секунды (delay(500) )и всё будет работать, но зная что сырые данные у нас представляют собой отсчёты времени в миллисекундах то можно просто добавить функцию отправки с задержкой. В модуле Irsend есть даже подходящая функция custom_delay_usec, которой я изначально воспользовался неправильно, забыв домножить величину задержки на множитель USECPERTICK из библиотеки (50 мс).

Такой код отлично работает, в switch теперь достаточно вписать нужное число case для кнопок и всё будет работать. Но не тут то было. Коды rawData записываются в виде массива int а у нас платформа на микроконтроллере. Память для переменных будет съедена уже пятью командами длиной по 100 элементов. А ведь на пультах бывает и по 25 кнопок.
Проблемы нет если не пользоваться сырым представлением данных, для этого в библиотеке есть возможность слать команды известными протоколами, например для пультов совместимых с Sony это sendSony. В библиотеке уже реализованы пульты известных производителей, но с ходу разобраться с моим пультом у меня не получилось. Поэтому переходим к более примитивным способам экономии памяти которые помогут тем у кого пульты совсем уж нестандартные.
Первое что приходит в голову это задавать rawData не в виде int, а перейти на байт. Все значения в этом массиве это результат чтения ИК сигнала таймером с периодом 50 миллисекунд, а так как эти данные кратны 50, то разделив их на 50 мы ничего не потеряем. Верхний предел будет ограничен значением 50*255=12750, а это 12 секунд, чего будет достаточно даже для декодирования неспешной азбуки Морзе — если такая необходимость возникнет.
В библиотеку был добавлен метод принимающий на вход байты, что сократило потребления памяти вдвое

Только вот памяти под переменные у Arduino всего два килобайта а это максимом 40 команд по 50 байтов. Нам необходимо больше памяти. И эту память мы извлечём из сегмента команд. Достаточно зарезервировать один массив достаточного размера и набивать его перед отправкой чередой присваиваний. Итого из кодового сегмента на одну команду будет тратиться около 100 байт, но ведь и места для кода у нас не меньше десяти килобайт. Так что на средний пульт со ста кнопками нам уже хватит.
Дабы не набивать руками присваивания в библиотеку был добавлен пример IRrecvDumpRawByte который выводит сырые данные не только в форме байтов но и в виде блока присваиваний










Под катом находятся фотографии интеграции Arduino Nano внутрь этого DVD рекордера, Arduino Mini конечно занимает ощутимо меньше места, но под рукой была только Nano. Питание я взял с панели управления. Сигнал со встроенного приёмника был подключен к Arduino а параллельно ему был напаян ещё один ИК приёмник, расположенный с противоположной стороны от первого. Тем же навесным монтажом на него был напаян ИК светодиод. В принципе этого повторения можно было бы избежать — но сигнал с ИК приёмника инвертирован — поэтому напрямую завести ТТЛ сигнал на устройство не получится — а городить инвертор на логике или транзисторе я уже не стал.

Несмотря на то, что в моём случае сырые данные отлично работали, эксперименты с остальным домашним оборудованием показали что далеко не все захваченные сигналы корректно работали при попытке управления конкретным устройством. Команда включения кондиционера так и не заработала, хотя если он был уже включён смена режимов работала корректно. Колонка от LG тоже отказалась воспринимать сырые команды, но отлично реагировала на отправку кодов через sendSamsung. При этом пять собранных по знакомых телевизора отлично реагировали на сырые данные. Вариант с разной частотой сигнала я опробовал — это никак не помогло. Возможно проблема лежит в частоте дискретизации сигнала в 50 мс. Судя по работоспособности команд формата Samsung на технике LG, протокол стоит формализовать в виде отдельного модуль по аналогии с ir_LG.cpp ir_JVC.cpp ir_Dish.cpp, подобрав для конкретного устройства заголовок и параметры кодирования нулей и единиц. Наверное разбор написания такого протокола послужит неплохой темой для статьи.

Ну и в дополнение, вторая большая ИК библиотека для Arduino это IRLib. Она обладает схожим функционалом, в ней есть даже готовый модуль для разбора ИК протоколов для десктопа. Был проведён быстрый сравнительный тест чтения сырых данных который не выявил разницы в отсчётах по сравнению с IRemote. Из плюсов, в IRLib уже есть пример определения на какой частоте работает ИК передатчик. Пример Samsung36 фактически реализует разбор протокола по данным из сети интернет. Кроме того, документация отлично расписывает подключение ИК приёмников с каскадированием и много чего ещё. Хотя на мой взгляд, IRemote гораздо проще в понимании и использовании.

Источник

Универсальный пульт на Arduino

Есть много статей в интернете о том, как сделать свой пульт к телевизору на Arduino, но мне понадобился универсальный пульт для управления телевизором и медиа-плеером. Главное преимущество моего универсального пульта в том, что кнопки в приложении для андроид телефона двух-целевые, а впрочем, смотрите на видео.

Пульт очень удобен в том, что на экране практически одни и те же кнопки используются для управления телевизором и плеером. Одно отличие в том, что кнопка «AV» в режиме управления телевизором меняется на кнопку «» (stop) при переходе в режим управления плеером. На картинках показано два режима, слева режим управления телевизором, справа — режим управления плеером.

Ну а сейчас я расскажу немного о создании такого пульта. Для устройства использовал пульт от телевизора ERGO и пульт от медиаплеера DUNE HD TV101W.

Для получения данных от пультов я использовал инфракрасный датчик TSOP1138 (аналог TSOP4838) на рабочей частоте 38 кГц и подключил его к плате Arduino по схеме:

Для начала нам потребуется прочитать коды кнопок пультов. Я воспользовался библиотекой IRremote и тестовым скетчем IRrecvDump.

Этот скетч на потребуется для определения кодировки передачи данных и считывания кода кнопок пультов.

В скетче в строке int RECV_PIN = 11; указываем наш пин под номером 4

После заливки скетча открываем «монитор порта» и, нажимая на кнопки пульта, смотрим на полученные данные.

На картинке пример сканирования кнопки включения от пульта телевизора и пульта плеера. Теперь формируем таблицу для кодов кнопок.

У меня получилось как на фото выше. Под надписью TV коды кнопок пульта от телевизора; под надписью Player — коды от пульта медиаплеера.

Теперь отключаем наш приемник инфракрасных сигналов от платы Arduino и подключаем к ней Bluetooth модуль HC-05 и инфракрасный светодиод по схеме на фото.

После этого переходим непосредственно к скетчу.

В скетче вам потребуется отредактировать коды кнопок, а именно в строках:

Значение 807F08F7 поменять на:

Где 12345678 — это код вашей кнопки.

После редактирования скетча по ваши коды кнопок заливаем скетч в плату Arduino и переходим к установке приложения на телефон.

Включаем блютуз в телефоне, ищем наше устройство, создаем пару, потом запускаем приложение Pult на телефоне.

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

После этого жмем на этот значок. У нас должно появится окно со списком всех доступных bluetooth устройств, где мы выбираем наше устройство для подключения.

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

Для перехода в режим управления нам потребуется нажать кнопку с надписью «Player». Как я говорил раньше, у нас кнопка с надписью «AV» поменяется на кнопку ««:

Для отключения от нашего устройства просто зажмите кнопку «Power» на несколько секунд.

Ну и несколько фотографий моего готового устройства.

Получилось, вроде, неплохо. Жду комментарии к статье.

Источник

Adblock
detector