Cuprins:

Telecomandă TV universală - Ardiuino, infraroșu: 5 pași
Telecomandă TV universală - Ardiuino, infraroșu: 5 pași

Video: Telecomandă TV universală - Ardiuino, infraroșu: 5 pași

Video: Telecomandă TV universală - Ardiuino, infraroșu: 5 pași
Video: Cum putem controla 4 relee din telecomanda Ir Rc 5 cu Arduino UNO 2024, Iulie
Anonim
Telecomandă TV universală - Ardiuino, infraroșu
Telecomandă TV universală - Ardiuino, infraroșu

Buna! În acest instructable, vă voi arăta cum să construiți și să programați propria telecomandă universală care va funcționa cu majoritatea lucrurilor care utilizează o telecomandă cu infraroșu și care va „asculta” și decoda și un semnal infraroșu trimis de diferite alte telecomenzi.

Un pic de fundal din ceea ce m-a inspirat să construiesc această telecomandă - Eu, ca majoritatea dintre voi, îmi pierd telecomenzile în mod constant, iar această calamitate este destul de frustrantă, așa că cred că o rezolvăm! Am construit această telecomandă și am încorporat-o discret în cadrul meu de pat personalizat (sunt, de asemenea, un lemnar) - Nu pot pierde telecomanda dacă face parte din rama patului meu!

Provizii

Lucruri de care aveți nevoie: -Arduino UNO sau Nano - kilometrajul poate varia în funcție de alte plăci

-Panou fără sudură (sau panou sudabil dacă doriți să îl faceți mai permanent)

-Jumperwires de diferite culori și lungimi

-Butoane momentane (5) (puteți adăuga mai multe butoane, dar va trebui să utilizați pini digitali, deoarece sunt utilizați toți pinii analogici, cu excepția 1 - va trebui să vă uitați să vă asigurați că utilizați în mod corespunzător rezistențele pull up, sau trageți în jos rezistențele și dezabonați butoanele)

-10K Ohm rezistor (5) (dacă doriți mai multe butoane, veți avea nevoie de mai multe dintre acestea)

-470 Ohm rezistor (2)

-LED cu infraroșu

-LED rosu

-Sensor cu infraroșu (am folosit numărul de piesă VS1838B, ai putea folosi altul, doar verifică pin-out-ul)

(Opțional) Fier de lipit, lipit, flux de lipit.

Pasul 1: Construirea circuitului:

Construirea circuitului
Construirea circuitului

1). Întotdeauna îmi place să încep cu așezarea componentelor mele, deoarece acest lucru conduce întotdeauna aspectul pe panou.

-Apasa butoanele

-LED-uri: LED-ul roșu și LED-ul IR sunt conectate în tandem, astfel încât să puteți vedea ce face LED-ul IR.

-Senzor

2). Rezistențe

- Cele cinci rezistențe de 10K pe care le-am atașat la butoane sunt numite rezistențe „trageți în jos”. Trageți rezistențele în jos, asigurați-vă că, atunci când un buton nu este apăsat, pinul Arduino corespunzător obține 0 volți (sau cel puțin aproape de acesta). Pentru mai multe informații despre rezistențele de tragere (sau de ridicare) iată un ghid în profunzime:

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

Este posibil ca aceste rezistențe să nu fie complet necesare, dar dacă primiți apăsări „fantomă”, este mai mult decât probabil cauzată de cuplarea capacitivă și rezistențele de tragere împiedică acest lucru.

3). Sârme de circuit

4). 5V și cabluri de masă

Utilizați imaginea furnizată pentru referință! nu vă fie teamă să o schimbați în funcție de nevoile voastre!

Pasul 2: Cod:

#include const int RECV_PIN = 7; // Senzor IR citit pin int Buton1 = A4; // Cel mai îndepărtat buton int stâng2 = A3; // al doilea din stânga int Butonul3 = A2; // Buton int Middle4 = A1; // al doilea la dreapta int Buton5 = A0; // Cel mai îndepărtat spre dreapta int LED = 3; // LED IR & LED rosu int val = 0; // Modificarea valorii IRsend irsend; IRrecv irrecv (RECV_PIN); rezultate decode_results;

void setup () {pinMode (Buton1, INPUT); pinMode (Buton2, INPUT); pinMode (Buton3, INPUT); pinMode (Buton4, INPUT); pinMode (Buton5, INPUT); pinMode (LED, OUTPUT); Serial.begin (9600); irrecv.enableIRIn (); irrecv.blink13 (adevărat);} void loop () {{{if (analogRead (Button1)> 900) irsend.sendNEC (0xFF02FD, 32); // folosind citire analogică în loc de citire digitală pentru a evita problemele de capacitate captivă. de asemenea, ajută la eliminarea butoanelor. // Dacă aveți citire analogică la 900, este permisă o anumită spațiu în valori, ceea ce înseamnă că semnalul infra va fi trimis chiar dacă nu este aplicat un pin complet de 5V. // dar 900 este suficient de mare pentru a nu citi eronat din cauza întârzierii capacitive de cuplare (100);} // RGB Strip On & off {if (analogRead (Button5)> 900) {for (int i = 0; i <3; i ++) // modificarea valorii în „i <3” va schimba numărul de repetări ale semnalului imediat. deci „i <2” va repeta semnalul de două ori. // s-ar putea să trebuiască să vă jucați cu acest număr dacă televizorul dvs. nu răspunde, în general, 1 sau 3 funcționează cel mai mult, dacă nu, încercați numerele impare. // s-ar putea să trebuiască, de asemenea, să vă jucați cu valorile temporizării întârzierii semnalului, de exemplu, pentru televizorul meu 10 funcționează, dar 30 nu. {irsend.sendSony (0xa90, 12); // Codul de alimentare Sony TV, pentru televizorul meu, codul trebuie trimis de 3x3, deci 3 impulsuri, de trei ori separate de întârziere (10); // "întârziere semnal intra" pentru (int i = 0; i <3; i ++) {irsend.sendSony (0xa90, 12); // „12” este numărul de biți, diferite protocoale solicită diferite numere de biți. NEC are 32, Sony are 12, puteți căuta celelalte întârziere (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); // Sony TV power Volume Down delay (100);}}} delay (100);} if (irrecv.decode (& results)) // partea de jos a codului vă permite să interpretați semnalele infraroșii de la diferite telecomenzi. {Serial.println (results.value, HEX); // va genera procedura „NEC, Sony, Etc..” și un cod TV „c90, a90, FF02FD” va trebui să adăugați 0x în partea din față a comutatorului Cod TV (results.decode_type) {case DENON: Serial.println ("DENON"); pauză; caz NEC: Serial.println ("NEC"); pauză; caz PANASONIC: Serial.println ("PANASONIC"); pauză; carcasa SONY: Serial.println ("SONY"); pauză; caz RC5: Serial.println ("RC5"); pauză; caz JVC: Serial.println ("JVC"); pauză; caz SANYO: Serial.println ("SANYO"); pauză; cazul MITSUBISHI: Serial.println ("MITSUBISHI"); pauză; caz SAMSUNG: Serial.println ("SAMSUNG"); pauză; carcasa LG: Serial.println ("LG"); pauză; caz RC6: Serial.println ("RC6"); pauză; caz DISH: Serial.println ("DISH"); pauză; caz SHARP: Serial.println ("SHARP"); pauză; caz WHYNTER: Serial.println ("WHYNTER"); pauză; caz AIWA_RC_T501: Serial.println ("AIWA_RC_T501"); pauză; implicit: caz UNKNOWN: Serial.println ("UNKNOWN"); pauză;} irrecv.resume ();}}

Pasul 3: Cod în adâncime: trimiterea de semnale IR

Mă voi referi la liniile de cod după numărul lor de linie - pentru a continua, folosiți acest link:

pastebin.com/AQr0fBLg

În primul rând, trebuie să includem Biblioteca la distanță IR de z3t0.

Iată un link către bibliotecă:

github.com/z3t0/Arduino-IRremote

Dacă aveți nevoie de un ghid despre cum să descărcați corect o bibliotecă și să o instalați în IDE:

www.arduino.cc/en/guide/libraries

Linia 1 include biblioteca.

În continuare, trebuie să declarăm câteva variabile, liniile 2-12 fac acest lucru.

Folosim „cost int” pentru a defini variabilele care nu se vor schimba, toate cu excepția unuia se încadrează în această categorie.

Folosim „int” pentru a defini variabilele care se vor schimba.

Trebuie să folosim un pin cu impuls cu modulație (PWM) pentru pinul nostru LED - orice pin care are „~” lângă el va fi suficient, în codul meu - folosim pinul 3 digital.

În continuare, trebuie să facem unele setări - acest cod va rula o singură dată când Arduino este pornit sau resetat.

Observați că ne definim intrările și ieșirile (15-20), declanșăm monitorul serial (21), activăm senzorul IR (22) și îi spunem Arduino să clipească LED-ul de bord oricând primim un semnal în senzor (23).

Apoi, ne vom construi bucla - acest cod va rula în mod repetat, mergând de sus în jos de câteva ori pe secundă.

La rândul 25, folosim o declarație if, aceasta îi spune lui Arduino „căutați acest criteriu specific, dacă acel criteriu este îndeplinit, faceți acest lucru specific”. În acest caz, criteriul este analogRead (Buton1)> 900, sau cu alte cuvinte - „Arduino, Uită-te la butonul1, pe care l-am definit ca pin A4 mai devreme, dacă semnalul analogic primit este mai mare de 900, vă rugăm să continuați cu următoarele instrucțiuni, dacă nu, vă rugăm să mergeți mai departe ". Există un pic de despachetat aici, așa că permiteți să ne scufundăm: un semnal analogic pe Arduino este o valoare egală sau mai mică de 5V, cu 5V egal cu 1023 și 0V egal cu 0. Orice tensiune dată între 0 și 5V poate fi definită de un număr și, cu un pic de matematică, putem da seama de acel număr sau invers, o tensiune. Împărțiți 1024 (includem 0 ca unitate) la 5, ceea ce ne dă 204,8. De exemplu, folosim numărul 900, pentru a traduce acest lucru în tensiune, împărțim pur și simplu 900 la 204,8, oferindu-ne ~ 4,4V. Îi spunem Arduino să caute o tensiune mai mare de ~ 4,4 volți și, dacă este, faceți următoarea noastră instrucțiune.

Apropo de instrucțiunile următoare (linia 25), vedem irsend.sendNEC (0xFF02FD, 32). Aceasta spune „Arduino, trimiteți un impuls modulat care urmează protocolul NEC, în special semnalul FF02FD și asigurați-vă că are 32 de biți lung”. Acest lucru va face ca LED-ul nostru IR să pâlpâie în modul în care alte dispozitive pot înțelege. Gândiți-vă puțin la Codul Morse, dar doar cu lumină invizibilă! Există o mulțime de protocoale diferite, fiecare cu sute, dacă nu chiar mii de semnale individuale și fiecare cu numărul lor specific de biți - dispozitivul nostru va fi capabil să recunoască o mare parte din aceste semnale, dar ne vom scufunda în asta mai târziu!

La linia 28, avem prima noastră întârziere - aceasta este aici pentru a preveni semnalele repetate neintenționate, odată ce butonul este apăsat și semnalul IR este trimis, avem 100 de milisecunde pentru a scoate degetul de pe buton. acest lucru nu sună mult timp, dar în practică pare să funcționeze bine. funcția de întârziere îi spune lui Arduino „să nu facă nimic pentru X milisecunde” și ca referință, acestea sunt de 1000 milisecunde într-o secundă.

Trecând la următorul nostru buton de la linia 29, butonul 5 (inițial aveam 4 butoane pe această telecomandă, am adăugat un al cincilea, deci de aceea suntem în neregulă). Acest lucru, în spirit, este același lucru cu butonul 1, dar cu câteva diferențe cheie. Prima diferență pe care o veți vedea este o declarație for - aceasta este în esență o altă buclă - o buclă cu o altă buclă mai mare, loopception. Mai exact avem „pentru (int i = 0; i <3; i ++)”, citiți acest lucru ca „Arduino, permite să începem de la 0, repetați următoarele instrucțiuni până ajungem la 3 ori”. Funcția for este utilizată deoarece o mulțime de dispozitive sunt programate să caute un semnal repetat, iar în cazul nostru aici, de 3 ori. Puteți pur și simplu schimba numărul 3 într-un număr diferit dacă dispozitivul dvs. solicită un program de repetare diferit. O altă diferență cheie cu butonul 5 este că se repetă din nou, de 3 ori sau 3x3. Cu alte cuvinte, trimitem semnalul de 3 ori, așteptăm 10 milisecunde, îl trimitem din nou de 3 ori, așteptăm încă 10 milisecunde și îl trimitem din nou de 3 ori. Acest tip de comunicare este obișnuit pentru pornirea și oprirea dispozitivelor și ar putea fi doar ceea ce solicită televizorul sau dispozitivul dvs. - cheia acestui lucru este să vă jucați cu toate variabilele până când obțineți rezultatul dorit. Schimbați valoarea de întârziere scurtă, schimbați valoarea pentru repetare, trimiteți 6 loturi în loc de 3 etc. Dispozitivele sunt programate cu reguli de semnal arbitrare intenționat, imaginați-vă dacă telecomanda TV a trimis același tip de semnal ca bara de sunet; de fiecare dată când schimbați canalul de pe televizor, bara de sunet se oprește - de aceea există reguli de semnal diferite.

Următoarele trei butoane sunt programate cu aceleași principii, cel puțin parțial, descrise mai sus - astfel încât să putem sări până la linia 55.

Pasul 4: Cod în adâncime: Primirea semnalelor IR

Cod în adâncime: Primirea semnalelor IR
Cod în adâncime: Primirea semnalelor IR

La linia 55, începem să programăm Arduino pentru a interpreta semnalele IR trimise de alte telecomenzi - acest lucru este necesar, astfel încât să puteți afla protocoalele și semnalele pe care telecomandele dvs. le utilizează. Prima linie de cod la linia 55 este dacă (irrecv.decode (și rezultate) citește acest lucru ca „Arduino, caută un cod IR, dacă găsești unul, returnează o valoare adevărată, dacă nu s-a găsit nimic, returnează fals. Când este adevărat, înregistrează informațiile în „rezultate””.

Trecând la linia 56, avem Serial.println (results.value, HEX) pe care scrie „Ardunio, tipăriți rezultatele în monitorul serial într-un format HEX”. Hex, adică hexadecimal, este un mod în care putem scurta un șir binar (doar 0 și 1) în ceva puțin mai ușor de tastat. De exemplu, 101010010000 este „a90”, codul folosit pentru a-mi opri și porni televizorul, iar 111111110000001011111101 este 0xFF02FD, care îmi controlează banda RGB. Puteți utiliza graficul de mai sus pentru a converti binarul în hex, și invers, sau puteți utiliza următorul link:

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

Până la linia 57, avem o funcție nouă, numită switch case.

În esență, un caz de comutare ne permite să specificăm instrucțiuni diferite pe baza rezultatelor unei variabile date (caz). pauza iese din instrucțiunea switch și este utilizată la sfârșitul fiecărei instrucțiuni.

Folosim cutia de comutare aici pentru a schimba modul în care imprimăm în monitorul serial pe baza protocoalelor pe care Arduino le detectează de la diferitele telecomenzi.

Pasul 5: Concluzie

Dacă aveți o întrebare - vă rugăm să nu ezitați să mă contactați aici! Sunt fericit să încerc să te ajut cât pot de bine.

Sper că ai învățat ceva pe care îl poți folosi pentru a-ți face viața puțin mai bună!

-RB

Recomandat: