Përmbajtje:

Telekomandë Universale TV - Ardiuino, Infrared: 5 Hapa
Telekomandë Universale TV - Ardiuino, Infrared: 5 Hapa

Video: Telekomandë Universale TV - Ardiuino, Infrared: 5 Hapa

Video: Telekomandë Universale TV - Ardiuino, Infrared: 5 Hapa
Video: 🔥🔥Теперь ваш пульт будет работать вечно! Просто вставьте в него зарядное устройство 2024, Nëntor
Anonim
Telekomandë Universale TV - Ardiuino, Infrared
Telekomandë Universale TV - Ardiuino, Infrared

Përshëndetje! Në këtë udhëzues, unë do t'ju tregoj se si të ndërtoni dhe programoni telekomandën tuaj universale që do të funksionojë me shumicën e gjërave që përdorin një telekomandë infra të kuqe, dhe që gjithashtu do të "dëgjojë" dhe deshifrojë një sinjal infra të kuqe të dërguar nga telekomanda të ndryshme.

Pak prejardhje për atë që më frymëzoi për të ndërtuar këtë telekomandë - unë, si shumica prej jush, i humbas telekomandat e mia vazhdimisht, dhe kjo fatkeqësi është mjaft zhgënjyese, kështu që mendoj se e zgjidh atë! Unë e kam ndërtuar këtë telekomandë dhe e kam futur në mënyrë diskrete në kornizën time të shtratit të ndërtuar me porosi (unë jam gjithashtu një punues druri) - nuk mund ta humbas telekomandën nëse është pjesë e kornizës sime të krevatit!

Furnizimet

Gjërat që do t'ju nevojiten: -Arduino UNO ose Nano - kilometrazhi mund të ndryshojë me bordet e tjera

-Burboard pa saldim (ose shirita të saldueshëm nëse dëshironi ta bëni atë më të përhershëm)

-Jumperwires me ngjyra dhe gjatësi të ndryshme

- Butona lëvizës (5) (mund të shtoni më shumë butona, por do t'ju duhet të përdorni kunja dixhitale, pasi të gjitha, përveç 1 të kunjave analoge, përdoren - do të duhet të shikoni që të siguroheni që përdorni siç duhet rezistorët tërheqës, ose tërhiqni rezistencat dhe hiqni butonat e shtypjes)

-Rezistencë 10K Ohm (5) (nëse dëshironi më shumë butona, do t'ju nevojiten më shumë prej tyre)

Rezistencë -470 Ohm (2)

-LED me rreze infra të kuqe

-LED i kuq

-Sensor infra të kuqe (kam përdorur numrin e pjesës VS1838B, ju mund të përdorni një tjetër, thjesht kontrolloni daljen)

(Opsionale) Hekuri i saldimit, salduesi, fluksi i saldimit.

Hapi 1: Ndërtimi i qarkut:

Ndërtimi i qarkut
Ndërtimi i qarkut

1) Gjithmonë më pëlqen të filloj me përcaktimin e përbërësve të mi, pasi kjo gjithmonë drejton paraqitjen në dërrasën e bukës.

-Shtypni butonat

-LEDS: LED i Kuq dhe LED LED janë të lidhur së bashku, kështu që ju mund të shihni se çfarë po bën LED LED.

-Sensor

2). Rezistencat

- Pesë rezistencat 10K që i kemi bashkangjitur butonave të shtypjes quhen rezistorë "tërheq poshtë". Tërhiqni poshtë rezistorët sigurohuni që kur një buton shtypi nuk shtypet, kunja përkatëse Arduino merr 0 Volt (ose të paktën afër saj). Për më shumë informacion mbi rezistencat tërheqëse (ose tërheqëse) këtu është një udhëzues i thelluar:

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

Këta rezistorë mund të mos jenë plotësisht të nevojshëm, por nëse jeni duke marrë shtytje "fantazmë", kjo ka më shumë të ngjarë të shkaktohet nga bashkimi kapacitiv dhe rezistencat e tërheqjes poshtë parandalojnë këtë.

3). Telat e qarkut

4). 5V dhe tela tokësore

Përdorni fotografinë e dhënë për referencë! mos kini frikë ta ndryshoni atë për nevojat tuaja!

Hapi 2: Kodi:

#përfshi const int RECV_PIN = 7; // Sensori IR lexon pin int Button1 = A4; // Butoni më i majtë int int2 = A3; // 2 nga e majta butoni int = A2; // Butoni i mesëm int4 = A1; // 2 në të djathtë int Button5 = A0; // Më së largu në të djathtë int LED = 3; // IR LED & LED i kuq int val = 0; // Ndryshimi i vlerës IRsend irsend; IRrecv irrecv (RECV_PIN); rezultatet e deshifrimit të rezultateve;

void setup () {pinMode (Button1, INPUT); pinMode (Button2, INPUT); pinMode (Butoni 3, HYRJA); pinMode (Button4, INPUT); pinMode (Button5, INPUT); pinMode (LED, OUTPUT); Serial.filloj (9600); irrecv.enableIRIn (); irrecv.blink13 (e vërtetë);} lak void () {{{nëse (analogRead (Button1)> 900) irsend.sendNEC (0xFF02FD, 32); // përdorimi i leximit analog në vend të leximit dixhital për të shmangur çështjet e kapacitetit të kapur. gjithashtu, ndihmon në heqjen e butonave. // Të kesh lexim analog në 900 lejon që një dhomë të lëvizë në vlerat, që do të thotë, sinjali infra do të dërgohet edhe nëse një 5V i plotë nuk aplikohet në kunj. // por 900 është mjaft i lartë për të mos lexuar gabimisht për shkak të vonesës së bashkimit kapacitiv (100);} // RGB Strip On & Off {if (analogRead (Button5)> 900) {për (int i = 0; i <3; i ++) // ndryshimi i vlerës në "i <3" do të ndryshojë numrin e herëve që sinjali përsëritet menjëherë. kështu që "i <2" do ta përsërisë sinjalin dy herë. // mund t'ju duhet të luani me këtë numër nëse TV juaj nuk përgjigjet, në përgjithësi, 1 ose 3 funksionojnë më së shumti, nëse jo, provoni numra tek. // ju gjithashtu mund të keni nevojë të luani me vlerat e kohës së vonesës brenda sinjalit, për shembull, për TV tim 10, por 30 jo. {irsend.sendSony (0xa90, 12); // Kodi i energjisë i TV Sony, për TV tim, kodi duhet të dërgohet 3x3, kështu që 3 pulse, tre herë të veçanta vonesë (10); // "vonesa brenda sinjalit" për (int i = 0; i <3; i ++) {irsend.sendSony (0xa90, 12); // "12" është numri i bitit, protokolle të ndryshëm kërkojnë numra të ndryshëm bit. NEC është 32 vjeç, Sony është 12 vjeç, mund të kërkoni vonesën e të tjerëve (10); për (int i = 0; i 900) {për (int i = 0; i 900) {për (int i = 0; i 900) {për (int i = 0; i <3; i ++) {irsend.sendSony (0xc90, 12); // Vonesa e zvogëlimit të vëllimit të fuqisë së televizorit Sony (100);}}} vonesë (100);} nëse (irreqv.decode (& rezultatet)) // pjesa e mëposhtme e kodit ju mundëson të interpretoni sinjale infra të kuqe nga telekomandat e ndryshme. {Serial.println (results.value, HEX); // do të gjenerojë procedurën "NEC, Sony, Etj.." dhe një kod televiziv "c90, a90, FF02FD" do t'ju duhet të shtoni 0x në pjesën e përparme të ndërruesit të Kodit TV (results.decode_type) {case DENON: Serial.println ("DENON"); pushim; rasti NEC: Serial.println ("NEC"); pushim; rast PANASONIC: Serial.println ("PANASONIC"); pushim; rasti SONY: Serial.println ("SONY"); pushim; rasti RC5: Serial.println ("RC5"); pushim; rasti JVC: Serial.println ("JVC"); pushim; rasti SANYO: Serial.println ("SANYO"); pushim; rasti MITSUBISHI: Serial.println ("MITSUBISHI"); pushim; rasti SAMSUNG: Serial.println ("SAMSUNG"); pushim; rast LG: Serial.println ("LG"); pushim; rasti RC6: Serial.println ("RC6"); pushim; rasti DISH: Serial.println ("DISH"); pushim; rast SHARP: Serial.println ("SHARP"); pushim; rasti WHYNTER: Serial.println ("WHYNTER"); pushim; rasti AIWA_RC_T501: Serial.println ("AIWA_RC_T501"); pushim; parazgjedhje: rasti I PANJOHUR: Serial.println ("I PANJOHUR"); pushim;} irrecv.resume ();}}

Hapi 3: Kodi në thellësi: Dërgimi i sinjaleve IR

Unë do t'i referohem rreshtave të kodit me numrin e tyre të linjës - për të ndjekur së bashku, përdorni këtë lidhje:

pastebin.com/AQr0fBLg

Së pari, ne duhet të përfshijmë Bibliotekën në distancë IR nga z3t0.

Këtu keni një lidhje me bibliotekën:

github.com/z3t0/Arduino-IRremote

Nëse keni nevojë për një udhëzues sesi të shkarkoni një bibliotekë dhe ta instaloni atë në IDE:

www.arduino.cc/en/guide/libraries

Linja 1 përfshin bibliotekën.

Tjetra, ne duhet të deklarojmë disa ndryshore, rreshtat 2-12 e bëjnë këtë.

Ne përdorim "cost int" për të përcaktuar variablat që nuk do të ndryshojnë, të gjithë përveç një të kësaj kategorie.

Ne përdorim "int" për të përcaktuar ndryshoret që do të ndryshojnë.

Ne duhet të përdorim një kunj me impuls me modulim (PWM) për kunjin tonë LED - çdo kunj që ka "~" pranë tij do të jetë e mjaftueshme, në kodin tim - ne përdorim pinin dixhital 3.

Tjetra, duhet të bëjmë disa konfigurime - ky kod do të funksionojë vetëm një herë kur Arduino të aktivizohet ose rivendoset.

Vini re se ne jemi duke përcaktuar hyrjet dhe daljet tona (15-20), ndezim monitorin serik (21), mundësojmë sensorin IR (22), dhe i themi Arduino-s të ndezë LED-in e bordit sa herë që marrim një sinjal në sensor (23).

Tjetra, ne do të ndërtojmë lakun tonë - ky kod do të funksionojë në mënyrë të përsëritur, duke shkuar nga lart poshtë, një grusht herë në sekondë.

Në rreshtin 25, ne përdorim një deklaratë if, kjo i thotë Arduino -s "kërkoni këtë kriter specifik, nëse ato kritere plotësohen, bëni këtë gjë specifike". Në këtë rast, kriteret janë analogRead (Button1)> 900, ose thënë ndryshe - "Arduino, Shikoni butonin1, të cilin e kemi përcaktuar si pin A4 më herët, nëse sinjali analog i marrë është më i madh se 900, ju lutemi vazhdoni me udhëzimet tona të ardhshme, nëse jo, ju lutemi vazhdoni ". Ka pak për t'u shpaketuar këtu, kështu që le të zhyteni: një sinjal analog në Arduino është një vlerë e barabartë ose më e vogël se 5V, me 5V e barabartë me 1023, dhe 0V e barabartë me 0. Çdo tension i dhënë midis 0 dhe 5V mund të përcaktohet nga një numër, dhe me pak matematikë, ne mund ta kuptojmë atë numër, ose anasjelltas, një tension. Ndani 1024 (ne përfshijmë 0 si njësi) me 5, që na jep 204.8. Për shembull, ne përdorim numrin 900, për ta përkthyer atë në tension, ne thjesht ndajmë 900 me 204.8, duke na dhënë 4.4V. Ne po i themi Arduino -s të kërkojë një tension më të madh se 4 4.4 volt, dhe nëse është, bëni udhëzimin tonë të ardhshëm.

Duke folur për udhëzimet e ardhshme (rreshti 25), ne shohim irsend.sendNEC (0xFF02FD, 32). Kjo thotë "Arduino, dërgoni një impuls të moduluar që ndjek protokollin NEC, veçanërisht sinjalin FF02FD, dhe sigurohuni që të jetë 32 bit i gjatë". Kjo do të bëjë që drita jonë IR IR të ndizet në atë mënyrë që pajisjet e tjera mund ta kuptojnë. Mendoni pak si Morse Code, por vetëm me dritë të padukshme! Ka shumë protokolle të ndryshme atje, secili me qindra, nëse jo mijëra sinjale individuale, dhe secili me numrin e tyre specifik të bitit - pajisja jonë do të jetë në gjendje të njohë një sasi të madhe të këtyre sinjaleve, por ne do të zhyten në këtë më vonë!

Në rreshtin 28, kemi vonesën tonë të parë - kjo është këtu për të parandaluar sinjalet e përsëritura të paqëllimshme, pasi të shtyhet butoni dhe të dërgohet sinjali IR, kemi 100 milisekonda për të hequr gishtin nga butoni. kjo nuk tingëllon si shumë kohë, por në praktikë, duket se funksionon mirë. funksioni i vonesës i thotë Arduino -s "mos bëni asgjë për X milisekonda" dhe për referencë, ato janë 1000 milisekonda në një sekondë.

Duke kaluar në butonin tonë tjetër në rreshtin 29, butoni 5 (Unë fillimisht kisha 4 butona në këtë telekomandë, shtova një të pestën, kështu që kjo është arsyeja pse ne jemi jashtë funksionit). Kjo, në shpirt, është e njëjta gjë si butoni 1, por me disa dallime kryesore. Dallimi i parë që do të shihni është një deklaratë for - kjo është në thelb një lak tjetër - një lak me një lak tjetër më të madh, loopception. Konkretisht kemi "për (int i = 0; i <3; i ++)", lexoni këtë si "Arduino, le të fillojmë në 0, përsërisim udhëzimet e mëposhtme derisa të arrijmë në 3 herë". Funksioni for përdoret sepse shumë pajisje janë programuar për të kërkuar një sinjal të përsëritur, dhe në rastin tonë këtu, 3 herë. Ju thjesht mund ta ndryshoni numrin 3 në një numër tjetër nëse pajisja juaj kërkon një orar të ndryshëm përsëritjesh. Një tjetër ndryshim kryesor me butonin5 është se ai përsëritet përsëri, 3 herë, ose 3x3. Me fjalë të tjera, ne e dërgojmë sinjalin 3 herë, presim 10 milisekonda, e dërgojmë përsëri 3 herë, presim 10 milisekonda të tjera dhe pastaj e dërgojmë përsëri 3 herë. Ky lloj komunikimi është i zakonshëm për ndezjen dhe fikjen e pajisjeve dhe mund të jetë vetëm ajo që kërkon TV ose pajisja juaj - çelësi për këtë është të luani me të gjitha variablat derisa të merrni rezultatin e dëshiruar. Ndryshoni vlerën e vonesës së shkurtër, ndryshoni vlerën e përsëritjes, dërgoni 6 tufa në vend të 3, etj. Pajisjet janë programuar me rregulla arbitrare të sinjalit, imagjinoni nëse telekomanda juaj televizive do të dërgonte të njëjtin sinjal si shiriti juaj i zërit; sa herë që ndryshoni kanalin në televizorin tuaj, shiriti i zërit tuaj mbyllet - kjo është arsyeja pse ka rregulla të ndryshme të sinjalit.

Tre butonat e ardhshëm janë programuar me të njëjtat parime, të paktën pjesërisht, të përshkruara më sipër - kështu që ne mund të kalojmë deri në rreshtin 55.

Hapi 4: Kodi në thellësi: Marrja e sinjaleve IR

Kodi në thellësi: Marrja e sinjaleve IR
Kodi në thellësi: Marrja e sinjaleve IR

Në rreshtin 55, ne fillojmë të programojmë Arduino për të interpretuar sinjalet IR të dërguara nga telekomandat e tjera - kjo është e nevojshme në mënyrë që të kuptoni protokollet dhe sinjalet që përdorin telekomandat tuaja. Rreshti i parë i kodit në rreshtin 55 është nëse (uncrecv.decode (& results) lexoni këtë si "Arduino, kërkoni një kod IR, nëse gjeni një, ktheni një vlerë të vërtetë, nëse asgjë nuk gjendet, kthejeni false. Kur është e vërtetë, regjistroni informacioni në "rezultate" ".

Duke kaluar në linjën 56, ne kemi Serial.println (results.value, HEX) kjo thotë "Ardunio, printo rezultatet në monitorin serik në një format HEX". Hex, që do të thotë heksadecimal, është një mënyrë që ne mund të shkurtojmë një varg binar (vetëm 0 dhe 1) në diçka pak më të lehtë për tu shtypur. Për shembull 101010010000 është "a90", kodi i përdorur për të fikur dhe ndezur televizorin tim, dhe 111111110000001011111101 është 0xFF02FD, i cili kontrollon shiritin tim RGB. Ju mund të përdorni tabelën e mësipërme për të kthyer binarin në gjashtëkëndësh, dhe anasjelltas, ose mund të përdorni lidhjen e mëposhtme:

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

Në linjën 57, ne kemi një funksion të ri, të quajtur një rast kalimi.

Në thelb, një rast kalimi na lejon të specifikojmë udhëzime të ndryshme bazuar në rezultatet e një ndryshoreje të dhënë (rasti). pushimi del nga deklarata switch, dhe përdoret në fund të secilës deklaratë.

Ne përdorim kutinë e kalimit këtu për të ndryshuar mënyrën e printimit në monitorin serik bazuar në protokollet që Arduino ndjen nga telekomandat e ndryshme.

Hapi 5: Përfundimi

Nëse keni ndonjë pyetje - ju lutem mos ngurroni të më kontaktoni këtu! Unë jam i lumtur të përpiqem t'ju ndihmoj sa më mirë.

Shpresoj se keni mësuar diçka që mund ta përdorni për ta bërë jetën tuaj pak më të mirë!

-RB

Recommended: