Необъяснимое рядом - протоколы ИК-пультов.

Все прочитали, вроде даже поняли, взяли паяльник - а нифига не получается? Скорее сюда! Поможем. Чем можем...
Ответить
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 39
Зарегистрирован: Чт июл 05, 2012 22:39:11
Откуда: Санкт-Петербург

Сообщение Petr57 »

Доброго времени суток, уважаемые Коты! Много читал этот сайт, и в какой-то момент захотелось самому написать. Что-то среднее между проблемой и историей.

Увлекаюсь микроконтроллерами, и вдруг захотелось научиться принимать осмысленную информацию с ик-пульта. Гугление... остановился на протоколе NEC. Купил пульт к нему http://orbis-shop.ru/goods/RM-887 (к сожалению потерял сайт, на котором был паспорт с указанием протокола), ТСОПик, всё собрал и.. ничего не работает) Перепробовал многие программы и с радиокота:
http://radiokot.ru/articles/14/
и с других сайтов:
http://chipenable.ru/index.php/how-conn ... nalov.html
и ещё некоторые. Сначала пинал ТСОПик, мол его 0 и 1 ATMEGA16 воспринимает как 1, но, попробовав через МК подавать инвертированный сигнал с ТСОПика на светодиод, получил мигающий светодиод при нажатой кнопке пульта. В общем, всё как надо, вот только сигнал не декодируется. С прерываниями, к сожалению, я ещё не научился нормально работать, поэтому очень уж хочется надеяться, что чужие программы корректны.

Итак, кульминация. А какой вообще сигнал приходит с пульта? Осцилографа у меня нету, достать у знакомых или использовать звуковуху компа не вариант. Выкрутился так: МК слушает ТСОПик (естественно инвертированно), как только приходит сигнал, начинает через каждые 100мкс записывать значение пина в массив. Когда память кончится :lol: (расчитано, чтобы поместился пакет NEC), начинает выводить значения массива, но увеличив интервал в 10000 раз. А тут уже секундомер, руки и хорошая реакция, после чего листочек и ручка. Точность полученного результата я оценил бы в +-50мкс (сюда даже укладывается разброс при работе с секундомером).
И, ОМГ, это совсем не NEC... Полученную "осцилограмму" привожу ниже в файле.
Кроме того, удивительно, что после первой часть пакета, состоящей из 12 "еденичек" (в файле только это часть), следует затишье (лог 0) на 28мс, после чего продолжение пакета ещё на 13 "еденичек". И на сигнал повтора (зажатой кнопки) это не похоже...
Может кто-нибудь знает, что это за протокол? :roll:
Я смотрел разные протоколы, но ни на один не похоже. Тут, например: http://led-displays.ru/ir/nec_protocol.html
Но вот не придёшь же в магазин со словами "я снял осциллограмму с пульта, и она не идентична описанной в документации, верните мои деньги", да и где гарантия что с другими пультами такого не будет... Подскажите, может я где-то ошибся, раз получил такие странные результаты?
Вложения
осциллограмма.JPG
(228.07 КБ) 518 скачиваний
Реклама
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вт июл 10, 2012 12:19:14
Откуда: Москва

Сообщение YurBoc »

Доброго времени суток, Petr57.
Когда я решал подобную задачу, про протоколы читал здесь - http://www.vidon.ru/old/ir-remote/teory.htm
Как вы измеряете промежутки времени на микроконтроллере? Если не таймером-счётчиком, а циклом или функцией sleep, то это могло быть источником существенных погрешностей. Попробуйте таким же способом померить сигнал известной частоты.
А вообще, если есть возможность подключить микроконтроллер к компьютеру по USART, то можно сохранить сигнал в немного другом виде.

Через каждые 100мкс можно увеличивать на единицу переменную "длительность" (а не записывать значение пина в массив). Как только значение пина изменилось, сбрасываем переменную "длительность" и снова считаем. Таким образом, получаем массив из длительностей нулей и единиц. Единица после очень долгого нуля - это старт. Наоборот - окончание посылки. После окончания посылки сбрасываем данные в USART.

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

Кстати, а почему осциллограф из звуковой карты не подходит? После демодуляции на ТСОПике сигнал должен быть вполне пригодным для звуковой карты, разве нет?
Контактная информация:
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 39
Зарегистрирован: Чт июл 05, 2012 22:39:11
Откуда: Санкт-Петербург

Сообщение Petr57 »

YurBoc, спасибо за ответ!
Наибольшей проблемой являлась боязнь неизведанного. Да, я пользовался функцией delay_ms() - это было наилучшее из того, что я мог сделать на тот момент. :roll: Но несколько суток курения мануалов научили использовать таймеры и прерывания.

Итого - стартовый импульс 2.4мс, а дальше всегда идёт пачка из 12 импульсов длинами 640мкс или 1.28мс. Приняв короткий импульс за лог 0, а длинный за лог 1 составляется 12-разрядное число. И, О ЧУДО! Все кнопки декодируются однозначно.

Основной минус - при зажатой кнопке пульт ретранслирует её код сначала (то есть отправляет пачку импульсов как будто кнопку только что нажали) через каждые 28мс, что на самом деле слишком быстро (хочешь набрать "2" на устройстве, а набирается "222"). :?

И осцилограф из аудиокарты получился, просто все предыдущие попытки ни к чему осмысленному не приводили.
ВОТ! В этой ветке описывается как раз этот пульт, что и побудило меня его купить
http://radiokot.ru/forum/viewtopic.php? ... %D0%B0+NEC
Ну NEC же! А вот и нифига( В общем, ладно, общаться с пультом мы научились и ладушки. :)) Вот, кстати, функция(драйвером не назову) позволяющая декодировать сигнал с пульта. Если кто-то наткнётся на этот пульт RM-887, думаю пригодится.
Вложения
PDU.c
(1.57 КБ) 405 скачиваний
Buttons.h
(643 байт) 349 скачиваний
PDU.h
(445 байт) 195 скачиваний
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вт июл 10, 2012 12:19:14
Откуда: Москва

Сообщение YurBoc »

Petr57 писал(а):Основной минус - при зажатой кнопке пульт ретранслирует её код сначала (то есть отправляет пачку импульсов как будто кнопку только что нажали) через каждые 28мс, что на самом деле слишком быстро (хочешь набрать "2" на устройстве, а набирается "222").
Ну если этот вопрос ещё актуален, могу предложить решение.
При считывании кода кнопки её значение используется не сразу, а сохраняется в переменную.
Эта переменная анализируется по таймеру с частотой, с которой кнопка должна повторяться при длительном удержании.
При отсутствии сигнала с пульта переменную обнуляем и таймер опроса выключаем.
При нажатии кнопки таймер этот снова включаем. Таким образом, будем ловить и одиночные нажатия, и длительные.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Сообщение Goodefine »

Petr57 писал(а): Ну NEC же! А вот и нифига...
А чип какой в пульте стоит?
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 39
Зарегистрирован: Чт июл 05, 2012 22:39:11
Откуда: Санкт-Петербург

Сообщение Petr57 »

Goodefine писал(а): А чип какой в пульте стоит?
Пульт не разбирал, на гарантии всё таки)) Как то не подумал, что там и другие микросхемы могут быть.. ну, очевидно, так оно и есть.
YurBoc писал(а): Ну если этот вопрос ещё актуален, могу предложить решение.
При считывании кода кнопки её значение используется не сразу, а сохраняется в переменную.
Эта переменная анализируется по таймеру с частотой, с которой кнопка должна повторяться при длительном удержании.
При отсутствии сигнала с пульта переменную обнуляем и таймер опроса выключаем.
При нажатии кнопки таймер этот снова включаем. Таким образом, будем ловить и одиночные нажатия, и длительные.
Интересное решение, буду втыкать :) Вообще в идеале система должна работать так, что при зажатой кнопке сначала сразу идёт одно срабатывание, потом пауза примерно 500мс, после чего происходят срабатывания с куда меньшим периодом. Как то так клавиатура работает :) Остался один 16-битный таймер...

*спустя три часа*
YurBoc, спасибо за идею! Сделал, всё работает чётко как нужно, счётчика 16-битного таймера в самый раз хватило для всех интервалов!
Реклама
Ответить

Вернуться в «Практика»