Декодиране сигнали инфрачервено дистанционно управление

Един ден имах нужда да контролира устройството с помощта на дистанционното управление. Разстоянието необходимо е малък (до 10 м) и реших да се използва за тази цел IR приемника и инфрачервеното дистанционно управление от домакинско оборудване.

За инфрачервено дистанционно управление (IR дистанционно управление), има няколко предавателни протоколи. Те са различни начини за кодиране бита, продължителността на честотен сигнал носител и количеството на предаваните данни. Един от най-разпространените протоколи, според интернет - тя RC5. Първоначално мислех, че ще трябва да се справят с него, но не по-отдалечен Не съм имал под ръка с този протокол. Но имаше три отдалечени от DVD плейъри, които използват NEC компания протокол.

Принципът на предаване на инфрачервени сигнали е както следва: - електрически сигнал носител се модулира и предава данни чрез инфрачервена LED се излъчва в пространството.

предаване на сигнала вече е внедрена в конзолата, въпросът не се докосва, въпреки че нищо сложно там.

За приемане на сигнала, по-специално чип, който съчетава фотодиод, усилвател с лентов филтър настроен към конкретна носеща честота, и детектор отличава плик сигнал. Обикновено, устройството има три терминала - две захранващи и един сигнал. Последният е свързан с колектора на изхода транзистор верига, поради което е обърнат на изходния сигнал.

Чипове на това семейство споделят обща abbreviaturoy- TSOP.

Декодиране сигнали инфрачервено дистанционно управление

За да разберете кой протокол се използва в дистанционното управление, трябва да се съберат shemku с IR приемник, извадете форма на вълната на сигнала и да го сравни с известни протоколи.

Въпреки това, има една точка, инфрачервения приемник е проектиран да работи с единична носеща честота, но в някои протоколи, различни стойности на честотата на носителя - един използва 38 кХц (например НЕК компания протокол), другите 36 или 40. Следователно, една и съща верига не може да работи всички без изключение, за инфрачервено дистанционно управление.

Схемата, която аз използвах, когато пиша програма е показано на фигурата по-долу. Получаване на инфрачервени сигнали проведени микросхема TSOP2138. изчислява честотата на 38 кХц.

Данните се предават LSB напред. Всеки бит започва с изблик на носеща честота импулси. Продължителността на стека е равна на 560 микросекунди. Чрез промяна на интервал от време между поредици от импулси се извършва кодиране на нули и единици. При предаването на логическо от началото на текущия интервал преди следващата поредица е 2,25 мс и предаване логиката нула - 1.12 милисекунди.

Декодиране сигнали инфрачервено дистанционно управление

импулс старт е купчина от продължителността на носеща честота на пулса на 9 милисекунди. След предоставяне на старт пулса последвано от пауза от 4,5 мс.



За декодиране IR сигнали, съответстващи протокол НЕК, необходими за измерване на времето между предадените импулсни поредици. За тази цел на използване може да улови верига, външно прекъсване или анкетата банална изход микроконтролер. Съм избрал за улавяне схема.

Нека разгледаме алгоритъма на програмата, декодиране на сигналите на дистанционното управление. (Кодекс не цитирам да не се закриват описанието.)

В началото на функцията главната () инициализира T1 таймер - разрешава прекъсване събитие "улавяне" настроен сцепление работа кръг на падащ фронт (тъй сигнал към изхода на IR приемник обърнат), таймерът за нормален режим на работа и делител позволява да се изчисли продължителността между изблици множество импулси без преливник брояч регистър. Initialized дисплей LCD, използвани за отстраняване на грешки. А флаг е установен световен активиране / деактивиране на прекъсванията.

След това микроконтролерът "пропуска" в безкраен цикъл, докато, които са причинени от обработка и изходни функции - TIM_Handle () и TIM_Display (), съответно.

Паралелно изпълнение главен код бягане таймер Т1 и превземането му верига. Веднъж ICP за нивото на изхода логика (Pd6) промени от "1" до "0" спира изпълнението на основния код и прекъсващ оператор се извиква. Процесорът микроконтролер съхранява текущата и предходната стойност на брояча и знаме с таймера, сигнализация функции TIM_Handle (), за да се обхване по-нова стойност.

TIM_Handle () функция е държавна машина с две състояния - IDLE (изчакване) и RESEIVE (рецепция). В началото на проверката за функция, че софтуерът на знамето, а в случая на заболяването, продължителността на интервала от време се изчислява и се изпълнява машинен код.

Първоначалното състояние -IDLE машината. В това състояние, машината изчаква появата на началния импулс или повторение код. Ако продължителността на интервала от време, е по-малка от максималната възможна стойност, но по-голяма от прага на - получи старт пулса. Автоматично инициализира променливи и променя своето състояние да RESEIVE. Ако стойността е по-малка от прага на - приет нов опит пулса, държи на брояча на нарастване повторен опит (пети байт Buf [] масив).

Променливи, използвани машини:

currentState - текущото състояние на автомата,

период - продължителността на интервала от време,

данни - получаване на "смяна регистър"

countBit - брои получените битове,

countByte - брой байтове,

В RESEIVE държавна машина сравнява продължителността на интервала от време с възможно най-голяма стойност и праг. Ако интервалът е по-голяма от прага - след приема такъв, ако по-малко - е нула.

В случай на получаване на единица в рамките на променливи данни настроен 7 разряд. Други броячи се проверяват битове и байтове, които се управляват от "удар" на битова последователност в масив.

След като ще бъдат взети четирите байта, машината ще създаде RESEIVE_OK флаг и да се промени държавата да бездейства.

RESEIVE_OK сигнали флаг TIM_Display () функция за извеждане на получените данни характер LCD. В този проект, на дисплея се използва единствено за целите на отстраняване на грешки.

Добро време на деня)))
изправени пред подобно бедствие:
PSTN 4838, когато е свързан в съответствие със схемата, като имате в режим на изхода 1,28v, докато прилагането на импулса от 1,08v отдалечените предавания. Какъв е проблемът? Можех да направя нищо лошо? в това, което имам някъде 5 различни PSTN и всички се държат една и съща (((

Обикновено този акт на изгарянето на PSTN, като обратна доставка полярност мощност. Проверете типа на връзката. И аз ви съветваме да не пренебрегва препоръките на фиша. Има веригата за доставки е включена по-RC-верига, така че това е къде е, а след това се изгаря PSTN става много по-трудно (съпротивление ограничава тока при грешна посока на и кратка продължителност тата с обратна полярност PSTN да не се раздвижи, и без него, дори за много кратко време за такъв ангажимент убива приемник веднага ). И точно по вашия случай: проверете веригата отново и захранващото напрежение, няма чудеса.

Затегнете TSOPa изходен сигнал чрез резистор 10 BR мощност, и да видим какво ще стане. Можете да го проверите отделно или е свързан към микроконтролера от?

купих нов tsop4836 и не всичко според схемата и извади сигнала чрез 10k, сега празен ход 1,45v и когато алармата 1,28v
как може живот?

Сигурни ли сте, не бъркайте ли сте? 1 изход - Сигнал, 2 - Парцел 3 - захранващо напрежение. И сигнала сте свързали към микроконтролера или само да дръпне нагоре резистори?

Не отидох на този код. Винаги се различни стойности. Аз не знам, това е просто ме, или по-щастлив? Малко по-опростен код, той прибра изцяло в прекъсващ оператор на таймера UB всичко мина като по часовник. Имената на много променливи и константи се променили, а някои дори заличи, тъй като ненужно. Тук прекъсне код:

код:
// прекъсване улавяне събитие
прекъсне [TIM1_CAPT] анулира Timer1Capt (свободен)
#asm ( "CLI")
ако (флаг == 1) интервал = TCNT1;
>
още
интервал = 0;
TCNT1 = 0;
флаг = 1;
#asm ( "SEI")
LED = OFF;
се върне;
>

превключвател (държава) // чака за стартиране на импулса
случай изчакайте:
TCNT1 = 0;
ако (интервал REPEAT_BIT_INT) данни = 0;
countBit = 0;
countByte = 0;
буфер [NUM_REPEAT] = 0;
състояние = ПОЛУЧИ;
LED = ON;
>
друг LED = ON;
буфер [NUM_REPEAT] ++;
флаг = 0;
delay_ms (10);
LED = OFF;
>
>
интервал = 0;
прекъсване;

// получават парцели
При получите:
TCNT1 = 0;
ако (интервал LOW_BIT_INT) SetBit (данните, countBit);
>
countBit ++;
ако (countBit == 8) буфер [countByte] = данни;
countBit = 0;
данни = 0;
countByte ++;
ако (countByte == (MAX_SIZE - 1)) флаг = 0;
състояние = ИЗЧАКВАНЕ;
LED = OFF;
прекъсване;
>
>
>
още
флаг = 0;
състояние = ИЗЧАКВАНЕ;
LED = OFF;
>
интервал = 0;
прекъсване;

Проектът за CodeVision грешка. Ръцете ми не достигат я поправи. За да работи кода, трябва да се определи това, което някои timer.c файл.
код:
icr1 = icr2;
icr2 = ((неподписан Int) ICR1H<<8)|ICR1L;

че има толкова
код:
icr1 = icr2;
icr2 = ICR1L;
icr2 | = ((неподписана вътр) ICR1H<<8);

Опитайте го, тя трябва да работи.

PS. Отначало неправилно изписана. не е достатъчно сън.

Всички добро dnya.Est problema.Vot също направи декодиране сигнали от дистанционно, само RC5.TSOP протокол свързан така и в статията по-горе за сключване на микроконтролера ICP.
използва RC5 библиотека - kibermaster.net/priem-komand-s-pulta-distantsionnogo-upravleniya/ .След инициализация таймер и прекъсват даде възможност се активира сцепление и микроконтролера започва да обработва данните, получени от дистанционното управление. Ако полученият пакет за данни е активирана rc5.dataOK флаг и получената команда е записан с променлива структура rc5.command.
Самият код който yuzayu е включено / изключено четири канала ключове дистанционно управление 1-4
Самата тук кода radiomanoff.at.ua/index/distancionnoe_upravlenie_na_atmega8_protokol_rc_5/0-27

Всичко е добре, но ако аз натисна дистанционното бутона "прекалявайте" съответния канал се включва / изключва yuchaetsya.A искаше да канализират участва, и контролера чака бутона на дистанционното освобождаване, а след това по-късно обработва следната пресата.
Опитах се да се вмъкне
Код.
_delay_ms (700); // забавяне от 700 мсек
rc5.dataOK = 0; // нулиране на флага

докато (rc5.dataOK) // чака за отпускане на бутона
_delay_ms (200); // забави 70 мсек
rc5.dataOK = 0; // нулиране на флага
бутон
Как да се освободи проверка knopki.Testiruyu на на една истинска "желязо" не излиза

Бих добавил брояча, който при получаване на ключовете кода нулира, и забранява обработването на следващото входящо кода, докато тя се брои до определен праг. След това дойде първият код ще бъдат обработени и на следващия не.

Благодаря ви за отговора, но ти знаеш, че все още има време цикъл, просто поставете закъснение
Код: _delay_ms (200); // забавяне от 700 мсек

rc5.dataOK = 0; // нулиране на флага

докато (rc5.dataOK) // чака за отпускане на бутона
// _ delay_ms (20); // забави 70 мсек
rc5.dataOK = 0; // нулиране на флага
_delay_ms (200);
>
Така си и мислех. канал, за който включва ясно, няма оплаквания net.No ако бутона на дистанционното управление, за да се запази постоянно се променя състоянието на канала ON / vykl.Poetom имат карах в проверки контур rc5.dataOK флаг, докато с неговата постоянна zbrosom rc5.dataOK = 0; - и по този начин напред край канал за пренасяне pulta.Ved, че вече е необходимо vklyuchen.Na недвижими хардуер оказа много дори нищо по принцип е, че това е, което исках.
Аз разбирам, че най-вероятно не е правилно, защото по времето, когато е натиснат бутона, както и други действия с MK I nesmogu.No ме правят щастлива.
Защо пиша под тази статия? Знаеш ли, че "Гугъл" мрежата е само TSOP окачен върху крака на микроконтролер ICP .Pravda Използвах ATmega8 в Fyuz фабрика, но кода с RC5 работи дистанционно управление, и мисля, че най-важното.
Ето още малко "опус" в това отношение, обработка и RC5 Matrix klaviaturaradiomanoff.at.ua / индекс / distancionnoe_upravlenie_na_atmega8_protokol_rc_5_matrichnaja_klaviatura / 0-35 .mozhet някой дойде по-удобно.

как да хване код преиграване?
Фактът, че е необходимо продължително натискане се извършва това, че действията (например, когато силата на звука)