Sadržaj:

Univerzalni daljinski upravljač za TV - Ardiuino, infracrveni: 5 koraka
Univerzalni daljinski upravljač za TV - Ardiuino, infracrveni: 5 koraka

Video: Univerzalni daljinski upravljač za TV - Ardiuino, infracrveni: 5 koraka

Video: Univerzalni daljinski upravljač za TV - Ardiuino, infracrveni: 5 koraka
Video: Testing and repairing remote controls 2024, Studeni
Anonim
Univerzalni daljinski upravljač za TV - Ardiuino, infracrveni
Univerzalni daljinski upravljač za TV - Ardiuino, infracrveni

Zdravo! U ovom uputstvu pokazat ću vam kako izgraditi i programirati vlastiti univerzalni daljinski upravljač koji će raditi s većinom stvari koje koriste infracrveni daljinski upravljač, a koji će također "slušati" i dekodirati infracrveni signal koji šalju različiti drugi daljinski upravljači.

Malo pozadine onoga što me inspiriralo za izgradnju ovog daljinskog upravljača - ja, kao i većina vas, stalno gubim daljinske upravljače, a ova je nesreća prilično frustrirajuća, pa mislim da to možemo riješiti! Ugradio sam ovaj daljinski upravljač i diskretno ga ugradio u prilagođeni okvir kreveta (također sam i stolar) - ne mogu izgubiti daljinski ako je dio mog okvira kreveta!

Pribor

Stvari koje trebate: -Arduino UNO ili Nano - kilometraža se može razlikovati ovisno o drugim pločama

-Oglasna ploča bez lemljenja (ili lemljiva ploča za lemljenje ako je želite učiniti trajnijom)

-Komperice različitih boja i duljina

-Trenutni gumbi (5) (možete dodati još gumba, ali ćete morati koristiti digitalne pinove jer se koriste sve osim 1 analogne pinove - morat ćete provjeriti jeste li ispravno koristili otpornike za podizanje ili povucite otpornike prema dolje i otpustite tipke)

-10K ohmski otpornik (5) (ako želite više tipki, trebat će vam više ovih)

-470 Ohm otpornik (2)

-Infracrvena LED dioda

-Crvena LED

-Infracrveni senzor (koristio sam broj dijela VS1838B, mogli biste koristiti i drugi, samo provjerite pin-out)

(Opcionalno) Lemilica, lem, lemni fluks.

Korak 1: Izgradnja kruga:

Izgradnja kruga
Izgradnja kruga

1). Uvijek volim početi s postavljanjem svojih komponenti jer to uvijek pokreće raspored na ploči.

-Pritisnite gumbe

-LEDs: LED i IR LED su povezane u tandemu, tako da možete vidjeti što IR LED radi.

-Senzor

2). Otpornici

- Pet 10K otpornika koje smo pričvrstili na gumbe nazivamo "pull down" otpornici. Povucite otpornike prema dolje kako biste bili sigurni da kada ne pritisnete gumb, odgovarajući Arduino pin dobije 0 volti (ili barem blizu njega). Za više informacija o otpornicima za povlačenje (ili podizanje) ovdje je dubinski vodič:

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

Ovi otpornici možda nisu u potpunosti potrebni, ali ako dobivate "duhovite" pritiske, to je više nego vjerojatno uzrokovano kapacitivnom spojnicom, a otpornici na dolje to sprječavaju.

3). Žice kruga

4). 5V i uzemljene žice

Za referencu upotrijebite priloženu sliku! ne bojte se to promijeniti za svoje potrebe!

2. korak: Kôd:

#include const int RECV_PIN = 7; // pin senzor za očitavanje IC senzora int Button1 = A4; // Najdalje lijevo int Button2 = A3; // 2. s lijeve strane int Button3 = A2; // Srednji int gumb 4 = A1; // 2. desno int Button5 = A0; // Najdalje desno od int LED = 3; // IR LED & Red LED int val = 0; // Promjena vrijednosti IRsend irsend; IRrecv unrecv (RECV_PIN); decode_results rezultate;

void setup () {pinMode (Button1, INPUT); pinMode (Button2, INPUT); pinMode (Button3, INPUT); pinMode (Button4, INPUT); pinMode (Button5, INPUT); pinMode (LED, IZLAZ); Serial.begin (9600); unrecv.enableIRIn (); unrecv.blink13 (true);} void loop () {{{if (analogRead (Button1)> 900) irsend.sendNEC (0xFF02FD, 32); // korištenje analognog čitanja umjesto digitalnog čitanja kako bi se izbjegli problemi s kapacitetom. također, pomaže u otklanjanju gumba. // Analogno očitavanje na 900 dopušta malo prostora za pomicanje, što znači da će se infra signal poslati čak i ako se na pin ne primijeni punih 5 V. // ali 900 je dovoljno visoko da se ne čita pogrešno zbog kašnjenja kapacitivne sprege (100);} // RGB Strip On & off {if (analogRead (Button5)> 900) {for (int i = 0; i <3; i ++) // mijenjanjem vrijednosti u "i <3" promijenit će se broj trenutaka ponavljanja signala. pa će "i <2" dvaput ponoviti signal. // možda ćete se morati poigrati s ovim brojem ako vaš televizor ne reagira, općenito, 1 ili 3 najviše rade, ako ne, pokušajte s neparnim brojevima. // možda ćete se morati poigrati i s vrijednostima vremena kašnjenja unutar signala, na primjer, za moj TV 10 radi, ali 30 ne. {irsend.sendSony (0xa90, 12); // Kôd za napajanje televizora Sony, za moj televizor kôd je potrebno poslati 3x3, dakle 3 impulsa, tri odvojena vremenska kašnjenja (10); // "kašnjenje unutar signala" za (int i = 0; i <3; i ++) {irsend.sendSony (0xa90, 12); // "12" je broj bita, različiti protokoli pozivaju na različite brojeve bitova. NEC ima 32 godine, Sony ima 12 godina, možete potražiti ostale s kašnjenjem (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); // Kašnjenje smanjenja glasnoće Sony TV -a (100);}}} kašnjenje (100);} if (unrecv.decode (& results)) // donji dio koda omogućuje vam tumačenje infracrvenih signala s različitih daljinskih upravljača. {Serial.println (results.value, HEX); // generirat će postupak "NEC, Sony, Etc.." i TV kod "c90, a90, FF02FD" morat ćete dodati 0x na prednjoj strani prekidača TV koda (results.decode_type) {slučaj DENON: Serial.println ("DENON"); pauza; slučaj NEC: Serial.println ("NEC"); pauza; slučaj PANASONIC: Serial.println ("PANASONIC"); pauza; kućište SONY: Serial.println ("SONY"); pauza; kućište RC5: Serial.println ("RC5"); pauza; kućište JVC: Serial.println ("JVC"); pauza; kućište SANYO: Serial.println ("SANYO"); pauza; kućište MITSUBISHI: Serial.println ("MITSUBISHI"); pauza; kućište SAMSUNG: Serial.println ("SAMSUNG"); pauza; kućište LG: Serial.println ("LG"); pauza; kućište RC6: Serial.println ("RC6"); pauza; kućište DISH: Serial.println ("DISH"); pauza; kućište SHARP: Serial.println ("SHARP"); pauza; slučaj WHYNTER: Serial.println ("WHYNTER"); pauza; slučaj AIWA_RC_T501: Serial.println ("AIWA_RC_T501"); pauza; default: velika slova UNKNOWN: Serial.println ("UNKNOWN"); break;} unrecv.resume ();}}

Korak 3: Dubinsko kodiranje: slanje IC signala

Ja ću se pozivati na retke koda prema njihovom broju retka - da biste nastavili, koristite ovu vezu:

pastebin.com/AQr0fBLg

Prvo, moramo uključiti IR Remote Library do z3t0.

Evo veze do biblioteke:

github.com/z3t0/Arduino-IRremote

Ako vam je potreban vodič kako pravilno preuzeti biblioteku i instalirati je u IDE:

www.arduino.cc/en/guide/libraries

1. redak uključuje knjižnicu.

Zatim moramo deklarirati nekoliko varijabli, a redovi 2-12 to čine.

Koristimo "cost int" za definiranje varijabli koje se neće promijeniti, sve osim jedne spadaju u ovu kategoriju.

Koristimo "int" za definiranje varijabli koje će se promijeniti.

Moramo koristiti pin s impulsnom modulacijom (PWM) za naš LED pin - svaki pin koji ima "~" pored sebe bit će dovoljan, u mom kodu - koristimo digitalni pin 3.

Zatim moramo napraviti neke postavke - ovaj kôd će se pokrenuti samo jednom kada se Arduino uključi ili resetira.

Uočite da definiramo naše ulaze i izlaze (15-20), pokrećemo serijski monitor (21), omogućujemo IC senzor (22) i kažemo Arduinu da trepće ugrađenu LED diodu kad god dobijemo signal u senzoru (23).

Zatim ćemo izgraditi našu petlju - ovaj kôd će se izvoditi više puta, idući od vrha do dna pregršt puta u sekundi.

U retku 25 koristimo if naredbu, koja govori Arduinu "tražite ove specifične kriterije, ako su ti kriteriji ispunjeni, učinite ovo posebno". U ovom slučaju kriterij je analogRead (Button1)> 900, ili drugim riječima - "Arduino, pogledaj gumb1, koji smo ranije definirali kao pin A4, ako je primljeni analogni signal veći od 900, nastavite s našim sljedećim uputama, ako ne, nastavite dalje ". Ovdje se ima nešto za raspakirati, pa zaronimo: analogni signal na Arduinu vrijednost je jednaka ili manja od 5 V, pri čemu je 5 V jednako 1023, a 0V jednako 0. Svaki zadani napon između 0 i 5 V može se definirati pomoću broj, a uz malo matematike možemo shvatiti taj broj ili obrnuto, napon. Podijelimo 1024 (uključujemo 0 kao jedinicu) sa 5, što nam daje 204.8. Na primjer, koristimo broj 900, da bismo to preveli u napon, jednostavno podijelimo 900 sa 204,8, dajući nam ~ 4,4 V. Kažemo Arduinu da traži napon veći od ~ 4,4 volti, i ako jest, učinite sljedeće.

Govoreći o sljedećim uputama (redak 25), vidimo irsend.sendNEC (0xFF02FD, 32). Ovdje piše "Arduino, pošalji modulirani impuls koji slijedi NEC protokol, točnije signal FF02FD, i pobrini se da ima 32 bita". Zbog toga će naša IR LED dioda treperiti na način koji drugi uređaji mogu razumjeti. Zamislite to pomalo poput Morseove abecede, ali samo s nevidljivim svjetlom! Postoji mnogo različitih protokola, svaki sa stotinama, ako ne i tisućama pojedinačnih signala, a svaki sa svojim specifičnim brojem bitova - naš će uređaj moći prepoznati veliku količinu tih signala, ali u to ćemo ući kasnije!

Na liniji 28 imamo prvo kašnjenje - ovo je ovdje radi sprječavanja nenamjernih ponavljajućih signala, nakon što pritisnete gumb i pošaljete IC signal, imamo 100 milisekundi da maknemo prst s gumba. ovo ne zvuči kao puno vremena, ali u praksi se čini da radi dobro. funkcija kašnjenja govori Arduinu "ne radi ništa u milisekundama", a za referencu su 1000 milisekundi u sekundi.

Prelazimo na sljedeći gumb na retku 29, gumb5 (prvotno sam imao 4 gumba na ovom daljinskom upravljaču, dodao sam peti, pa smo zato u kvaru). U duhu, to je isto što i gumb 1, ali s nekoliko ključnih razlika. Prva razlika koju ćete vidjeti je naredba for - ovo je u biti druga petlja - petlja s drugom većom petljom, loopception. Konkretno imamo "for (int i = 0; i <3; i ++)", čitajte ovo kao "Arduino, počnimo s 0, ponavljajte sljedeće upute dok ne dođemo do 3 puta". Funkcija for koristi se jer je mnogo uređaja programirano da traži ponovljeni signal, au našem slučaju 3 puta. Možete jednostavno promijeniti broj 3 u drugi broj ako vaš uređaj traži drugačiji raspored ponavljanja. Još jedna ključna razlika s gumbom 5 je ta što se ponavlja opet, 3 puta ili 3x3. Drugim riječima, signal šaljemo 3 puta, čekamo 10 milisekundi, šaljemo ga ponovno 3 puta, čekamo još 10 milisekundi, a zatim ga šaljemo ponovno 3 puta. Ova vrsta komunikacije uobičajena je za uključivanje i isključivanje uređaja i može biti upravo ono što vaš televizor ili uređaj traže - ključ toga je poigravanje sa svim varijablama dok ne dobijete željeni rezultat. Promijenite vrijednost kratkog kašnjenja, promijenite vrijednost za ponavljanje, pošaljite 6 serija umjesto 3 itd. Uređaji su namjerno programirani s proizvoljnim pravilima signala, zamislite je li vaš daljinski upravljač za televizor poslao signal iste vrste kao i vaša zvučna traka; svaki put kad promijenite kanal na televizoru, zvučna traka će se isključiti - zato postoje različita pravila signala.

Sljedeća tri gumba programirana su s istim principima, barem djelomično, gore opisanim - tako da možemo preskočiti sve do retka 55.

Korak 4: Dubinski kod: primanje IC signala

Dubinski kod: primanje IC signala
Dubinski kod: primanje IC signala

Na retku 55 počinjemo programirati Arduino za tumačenje IC signala koje šalju drugi daljinski upravljači - to je potrebno kako biste mogli shvatiti protokole i signale koje koriste vaši daljinski upravljači. Prvi redak koda u retku 55 je if (unrecv.decode (& results) pročitajte ovo kao "Arduino, potražite IR kod, ako ga pronađete, vratite pravu vrijednost, ako ništa nije pronađeno, vratite false. Kad je točno, zabilježite informacije u "rezultate" ".

Prelazimo na redak 56, imamo Serial.println (results.value, HEX) koji kaže "Ardunio, ispišite rezultate na serijskom monitoru u HEX formatu". Hex, što znači heksadecimalno, način je na koji možemo skratiti binarni niz (samo 0 i 1) u nešto što je lakše upisati. Na primjer, 101010010000 je "a90", kôd koji se koristi za isključivanje i uključivanje televizora, a 111111110000001011111101 je 0xFF02FD, koji kontrolira moju RGB traku. Možete koristiti gornji grafikon za pretvaranje binarnog u heksadecimalno i obrnuto, ili možete upotrijebiti sljedeću vezu:

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

Do retka 57, imamo novu funkciju, koja se zove prekidač.

U biti, slučaj prekidača omogućuje nam specificiranje različitih uputa na temelju rezultata zadane varijable (slučaja). prekid napušta naredbu switch i koristi se na kraju svake naredbe.

Ovdje koristimo prekidač za promjenu načina ispisa na serijskom monitoru na temelju protokola koje naša Arduino osjetila s različitih daljinskih upravljača.

Korak 5: Zaključak

Ako imate pitanje - slobodno mi se obratite ovdje! Drago mi je što ću vam pokušati pomoći najbolje što mogu.

Nadam se da ste naučili nešto što možete upotrijebiti za poboljšanje života!

-RB

Preporučeni: