Kazalo:

Univerzalni daljinski upravljalnik za televizijo - Ardiuino, infrardeči: 5 korakov
Univerzalni daljinski upravljalnik za televizijo - Ardiuino, infrardeči: 5 korakov

Video: Univerzalni daljinski upravljalnik za televizijo - Ardiuino, infrardeči: 5 korakov

Video: Univerzalni daljinski upravljalnik za televizijo - Ardiuino, infrardeči: 5 korakov
Video: сделать умный дом - сделать умный дом дешево 2024, Julij
Anonim
Univerzalni daljinski upravljalnik za televizor - Ardiuino, infrardeči
Univerzalni daljinski upravljalnik za televizor - Ardiuino, infrardeči

Zdravo! V tem navodilu vam bom pokazal, kako sestaviti in programirati svoj lasten univerzalni daljinski upravljalnik, ki bo deloval z večino stvari, ki uporabljajo infrardeči daljinski upravljalnik, in ki bo tudi "poslušal" in dekodiral infrardeči signal, ki ga pošiljajo različni drugi daljinski upravljalniki.

Nekaj ozadja tega, kar me je navdihnilo za izdelavo tega daljinskega upravljalnika - tudi jaz, tako kot večina vas, nenehno izgubljam daljince in ta nesreča je precej frustrirajoča, zato mislim, da jo lahko rešimo! Ta daljinski upravljalnik sem vgradil in ga diskretno vgradil v svoj posteljni okvir po meri (tudi sam sem lesar) - daljinca ne morem izgubiti, če je del mojega okvirja postelje!

Zaloge

Stvari, ki jih potrebujete: -Arduino UNO ali Nano - kilometrina se lahko razlikuje glede na druge plošče

-Opečna deska brez spajkanja (ali spajkalne plošče, če jo želite narediti trajnejšo)

-Jemperji različnih barv in dolžin

-Trenutni potisni gumbi (5) (lahko dodate več gumbov, vendar boste morali uporabiti digitalne zatiče, saj se uporabljajo vsi analogni zatiči razen enega - preučiti morate, ali pravilno uporabljate uporovne upore ali izvlecite upore navzdol in potisnite gumbe)

-10K ohmski upor (5) (če želite več gumbov, jih boste potrebovali več)

-470 ohmski upor (2)

-infrardeča LED

-Rdeča LED

-Infrardeči senzor (uporabil sem številko dela VS1838B, lahko uporabite drugega, samo preverite pin-out)

(Neobvezno) spajkalnik, spajkanje, spajkalni fluks.

1. korak: Izdelava vezja:

Gradnja vezja
Gradnja vezja

1). Vedno rad začnem s postavitvijo svojih komponent, saj to vedno vodi postavitev na plošči.

-Pritisnite gumbe

-LEDS: LED rdeča in IR LED sta povezani skupaj, tako da lahko vidite, kaj počne IR LED.

-Senzor

2). Upori

- Pet 10K uporov, ki smo jih pritrdili na potisne gumbe, se imenuje "pull down" upori. Potegnite upore navzdol in se prepričajte, da ustrezen zatič Arduino dobi 0 voltov (ali vsaj blizu njega), ko pritisnete gumb. Za več informacij o izvlečnih (ali potegljivih) uporov je tukaj poglobljen vodnik:

www.electronics-tutorials.ws/logic/pull-up…

Ti upori morda niso popolnoma potrebni, če pa dobivate "duhovne" pritiske, je to več kot verjetno posledica kapacitivne sklopke in izvlečni upori to preprečijo.

3). Žice vezja

4). 5V in ozemljitvene žice

Za referenco uporabite priloženo sliko! ne bojte se ga spremeniti za svoje potrebe!

2. korak: Koda:

#include const int RECV_PIN = 7; // pin za branje IR senzorja int Button1 = A4; // Najdaljši levi int Button2 = A3; // 2. z leve strani int Button3 = A2; // Srednji int gumb 4 = A1; // 2. na desno int Button5 = A0; // Najdaljši desni int LED = 3; // IR LED & Rdeča LED int val = 0; // Spreminjanje vrednosti IRsend irsend; IRrecv unrecv (RECV_PIN); decode_results rezultati;

void setup () {pinMode (Button1, INPUT); pinMode (Button2, INPUT); pinMode (Button3, INPUT); pinMode (Button4, INPUT); pinMode (Button5, INPUT); pinMode (LED, IZHOD); Serial.begin (9600); unrecv.enableIRIn (); unrecv.blink13 (true);} void loop () {{{if (analogRead (Button1)> 900) irsend.sendNEC (0xFF02FD, 32); // z uporabo analognega branja namesto digitalnega branja, da bi se izognili težavam z lastno kapaciteto. pomaga tudi pri odstranjevanju gumbov. // Analogno branje pri 900 omogoča nekaj prostora za premikanje v vrednostih, kar pomeni, da bo infra signal poslan tudi, če na pin ne bo priloženih polnih 5 V. // vendar je 900 dovolj visoko, da se zaradi zakasnitve kapacitivne sklopke ne zmoti pri branju (100);} // RGB Strip On & off {if (analogRead (Button5)> 900) {for (int i = 0; i <3; i ++) // spreminjanje vrednosti v "i <3" bo spremenilo število krat, ko se signal takoj ponovi. zato bo "i <2" dvakrat ponovil signal. // morda se boste morali poigrati s to številko, če se vaš televizor ne odziva, na splošno 1 ali 3 delujeta največ, če pa ne, poskusite s čudnimi številkami. // morda se boste morali na primer poigrati tudi z vrednostmi časovnega zamika znotraj signala za moj televizor 10, deluje pa 30. {irsend.sendSony (0xa90, 12); // Napajalna koda Sony TV, za moj televizor je treba kodo poslati 3x3, torej 3 impulzi, tri ločene časovne zamude (10); // "zakasnitev znotraj signala" za (int i = 0; i <3; i ++) {irsend.sendSony (0xa90, 12); // "12" je bitna številka, različni protokoli zahtevajo različne bitne številke. NEC je 32, Sony 12, lahko poiščete druge zamude (10); for (int i = 0; i 900) {for (int i = 0; i 900) {for (int i = 0; i 900) {for (int i = 0; i <3; i ++) {irsend.sendSony (0xc90, 12); // Zamuda za zmanjšanje glasnosti (100);}}} zamuda (100);} če (unrecv.decode (& rezultati)) // spodnji del kode omogoča razlago infrardečih signalov z različnih daljinskih upravljalnikov. {Serial.println (results.value, HEX); // ustvaril bo postopek "NEC, Sony, Etc.." in kodo televizorja "c90, a90, FF02FD", ki jo boste morali dodati 0x na sprednjo stran stikala TV kode (results.decode_type) {primer DENON: Serial.println ("DENON"); prekiniti; ohišje NEC: Serial.println ("NEC"); zlom; ohišje PANASONIC: Serial.println ("PANASONIC"); prekiniti; ohišje SONY: Serial.println ("SONY"); prekiniti; ohišje RC5: Serial.println ("RC5"); prekiniti; ohišje JVC: Serial.println ("JVC"); zlom; etui SANYO: Serial.println ("SANYO"); zlom; etui MITSUBISHI: Serial.println ("MITSUBISHI"); prekiniti; ohišje SAMSUNG: Serial.println ("SAMSUNG"); prekiniti; etui LG: Serial.println ("LG"); zlom; ohišje RC6: Serial.println ("RC6"); prekiniti; ohišje DISH: Serial.println ("DISH"); zlom; ohišje SHARP: Serial.println ("SHARP"); zlom; primer WHYNTER: Serial.println ("WHYNTER"); zlom; ohišje AIWA_RC_T501: Serial.println ("AIWA_RC_T501"); zlom; privzeto: velika črka UNKNOWN: Serial.println ("UNKNOWN"); prelom;} unrecv.resume ();}}

3. korak: Globinsko kodiranje: pošiljanje IR signalov

Na vrstice kode se bom skliceval po številki vrstice - za nadaljevanje uporabite to povezavo:

pastebin.com/AQr0fBLg

Najprej moramo z3t0 vključiti IR Remote Library.

Tukaj je povezava do knjižnice:

github.com/z3t0/Arduino-IRremote

Če potrebujete vodnik, kako pravilno prenesti knjižnico in jo namestiti v IDE:

www.arduino.cc/en/guide/libraries

Vrstica 1 vključuje knjižnico.

Nato moramo razglasiti nekaj spremenljivk, vrstice 2-12 to storijo.

Za določitev spremenljivk, ki se ne bodo spremenile, uporabljamo "cost int", vse v eno kategorijo, razen enega.

Za definiranje spremenljivk, ki se bodo spremenile, uporabljamo "int".

Za naš LED pin moramo uporabiti pin z impulznim moduliranjem (PWM) - vsak pin, ki ima zraven "~", bo v moji kodi dovolj - uporabljamo digitalni pin 3.

Nato moramo narediti nekaj nastavitev - ta koda se bo zagnala samo enkrat, ko bo Arduino vklopljen ali ponastavljen.

Upoštevajte, da definiramo naše vhode in izhode (15-20), vžgemo serijski monitor (21), omogočimo IR senzor (22) in povemo, da Arduino utripa vgrajeno LED, kadar koli v senzorju dobimo signal (23).

Nato bomo zgradili našo zanko - ta koda se bo izvajala večkrat, od zgoraj navzdol pa nekajkrat na sekundo.

V vrstici 25 uporabljamo stavek if, ki pove Arduinu "poišči ta posebna merila, če so ta merila izpolnjena, naredi to posebno stvar". V tem primeru je merilo analogRead (Button1)> 900 ali z drugimi besedami - "Arduino, poglej gumb1, ki smo ga prej opredelili kot pin A4, če je sprejeti analogni signal večji od 900, nadaljujte z naslednjimi navodili, če ne, nadaljujte «. Tukaj je še nekaj za razpakirati, zato se potopimo: analogni signal na Arduinu je vrednost enaka ali manjša od 5V, pri čemer je 5V enako 1023, 0V pa 0. Vsako dano napetost med 0 in 5V lahko definiramo z številko in z malo matematike lahko ugotovimo to število ali obratno napetost. 1024 (vključimo 0 kot enoto) s 5, tako da dobimo 204,8. Na primer, uporabljamo številko 900, če to prevedemo v napetost, preprosto delimo 900 z 204,8, kar nam daje ~ 4,4 V. Arduinu govorimo, naj poišče napetost, večjo od ~ 4,4 voltov, in če je, naredite naslednje navodilo.

Ko govorimo o naslednjih navodilih (vrstica 25), vidimo irsend.sendNEC (0xFF02FD, 32). To pravi "Arduino, pošlji moduliran impulz, ki sledi protokolu NEC, natančneje signalu FF02FD, in poskrbi, da bo dolg 32 bitov". Tako bo naša IR LED utripala tako, da jo bodo druge naprave razumele. Pomislite malo na Morsejevo abecedo, vendar le z nevidno svetlobo! Obstaja veliko različnih protokolov, od katerih ima vsak na stotine, če ne na tisoče posameznih signalov, in vsak s svojo posebno številko bitov - naša naprava bo lahko prepoznala veliko teh signalov, vendar se bomo v to poglobili kasneje!

Na 28. vrstici imamo prvo zamudo - to je zato, da preprečimo nenamerne ponavljajoče se signale. Ko pritisnemo gumb in pošljemo IR signal, imamo 100 milisekund, da odmaknemo prst od gumba. to ne zveni veliko časa, v praksi pa se zdi, da deluje dobro. funkcija zakasnitve pove Arduinu "ne delaj nič X milisekund", za referenco pa so 1000 milisekund v sekundi.

Prehajamo na naslednji gumb pri vrstici 29, button5 (prvotno sem imel na tem daljinskem upravljalniku 4 gumbe, dodal še petega, zato nismo v redu). V duhu je to isto kot gumb 1, vendar z nekaj ključnimi razlikami. Prva razlika, ki jo boste videli, je stavek for - to je v bistvu druga zanka - zanka z v drugi večji zanki, loopception. Natančneje imamo "for (int i = 0; i <3; i ++)", preberite to kot "Arduino, začnimo pri 0, ponavljajte naslednja navodila, dokler ne pridemo do 3 -krat". Funkcija for se uporablja, ker je veliko naprav programiranih za iskanje ponavljajočega se signala, v našem primeru pa trikrat. Številko 3 lahko preprosto spremenite v drugo številko, če vaša naprava zahteva drugačen urnik ponovitev. Druga ključna razlika pri gumbu 5 je, da se ponovi znova, 3 -krat ali 3x3. Z drugimi besedami, signal pošljemo 3 -krat, počakamo 10 milisekund, ga pošljemo še 3 -krat, počakamo še 10 milisekund in ga nato še trikrat pošljemo. Ta vrsta komunikacije je običajna za vklop in izklop naprav in je lahko samo tisto, kar zahteva televizor ali naprava - ključ do tega je, da se poigravate z vsemi spremenljivkami, dokler ne dobite želenega rezultata. Spremenite vrednost kratke zakasnitve, spremenite vrednost za ponavljanje, pošljite 6 serij namesto 3 itd. Naprave so namenoma programirane s poljubnimi pravili signala, predstavljajte si, če je daljinski upravljalnik televizorja poslal signal iste vrste kot vaša zvočna vrstica; vsakič, ko spremenite kanal na televizorju, se zvočna vrstica izklopi - zato obstajajo druga pravila za signal.

Naslednji trije gumbi so programirani z istimi principali, vsaj delno opisanimi zgoraj - tako da lahko preskočimo vse do vrstice 55.

4. korak: Globinska koda: sprejem IR signalov

Globinska koda: sprejem IR signalov
Globinska koda: sprejem IR signalov

V vrstici 55 začnemo programirati Arduino za razlago IR signalov, ki jih pošiljajo drugi daljinski upravljalniki - to je potrebno, da lahko ugotovite protokole in signale, ki jih uporabljajo vaši daljinski upravljalniki. Prva vrstica kode v vrstici 55 je, če se (unrecv.decode (& results) to prebere kot "Arduino, poiščite kodo IR, če jo najdete, vrnite pravo vrednost, če nič ne najdete, vrnite false. Ko je vrednost true, zapišite informacije v "rezultate" ".

Če preidemo na vrstico 56, imamo Serial.println (results.value, HEX), ki pravi "Ardunio, natisni rezultate v serijskem monitorju v formatu HEX". Hex, kar pomeni šestnajstiško, je način, kako lahko skrajšamo binarni niz (samo 0 in 1) v nekaj, kar je lažje tipkati. Na primer 101010010000 je "a90", koda, ki se uporablja za izklop in vklop televizorja, in 111111110000001011111101 je 0xFF02FD, ki nadzoruje moj RGB trak. Z zgornjim grafikonom lahko pretvorite binarno datoteko v šestnajstiško in obratno ali pa uporabite naslednjo povezavo:

www.rapidtables.com/convert/number/hex-to-…

Do vrstice 57 imamo novo funkcijo, imenovano stikalo.

V bistvu nam stikalni primer omogoča, da določimo različna navodila na podlagi rezultatov dane spremenljivke (primera). prekinitev zapusti stavek switch in se uporablja na koncu vsakega stavka.

Tu uporabljamo ohišje stikala, da spremenimo način tiskanja v serijskem monitorju na podlagi protokolov, ki jih zaznava Arduino z različnih daljincev.

5. korak: Zaključek

Če imate vprašanje - se obrnite na mene tukaj! Z veseljem vam poskušam pomagati po svojih najboljših močeh.

Upam, da ste se naučili nekaj, kar vam bo pomagalo izboljšati življenje!

-RB

Priporočena: