roboforum.ru

Технический форум по робототехнике.

ИК ДУ на AVR

ИК ДУ на AVR

Scorpio » 13 янв 2011, 23:35

Возможно, кому-то понадобиться приделать роботу функцию ИК управления бытовой аппаратурой. Возможно также, что об этом уже 100 раз писали - не особенно искал. На всякий случай поделюсь опытом на примере телевизора LG и AVR MEGA168.
Для реализации достаточно иметь одну свободную ножку порта, желательно с функцией PWM (в нашем случае PD5). И ИК светодиод с длинной волны 800 - 950 нм. Светодиод я подключил через ключевой n-p-n транзистор для усиления мощности импульса. Т.е. светодиод горит, если на ножке 1. Если подключать напрямую без транзистора, то будет наоборот. Картинки здесь.
Для начала, надо определиться с ИК протоколом и системой комманд для вашей техники, если она отличная от LG. Для этого понадобится TSOP и осциллограф, подключенный к его выходу. Направляем штатный пульт на тсоп, нажимаем нужную кнопку, получаем картинку и анализируем ее. В нашем случае получился протокол NEC (кодирование с помощью длительности пауз между синхроимпульсами), код комманды 08, что по табличке в инструкции на телевизор соответствует нажатой кнопке «вкл», адрес комманды 04 (про него в табличке ничего не написано). Осталось смоделировать такую-же картинку на МК.
Для начала получим на нашей ножке меандр с требуемой протоколом частотой заполнения лог единицы – 38кГц. Проще всего использовать один из каналов PWM, имеющийся во всех мегах. Настроим 8-разрядный таймер (16-разрядные оставим для более серьезных дел) в визарде CVAVR. В других компиляторах или с другими МК будет выглядеть по другому. Подробнее о настройках таймеров читайте в курсе avr123 и в даташите на свой МК.
timer.jpg
Code Wizard CVAVR

Т.е. выбрали режим, когда при превышении значения регистра OCR0A ,счетчик таймера будет обнуляться, а выход OUT B (он же PD5), будет менять состояние на противоположное. Частота меандра определяется как ClockValue/CompareA/2= 2500/33/2=37.88 kHz. Потом я подстроил значение CompareA=32 по осциллографу. Особая точность частоты заполнения не требуется.
Сгенерив код получим следующую настройку для таймера:
Код: Выделить всёРазвернуть
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 2500,000 kHz
// Mode: CTC top=OCR0A
// OC0A output: Disconnected
// OC0B output: Toggle on compare match
TCCR0A=0x12;
TCCR0B=0x02;
TCNT0=0x00;
OCR0A=0x20;
OCR0B=0x00;

Визард также предложит настроить ножку PD5 на выход, если мы забыли это сделать.
Запустим, проверим, что работает.
Чтобы снять импульсы и перевести ножку в ноль, запишем в регистры управления TCCR0A=0;TCCR0B=0;
Осталось, возпользовавшись библиотекой пауз, написать процедуры генерации сигналов по протоколу NEC.
Код: Выделить всёРазвернуть
#include <delay.h>
#define PulseON   TCCR0B=0x02;TCCR0A=0x12
#define PulseOFF   TCCR0B=0;TCCR0A=0

void Gen_NEC_Byte(unsigned char dat)    //Генерация одного байта по NEC
{
char i;
for(i=0;i<8;i++)
  {
  PulseON;               // синхроимпульс
  delay_us(560);
  PulseOFF;
  if(dat&1)delay_us(1690);else delay_us(560); //длительность паузы зависит от 1/0
  dat>>=1;                                    //передаем от младшего бита к старшему
  }
}
void Gen_NEC_Code(unsigned char adr, unsigned char cmd)    // Генерация всей комманды по NEC
{
PulseON;         // стартовая последовательность
delay_us(9000);
PulseOFF;
delay_us(4500);
Gen_NEC_Byte(adr);      // генерация адресса
Gen_NEC_Byte(~adr);      // генерация инверсии адресса
Gen_NEC_Byte(cmd);      // генерация комманды
Gen_NEC_Byte(~cmd);      // генерация инверсии комманды
PulseON;         // завершающий синхроимпульс
delay_us(560);
PulseOFF;
}

Re: ИК ДУ на AVR

dccharacter » 13 янв 2011, 23:42

Ух ты! Какая штука! Код-визард!!!!!!!!! А у нас на пиках такой штуки небось нет :-(((

Добавлено спустя 3 минуты 5 секунд:
ну и фик. не UNIX-way

Re: ИК ДУ на AVR

Radist » 14 янв 2011, 07:44

Все это интересно, как курьёз. Сам делал маленький пультик, которым можно выключить/включить подавляющее большинство телевизоров. Но вот практического применения для робота не вижу. Если роботы будет телек выключать когда вздумается - куда это годится? :D А если хозяину лень протянуть руку к пульту и он говорит роботу: включи телек - это другое дело. Осталось только распознавание речи сделать и научить робота находить направление на телевизор.

Re: ИК ДУ на AVR

dccharacter » 14 янв 2011, 09:14

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

Re: ИК ДУ на AVR

Myp » 14 янв 2011, 09:49

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

Re: ИК ДУ на AVR

Scorpio » 14 янв 2011, 17:25

Или, например, сидишь на работе, телека нет, а скайп есть. Гонишь по скайпу робота к телеку, даешь комманды включить и выбрать нужный канал и смотришь футбол по скайпу. :). Конечно телек проще включить самому, так же, как и подмести, помыть посуду, вынести мусор и т.д. Обучая чему-то домашних роботов, мы получаем кайф от самого процесса, а не от практической пользы его применения. Исключая коммерческие проекты. "А мой робот умеет включать телевизор!" "А на хрена?" "Да фиг его знает, прикольно всетаки..."

Re: ИК ДУ на AVR

Myp » 14 янв 2011, 17:32

кстати
а есть такие скайп сервисы? типа звонишь на номер ОРТ и тебе в скайп транслируется телеэфир ? :)
просто так в инете же можно смотреть трансляции

Re: ИК ДУ на AVR

Scorpio » 14 янв 2011, 17:45

Myp писал(а):просто так в инете же можно смотреть трансляции

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

Re: ИК ДУ на AVR

$ilent » 14 янв 2011, 17:53

Это легко осуществимо. В первые об этом задумались производитель видеомагнитофонов, что бы записывать без рекламы.
На время рекламы из эфира убирается логотип канала!

Re: ИК ДУ на AVR

Scorpio » 14 янв 2011, 18:09

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

Re: ИК ДУ на AVR

=DeaD= » 14 янв 2011, 18:15

Последнее время эту фишку похоже каналы раскусили и далеко не все убирают логотип.

Re: ИК ДУ на AVR

Myp » 14 янв 2011, 19:40

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

Re: ИК ДУ на AVR

$ilent » 15 янв 2011, 01:07

Всё что идёт по центральному телевидению не имеет логотипа во время рекламы.
Прозрачность логотипа не имеет значения.


Rambler\'s Top100 Mail.ru counter