Semnale Decoding infraroșu control de la distanță

Într-o zi am nevoie pentru a controla dispozitivul cu ajutorul telecomenzii. Distanța necesară este mică (până la 10 metri) și am decis să utilizeze în acest scop receptor IR și telecomandă cu infraroșu de la echipamente de uz casnic.

Pentru control la distanță cu infraroșu (telecomandă IR), există mai multe protocoale de transmisie. Acestea sunt moduri diferite de biți de codare, durata frecvenței purtătoare a semnalului și cantitatea de date transmise. Una dintre cele mai comune protocoale, în conformitate cu internet - RC5. Inițial, am crezut că ar trebui să se ocupe de ea, dar nu de la distanță nu am avut la îndemână cu acest protocol. Dar au existat trei la distanță de DVD playere care utilizează protocolul compania NEC.

Principiul de transmitere a semnalelor IR este după cum urmează: - un semnal purtător electric este modulat și transmis de date prin intermediul unui LED infraroșu este radiat în spațiu.

Semnalul de transmisie este deja implementată în consolă, problema nu atinge, cu toate că nimic complicat acolo.

Pentru recepția semnalului, un cip special care combină o fotodiodă, un amplificator cu un filtru de bandă reglat la o frecvență purtătoare specifică, și un detector de semnal distinge plic. De obicei, dispozitivul are trei terminale - două alimentator și un semnal. Acesta din urmă este conectat la colectorul circuitului de ieșire tranzistor, din cauza căreia este inversat semnalul de ieșire.

Așchii din această cotă de familie o TSOP abbreviaturoy- comună.

Semnale Decoding infraroșu control de la distanță

Pentru a afla ce protocol este folosit în controlul de la distanță, aveți nevoie pentru a colecta shemku cu receptor IR, scoateți forma de undă a semnalului și se compară cu protocoalele cunoscute.

Cu toate acestea, există un punct, receptorul infraroșu este proiectat să funcționeze cu o singură frecvență purtătoare, dar în unele protocoale, valori diferite ale frecvențelor purtătoare - se utilizează 38 kHz (de exemplu, Nec protocol companie), celelalte 36 sau 40. Prin urmare, același circuit nu poate funcționa toate fără excepție, telecomanda IR.

Schema pe care am folosit la scrierea unui program este prezentat în figura de mai jos. Semnalele IR Recepționarea efectuate microcircuit TSOP2138. calculat frecvența de 38 kHz.

Datele sunt transmise LSB înainte. Fiecare bit începe cu o explozie de impulsuri de frecvență purtătoare. Durata stivei este egală cu 560 microsecunde. Prin schimbarea intervalul de timp dintre exploziile de impulsuri se efectuează codificare de zerouri și cele. La transmiterea unei logici unul de la începutul intervalului curent înainte de următoarea rafală este de 2,25 ms, iar logica de transmisie zero, - 1.12 ms.

Semnale Decoding infraroșu control de la distanță

Pulsul de start este o stivă de durata impulsurilor de frecvență purtătoare de 9 ms. După furnizarea impulsului de pornire, urmată de o pauză de 4,5 ms.



Pentru decodarea semnalelor IR protocol Nec corespunzătoare, este necesar să se măsoare intervalul de timp dintre exploziile de impulsuri transmise. În acest scop, utilizare poate captura de circuit, întreruperi externe sau sondaj de ieșire microcontroler banal. Am optat pentru capturarea sistem.

Să considerăm algoritmul programului, decodarea semnalelor de control de la distanță. (Codul nu citează să nu ascundă descrierea.)

La începutul funcției main () inițializează timer T1 - permis eveniment de întrerupere „captare“ set de prindere de circuit de lucru pe marginea care se încadrează (deoarece semnalul de la o ieșire receptor IR inversat), normal timer-ul modul de funcționare și prescaler care să permită să se calculeze durata dintre exploziile mai multe impulsuri fără registru de preaplin contra. afișaj LCD inițializat utilizat pentru depanare. Un steag este setat la nivel mondial a activa / dezactiva întrerupe.

Apoi, microcontrolerul „rateaza“ într-o buclă infinită în timp, care sunt cauzate de funcții de prelucrare și de ieșire - TIM_Handle () și TIM_Display (), respectiv.

Paralel Implementarea principal cod de funcționare temporizator T1, iar circuitul de captare. Odată ce ICP nivel logic de ieșire (PD6) se schimbă de la „1“ la „0“ se oprește executarea codului principal și este invocat de tratare a întreruperii. Procesorul microcontroler stochează curent și valoarea contorului anterior și pavilion timer este setat, de semnalizare funcții TIM_Handle () pentru a captura o nouă valoare.

Funcția TIM_Handle () este o mașină de stat cu două state - IDLE (de așteptare) și RESEIVE (recepție). La începutul verificării funcției pe care software-ul de pavilion și în cazul condiției, durata intervalului de timp este calculat și executat cod mașină.

Mașina inițială -IDLE de stat. În această stare, aparatul așteaptă apariția impulsului de pornire sau codul de repetiție. În cazul în care durata intervalului de timp este mai mică decât valoarea maximă posibilă, dar mai mare decât pragul - a primit pulsul de pornire. Automată inițializează variabile și își schimbă starea la RESEIVE. Dacă valoarea este mai mică decât pragul - a adoptat pulsul retry, deține contorul increment reîncerca (al cincilea octet buf [] array).

Variabile mașină second hand:

currentState - stadiul actual al automatului,

Perioada - durata intervalului de timp,

date - primirea „registru de deplasare“

countBit - conta biții primite,

countByte - număr de octeți,

În mașină de stat RESEIVE compară durata intervalului de timp cu cea mai mare valoare posibilă și un prag. Dacă intervalul este mai mare decât pragul - apoi a acceptat una, dacă mai puțin - este zero.

În cazul unității de primire într-o serie de date variabile set 7 de descărcare de gestiune. Alte contoare sunt verificate biți și octeți, care este controlat prin „suflare“ secvența de biți într-o matrice.

După cele patru octeți vor fi luate, aparatul va seta pavilion RESEIVE_OK și stat la INACTIV schimbat.

RESEIVE_OK semnale de pavilion TIM_Display () pentru ieșire a primit date pentru un LCD caracter. In acest proiect, display-ul a fost utilizat exclusiv în scopul de depanare.

Bună ora din zi)))
se confruntă cu un astfel de dezastru:
PSTN 4838 când este conectat conform schemei așa cum ați făcut ieșiri inactiv 1,28v, în timp ce aplicarea unui puls de la distanță arată 1,08v. Care este problema? Am putut face nici un rău? la ce am undeva 5 PSTN diferite și toate se comportă la fel (((

De obicei, acest act de ardere PSTN, cum ar fi alimentarea cu energie polaritate inversă. Verificați tipul de conexiune. Și Te sfătuiesc să nu ignore recomandările foaie de date. Există un lanț de aprovizionare este inclus mai RC-lanț, astfel încât este în cazul în care acesta este, atunci ea se arde PSTN devine mult mai dificilă (rezistență limitează curentul la rândul său greșit pe și de scurtă durată mii PSTN polaritate inversare nu decola, și fără ea chiar și un timp foarte scurt pentru un astfel de angajament imediat ucide receptor ). Și în special cu privire la cazul dumneavoastră: verificați circuitul din nou și tensiunea de alimentare, nu există miracole.

Strângeți semnal de ieșire TSOPa printr-o rezistență 10 BR putere, și să vedem ce se întâmplă. Ai verifica separat sau este conectat la microcontroler de la?

a cumparat un nou tsop4836 și totul a făcut conform schemei și a tras semnalul prin 10k, acum 1,45v mers în gol și atunci când alarma 1,28v
cum poate viața?

Sunteți sigur că nu greșeală? 1 ieșire - Signal, 2 - Teren 3 - tensiunea de alimentare. Iar semnalul ați conectat la microcontroler sau numai rezistențe pull-up?

Nu am fost la acest cod. are întotdeauna valori diferite. Nu știu, doar eu, sau mai norocoși? Un pic de cod simplificat, învelind-l complet în rutina de tratare a întreruperii timer ub totul a mers ca ceasul. Numele de mai multe variabile și constante schimbate, iar unele chiar șterse ca inutile. Aici întrerupe codul:

cod:
// întrerupe captare eveniment
întrerupe [TIM1_CAPT] nule Timer1Capt (void)
#asm ( "cli")
if (flag == 1) Interval = TCNT1;
>
altfel
interval = 0;
TCNT1 = 0;
flag = 1;
#asm ( "sei")
LED = OFF;
return;
>

comutator (stat) // așteptați impuls de pornire
caz ASTEPTARE:
TCNT1 = 0;
if (interval REPEAT_BIT_INT) date = 0;
countBit = 0;
countByte = 0;
tampon [NUM_REPEAT] = 0;
starea = PRIMEȘTE;
LED = ON;
>
altceva LED = ON;
tampon [NUM_REPEAT] ++;
flag = 0;
delay_ms (10);
LED = OFF;
>
>
interval = 0;
pauză;

// care primesc colete
caz PRIMEȘTE:
TCNT1 = 0;
if (interval LOW_BIT_INT) SetBit (date, countBit);
>
countBit ++;
if (countBit == 8) tampon [countByte] = date;
countBit = 0;
date = 0;
countByte ++;
if (countByte == (MAX_SIZE - 1)) flag = 0;
stare = WAIT;
LED = OFF;
pauză;
>
>
>
altfel
flag = 0;
stare = WAIT;
LED = OFF;
>
interval = 0;
pauză;

Proiectul de eroare CodeVision. Mâinile mele nu ajung să îl corectați. Pentru codul de la locul de muncă, aveți nevoie pentru a stabili ce unele fișier timer.c.
cod:
icr1 = icr2;
icr2 = ((int unsigned) ICR1H<<8)|ICR1L;

că există atât de
cod:
icr1 = icr2;
icr2 = ICR1L;
icr2 | = ((int nesemnate) ICR1H<<8);

Încercați-l, ar trebui să funcționeze.

PS. mai întâi am scris greșit. nu suficient de somn.

Toate bune dnya.Est problema.Vot face, de asemenea, semnale de decodare de singurul protocol de la distanță, RC5.TSOP conectat atât de bine ca și în articolul de mai sus la încheierea ICP microcontroler.
Biblioteca RC5 utilizat - kibermaster.net/priem-komand-s-pulta-distantsionnogo-upravleniya/ .După inițializare cronometru și întrerupe activa este activat de prindere și microcontrolerul începe să prelucreze datele primite de la telecomandă. În cazul în care pachetul de date recepționat este activat de pavilion rc5.dataOK, iar comanda primită este înregistrată cu o structură rc5.command variabilă.
Codul în sine pe care am yuzayu este pe tastele de control de la distanță / off patru canale 1-4
Codul în sine aici radiomanoff.at.ua/index/distancionnoe_upravlenie_na_atmega8_protokol_rc_5/0-27

Totul este bine, dar dacă am apăsat butonul de la distanță „exagera“ canalul corespunzător este pornit / oprit yuchaetsya.A a vrut să canalizeze implicate, iar regulatorul de așteptare pentru butonul de declanșare de la distanță, și apoi mai târziu procesa următoarea presă.
Am încercat să inserați
Cod.
_delay_ms (700); // întârziere de 700 ms
rc5.dataOK = 0; // pavilion resetare

în timp ce (rc5.dataOK) // așteptați butonul este eliberat
_delay_ms (200); // întârzie 70 ms
rc5.dataOK = 0; // pavilion resetare
buton
Cum de a elibera knopki.Testiruyu de verificare pe o adevărată „de fier“ nu merge

Aș adăuga contorul, care la primirea cheilor codului resetează, și interzice procesarea următorului cod de intrare până când se numără până la un anumit prag. Apoi a venit primul cod va fi procesată, iar următoarea nu.

Vă mulțumesc pentru răspuns, dar știi că am încă o buclă în timp ce, pur și simplu inserați o întârziere
Cod: _delay_ms (200); // întârziere de 700 ms

rc5.dataOK = 0; // pavilion resetare

în timp ce (rc5.dataOK) // așteptați butonul este eliberat
// _ delay_ms (20); // întârzie 70 ms
rc5.dataOK = 0; // pavilion resetare
_delay_ms (200);
>
M-am gândit acest lucru. canalul I cuprinde o clar, nu se plânge net.No dacă butonul de pe telecomandă pentru a menține starea în permanentă schimbare a canalului ON / vykl.Poetom am condus în timp ce pavilion controalele buclă rc5.dataOK cu zbrosom constantă rc5.dataOK = 0; - și, astfel, înainte canal de transmisie final pulta.Ved că am nevoie deja vklyuchen.Na hardware-ul real, sa dovedit foarte chiar nimic, în principiu este, asta e ceea ce am vrut.
Am înțeles că cel mai probabil, nu este corect, pentru că în momentul în care este apăsat butonul, și alte acțiuni cu MK I nesmogu.No mă face fericit.
De ce am scrie sub acest articol? Știi că „googled“ rețeaua este doar TSOP suspendată pe picior de microcontroler ICP .Pravda am folosit ATmega8 c fabrica Fyuz, dar codul cu lucrări de control la distanță RC5, și cred că lucrul cel mai important.
Iată un pic „opus“, în acest sens, prelucrarea și RC5 Matrix klaviaturaradiomanoff.at.ua / index / distancionnoe_upravlenie_na_atmega8_protokol_rc_5_matrichnaja_klaviatura / 0-35 .mozhet cineva veni la îndemână.

cum să prindă un cod de reluare?
Faptul că este necesar ca presa lung a fost realizată ce această acțiune (cum ar fi atunci când controlul volumului)