Avtor: Brian Miller
2018_260_36
Večina nas ima več IR daljincev, ki delujejo z našimi TV-ji ali medijskimi centri. Običajno IR daljinec, ki ga dobimo skupaj z modemom za IP TV, lahko emulira nekatere funkcije drugih naprav. Seveda pa si morate vzeti čas, da sprogramirate te večfunkcijske daljince. Če želimo, da je daljinec “univerzalen”, je ponavadi velik in ima polno majhnih gumbov, ki jih je težko videti v temni sobi. Seveda imajo s tem težave tudi starejši ljudje, ki se težje spoznajo kako vklopiti njihov TV, kako prikazati vsebino iz DVD, spletne TV itd. zaradi kompleksnosti vseh daljincev.
Ali ne obstaja aplikacija za vse to?
Ta vsebina je samo za naročnike
Želel sem uporabiti moj iPad kot vmesnik za moj “univerzalni” daljinec. To pomeni, da bi na IOS napravi tekla aplikacija, ki bi kazala zaslon za vsak daljinec z dovolj velikimi in dobro označenimi gumbi. Prav tako sem čutil, da lahko isto naredim za Android tablico. Podobno lahko naredim tudi za pametni telefon, seveda pa bi bilo potrebno ustrezno pomanjšati velike gumbe za manjši zaslon telefona. Ob tem sem videl tri probleme, ki jih je bilo potrebno rešiti, preden bi ideja zaživela
- Nobena IOS naprava ne vsebuje IR LED, ki bi oddajala IR kode na TV itd., torej moram to rešiti ločeno od IOS naprave. Čeprav imam Samsung Galaxy tablico, ki vsebuje IR LED oddajno diodo, ne obstaja nobena aplikacija za krmiljenje, kar sem ugotovil šele po tem, ko sem tablico kupil.
- Potrebujete sposobnost, da lahko napišete (ali pridobite) aplikacijo z uporabniškim vmesnikom, ki vsebuje gumbe, drsnike itd., ki jih je mogoče enostavno prilagoditi modeliranju videza / funkcionalnosti različnih IR daljincev.
- Morate biti sposobni ponoviti IR kode, ki prihajajo iz vseh vaših IR oddajnikov. Kot sem opisal kasneje v članku, to ni trivialna naloga.
Poglejmo si zdaj posamezne probleme od blizu.
Oddajnik IR kode
Potrebovali bomo majhno ohišje, ki bo vsebovalo IR LED-ico, ki bo oddajala IR kode v TV in podobne naprave. Potrebovali bomo tudi metodo za pošiljanje kod (ko pritisnemo “gumb” na iPad zaslonu) v to ohišje. To bom razložil malce kasneje. Še ena funkcija te enote bo sprejemanje IR kod iz različnih oddajnikov med postopkom “učenja” (kar se bo dogajalo samo enkrat). Edini način komuniciranja med iPad in zunanjo IR enoto je preko Wi-Fi, saj IOS aplikacija, ki sem jo želel uporabiti, ne podpira Bluetooth ali Bluetooth LE. Podobno tudi Android aplikacije uporabljajo Wi-Fi.
Izkazalo se je, da je izvajanje funkcije Wi-Fi v zunanji IR krmilni enoti poceni in enostavno razumljivo. Moja prva implementacija tega projekta približno leto nazaj je vsebovala ESP8266 modul za obdelovanje Wi-Fi povezave, Atmelov ATmega1284 mikrokontroler in 256 kb SPI EEPROM (ki je hranil IR kode). To je delovalo odlično, zato sem takrat ta projekt objavil v reviji Circuit Cellar.
Vendar pa zdaj, ko uporabljam Espressif ESP32 module sem ugotovil, da bi ta projekt lahko naredil samo z ESP32 modulom (in seveda še nujnim IR sprejemnikom in IR LED oddajnikom). Podrobno bom ESP32 vezje in programsko opremo opisal kasneje v članku. Zaenkrat naj omenim, da sem svojo aplikacijo napisal v Arduino IDE (v1.80), ki trenutno podpira ESP32 (in ESP8266).
Aplikacija za tablico
Če niste aktivno udeleženi v pisanju IOS aplikacij je malo verjetno da boste zmožni napisati program, ki bi počel to, kar projekt potrebuje. Potrebovali boste Xcode IDE podjetja Apple in naučiti se boste morali Objektni C (ali Swift), hkrati pa boste morali razumeti veliko API-jev. Morali bi programirati na Apple računalniku v OS X okolju in podjetju Apple plačati “razvojno pristojbino”.
Našel sem poceni IOS aplikacijo z imenom “Mote”, ki omogoča načrtovanje daljinskih nadzornih “zaslonov” s potegni/spusti vmesnikom. Ko razpostavite elemente svojega vmesnika, vsakemu gumbu ali drsniku “določite” string ukaz, ki ga bo iPad oddal preko Wi-Fi omrežja. Lahko izbirate med različnimi oddajnimi protokoli, kot UDP, TCP/IP ali HTTP. Napravite lahko veliko “zaslonov” za vsako vašo napravo. Jaz uporabljam samo en zaslon za en fizični IR daljinec, ki ga emuliram. Lahko pa kombinirate več daljincev na enem iPad zaslonu, saj ima zaslon visoko resolucijo. Fotografija 1A kaže enega od bolj kompleksnih zaslonov daljinca, ki sem ga načrtoval za ta projekt. To je zaslon, ki krmili Fiber-Op (telekom) digitalni sprejemnik. Sem pa tudi dodal Volume Up/Down gumba s katerima krmilim svoj Yamaha avdio sprejemnik.
Za Android naprave sem našel manj sofisticirano (ampak brezplačno) aplikacijo z imenom WiFi TCP/UDP Controller (ki jo najdete v Google Play trgovini). Fotografija 1B kaže ustrezen zaslon daljinca – ni tako dovršen, kot IOS Mote verzija.
Ne glede na to, katero aplikacijo uporabite, sem se odločil za identičen in enostaven protokol za ukaze. Vsakemu gumbu na daljincu določim integer številko. To pošljem v IR oddajnik preko IOS/Android aplikacije kot ASCII string, ki je končan z LF karakterjem. Uporabil sem UDP protokol na portu 40000. Obe aplikaciji morata poznati IP številko IR oddajnika. To IP informacijo pošljem preko ESP32 USB serijskih vrat med zagonom (ko je že povezan na brezžično dostopno točko). Medtem ko ESP32 uporablja DHCP da dobi svojo IP številko, sem svoj ruter nastavil tako, da ESP32 projektu nastavi isto IP številko (drugi ESP32 na mojem omrežju opravlja drugo funkcijo).
Ne delam razlike kateri gumbi pripadajo posameznim daljincem. Vsak potreben gumb iz vseh IR daljincev ima svojo številko. Ko se nahajam v načinu učenja vnesem to številko in potem pritisnem na gumb na ustreznem daljincu. To je narejeno za vsak gumb na vseh daljincih. To se naredi samo enkrat v postopku učenja. Program na ESP32 potem analizira in shrani te IR kode v datoteko (ki jo vzdržuje interni datotečni sistem SPIFFS samega ESP32).
Ko kasneje v načinu delovanja iz tablice sprejmemo to številko gumba preko WiFi UDP sporočila, bo program na ESP32 naložil datoteko (z uporabo številk gumbov) in bo poslal ustrezno IR kodo.
Shranjevanje IR kod
Lahko bi napisali veliko dolgih člankov na temo IR kod – obstaja namreč veliko različnih protokolov in v prihodnosti jih bo še več. Obstaja nekaj metod, ki jih lahko uporabimo za razvoj “univerzalnega” IR daljinca. Podajam dve metodi:
1 metoda
Lahko dostopate do javno dostopne baze IR kod poznane kot LIRC baza (Linux IR Code). To je dobro uveljavljena podatkovna zbirka, ki jo prostovoljci stalno vzdržujejo na način, ki je “prevladujoč iz množice”. Ta podatkovna baza je povezana z aplikacijskimi programi, ki so bili prvotno namenjeni za delovanje v Linux računalnikih. Ti programi omogočajo, da zapisujete kodo iz katerega koli IR daljinca z uporabo modula IR sprejemnika in jih shranite v datoteko s standardiziranim formatom LIRC. Obstajajo tudi programi, ki se izvajajo na različnih MCU-jih in razvojnih ploščah (na primer Raspberry Pi), ki podatke iz te baze uporabljajo za posredovanje IR-kode prek IR LED-ice, ki je priključena na I/O priključek mikrokontrolerja.
V preteklosti sem zgradil daljinski upravljalnik na osnovi AVR-ja, ki je uporabljal te LIRC podatkovne baze, da zagotovim IR-protokol, potreben za prenos potrebnih kodnih gumbov. Tabela 1 prikazuje del vzorčne LIRC tabele za Panasonic TV, glej tabela 1.
Prvi del sekcije (začni z oddajo) vsebuje 12 atributov IR kode (drugi daljinci lahko uporabljajo več atributov, kot prikazani). Drugi del (začni s kodo) vsebuje dejansko obliko signala, ki je značilna za vsak gumb. Vrednost za vsak gumb je lahko od 8 do 32 bitov dolžine. Pisanje kode, ki bo obdelovala različne permutacije LIRC ni trivialno. Program, ki sem ga napisal vsekakor obdeluje IR daljince, ki jih uporabljam, vendar sem vedel, da program ne bo deloval za vse daljince, ki jih trenutno uporabljam.
2 metoda
Lahko napišete svoj program, ki mikrokontrolerju, ki je povezan na IR sprejemni modul omogoča, da analizira kodo različnih IR daljincev. Nato lahko shrani “surovo” kodo. To pomeni, da ne delate nobene predpostavke glede dejanskega protokola, ki ga uporablja daljinec in namesto tega merite vsak vlak IR impulzov in njihovih presledkov posamezno ter shranite kodo kot dolg spisek parametrov in vmesnih presledkov. Na ta način porabite vsaj 5 do 10-krat več spominskega prostora, kot če bi uporabili kompleksno LIRC strukturo. Vendar pa je ta metoda zelo blizu temu, da lahko rečemo, da je dejansko “univerzalna” v smislu s katerimi daljinci bo delovala.
Nedavno sem ugotovil, da IR kod, ki jih uporabljajo novejši digitalni TV sprejemniki ne moremo analizirati z LIRC programom za “snemanje” na moji Raspberry Pi. To velja za nov digitalni TV sprejemnik, ki deluje kot IP-TV sprejemnik, ki ga krmili telekomunikacijsko podjetje preko optičnega kabla neposredno v moj dom. To omenjam zato, ker kljub popularnosti in široki podpori za LIRC bazo podatkov izgleda, da občasno ne zmore obdelati res novih naprav. Zato sem se odločil, da bom nadaljeval z 2. točko tega projekta..
Analiziranje IR kod
Ne glede na to, kateri protokol je uporabljen, vsi IR daljinci delujejo s pošiljanjem impulzov IR svetlobe, ki so ločeni med sabo. Impulz IR svetlobe je amplitudno moduliran na neki nosilni frekvenci. Običajno so nosilne frekvence v področju od 35 do 40 kHz, nekatere pa celo 25 kHz ali 56 kHz. Sliki 1 in 2 sta zaslonski sliki iz mojega osciloskopa. To je signal, ki krmili 2N3904 tranzistor, ki krmili IR LED oddajnik v tem projektu, kjer prikazuje 2 različna daljinca. Lahko vidite impulze skupaj z različnimi presledki med impulzi.
V obeh primerih lahko vidite, da je daljši impulz na začetku. Ta “”sync” impulz omogoča kontrolo avtomatskega ojačenja v IR sprejemniku s čemer meri jakost vhodnega IR signala in ustrezno nastavi ojačenje. V kolikor dovolj povečate te vhodne IR signale boste videli moduliran nosilec in ga boste lahko tudi izmerili. Izhod iz TSMP-1138 IR sprejemnika ima logično 1 kadar ni signala in pade na 0, kadar je IR signal prisoten. Zato je v bistvu invertiran IR signal. Slika 3 kaže TSMP-1138 izhodni signal enega od mojih daljincev.
Slika 4 je približana slika enega od impulzov. Postavil sem kurzor, da bi izmeril en cikel nosilne frekvence, ki znaša 33,3 kHz.
Moduliranje IR impulza na to visoko frekvenco nosilca omogoča IR sprejemnemu modulu, da postavi pasovni filter blizu nosilne frekvence. Zaradi tega filtra je precej bolj imun na neželeno svetlobo, ki je vedno prisotna. Prav neverjetno je, kako fleksibilni ste lahko glede razdalje med daljincem in TV/itd. Pa tudi glede tega, kako dobro/slabo “naciljate” daljinec v TV. Zasluga za to gre predvsem temu pasovnemu filtru in avtomatski kontroli ojačenja (AGC), ki je uporabljena v IR sprejemnem modulu. Drugi razlog, da IR daljinci delujejo tako dobro je v zmogljivih IR LED-icah v daljincu, ki pošljejo zalo močen IR svetlobni signal, saj delujejo na tokovih 50-100 mA. Delovanje pri tako nizkem razmerju signal/pavza IR LED-ice enostavno prenesejo tako visoke tokove brez pregrevanja.
Prednost uporabe specifične nosilne frekvence, ki jo lahko filtriramo v IR sprejemnem modulu nam ni po godu, ko želimo napraviti univerzalni modul “za učenje”. Običajni IR sprejemni moduli, ki so na voljo, so specificirani za določeno nosilno frekvenco, na katero je uglašen tudi pasovni filter. Izhod takšnih modulov je tudi demoduliran signal. To pomeni, da na izhodu dobimo logično 0 celoten čas, ko je prisoten moduliran impulz, in logično 1, ko IR svetloba ni zaznana.
Za namene “učenja” različnih IR kod te moduli predstavljajo dva problema:
- Morali bi uporabiti ločene IR sprejemne module za vsako nosilno frekvenco, ki se uporablja v daljincih ki bi jih želeli emulirati. V praksi bi to lahko naredili s 3 moduli: 25-35 kHz, 35-45 kHz in 45-56 kHz, vendar to še vedno ni dobra možnost.
- Takšni moduli imajo na izhodu demoduliran izhodni signal, zato ne boste mogli vedeti katera nosilna frekvenca je bila uporabljena pri določenem daljincu.
Ugotovil sem, da morate uporabiti poseben IR sprejemni modul, če želite implementirati “učenje”. Te moduli so različni od standardnih IR sprejemnih modulov uporabljenih v širokopotrošnih napravah v naslednjem:
- Imajo širši pasovni filter (tipično 30-60 kHz).
- Ne demodulirajo signala, zato boste imeli na voljo izhodni signal, ki je resnična reprezentacija moduliranih impulzov.
- Zaradi točk 1. in 2. te moduli niti slučajno niso tako fleksibilni v smislu dosega in nenatančnosti ciljanja, kot standardni sprejemniki. Vendar pa boste v postopku “učenja” z daljincem ciljali neposredno v modul na razdalji od pol do 1 m. Pod temi pogoji bodo “učeči se” IR moduli delovali dobro.
Takšen IR sprejemni modul za “učenje” je manj pogost, kot običajni IR sprejemni moduli, ki jih kupite za približno en dolar. Vendar pa sem našel modul podjetja Vishay Semiconductors in izbral njihov TSMP-1138 za ta projekt. Fotografija 2 kaže ta modul – opazili boste, da je precej večji, kot običajni IR sprejemni moduli, ki se uporabljajo za “ne-učeče” module.
Poleg tega, da se te moduli uporabljajo v “učečih se” modulih, se uporabljajo tudi v IR repetitorjih – vezjih, ki omogočajo podaljšanje dosega IR daljinca v druge sobe v hiši. Ker ima TSMP-1138 na izhodu točen signal, ki predstavlja dejansko strukturo IR signala, lahko ta signal pošljete v drugo sobo bodisi preko žice ali brezžično. V drugi sobi ta “surov” signal lahko potem uporabite za krmiljenje IR LED-ice, ki cilja v napravo, ki jo želimo krmiliti.
Ko uporabljamo TSMP-1138 v povezavi z mikrokontrolerjem lahko pričakujemo, da bo izhodni signal na 3,3V. In to logično nizek nivo, ko je IR svetloba prisotna in logično visok nivo, ko IR svetlobe ni. Kar mora mikrokontroler meriti je v bistvu funkcija časa – kako dolgo je IR svetloba prisotna in kako dolgo je ni. To je že narejeno znotraj ESP32 in bom opisal kasneje.
Če pogledate tipično IR kodo boste ugotovili, da morate poznati naslednje:
- Kakšna je nosilna frekvenca? To lahko izmerite tako, da čakate dokler signal iz TSMP-1138 ne gre na logično 0, zaženete časovnik in potem čakate dokler signal ne gre še enkrat na logično 0. Ta čas predstavlja periodo nosilnega signala oziroma frekvence, če jo invertiramo. V praksi sem izmeril čas osmih posameznih ciklov nosilca in bolj natančno določil frekvenco.. Potrebno je omeniti, da bo frekvenca, ki jo uporablja namenski IR daljinec konstantna in se ne spreminja medtem, ko pošiljamo različne kode iz tega daljinca. Tega ne moremo trditi za “univerzalne” daljince, saj oni emulirajo IR protokole.
- Koliko ciklov nosilne frekvence določi dani impulz? To naredite tako, da izmerite čas zaporednih padajočih robov dokler ne najdete časovne razlike, ki je precej večja kot en cikel nosilca (pri najnižji pričakovani frekvenci nosilca, ki znaša 25 kHz oziroma 40 µs). Skupno število teh padajočih robov je število ciklov nosilne frekvence tega določenega impulza.
- Ko ste enkrat določili konec danega impulza moduliranega nosilca, boste izmerili čas do naslednjega impulza. Ta čas se imenuje “Space interval” v LIRC bazi. V velikem številu IR protokolov impulzi sami predstavljajo “držalniki-prostora” to je čas med posameznimi impulzi, ki vsebujejo IR kodo. Pomembna stvar, ki jo je pri tem potrebno omeniti je dolžina teh intervalov med impulzi, ki bodo precej daljši od periode nosilca.
- Koliko impulzov se nahaja v eni IR kodi? To ni enostavno vprašanje. Nekateri IR daljinci pošiljajo ponavljajoče kopije ustrezne kode čeprav smo na hitro pritisnili gumb na daljincu. Nekateri pošljejo enako kodo 2x s tem, da je druga koda majčkeno drugačna od prve na nek določen način (tako, da invertira en ali dva bita v kodi). V naprej ni enostavno vedeti, kakšna je struktura kode danega daljinca. Zato v moji analizi “učenja” stalno snemam vrednosti določene v točkah 2 in 3 zgoraj dokler 1-sekundni interval ne poteče, saj nobena koda ni daljša od 1 sekunde.
Obstaja nekaj pomislekov, ki jih je treba upoštevati pri izvajanju programske opreme za izvajanje zgoraj omenjenega algoritma. V tem trenutku je koristno podrobno preučiti, kako ESP32 obravnava sprejem IR signala in tudi prenos.
ESP32 RMT blok
Obstaja več lastnosti ESP32 vezja, za katere sem menil, da so posebej primerne za ta IR projekt:
- popolna WiFi funkcionalnost, ki jo potrebujemo za ta projekt,
- veliko SRAM-a, ki bo hranil IR podatke, ko prihajajo v analizo v procesu “učenja”,
- dovolj Flash spominskega prostora, v katerega bomo naložili programsko opremo z veliko prostora, ki se ga dodeli SPIFFS sistemu datotek (uporaben za hranjenje vseh “surovih” kod gumbov),
- nadzor periferije (RMT) daljinca.
ESP32 RMT periferija je rahlo unikatni funkcijski blok, ki ga nisem našel v katerem koli drugem mikrokontrolerju, ki sem jih kadarkoli srečal. Ta blok je posebej načrtovan za IR sprejem in oddajo. RMT periferija vsebuje 8 neodvisnih blokov, vsak od njih je lahko konfiguriran bodisi kot IR oddajnik ali IR sprejemnik (posebej za IR namene, to je po moje preveč).
V povezavi s temi 8 funkcijskimi bloki je namenski odsek SRAM-a (tudi v 8 diskretnih blokih), do katerega lahko dostopa bodisi MCU ali 8 funkcijskih blokov RMT. Vsak razdelek RMT ima s tem blokom povezan uporabniško določen GPIO pin, ki je lahko vhodni ali izhodni, odvisno od tega, ali je konfiguriran na način sprejemanja ali oddajanja.
Način IR oddajanja
V tem načinu uporabniški program naloži enega (ali več) blokov SRAM, namenjenega za RMT, z nizom vrednosti, ki določajo valovno obliko, ki jo želite poslati. Vsak element polja je 16-bitna vrednost v naslednji obliki, glej tabelo 2.
BIT # | Definicija |
15 (MSB) | “1” če je signal logično visok, “0” če je signal logično nizek |
14-0 | 15-bit vrednost časa (RMT impulzi ure) ko je ta nivo prisoten |
Tabela 2
Če želite končati ta seznam, naložite zadnji element polja z vrednostjo nič, ki je rezerviran za zaključno vrednost.
Periodo zgoraj omenjenih impulzov je mogoče programirati. Obstaja 8-bitni uporabniško programabilen preskaler med sistemsko uro MCU 80 MHz in blokom RMT. Zato lahko izberete časovne impulze med 3,2 in 12,5 ns. Za IR namene je impulz ure 1µs dobra vrednost za uporabo.
Vsak RMT blok vsebuje tudi generatorja nosilca. To pomeni, da lahko vsak impulz, ki ga pošljemo iz RMT bloka po želji moduliramo na izbrano nosilno frekvenco. Morate samo določiti nosilno frekvenco v RMS konfiguracijski rutini in ta bo izračunala ustrezni faktor deljenja, ki bo generiral to frekvenco nosilca (iz 80 MHz sistemskega takta).
Osem SRAM pomnilniških blokov, povezanih s periferijo RMT, lahko uporabnik dodeli v konfiguracijski rutini. Lahko bi na primer konfigurirali RMT sekcijo 0 kot oddajnik s 6 povezanimi bloki SRAM, in RMT sekcijo 1 kot sprejemnik z dvema povezanima SRAM blokoma.
Ko ste konfigurirali blok RMT in naložili SRAM z želenim vzorcem IR impulzov, lahko pokličete rutino, s katero začnete oddajo. Impulzi bodo nato poslani. To rutino lahko nastavite tako, da počakate, dokler prenos ni končan (tako ga uporabljam jaz) ali da se takoj vrnete (ne blokiran).
IR vlak impulzov se odda v celoti pod kontrolo RMT perifernega vezja: ne glede na naloge, ki bi jih morda zahteval tudi MCU ESP32, to ne vpliva na izvajanje tega IR signala. Za pošiljanje IR signalov v tem projektu uporabljam en oddajni blok RMT in 6 povezanih blokov SRAM.
Način IR sprejema
V tem načinu, periferija RMT spremlja uporabniško določen GPIO pin za prehode. Kadarkoli vidi prehod, v pripadajočem blok SRAM-a poveča vrednost števca. Nato poveča kazalec, tako da naslednji prehod preide v naslednji element matrike RMT SRAM. Ta vrednost štetja prihaja iz 32-bitnega števca, ki ga poganja sistemska ura MCU, prednastavljena z 8-bitnim preskalerjem. Razmerje preskalerja je uporabniško določena vrednost, naložena v register preskalerja. Kot pri prenosu IR, za sprejemnik uporabim periodo merjenja 1 µs.
Ko so IR impulzi sprejeti, se vrednosti nivoja in časovnega zaporedja zaporedno shranjujejo v matriko RMT SRAM-a, dokler ne pride do uporabniško določenega intervala, v katerem ni prehodov. Ko se to zgodi, lahko sprožite prekinitev ali pa lahko občasno preiščete register stanja, da vidite, kdaj je prišlo do tega.
Za več namenov bi način sprejema RMT IR delal precej lepo. Sprejemniku lahko dodelite dovolj blokov RMT-ja 8 SRAM za obdelavo katerega koli demoduliranega IR vlaka impulzov, na katerega boste morda naleteli. Vendar pa morate za obravnavo načina “učenja”, ki ga uporabljam v tem projektu, določiti tudi nosilno frekvenco. Z uporabo prej omenjenega sprejemnega sprejemnika TSMP-1138, bo izhodni signal vseboval posamezno nosilno valovno obliko, ki modulira impulze (kot je prikazano na sliki 4). Torej, celo dolg sinhronizacijski impulz na začetku IR impulznega vlaka lahko vsebuje na stotine nosilnih prehodov. Celoten impulzni vlak bi preobremenil zmogljivost pomnilnika SRAM RMT, čeprav je bilo vseh 8 blokov SRAM dodeljenih sprejemniku RMT.
Blok sprejemnika RMT vsebuje filter špic, ki ga je mogoče programirati. Na začetku sem mislil, da bi lahko uporabil ta filter, da bi integriral nosilce impulzov, potem ko sem opravil prvo merjenje nosilne frekvence daljinca. Vendar je ta filter špic zelo omejen, in z njim niti od daleč nisem mogel izluščiti nosilca.
Na koncu sem uporabil en blok RMT, konfiguriran v načinu sprejema, da bi natančno določil nosilno frekvenco oddajnika daljinca. Toda, da bi analizirali celoten IR vlak impulzov, sem uporabil programsko kodo za spremljanje GPIO pina, ki je bil priključen na izhodni signal TSMP-1138, in za »časovno žigosanje« teh prehodov z iztekom vrednosti mikrosekund, ki izhajajo iz ESP32 funkcije “system-level micros()”. Med zgodnjim preizkušanjem, s fiksnim kvadratnim signalom, ki je bil uporabljen za ta GPIO pin, sem ugotovil, da so bile vrednosti prehodov, ki so bile vrnjene iz mikro () funkcije, dosledne znotraj nekaj µs. To je bilo več kot primerno za merjenje IR impulzov / pavz, ki so običajno v milisekundnem območju.
Analiza IR signala se izvaja v rutini, ki spremlja prehode IR signalov in določa, ali so dovolj kratki, da bi bili posamezni impulzi nosilca. Če je tako, dodaja signal nosilca, dokler se ne prikaže veliko daljše obdobje, kar je čas pavze med impulzi. Nato izračuna čas impulza od vsote časov nosilnega cikla kot tudi naslednji intervalni čas. Te vrednosti so postavljene v matriko v formatu RMT, kot je prikazano v tabeli 2. Obstaja en zaplet: časi med impulzi so včasih daljši od tistega, kar lahko izrazi 15-bitno število, ki predstavlja mikrosekunde (tj. 32,767 milisekund.). Ko se to zgodi, prekinem te dolge intervale (ki jih LIRC definira kot vrzel) v nekaj krajših intervalih in vstavim to število vpisov v matriko. Vsak od teh vnosov je definiran kot pavza, vsota njihovih intervalov pa je enaka dolžini presledka.
Knjižnica C, ki temelji na Arduino na ESP32, vsebuje funkcijo EEPROM (), podobno kot v Arduino/AVR knjižnici. ESP32 sam nima dejanskega EEPROM-a, ESP32 EEPROM funkcija pa uporablja zunanji SPI Flash pomnilnik, ki emulira EEPROM-a. Ker modul ESP32 WROOM-32 vsebuje 4 Mbytes SPI Flash, sem domneval, da lahko dodelite EEPROM matriko, ki je velika vsaj 65.535 bajtov (saj uporablja le 16-bitno naslavljanje). Uporabil sem to polje EEPROM-a za shranjevanje mojih “surovih” kod IR gumbov. Čeprav se prevajalnik ni pritožil, ko sem to pisal, sem kasneje ob zagonu ugotovil, da matrika EEPROM ne sme biti večja od 2048 bajtov – vsaj z rutino knjižnice, kot je trenutno napisana.
To me je ujelo nepripravljenega. Bil sem prisiljen zapustiti to idejo in uporabiti knjižnico Arduino SPIFFS ESP32. Ta zagotavlja datotečni sistem, ki se nahaja v zunanjem SPI Flash pomnilniku, vendar ni omejen na 2048-bajtno omejitev funkcije EEPROM. Ta lahko shranjuje več kodnih gumbov, kot bi jih kadar koli potrebovali.
Vezje
Preuredil sem svoj IR daljinec, ki je temeljil na AVR-ju, na ESP32 zaradi dveh razlogov:
- ESP32 lahko obdela vse funkcije samostojno, razen IR sprejemnika in krmilnega tranzistorja za IR LED oddajnik.
- To je bil dober način, da postanem bolj usposobljen pri pisanju C kode za ESP32 – zlasti glede perifernih funkcij, ki jih niso pokrivale obstoječe Arduino knjižnice.
Slika 5 kaže shemo vezja.
Uporabil sem Adafruit ID3269 ESP32 razvojno ploščo, vendar obstaja veliko podobnih / identičnih plošč, ki so na voljo na eBayu itd.. Napajanje s petimi volti dobim iz USB polnilnika, ki se neposredno priključi na Mikro USB vtičnico razvojne plošče. Obe napetosti, 5V, kot tudi regulirana 3,3V sta na voljo na priključkih razvojne plošče in se uporabljata za gonilnik IR-LED in za TSMP-1138 IR sprejemnik. Stikalo S1 je Mode stikalo. Če napravo vklopite s pritisnjenim S1, se bo zagnala v načinu “Učenje”, sicer se bo zagnala v običajnem načinu dela. Fotografija 3 kaže enoto z odstranjenim pokrovom.
Nalaganje programa in delovanje
Naj najprej omenim, da morate svojemu Arduino IDE dodati funkcionalnost ESP32. Navodila za namestitev za to so na voljo na spletnem mestu Espressif’s GitHub na naslovu: https://github.com/espressif/arduino-esp32
Upoštevajte tudi, da sem vključil mapo z naslovom “ESP32_RMT-master”. To morate postaviti v mapo Arduino “Library” (mapa Library je podmapa tiste, ki vsebuje vaše skice). V tej mapi je knjižnica RMT, ki jo ponuja Espressif, vendar sem v njej naredil obsežne spremembe / dodatke za izvajanje funkcij, potrebnih za ta projekt. Deli kode, ki sem jih dodal / spremenil, so na splošno označeni v polju z komentarji z mojimi začetnicami (BM).
Upoštevajte tudi, da morate v mojem programu spremeniti vrstice 34,35, da prikažete SSID in geslo Wi-Fi. Nato prevedite in naložite kodo v modul ESP32.
Način učenja
Za izvajanje funkcije “Učenje” vklopite napravo s pritisnjenim S1. V tem načinu morate imeti enoto priključeno na osebni računalnik prek USB kabla in imeti vklopljen serijski monitor (to je lahko serijski monitor v Arduino IDE). Enota bo poslala svoj IP # na serijski monitor, ob predpostavki, da je bila uspešna pri povezovanju z vašo dostopno točko Wi-Fi. Nato vas bo naprava vprašala za številko gumba.
Če izberete “0”, bo vstopila v način, v katerem čaka na številko gumba sprejetega prek WiFi iz tabličnega računalnika: v tem primeru nadaljujete s pritiskom enega od gumbov na zaslonu tabličnega računalnika (Fotografija 1). To je pravzaprav najboljši način izvajanja načina učenja, saj se vam ni treba zapomniti, katero številko ste dodelili vsakemu gumbu. Ko izberete številko gumba, usmerite daljinski upravljalnik na sprejemnik TSMP-1138 na razdalji 0,3 – 1,0 m. Hitro se dotaknite gumba, sicer boste prejeli ponovljeno IR kodo. Serijski monitor bo prikazal nekaj informacij o prejetih impulzih / presledkih in sporočilo, da je bila koda shranjena. Poleg tega lahko iz serijskega zaslona določite številko, ki ni enaka nič, in nato pritisnite ustrezni gumb daljinskega upravljalnika. Naredite to za vse potrebne gumbe na vseh daljincih.
Način delovanja
Pri zagonu in če S1 NI pritisnjen, se bo naprava zagnala v načinu delovanja. Če imate serijski monitor priključen prek USB-ja, bo poslal sporočilo, da se je povezal z vašo dostopno točko Wi-Fi in vam dodelil dodeljeni IP #. Kot je bilo že omenjeno, morate v aplikaciji, ki jo uporabljate v tabličnem računalniku, določiti to številko IP. Slika 6 prikazuje zajem zaslona za nastavitev aplikacije IR krmilnika Mote, ki prikazuje parametre, kot sem jih opisal.
V tem načinu samo posluša UDP-pakete, ki prihajajo na Port 40000 in vsebujejo ASCII številke gumbov. Ko jih prejme, bo poslal ustrezno IR-kodo na IR LED in na navadno LED-ico (za prikaz uporabniku, da je prejela sporočilo in pošilja ustrezno kodo). Če imate enoto priključeno na serijski monitor prek USB-ja, boste videli številko gumba, ko jih prejmete. Ko ste ugotovili, da vse deluje, lahko odstranite povezavo USB z računalnikom in jo zamenjate s polnilnikom USB, da napravo napajate.
Reference
TSMP-1138 IR sprejemnik, TSAL6400 IR LED
Vishay Intertechnology, www.vishay.com
Mote IOS App:
Worried Cat LLC, http://www.worriedcat.com
Na voljo v Apple Apps store
Brian2_firmware_and_docs
tabela 1
# this config file was automatically generated # using WinLIRC 0.6.5 (LIRC 0.6.1pre3) on Tue Oct 04 13:28:31 2005 # brand: Panasonic # model: N2QAHB000022 begin remote name Panasonic_N2QAHB000022 bits 32 flags SPACE_ENC eps 50 aeps 100 header 3487 1694 one 449 1264 zero 449 387 ptrail 449 pre_data_bits 16 pre_data 0x4004 gap 73969 toggle_bit 0 begin codes KEY_TV 0x0100BCBD AV 0x0100A0A1 KEY_VOLUMEUP 0x01000405