Sari la conținut
ELFORUM - Forumul electronistilor

Decodificare telecomanda KEYES cu 17 taste


Postări Recomandate

Salutare, pun si eu o intrebare: lucrez la un decodificator pt. telecomanda KEYES cu 17 taste, este pentru comanda unui amplificator cu lampi. Am rezolvat totul, dar observ o ciudatenie: la prima apasare pe orice tasta, in loc sa se transmita un burst conform standardului NEC, se transmite altceva. La urmatoarele apasari, totul este conform standardului. Daca atept mai mult de 15s, la urmatoarea apasare se transmite aceeasi ciudatenie, apoi cele normale. 

A mai observat cineva asta? O fi avand legatura cu reglarea automata a castigului receptorului?

Setul telecomanda+senzor IR se gasesc la preturi derizorii (10lei), sunt ideale pentru asemenea aplicatii. 

 

KEYES IR RC 17 keys.JPG

Link spre comentariu
  • Răspunsuri 14
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Imagini postate

la standardul NEC, mai mai întâi se transmite codul complet al tastei apăsate. Dacă tasta este menținută apăsat mai mult timp, în loc de codul complet, se transmite un cod REPEAT. Acesta constă dintr-o comandă START+STOP. Astfel când se recepționează REPEAT, se repetă ultima comandă primită în clar.

Nu la toate butoanele unei telecomenzi se transmite codul REPEAT. Butoanele colorate, SETTING, POWER_ON, INFO si încă câteva, nu transmit cod REPEAT. CH_UP, CH_DOWN, VOLUME_UP, VOLUME_DOWN, tastele de sageți, transmit întotdeauna codul REPEAT. 

 

La telecomanda aia e greu să poți măsura cu un osciloscop direct pe ledul IR. Posibil că telecomanda are o problemă. Umezeală la butoane sau chiar program alterat (foarte rar). Ori poate fi bateria prea descărcată și uneori emite cod REPEAT aiurea.

 

Dacă sunt anumite surse care emit IR, e posibil ca la ieșirea receptorului să apară impulsuri parazite. Contează mult și cum e făcut programul receptorului. Trebuie să știe să elimine impulsurile parazite care apar la ieșirea receptorului IR. 

Editat de cimitavita
Link spre comentariu

Am studiat standardul NEC, tocmai de asta sunt nedumerit. Pot sa vad secventa initiala, dar nu ma ajuta cu nimic, pentru ca nu este conforma standardului. Este aceeasi secventa la prima apasare pe orice tasta si cred ca are tot 32biti. Poate ca telecomanda are o problema, o sa mai cumpar cateva. Bateria are influienta asupra duratei bitilor, cu cat e mai descarcata cu atat secventele se lungesc cu vreo 20-30us. Am prevazut in soft rutine de tratare a erorilor si l-am facut tolerant la descarcarea bateriei. Functioneaza perfect, doar ca nu ia comanda "din prima", ci dintr-a doua apasare. 

Multumesc pentru raspuns!

Link spre comentariu

încearcă orice telecomanda de televizor LG. Toate folosesc protocolul NEC. Se transmite START+4 octeți+STOP.

În realitate sunt doar 2 octeți deoarece după primul octet se transmite inversul lui și după al treilea octet se transmite la fel, inversul lui. Asta se face pentru a verifica la receptie corectitudinea transmisiei.

Pe baza fișierului de mai jos, am facut emițător/receptor IR pe același uC. L-am folosit ca să oprească un TV după un anumit timp dacă adormeam. Televizorul nu avea funcția asta din fabrică.

 

 

coduri_receptionate_LG.txt

Editat de cimitavita
Link spre comentariu
Acum 49 minute, cimitavita a spus:

încearcă orice telecomanda de televizor LG. Toate folosesc protocolul NEC.

aceasta afirmatie  nu  este  nici pe  departe  adevarata ...

la  modelele  vechi  de  televizoare crt   LG ,  cam 50%  din  telecomenzi  emit  3010/00  pe  testerul Qunda , care  este  un  protocol  de  la  PHILIPS , anume  RC5 daca  nu  ma  insel  prea  tare ... restul  de  50%  emit  pe  testerul Qunda  6121/04FB , care  este  doar unul  dintre  foarte  multele  protocoale  NEC ...

jafurile  alea  de  10 ron  setul  , in marea  lor  majoritate  emit  6121/00FF , care  este  cel  mai  des  cod  in  hexazecimal  folosit  la  ora  actuala  de  catre  industria  chinezeasca  de  profil ...  pe  locurile  2 si  3  in  industria  de  profil  chinezeasca  eu  as  zice  ca  se  afla   6121/08F7   si/sau   6121/007F ...

nici  macar  unul  din  aceste  3  coduri  in  hexazecimal  de  mai  sus  nu  actioneaza  televizoare  LG ... daca  virgula  codurile  in  hexazecimal  nu  seamana  intre  ele , atunci  101% nici  trenurile  de  impulsuri  vizualizate  pe  un  osciloscop  nu  seamana  intre ele ...

 

Link spre comentariu

Daca "problema" este repetabila s-ar putea sa fie si o functionalitate de wake-up agresiv, adica acel ceva care este transmis prima data este de fapt un semnal de trezire a circuitului receptor dintr-o stare de standby low-power ( cum e deepsleep pe Arduino / ESP32 ). Eu am un dimmer pentru benzi led cu telecomanda RF si butoane touch care se comporta exact la fel, dupa cateva secunde intra in hibernare iar la urmatoarea folosire trebuie sa apas aleator pe orice buton pentru a trezii telecomanda / receptorul dupa care pot apasa pe ce buton vreau.

Editat de Bandi Szasz
Link spre comentariu

eu  nu  cred  ca  este  valabila  faza  cu  revenirea  din  deep-sleep  pentru  emisia  in  IR , iar  simplul  motiv  ar  fi  ca  la  apasarea  oricarei  taste  consumul  este  ff  mic ...maxim 20 ...20 si  ceva  mA ... o  baterie  plata  de  genul  Varta  poate  sustine  fara  nici  o  problema  un  astfel  de  consum  minim  1  an  de  zile ...

mult  mai  plauzibila  este  posibilitatea  ca  integratele  folosite  de  chinezi  in  telecomenzile  acestea  plate  sa  fie niste pocnitori   puternic  dependente  de  tensiunea  de  alimentare ... cum  scade  un  pik  tensiunea  furnizata  de  o  baterie  de  proasta  calitate , cum  pac , deformeaza  trenul  original  de  impulsuri  ...

ginditi-va  si  la  aspectul  economic ... daca  tot  ansamblul  costa  fantastica  suma  de  10ron , cu  cit  credeti  ca  a  iesit  pe  poarta  fabricii  ?  maxim  1 usd  banuiesc , iar  la  acest  pret  nu  ai  cum  sa  obtii  si  calitate ...

Link spre comentariu

Nu va contrazic, sunt prea ieftine ca sa o fac. Cert este ca secventa initiala e complet diferita de secventele standard. Nu are START, incepe cu o secventa lunga de 0L, nu am fost curios sa o decodific. Pe de alta parte, pocnitorile astea isi fac treaba fara nicio problema. 

Numai bine! 

Link spre comentariu

am și eu câteva telecomenzi dinastea plate și merg fără probleme cu baterii vechi de 3 - 5 ani. Sunt prea simple ca să meargă prost.

 

la un atmega, în funcție de anumite setări, uC are devoie de până la 32768 CLK ca să iasă din sleep.

Un ESP32 are mult mai multe interfețe de pornit așa că...  Unii pe YT arătau cum că ESP32 ar avea nevoie de până la 3 secunde ca să iasă din deep sleep, dar eu nu cred că ieșirea din sleep poate dura atât de mult.

Apoi mai este și prioritatea pinului legat la senzorul IR. În momentul în care se detectează semnal de la senzorul IR, toate întreruperile trebuie imediat oprite și lăsată să meargă doar partea de program care se ocupă de citire și decodare telecomandă. După ce s-a obținut codul tastei apăsate, întreruperile generale sunt repornite. Altfel orice întrerupere care se activează pe durata citirii, afectează citirea și iese o mare bâlbâială.

 

La toate uC din TV sau radio pe care le-am văzut și care au telecomenzi, partea de recepție și decodare nu intră niciodată în sleep. Iar la multe chestii care au funcția sleep sau power off și întreruperi complicate, cum ar fi tunere PC, recepția și decodarea IR este asigurată de un cip separat care nu intră niciodată în sleep. 

 

să facă teste fără ca ESP32 să mai intre în modul sleep și cu întreruperile oprite. Dacă e din cauza lui ESP32 și vrea neapărat ca să intre în sleep și să folosească întreruperi, trebuie să mai folosească incă un microcontroler mic care să prelucreze codurile telecomenzii și să le trimită gata decodate la ESP32 exact așa cum e în tunerele TV pentru PC.

 

 

 

Link spre comentariu

La unele uC uri mai simple cum ar fi atmega / pic poate ar fi posibila iesirea din sleep pe prima comanda dar la ESPuri in nici un caz, ESP pe deepsleep se opreste in proportie de 99.9% inclusiv continut RAM, iesirea din deepsleep este de fapt o pornire de la rece, se trece prin bootloader si alte functii interne, are nevoie de cateva sute de ms sa poata procesa softul efectiv, cele 3s poate au fost calculate si cu conexiunea la WIFI insa acesta nu e necesar, se pot obtine porniri la cateva sute de ms.

Link spre comentariu
Citat

Apoi mai este și prioritatea pinului legat la senzorul IR. În momentul în care se detectează semnal de la senzorul IR, toate întreruperile trebuie imediat oprite și lăsată să meargă doar partea de program care se ocupă de citire și decodare telecomandă. După ce s-a obținut codul tastei apăsate, întreruperile generale sunt repornite. Altfel orice întrerupere care se activează pe durata citirii, afectează citirea și iese o mare bâlbâială.

nu trebuie sa opresti celelalte intreruperi daca-i dai prioritate la cea de IR. La inceputul codului de IR (prima tranzitie) pornesti un timer cu rezolutie suficienta de timp si la fiecare tranzitie de bit (intrerupere) memorezi valoare timerului in ram (dureaza numai cateva cicluri de ceas sa faci asta si nu poate fi intrerupta de alta intrerupere din cauza prioritatii) - cand expira timerul respectiv (alta intrepere) decodifici ce ai capturat in RAM. Telecomenzile sunt foarte lente fata de executia unui MCU ai o gramada de timp intre tranzitii sa faci o gramada de lucruri. O rutina de intrupere scrisa bine nu are trebui sa dureze mai nult de cateva zeci de cicluri de ceas iar distanta in timp intre tranzitiile bitilor de la telecomanda e mare (zeci de mii de cicluri de ceas) deci executia intreruoerilor e scurta si sporadica daca codul e scris bine.

RR

Editat de roadrunner
Link spre comentariu

ba trebuie să dai prioritate la întreruperea IR. Numai că asta merge doar la 8051 și la procesoarele pentru PC. Nu știu dacă asta e posibil la uC Texas Instruments. La microcontrolerele atmega și pic întreruperile sunt mult simplificate și nu merge să faci asta. Prioritatea e prestabilită dinainte și se poate vedea în tabela vectorilor de întrerupere.

Poți seta un counter să contorizeze singur în funcție de starea unui pin. Doar că la schimbarea stării pinului dacă în momentul acela se execută o altă întrerupere care a oprit întreruperile generale, se sare peste întreruperea care a schimbat starea pinului și care pentru întreruperi imbricate trebuie să facă următoarele:

- să refacă pointerul de memorie IR. La întreruperile imbricate, pentru acest pointer nu poți folosi stiva.

- să citească data din counter și să calculeze cât timp pinul IR a stat în acea stare logică. (timerele numără taman pe dos. Nu e ca la 8051 sau x86 unde poți seta sensul contorizării)

- să o memoreze timpul calculat și să incrementeze pointerul la adresa următoare de memorie

- să reseteze counterul

- să inverseze logica care face întreruperea pe pinul IR (dacă era 0, trebuie să pună 1 sau invers) și să repornească contorizarea.

- să memoreze pointerul de memorie.

- să repornească întreruperile generale (acestea sunt oprite automat în momentul apariției întreruperii la pinii de captură)

 

Iar toată chestia asta trebuie să se repete de 67 de ori până la citirea completă a unui cod IR pe 32 biți. Ca să meargă corect, restul întreruperilor nu ar trebui să se atingă de contorul rezervat pentru IR și să nu lase oprite întreruperile generale pe durata execuției lor. Iar cel mai complicat e cu stiva. Cred că știi că la atmega, în momentul în care apare o întrerupere, prima chestie care o face uC e să opreacă întreruperile generale și abia apoi sare la adresa întreruperii nou apărută. Astfel celelalte întreruperi apărute nu mai sunt luate în considerare. Întreruperile generale sunt repornite de prima instrucțiune RETI, dar pentru întreruperile imbricate trebuie repornite și cu SEI iar RETI devine un simpu RET care nu face decât ca contorul program să sară înapoi unde era când a apărut întreruperea.

 

Dacă astea nu sunt respectate, telecomanda trebuie să emită câteva zeci de coduri până se întâmplă ca unul să fie  recepționat cât de cât corect. Știu asta pentru că am făcut receptoare IR cu întreruperi imbricate. Și e foarte mult de calculat ca să le faci să meargă corect. Și cu toate calculele și aranjamentele, tot e posibil ca în anumite situații citirea codului IR să fie afectată. Cel mai simplu e să nu te legi la cap când nu te doare și să lași întreruperile generale oprite pe toată durata citirii codului IR. Durează numai câteva zecimi de secundă.

Și cu astea, tocmai am spus cum poți citi date seriale pe pinii captură prin întreruperi, fără să stresezi prea mult un uC 😊

Editat de cimitavita
Link spre comentariu

Folosesc un PIC, fara sleep. De ani de zile nu am mai folosit comanda sleep. Dupa cum spuneam, decodificarea tuturor tastelor functioneaza perfect. Ca sa suflu si-n iaurt, folosesc un cuart de 4Mhz si compensez masurarea timpului tranzitiilor inclusiv cu durata instructiunilor executate pana la oprirea/pornirea timer-ului. Am prevazut o marja de eroare adaptata, in functie de durata burstului masurat, ca sa acopere si influienta descarcarii bateriei. 

Link spre comentariu
  • 2 săptămâni mai târziu...

In final, s-a dovedit ca telecomanda cu pricina era un fel de "dick's head dick head", cum ar zice englezii. Cele pe care le-am cumparat nu au meteahna descrisa anterior. Pe langa aceea, are si folia lipita invers, adica semnificatia tastelor e complet aiurea. 

Numai bine! 

Capture.JPG

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări