Turinys:

„Universal TV Remote“- „Ardiuino“, infraraudonųjų spindulių ryšys: 5 žingsniai
„Universal TV Remote“- „Ardiuino“, infraraudonųjų spindulių ryšys: 5 žingsniai

Video: „Universal TV Remote“- „Ardiuino“, infraraudonųjų spindulių ryšys: 5 žingsniai

Video: „Universal TV Remote“- „Ardiuino“, infraraudonųjų spindulių ryšys: 5 žingsniai
Video: On-off led using TV remote with IR sensor #shorts 2024, Liepa
Anonim
„Universal TV Remote“- „Ardiuino“, infraraudonųjų spindulių
„Universal TV Remote“- „Ardiuino“, infraraudonųjų spindulių

Sveiki! Šioje pamokoje aš jums parodysiu, kaip sukurti ir užprogramuoti savo universalų nuotolinio valdymo pultą, kuris veiks su daugeliu dalykų, kuriuose naudojamas infraraudonųjų spindulių nuotolinio valdymo pultas, ir kuris taip pat „klausys“ir dekoduos įvairių kitų nuotolinio valdymo pultelių siunčiamą infraraudonųjų spindulių signalą.

Šiek tiek informacijos apie tai, kas mane įkvėpė sukurti šį nuotolinio valdymo pultą - aš, kaip ir dauguma jūsų, nuolat prarandu nuotolinio valdymo pultus, ir ši nelaimė yra gana varginanti, todėl manau, kad galime ją išspręsti! Aš sukūriau šį nuotolinio valdymo pultą ir diskretiškai įterpiau jį į savo pagal užsakymą pastatytą lovos rėmą (aš taip pat esu medžio apdirbėjas) - negaliu pamesti nuotolinio valdymo pulto, jei jis yra mano lovos rėmo dalis!

Prekės

Jums reikalingi dalykai: -Arduino UNO arba Nano - rida gali skirtis priklausomai nuo kitų lentų

-Lydmetalinė lentelė (arba lituojama juostelė, jei norite ją padaryti patvaresnę)

-Įvairių spalvų ir ilgių megztiniai

- Įprasti mygtukai (5) (galite pridėti daugiau mygtukų, tačiau turėsite naudoti skaitmeninius kaiščius, nes naudojami visi, išskyrus 1, analoginius kaiščius - turėsite pasidomėti, ar tinkamai naudojate traukiamus rezistorius arba nuimkite rezistorius ir atjunkite mygtukus)

-10K omų rezistorius (5) (jei norite daugiau mygtukų, jums reikės daugiau šių)

-470 omų rezistorius (2)

-Infraraudonųjų spindulių šviesos diodas

-raudonas šviesos diodas

-Infraraudonųjų spindulių jutiklis (aš naudoju dalies numerį VS1838B, galite naudoti kitą, tiesiog patikrinkite kontaktą)

(Pasirinktinai) Lituoklis, Lituoklis, Lituoklio srautas.

1 žingsnis: grandinės kūrimas:

Grandinės statymas
Grandinės statymas

1). Man visada patinka pradėti nuo komponentų išdėstymo, nes tai visada lemia maketo išdėstymą.

-Paspauskite mygtukus

-LEDS: raudonas šviesos diodas ir IR šviesos diodas yra prijungti kartu, todėl galite pamatyti, ką veikia IR šviesos diodas.

-Jutiklis

2). Rezistoriai

- Penki 10K rezistoriai, kuriuos pritvirtinome prie mygtukų, vadinami „nuleidžiamais“rezistoriais. Nuleiskite rezistorius žemyn ir įsitikinkite, kad kai nepaspaudžiamas mygtukas, atitinkamas „Arduino“kaištis gauna 0 voltų (arba bent jau arti jo). Norėdami gauti daugiau informacijos apie nuleidžiamus (arba pakeliamus) rezistorius, čia yra išsamus vadovas:

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

Šie rezistoriai gali būti visiškai nereikalingi, tačiau jei jūs gaunate „vaiduoklių“stūmimus, tai greičiausiai sukelia talpinė jungtis ir nuleidžiami rezistoriai to neleidžia.

3). Grandinės laidai

4). 5 V ir antžeminiai laidai

Naudokite pateiktą paveikslėlį kaip nuorodą! nebijokite pakeisti jo pagal savo poreikius!

2 žingsnis: kodas:

#include const int RECV_PIN = 7; // IR jutiklio skaitymo kaištis int Mygtukas1 = A4; // Toliausiai kairėje esantis mygtukas2 = A3; // 2 -as iš kairės int Button3 = A2; // Vidurinis int mygtukas4 = A1; // 2 į dešinę int Button5 = A0; // Toliausiai į dešinę int LED = 3; // IR šviesos diodas ir raudonas šviesos diodas int val = 0; // Vertės keitimas IRsend irsend; IRrecv irrecv (RECV_PIN); decode_results rezultatai;

void setup () {pinMode (Button1, INPUT); pinMode (mygtukas2, Įvestis); pinMode (mygtukas 3, Įvestis); pinMode (mygtukas 4, Įvestis); pinMode (5 mygtukas, Įvestis); pinMode (LED, OUTPUT); Serial.begin (9600); irrecv.enableIRIn (); irrecv.blink13 (true);} void loop () {{{if (analogRead (Button1)> 900) irsend.sendNEC (0xFF02FD, 32); // naudojant analoginį skaitymą, o ne skaitmeninį skaitymą, kad būtų išvengta nelaisvės talpos problemų. taip pat padeda išjungti mygtukus. // Jei analoginis nuskaitymas yra 900, reikšmės gali šiek tiek svyruoti, o tai reiškia, kad infra signalas bus siunčiamas, net jei kaiščiui netaikomas visas 5 V. // bet 900 yra pakankamai aukštas, kad neskaitytų klaidingai dėl talpinio sujungimo uždelsimo (100);} // RGB juostos įjungimas ir išjungimas {if (analogRead (Button5)> 900) {for (int i = 0; i <3; i ++) // pakeitus reikšmę „i <3“, signalas kartojamas iš karto. taigi „i <2“du kartus pakartos signalą. // jums gali tekti žaisti su šiuo numeriu, jei jūsų televizorius nereaguoja, dažniausiai veikia 1 arba 3, o jei ne, pabandykite nelyginius skaičius. // jums taip pat gali tekti žaisti su vidinio signalo uždelsimo laiko reikšmėmis, pavyzdžiui, mano TV 10 veikia, bet 30 ne. {irsend.sendSony (0xa90, 12); // „Sony TV“maitinimo kodas, mano televizoriui, kodas turi būti siunčiamas 3x3, taigi 3 impulsai, trijų atskirų kartų uždelsimas (10); // "vidinis signalo uždelsimas", skirtas (int i = 0; i <3; i ++) {irsend.sendSony (0xa90, 12); // „12“yra bitų skaičius, skirtingi protokolai reikalauja skirtingų bitų skaičių. NEC yra 32, „Sony“- 12, galite ieškoti kitų vėlavimo (10); (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); // „Sony“televizoriaus maitinimo garsumo mažinimo uždelsimas (100);}}} uždelsimas (100);} jei (irrecv.decode (& rezultatai)) // toliau pateikta kodo dalis leidžia interpretuoti infraraudonųjų spindulių signalus iš įvairių nuotolinio valdymo pultų. {Serial.println (results.value, HEX); // tai sugeneruos procedūrą „NEC, Sony, Etc..“ir TV kodą „c90, a90, FF02FD“, prie TV kodo jungiklio priekio turėsite pridėti 0x (results.decode_type) {case DENON: Serial.println ("DENON"); pertrauka; atvejis NEC: Serial.println ("NEC"); pertrauka; atvejis PANASONIC: Serial.println ("PANASONIC"); pertrauka; atvejis SONY: Serial.println ("SONY"); pertrauka; atvejis RC5: Serial.println ("RC5"); pertrauka; atvejis JVC: Serial.println ("JVC"); pertrauka; atvejis SANYO: Serial.println ("SANYO"); pertrauka; atvejis MITSUBISHI: Serial.println ("MITSUBISHI"); pertrauka; dėklas SAMSUNG: Serial.println ("SAMSUNG"); pertrauka; atvejis LG: Serial.println („LG“); pertrauka; atvejis RC6: Serial.println ("RC6"); pertrauka; dėklas DISH: Serial.println ("DISH"); pertrauka; korpusas SHARP: Serial.println ("SHARP"); pertrauka; atvejis WHYNTER: Serial.println ("WHYNTER"); pertrauka; atvejis AIWA_RC_T501: Serial.println ("AIWA_RC_T501"); pertrauka; numatytasis: atvejis UNKNOWN: Serial.println ("UNKNOWN"); break;} irrecv.resume ();}}

3 žingsnis: kodas giliai: IR signalų siuntimas

Aš nurodysiu kodo eilutes pagal jų eilutės numerį - norėdami sekti, naudokite šią nuorodą:

pastebin.com/AQr0fBLg

Pirma, į z3t0 turime įtraukti IR nuotolinę biblioteką.

Čia yra nuoroda į biblioteką:

github.com/z3t0/Arduino-IRremote

Jei jums reikia vadovo, kaip tinkamai atsisiųsti biblioteką ir ją įdiegti IDE:

www.arduino.cc/en/guide/libraries

1 eilutėje yra biblioteka.

Toliau turime deklaruoti keletą kintamųjų, 2-12 eilutės tai daro.

Mes naudojame „cost int“, kad apibrėžtume kintamuosius, kurie nesikeis, visi, išskyrus vieną, patenka į šią kategoriją.

Mes naudojame „int“, kad apibrėžtume kintamuosius, kurie keisis.

Savo LED kaiščiui turime naudoti kaištį su impulsu su moduliacija (PWM) - mano kode užteks bet kokio kaiščio, šalia kurio yra „~“, - mes naudojame 3 skaitmeninį kaištį.

Toliau turime atlikti tam tikrą sąranką - šis kodas bus paleistas tik vieną kartą, kai „Arduino“bus įjungtas arba iš naujo nustatytas.

Atkreipkite dėmesį, kad mes apibrėžiame savo įėjimus ir išėjimus (15-20), įjungiame nuoseklųjį monitorių (21), įgaliname IR jutiklį (22) ir liepiame „Arduino“sumirksėti borto šviesos diodą, kai tik gauname signalą jutiklyje (23).

Tada mes sukursime savo kilpą - šis kodas bus paleistas pakartotinai, einant iš viršaus į apačią keletą kartų per sekundę.

25 eilutėje mes naudojame teiginį „if“, kuris nurodo „Arduino“„ieškokite šio konkretaus kriterijaus, jei jis atitinka kriterijus, atlikite šį konkretų dalyką“. Šiuo atveju kriterijai yra analogRead (Button1)> 900 arba, kitaip tariant - „Arduino, pažvelk į mygtuką1, kurį anksčiau apibrėžėme kaip A4 kaištį, jei gautas analoginis signalas yra didesnis nei 900, vadovaukitės kitomis instrukcijomis, jei ne, prašau pirmyn “. Čia reikia šiek tiek išpakuoti, todėl leiskite pasinerti: „Arduino“analoginis signalas yra lygus arba mažesnis nei 5 V, 5V lygus 1023, o 0V lygus 0. Bet kurią įtampą nuo 0 iki 5 V galima apibrėžti skaičių ir šiek tiek matematikos, mes galime išsiaiškinti tą skaičių arba, atvirkščiai, įtampą. Padalinkite 1024 (mes įtraukiame 0 kaip vienetą) iš 5, o tai suteikia 204,8. Pavyzdžiui, mes naudojame skaičių 900, norėdami jį išversti į įtampą, mes tiesiog padalijame 900 iš 204,8 ir gauname ~ 4,4 V. Mes sakome „Arduino“ieškoti didesnės kaip 4,4 volto įtampos ir, jei taip, atlikite kitą nurodymą.

Kalbėdami apie kitas instrukcijas (25 eilutė), matome irsend.sendNEC (0xFF02FD, 32). Tai sako: „Arduino, siųskite moduliuotą impulsą, atitinkantį NEC protokolą, ypač FF02FD signalą, ir įsitikinkite, kad jis yra 32 bitų ilgio“. Dėl to mūsų IR šviesos diodas mirksės taip, kad kiti prietaisai galėtų tai suprasti. Pagalvokite apie tai šiek tiek kaip Morzės abėcėlę, bet tik su nematoma šviesa! Yra daug įvairių protokolų, kurių kiekvienas turi šimtus, jei ne tūkstančius atskirų signalų, ir kiekvienas su konkrečiu bitų numeriu - mūsų įrenginys galės atpažinti daugybę šių signalų, tačiau mes į tai pasinersime vėliau!

28 eilutėje turime pirmąjį delsą - čia norima išvengti netyčinių pasikartojančių signalų, kai paspaudžiamas mygtukas ir siunčiamas IR signalas, turime 100 milisekundžių, kad pirštas nukristų nuo mygtuko. tai neatrodo kaip daug laiko, tačiau praktiškai atrodo, kad tai veikia gerai. atidėjimo funkcija nurodo „Arduino“„nieko nedaryti už X milisekundžių“, o nuoroda - 1000 milisekundžių per sekundę.

Pereiname prie kito mūsų mygtuko 29 eilutėje, 5 mygtuko (iš pradžių šiame nuotolinio valdymo pulte turėjau 4 mygtukus, pridėjau penktą, todėl mes neveikiame). Tai iš esmės yra tas pats, kas 1 mygtukas, tačiau yra keletas esminių skirtumų. Pirmasis skirtumas, kurį pamatysite, yra teiginys - tai iš esmės yra kita kilpa - kilpa su kita didesne kilpa, kilpos suvokimas. Konkrečiai mes turime „for (int i = 0; i <3; i ++)“, skaitykite tai kaip „Arduino, pradėkime nuo 0, kartokite šias instrukcijas, kol pasieksime 3 kartus“. Funkcija „for“naudojama, nes daug prietaisų yra užprogramuoti ieškoti pasikartojančio signalo, o mūsų atveju čia - 3 kartus. Galite tiesiog pakeisti skaičių 3 į kitą, jei jūsų įrenginys reikalauja kitokio kartojimo tvarkaraščio. Kitas pagrindinis mygtuko 5 skirtumas yra tas, kad jis kartojamas dar kartą, 3 kartus arba 3x3. Kitaip tariant, siunčiame signalą 3 kartus, laukiame 10 milisekundžių, siunčiame dar kartą 3 kartus, laukiame dar 10 milisekundžių ir tada siunčiame dar 3 kartus. Šis ryšio tipas yra įprastas įjungiant ir išjungiant įrenginius ir gali būti būtent tai, ko reikalauja jūsų televizorius ar įrenginys - svarbiausia yra žaisti su visais kintamaisiais, kol gausite norimą rezultatą. Pakeiskite trumpojo atidėjimo vertę, pakeiskite pakartotinę reikšmę, siųskite 6 partijas, o ne 3 ir tt Įrenginiai sąmoningai užprogramuoti savavališkomis signalo taisyklėmis, įsivaizduokite, ar jūsų televizoriaus nuotolinio valdymo pultas siunčia tokio paties tipo signalą kaip ir jūsų garso juosta; kiekvieną kartą, kai pakeisite televizoriaus kanalą, garso juosta išsijungia - todėl yra skirtingos signalo taisyklės.

Kiti trys mygtukai yra užprogramuoti su tais pačiais principais, bent jau iš dalies, aprašytais aukščiau - taigi galime pereiti iki 55 eilutės.

4 žingsnis: kodas giliai: IR signalų priėmimas

Gilus kodas: IR signalų priėmimas
Gilus kodas: IR signalų priėmimas

55 eilutėje mes pradedame programuoti „Arduino“, kad jis interpretuotų kitų nuotolinio valdymo pultelių siunčiamus IR signalus - tai būtina, kad galėtumėte išsiaiškinti protokolus ir signalus, kuriuos naudoja jūsų nuotolinio valdymo pultai. Pirmoji kodo eilutė 55 eilutėje yra, jei (irrecv.decode (ir rezultatai) tai skaito kaip „Arduino, ieškokite IR kodo, jei jį rasite, grąžinkite tikrąją vertę, jei nieko nerasta, grąžinkite klaidingą. Kai tiesa, įrašykite informaciją į „rezultatus“.

Pereinant prie 56 eilutės, turime Serial.println (results.value, HEX), sakoma: „Ardunio, spausdinkite rezultatus serijiniame monitoriuje HEX formatu“. Šešioliktainis, reiškiantis šešioliktainį, yra būdas, kuriuo mes galime sutrumpinti dvejetainę eilutę (tik 0 ir 1) iki kažko šiek tiek lengviau įvesti. Pavyzdžiui, 101010010000 yra „a90“, kodas, naudojamas įjungti ir įjungti televizorių, o 111111110000001011111101 yra 0xFF02FD, kuris valdo mano RGB juostą. Galite naudoti aukščiau pateiktą diagramą, kad dvejetainę konvertuotumėte į šešioliktainį, ir atvirkščiai, arba galite naudoti šią nuorodą:

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

Iki 57 eilutės turime naują funkciją, vadinamą jungiklio dėklu.

Iš esmės perjungimo dėklas leidžia mums nurodyti skirtingas instrukcijas, atsižvelgiant į tam tikro kintamojo (atvejo) rezultatus. pertrauka išeina iš jungiklio sakinio ir naudojama kiekvieno teiginio pabaigoje.

Čia mes naudojame jungiklio dėklą, kad pakeistume spausdinimo serijiniame monitoriuje metodus, pagrįstus mūsų „Arduino“jutimo protokolais iš įvairių nuotolinio valdymo pultų.

5 žingsnis: Išvada

Jei turite klausimų - nedvejodami kreipkitės į mane čia! Džiaugiuosi galėdamas jums padėti kuo geriau.

Tikiuosi, kad sužinojote ką nors, kad galėtumėte šiek tiek pagerinti savo gyvenimą!

-RB

Rekomenduojamas: