Распознавание ик команд с помощью на avr

Распознавание ИК команд с помощью UART на AVR

Введение

О распознавании команд с инфракрасного пульта написано много статей. В-основном, речь идёт о протоколе RC5 от пультов Philips [1]. Этот протокол не единственный и не самый распространённый. Хорошее описание других форматов на русском языке можно найти в документе [2].

Во всех найденных мною статьях распознавание производится чтением состояния датчика TSOP в строго определённые моменты времени ( в обработчике прерывания от таймера или в основном цикле программы ). Однако в моём последнем проекте мне нужно общаться с внешним устройством со строгими временными задержками, из-за чего приходится запрещать прерывания на периоды до 2мс. Этот факт делает невозможным опрос состояния датчика TSOP с требуемой точностью ( раз в 560мкс +-100мкс ).

Так родилась идея использовать UART как “хитрый” сдвиговый регистр. В полученной реализации при декодировании NEC-подобного протокола необходимо неспешно опрашивать состояние датчика лишь раз в 4мс, при этом сам микроконтроллер может находиться в idle mode или даже в power down mode!

Не вижу смысла повторять описание протоколов ИК пультов – они описаны достаточно хорошо в статье [2]. Обозначу лишь основные моменты:

ИК-посылка на примере протокола NEC состоит из Mark pulse(9мс), Space pulse(4.5мс) и последовательности импульсов данных.

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

Следует отметить, что на выходе датчика TSOP показанный сигнал будет инвертирован:

Для декодирования команды необходимо синхронизироваться с фронтом первого импульса данных, подождать его середины (280мкс), и продолжить опрос состояния датчика каждые 560мкс:

Моменты опроса датчика должны быть соблюдены достаточно точно (не более +-100мкс).

Если временнЫе промежутки соблюсти невозможно, то программное декодирование работать не будет. Нужно искать какое-то другое решение. Решением “в лоб” было бы использовать второй микроконтроллер, или специализированную микросхему-декодер.

Однако стоит вспомнить, что “на борту” у AVR есть масса устройств, которые можно попробовать применить не по назначению 🙂

UART протокол

UART использует простой последовательный протокол [3]:

При простое линия держится в стоянии “1”. Начало передачи определяется спадающим фронтом “стартового” бита (0). Далее следуют биты данных, далее – бит четности (может не использоваться ), далее – один или два стоповых бита (1) . То есть после передачи байта линия возвращается в состояние 1, и цикл передачи начинается снова. Длины всех битов одинаковы и равны 1/Baud rate.

Протокол UART не совместим с ИК протоколами.

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

О том, как именно работает приёмник UART , можно прочесть в даташите на AT90USB162[4].

После определения спадающего фронта приёмник делает паузу длинной ½ бита, после чего проверяет, что линия всё еще в “0” ( valid start bit detection).

После этого начинается цикл приёма битов данных, без всяких проверок, через промежутки, равные длине бита. Биты данных “заезжают” в сдвиговый регистр приёмника, а первый стоповый бит – в флаг FE в инвертированном виде.

Если описать весь этот процесс упрощенно, то в режиме 7N1 приемник ждёт спадающего фронта, после чего читает вход 8 раз через равные промежутки времени. Но именно так и работает программное декодирование ИК протокола, описанное выше!

Распознавание ИК команд с помощью UART

Давайте посмотрим что будет, если “скормить” сигнал с ИК приёмника в UART.

Мой пульт использует протокол с временнЫми промежутками как в протоколе NEC[2], хотя сам формат команды отличается.

Настроим UART в режим 7N1 ( 7 бит данных, без битов чётности, 1 стоповый бит). Baud rate установим в 1.000.000 / 560мкс = 1786 бод.

Импульс Mark длиной 9мс (“0” на выходе датчика TSOP ) будет принят приёмником как 0000000b с ошибочным стоповым битом:

После этого приёмник будет ждать следующего спадающего фронта (пропустит до конца Mark и весь Space ). С началом ИК посылки приёмник синхронизируется на середину бита (560мкс / 2 = 280 мкс ) и прочитает 7 бит данных + стоповый бит:

После приёма 7+1 бит, UART будет ждать следующего спадающего фронта, причём если последний бит был “0”, то линия должна сначала вернуться в “1”. В этот момент у нас происходит некий “пробел” в приёме, что делает невозможным точное декодирование ИК протоколов, в которых биты кодируются длиной импульсов. Но даже в этом случае уникальный пакет будет формировать уникальные данные в приёмнике UART. Поскольку задачей является не декодирование содержания команды, а распознавание посылки, такая ситуация нас полностью устраивает.

Реализация

Пример написан на Codevision AVR 2.05 для ATMega8A, кварцевый резонатор 8МГц.

Основной цикл программы опрашивает состояние UART каждые 4мс и записывает полученные данные в циклический буфер длиной 12 байт. Длина буфера выбирается исходя из длины ИК посылки.

У моего пульта посылка имеет длину 54мс. 54000 / 560 = 96 бит или 12 полных байт. Выбираем 11 байт и +1 для стартового нулевого (разбирать всю посылку не обязательно, но очень важно, чтобы посылка привела к зацикливанию буфера). Для пультов, у которых длина посылки отличается в зависимости от кнопки, алгоритм будет чуть сложнее ( здесь обсуждаться не будет).

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

Пример выводит на терминал( 9600N1 ) CRC32 полученной команды, байты команды и символьное представление посылки:

После получения кодов можно уменьшить ложные срабатывания, раскомментировав секцию:

(выше вставить заголовок кодов своего пульта)

Под “ложными срабатываниями” здесь подразумевается определение помех как команды с каким-то кодом, а не ложное срабатывание правильной кнопки.

Улучшения

1. Если использовать UART в режиме 9 бит данных, 1 паритет и 1 стоп, то период опроса можно ещё увеличить.

2. Приведённый алгоритм не проверяет время, прошедшее между приёмом байтов. Проверяя, можно уменьшить ложные срабатывания.

3. Во время ожидания команды микроконтроллер может находиться в idle mode и просыпаться по прерыванию от UART.

4. В Power down mode UART не работает. Но если соединить RX с INT0, то это даст возможность выводить микроконтроллер в нормальный режим для приёма команды.

Заключение

Алгоритм опробован в реальном устройстве и показал отличные результаты.

Читайте также:  Страница заблокирована по требованию Роскомнадзора или из-за нарушения правил хостинга!

Введение

Описание протокола Nec

Данные передаются младшим битом вперед. Каждый бит начинается с пачки импульсов несущей частоты. Длительность пачки равна 560 мкс. Путем изменением временного интервала между пачками импульсов осуществляется кодирование нулей и единиц. При передаче логической единицы интервал от начала текущей до начала следующей пачки импульсов составляет 2.25 мс, а при передаче логического нуля – 1.12 мс.

Стартовый импульс представляет собой пачку импульсов несущей частоты длительностью 9 мс. После подачи стартового импульса следует пауза в 4.5 мс.


Существует расширенная версия протокола Nec, в которой используется 16-ти разрядные адреса.

Алгоритм декодирования сигналов ПДУ

Файлы

Ссылки

Related items

Comments

мультиметр не покажет мгновенное значение напряжения, тут надо осциллографом только смотреть.

Мультиметр видит сигнал, если он присутствует около 0,5сек. А длительности команд пульста – несколько милисекунд! Конечно мультиметр не увидит!

попробовал повторить прибор, но не пошло.

вопрос: какие Fuse mega8535, т.к. программатор USBASP AVRDUDE из хекса брать не умеет.

Мне тут подсказали, что в схеме ошибка. Чтобы проект заработал, нужно подправить файл lcd_lib.h
Code:
//порт, к которому подключена шина данных
#define PORT_DATA PORTC
#define PIN_DATA PINC
#define DDRX_DATA DDRC

//порт, к которому подключены управляющие выводы
#define PORT_SIG PORTC
#define PIN_SIG PINC
#define DDRX_SIG DDRC

//управляющие выводы
#define RS 0
#define RW 1
#define EN 2

Микроконтроллер работает от внешнего кварца на 16 МГц. Нужно выставить фуз биты соответствующие этому режиму..

Схему я скоро поправлю.

Не пошёл у меня этот код. Принимает всегда разные значения. Не знаю, это только у меня так, или ещё кому повезло? Немного упростил код, засунув его полностью в обработчик прерывания таймера иь всё пошло как по маслу. Имена многих переменных и констант изменены и некоторые вообще удалены за ненадобностью. Вот код прерывания:

Code:
//прерывание по событию захват
interrupt [TIM1_CAPT] void Timer1Capt(void)
<
#asm(“cli”)
if (flag==1) <
interval = TCNT1;
>
else
<
interval=0;
TCNT1=0;
flag=1;
#asm(“sei”)
LED=OFF;
return;
>

switch (state) <
//ждем стартовый импульс
case WAIT:
TCNT1=0;
if (interval REPEAT_BIT_INT) <
data = 0;
countBit = 0;
countByte = 0;
buffer[NUM_REPEAT] = 0;
state = RECEIVE;
LED=ON;
>
else <
LED=ON;
buffer[NUM_REPEAT]++;
flag=0;
delay_ms(10);
LED=OFF;
>
>
interval=0;
break;

//прием посылки
case RECEIVE:
TCNT1=0;
if (interval LOW_BIT_INT) <
SetBit(data, countBit);
>
countBit++;
if (countBit == 8) <
buffer[countByte] = data;
countBit = 0;
data = 0;
countByte++;
if (countByte == (MAX_SIZE – 1)) <
flag=0;
state = WAIT;
LED=OFF;
break;
>
>
>
else
<
flag=0;
state=WAIT;
LED=OFF;
>
interval=0;
break;

В проекте для CodeVision ошибка. У меня руки не доходят исправить ее. Чтобы код заработал, нужно в файле timer.c кое чего подправить.
Code:
icr1 = icr2;
icr2 = ((unsigned int)ICR1H
чтобы было вот так
Code:
icr1 = icr2;
icr2 = ICR1L;
icr2 |= ((unsigned int)ICR1H
Попробуй, должно заработать.

PS. первый раз неправильно написал. не выспался.

Весь код не лезет в размер. Вот объявление переменных и констант.

Функция main выглядит так .
Code:
void main(void)
<
PORTA=0xFF;
DDRA=0x00;
PORTB=0xFF;
DDRB=0x00;

// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS – PORTA Bit 4
// RD – PORTA Bit 5
// EN – PORTA Bit 6
// D4 – PORTB Bit 4
// D5 – PORTB Bit 5
// D6 – PORTB Bit 6
// D7 – PORTB Bit 7
// Characters/line: 20
lcd_init(20);
lcd_puts(“READY”);

while (1)
<
// Place your code here
if ((flag==0)&&(state==WAIT))

Это функция вывода результата.
Code:
void ShowResult()
<
lcd_gotoxy(0,1);
sprintf(lcd_buffer,”%u %u %u %u n”,buffer[0],buffer[1],buffer[2],buffer[3]);
lcd_puts(lcd_buffer);
sprintf(lcd_buffer,”%u “,buffer[4]);
lcd_puts(lcd_buffer);
>

Вот и весь кодю 😉 Да, у меня атмега32, для других надо соответсвенно менять инициализацию оборудования в майн функции.

Всем доброго дня.Есть проблема.Вот тоже занимаюсь декодированием сигналов пульта,только протокол RC5.TSOP подключен так-же как в статье выше к выводу ICP микроконтролера.
Библиотека RC5 использована – kibermaster.net/priem-komand-s-pulta-distantsionnogo-upravleniya/.После инициализации таймера и разрешения прерываний включается захват, и микроконтроллер начинает обрабатывать данные, принятые с пульта. Если получен пакет данных, то активируется флаг rc5.dataOK, а принятая команда записывается с переменную структуры rc5.command.
Сам код который я юзаю являет собой вкл/отключение четырех каналов клавишами 1-4 пульта
Сам код здесь radiomanoff.at.ua/index/distancionnoe_upravlenie_na_atmega8_protokol_rc_5/0-27

Все бы хорошо,но вот если нажатую кнопку пульта “передержать” соответствующий канал включается/выкл ючается.А хотелось чтобы канал включился,и контролер ждал отпускания кнопки пульта,а уже потом обрабатывал следующее нажатие.
Пробовал вставлять
Code: .
_delay_ms(700); //задержка 700 мс
rc5.dataOK = 0; // сбрасываем флаг

while (rc5.dataOK) //ждем отпускания кнопки
<
_delay_ms(200); //задержка 70 мс
rc5.dataOK = 0; // сбрасываем флаг
кнопки
Как бы проверка отпускания кнопки.Тестирую на реальном “железе”не идет

Cпасибо за ответ,но Вы знаете у меня все получилось с циклом while,просто вставил задержку
Code: _delay_ms(200); //задержка 700 мс

rc5.dataOK = 0; // сбрасываем флаг

while (rc5.dataOK) //ждем отпускания кнопки
<
//_delay_ms(20); //задержка 70 мс
rc5.dataOK = 0; // сбрасываем флаг
_delay_ms(200);
>
Я так подумал : каналы у меня включает четко,никаких нареканий нет.Но если кнопку пульта держать постоянно состояние канала меняется вкл/выкл.Поэтом у я вогнал в цикл while проверку флага rc5.dataOK с постоянным его збросом rc5.dataOK = 0;- и таким образом жду окончания передачи с пульта.Ведь канал который мне нужен уже включен.На реальном железе получилось очень даже ничего,впринцип е то чего я и добивался.
Я понимаю что скорей всего это не есть правильно,ведь во время когда кнопка нажата ,другие действия с МК я производить несмогу.Но меня устраивает.
Почему пишу под этой статьей?Вы знаете что”прогуглив” сеть,только здесь TSOP подвешен на ногу ICP микроконтролера .Правда я использовал Atmega8 c заводскими фьюзами,но код с пультом RC5 работает, а это я думаю главное.
Вот небольшой “опус” по этому поводу,обработк а RC5& матричная клавиатураradiomanoff.at.ua/index/distancionnoe_upravlenie_na_atmega8_protokol_rc_5_matrichnaja_klaviatura/0-35.Может кому пригодится.

У вас недостаточно прав для комментирования.

Распознавание ик команд с помощью на avr

Осваиваем AVR микроконтроллеры – система команд

MOV Rd,Rs
Эта команда копирует содержимое регистра Rs в регистр Rd. Содержимое Rs не изменяется, предыдущее содержимое Rd теряется. Пример:Работает со всеми регистрами. Биты признаков не изменяет.

LDI Rd,K
Загружает в регистр Rd 8-ми разрядную константу. Работает со старшими регистрами (R16-R31). Пример:Биты признаков не изменяет. Если необходимо загрузить константу в младший регистр, то это делается двумя командами:

LD Rd,X
Загружает в регистр Rd байт из памяти данных, адрес ячейки памяти в регистровой паре X. Содержимое регистровой пары X не изменяется. Например:Биты признаков не изменяет.

LD Rd,X+
Аналогично предыдущей команде, но содержимое регистровой пары X после выполнения пересылки данных увеличивается на 1. Например:Биты признаков не изменяет.

LD Rd,-X
Аналогично предыдущей команде, но содержимое регистровой пары X перед выполнением пересылки данных уменьшается на 1. Например:Биты признаков не изменяет.

LD Rd,YLD Rd,Y+LD Rd,-YLD Rd,ZLD Rd,Z+LD Rd,-Z
Эти команды работают абсолютно идентично трем ранее описанным, за исключением того, что индексным регистром является не X, а Y и Z. Наличие трех пар регистров дает возможность эффективной работы с блоками памяти, например:В результате выполнения этого цикла 10 байт памяти, начиная с адреса 0x200 будут скопированы в область памяти с адресом 0x180

LDD Rd,Y+qLDD Rd,Z+q
Регистровые пары Y и Z, кроме вышеописанных методов обращения к памяти данных, имеют еще один. В этом случае в регистр Rd загружается байт из ячейки памяти, чей адрес вычисляется как содержимое регистровой пары плюс 6-ти разрядное смещение. Содержимое регистровой пары не изменяется! Например:Такой режим адресации невозможен для регистровой пары X. Значение смещения q – от 0 до 63.

Читайте также:  Автоматическое освещение atmega328 (pir)

Мы рассмотрели команды LD и LDD, которые обеспечивают пересылку данных из памяти данных в регистр общего назначения. Естественно, что для каждой команды LD и LDD имеется “обратная” ей команда – записи в память данных из регистра. Эти команды имеют мнемоники соотвественно ST и STD (store). Например:Думаю, что совершенно нет необходимости расписывать каждую из них в отдельности…

LDS Rd,ASTS A,Rs
Команда LDS загрузит в регистр Rd содержимое ячейки памяти данных с адресом A, где A – шестнадцатиразрядная константа. В этом случае нет необходимости предварительно загружать регистровую пару, но сама команда займет два слова программной памяти, а не одно, как предыдущие. Например:Парой для команды LDS является команда STS – записывающая содержимое регистра в память.

LPM
К командам пересылки данных надо отнести и очень специфичную команду LPM, которая пересылает в R0 байт памяти программ, на который указывает региcтровая пара Z. Напомню, что память программ и память данных между собой никак не пересекаются. Данная команда используется в основном для чтения таблиц констант, располагаемых в памяти программ. Например:Содержимое регистровой пары Z не изменяется, биты признаков – тоже. Вообще, ни одна команда пересылки данных не изменяет признаков.Важно! Поскольку для команды LPM адресация побайтная, а память программ адресуется словами (слово = 2 байта), то необходимо при загрузке адреса таблицы адрес умножить на 2!

IN Rd, I/O
Команда IN прочтет байт из регистра ввода-вывода в регистр общего назначения, например:Работает со всеми регистрами, биты признаков не изменяет.

OUT I/O, Rs
А эта – из регистра выведет в порт.

PUSH RsPOP Rd
Эти команды предназначены для работы со стеком. Команда PUSH поместит Rs в стек, после выполнения команды указатель стека уменьшается на единицу. Команда POP извлечет байт из стека и поместит его в Rd. Соответственно, указатель стека увеличится на единицу.Указатель стека должен быть установлен (как правило – на последний байт ОЗУ) при старте программы!

Урок 17. Использование ИК в AVR микроконтроллерах

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

Решением стала статья с хабры (habrahabr.ru/post/82383), в которой для управления роботом использовался ик. Основная идея весьма проста — информация передается и принимается, как при обычной работе с UART, ик передатчик и приемник выполняют роль проводов. Единственная особенность, то что сигнал с UART должен быть промодулирован на определенной частоте.

Теперь обо всем подробнее, начнем с приемника.В качестве приемника использован TSOP4836. Как уже было сказано, приемник работает на определенной частоте, данный приемник работает на частоте 36кГц. Если принимаемый сигнал отклоняется от заданной частоты, то соответственно снижается чувствительность.

Схема приемника достаточна проста, как впрочем и просто использовать ее программно — достаточно просто ловить данные по UART никаких дополнительных действий. Также возможно подсоединить к FT232 и смотреть терминалкой приходящие данные, мне это очень помогло во время отладки.

Для управления светодиодом использована Atmega8, думаю пояснений по коду не требуется, единственное, на что стоит обратить внимание, это скорость UART-2400, она напрямую связана с частотой, на которой работает приемник «10/fo is recommended for optimal function»

Теперь перейдем разберемся с передатчиком, в качестве которого использован инфракрасный диод TSAL6200. В целом ничего сложного, задействована ножка Tx, для передачи данных из UART, ножка PB1 нужна для формирования несущей частоты, т.е. она дрыгается с частотой 36кГц.

Основной проблемой, в данной схеме, является то, что ик диод потребляет порядка 100мА, поэтому, если дать полный ток, то ножка мк может сгореть. Поэтому ток ограничен, соответственно в ущерб излучаемой мощности. Можно схему переделать и придумать как от этого избавиться, однако для учебных целей схема вполне годна и наглядна.

Теперь пару слов о формировании несущей частоты, ножка таймера T1А включена в режим Toggle, это значит что при достижении таймером величины указанной в OCR1A, состояние ножки изменится на противоположное, подобное мы делали в уроке про генерацию звука.

Частота, которую можно получить на ножке таким способом определяется по формуле из даташита:

Focn — частота, с которой должна дрыгаться ножка;

Fclk — частота таймера;

N — частота предделителя таймера;

OCRn — значение регистра сравнения;

В остальном исходный код для передатчика, ничем не отличается, от ранее изученного нами, в статье про передачу данных по UART. Для удобства повесил 2 кнопки PB2 передает ‘1’ — соответственно зажигает светодиод, PB0 передает ‘0’ — гасит светодиод.

На железке все работало стабильно, глюков замечено не было, в пределах 1,5-2 метров прием устойчивый под разными углами, дальше — нужно целиться. В пределах 3-4 метров все работает нормально, дальше нет возможности проверить.

46 комментариев: Урок 17. Использование ИК в AVR микроконтроллерах

Не бывает. Просто мы чего-то не знаем либо не учитываем…
Например, при каждом вызове прерывания в счетный регистр заносится наше расчитаное число- сколько тактов процессор на это тратит и как это влияет в итоге на частоту?
Протеус, кстати, при расчете берет «идеальную» частоту- но тем не менее вместо ожидаемых 38.095 КГц упорно показывает на выходе OC0A 35.037 КГц, что для «дальнобойности» ИК уже значимо.
Окей, предположим что визард код-вижна неидеален и ставит «неправильное» число (хотя вряд ли погрешность больше значения младшего разряда), модель tiny в протеусе неидеальна и часотомер тоже не идеален- и потому кажет что попало… Я согласен с вашими аргументами- в теории. Однако, я верю глазам своим. Факт пока остается фактом- подобраное по протеусу значение дало лучший результат, нежели «расчитаное». Я ни в коем случае не утверждаю что Протеус непогрешим- я просто даю пищу для размышления…
Очень жаль что у нас нет частотомера. Я бы тупо замерял частоту от кварцованого 2313 и ясность стала бы полной…

ЗЫ: извините за флуд…

Очевидно вы не правильно считаете или не правильно задаете частоты в CAVR или протеусе. При 38кГц (подчеркну) несущей, у вас никак не может получиться 0x8C на 9.6МГц. Если режим CTC, то таймер должен вызывать прерывания в 2 раза чаще, т.е. все тупо 9600 делим на 76 и получаем OCR, внутри прерывания дрыгаем ногой. Если использовать режим toggle то правила те же, но нога дрыгается аппаратно, без прерывания.
UPD: только что зачекал, все совпадает на 100%, ищите ошибку.

Читайте также:  Новая гибридная "кубическая" память от компании micron

Привет админ! Пожалуйста объясни как сделать расчет я чет так и не понял.
Вот у меня Atmega8 8 МГц
Как расчитать 36 кгц?

Focn — частота, с которой должна дрыгаться ножка OC1(PB1) — здесь мы дожны 36 кгц получить, я понял, но в каких единицах? 36? или же 36000? по формуле
Fclk — частота таймера — это есть частота мк да? на фото Clock source? 8000? или 8000 000? в формуле?
N — частота предделителя таймера — на фото это есть clock value? в каких он единицах будет в формуле?
OCRn — значение регистра сравнения — это значение вводится на фото в comp A? да?
Пожалуйста поясните… жду ответа

USB ИК приёмник на AVR

Что не говори, а человек существо ленивое. Иногда так не хочется вставать с кровати чтобы отрегулировать громкость во время просмотра фильма или еще чего. Сейчас конечно есть куча всяких девайсов вроде мышек и клавиатур соединенных с компом по радиоканалу, но меня дико душит жаба при виде негуманных цен. Да и зачем покупать все это если в доме есть не нужный ик пульт и в загашнике завалялся tiny2313. Итак, будем ваять usb ик приёмник.

Было решено не изобретать свой велосипед, а повторить довольно удачную разработку некого Игоря Чешко. Повторить решил главным образом из-за того, что этот приемник поддерживается несколькими удобными программами вроде IrLink. Схема в оригинальном варианте мне очень не понравилась и я ее немного допилил. Доработка заключается в добавлении стабилитронов в цепи D+ и D-. Это сделано для того чтоб не спалить USB порт. Логическая единица у usb порта около 3.6 вольт и превышение этого напряжения крайне не желательно.

Сигнал с пульта принимается ик приёмником демодулятором TSOP17xx или TSOP21хх. ХХ — это несущая частота пульта в килогерцах. Как правило это 36 или 38 кГц. У меня например дома пять пультов и все пять работают на частоте 36 кГц. У ик приёмника очень хорошая чувствительность. Уверенно принимается даже сигнал отраженный от стен комнаты. Хотя тут еще многое зависит от пульта. Например с моим самодельным пультом результаты чуть похуже (стоит крошечный 3мм светодиод). Сам приёмник после сборки в настройке не нуждается, а вот с софтом придётся немного повозиться. Из всех программ для работы с этим приёмником, самая прикольная на мой взгляд — IrLink. Прога умеет распознавать всевозможные кодировки, а следовательно можно заюзать почти любой пульт! Разумеется IrLink не знает всевозможных кодов кнопок, поэтому программу нужно обучать. Для начала работы с программой нам нужно установить драйвера на ик приёмник. Их можно скачать с сайта автора или у меня. Драйвер есть двух версий — платная и бесплатная. У бесплатной версии есть один маленький неприятный момент. Когда какая либо программа начинает работать с ик приёмником — выпрыгивает окно с кнопкой ок в котором написано что мы используем бесплатную версию. Это почти не мешает, однако если кого-то это сильно будет раздражать, то можно купить полную версию за семь баксов у автора. Кроме этого окна ни каких различий в функциональности нет. Драйвер успешно заработал как на WinXP так и на Windows 7. После установки драйверов нужно скачать самую новую версию программы с сайта www.irlink.ru . При первом запуске появится окно настроек в котором нужно указать что у нас используется самодельный приёмник IgorPlugUSB. Если всё работает как надо то на вкладке «Ик приёмник» должно быть написано что «приёмник сигналов обнаружен и запущен». Теперь можно обучать программу. Начинается обучение с создания нового пульта. Для этого переходим на вкладку «Пульт ДУ» и на пульте слева расставляем кнопки точно так же как они расположены на вашем пульте. Когда кнопки расставлены тыкаем по очереди на каждую и нажимаем на пульте соответствующие кнопки. После завершения обучения можно легко проверить результат, жмем кнопки пульта и видим как они подсвечиваются в окне программы. Присвоить кнопкам действия дело не хитрое, но на всякий случай покажу как настроить две кнопки на управление громкостью в проигрывателе Winamp.

1) Выбрать кнопку пульта
2) Выбрать программу и действие
3) Добавить действие

Вот и всё. Кстати, программа начнет откликаться на команды с пульта только после закрытия главного окна. Напоследок хочу сказать, что большие полигоны на плате очень хорошо лудятся с использованием флюса СКФ:

ИК загрузчик для микроконтроллеров AVR. Часть 1. Host-устройство

ИК загрузчик – это микроконтроллерный электронный комплекс, с помощью которого возможно осуществить дистанционное программирование микроконтроллеров семейства AVR в пользовательском устройстве по ИК каналу связи. Комплекс состоит из двух частей: целевое устройство и Host-устройство. Целевое устройство имеет ИК-приемник, ИК-передатчик и два канала интерфейса внутрисхемного программирования (для подключения к пользовательскому устройству). Передатчик (Host-устройство) подключается к USB интерфейсу компьютера, на котором установлено соответствующее ПО и драйверы Host-устройства. Все данные передаются по ИК каналу целевому устройству, которое после успешного принятия данных осуществляет программирование пользовательского микроконтроллера. Проект является бесплатным с открытым исходным кодом и разработан для образовательных целей.

Изначально основной целью данного проекта была программная реализация USB интерфейса на микроконтроллерах семейства AVR компании Atmel с помощью программной библиотеки известной как V-USB от Objective Development Software.

Host-устройство базируется на микроконтроллере ATmega8, на котором с помощью V-USB программно реализован USB интерфейс. К микроконтроллеру подключаются ИК-приемник и ИК-передачик, которые собраны в виде отдельных подключаемых модулей. Для программного обеспечения использовался компилятор WinAVR (AVR-GCC).

Программное обеспечение для персонального компьютера написано с использованием бесплатной библиотеки Libusb-Win32 и скомпилировано с использованием Lazarus Freepascal.

Полностью вся реализация использует пользовательский класс устройства, требует простой inf-файл и драйвер libusb , установленный на персональном компьютере.

Передача данных по ИК каналу реализуется при помощи встроенного в микроконтроллер ATmega8 модуля UART и Таймера 2 (таймер используется в качестве генератора сигнала модуляции 38 кГц). Скорость передачи данных 2400 бит/с. При использовании одного ИК светодиода коммуникация между Host и целевым устройством возможна на расстоянии 6.5 м. В последней версии ИК-передатчика применены 6 ИК светодиодов, что позволило увеличить расстояние до 15 метров.

Принципиальная схема Host-устройства

Отличительные особенности и характеристики Host-части проекта:

  • программное обеспечение микроконтроллера реализует устройство пользовательского класса;
  • поддержка операций работы с памятью микроконтроллера: стирание, запись, чтение;
  • доступ возможен к Flash-памяти, EEPROM, fuse-битам;
  • определение ошибок в процессе передачи данных (CRC16);
  • размер пакета данных 128 Байт (возможно дальнейшее увеличение длины);
  • процедура usbpoll не может быть запущена, пока идет передача данных USART. Работа модуля USART имеет высший приоритет, чтобы поддерживать ИК коммуникацию между Host и целевым устройством;
  • разработка для микроконтроллеров семейства AVR (не все модели протестированы, ограничения накладываются по частоте сигнала тактирования SCK интерфейса ISP в различных сериях микроконтроллеров);
  • максимальный объем целевой памяти с которой поддерживается работа 32640 Байт (32 КБайт) – это ограничение накладывается из-за ограниченного количества пакетов данных (255) и длиной пакета данных (128 Байт)

Принципиальная схема модуля ИК-передатчика

Принципиальная схема модуля ИК-приемника

Список компонентов для Host-части комплекса

Рейтинг
( Пока оценок нет )
Загрузка ...
Adblock
detector