INHOUDSOPGAWE:

Universele TV -afstandsbediening - Ardiuino, infrarooi: 5 stappe
Universele TV -afstandsbediening - Ardiuino, infrarooi: 5 stappe

Video: Universele TV -afstandsbediening - Ardiuino, infrarooi: 5 stappe

Video: Universele TV -afstandsbediening - Ardiuino, infrarooi: 5 stappe
Video: Which IR Sensor Is Best 2024, Julie
Anonim
Universele TV -afstandsbediening - Ardiuino, infrarooi
Universele TV -afstandsbediening - Ardiuino, infrarooi

Hallo! In hierdie instruksies sal ek u wys hoe u u eie universele afstandsbediening kan bou en programmeer wat sal werk met die meeste dinge wat met 'n infrarooi afstandsbediening gebruik word, en wat ook 'n infrarooi sein wat deur verskillende ander afstandbeheer gestuur word, sal 'luister' en dekodeer.

'N bietjie agtergrond van wat my geïnspireer het om hierdie afstandsbediening te bou - ek, soos die meeste van u, verloor my afstandbeheer voortdurend, en hierdie ramp is nogal frustrerend, so ek dink ek kan dit oplos! Ek het hierdie afstandsbediening gebou en dit diskreet ingebed in my pasgemaakte bedraam (ek is ook 'n houtwerker) - ek kan nie die afstandsbediening verloor as dit 'n deel van my bedraam is nie!

Voorrade

Dinge wat u nodig het: -Arduino UNO of Nano - kilometers kan met ander planke verskil

-Soldeerlose broodbord (of soldeerbare strookbord as u dit meer permanent wil maak)

Jumperdrade van verskillende kleure en lengtes

-Momentele drukknoppies (5) (u kan meer knoppies byvoeg, maar u moet digitale penne gebruik, aangesien almal behalwe 1 van die analoog penne gebruik word - u moet kyk of u optrekweerstands behoorlik gebruik, of trek weerstande af en druk die drukknoppies af)

-10K Ohmweerstand (5) (as u meer drukknoppies wil hê, benodig u meer hiervan)

-470 Ohm weerstand (2)

-Infrarooi LED

-Rooi LED

-Infrarooi sensor (ek het onderdeelnommer VS1838B gebruik, u kan nog 'n ander gebruik, kyk net na die pen)

(Opsioneel) Soldeerbout, soldeer, soldeerstroom.

Stap 1: Bou die kring:

Bou die kring
Bou die kring

1). Ek begin altyd graag met die uitleg van my komponente, aangesien dit altyd die uitleg op die broodbord dryf.

-Druk knoppies

-LEDS: die Rooi LED en IR LED is saamgevoeg, sodat u kan sien wat die IR LED doen.

-Sensor

2). Weerstande

- Die vyf 10K -weerstande wat ons aan die drukknoppies geheg het, word "aftrekweerstands" genoem. Trek weerstande af dat die ooreenstemmende Arduino -pen 0 volt (of ten minste daarby) kry as daar nie op 'n drukknoppie gedruk word nie. Hier is 'n diepgaande gids vir meer inligting oor aftrekweerstand (of optrek).

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

Hierdie weerstande is moontlik nie heeltemal nodig nie, maar as u 'spookstoot' kry, word dit waarskynlik veroorsaak deur kapasitiewe koppelings- en aftrekweerstands, wat dit voorkom.

3). Kringdrade

4). 5V en gronddrade

Gebruik die meegaande prentjie as verwysing! moenie bang wees om dit vir u behoeftes aan te pas nie!

Stap 2: Kode:

#sluit const int RECV_PIN = 7 in; // IR -sensor leespen int Button1 = A4; // Verste links links int knop2 = A3; // 2de van links int Button3 = A2; // Middel int Button4 = A1; // 2de na regs int Button5 = A0; // Verste na regs int LED = 3; // IR LED & Rooi LED int val = 0; // Veranderende waarde IRsend irsend; IRrecv irrecv (RECV_PIN); resultate van dekode_resultate;

ongeldige opstelling () {pinMode (knoppie1, INVOER); pinMode (Button2, INPUT); pinMode (Button3, INPUT); pinMode (Button4, INPUT); pinMode (Button5, INPUT); pinMode (LED, OUTPUT); Serial.begin (9600); irrecv.enableIRIn (); irrecv.blink13 (waar);} leemte lus () {{{if (analogRead (Button1)> 900) irsend.sendNEC (0xFF02FD, 32); // deur analoog lees in plaas van digitale lees te gebruik om probleme met kapasitansie te vermy. help ook om die knoppies af te weer. // As analoog op 900 gelees word, kan die waardes 'n wiggle -ruimte hê, wat beteken dat die infra -sein gestuur sal word, selfs al word 'n volle 5V nie op die pen toegedien nie. // maar 900 is hoog genoeg om nie verkeerd te lees nie as gevolg van kapasitiewe koppelingsvertraging (100);} // RGB Strip Aan en af {if (analogRead (Button5)> 900) {for (int i = 0; i <3; i ++) // Deur die waarde in "i <3" te verander, verander die aantal kere wat die sein onmiddellik herhaal word. dus "i <2" sal die sein twee keer herhaal. // Miskien moet u met hierdie nommer speel as u TV nie reageer nie, gewoonlik werk 1 of 3 die meeste, as dit nie die geval is nie, probeer dan onewe getalle. // Miskien moet u ook speel met die tydsberekeningwaardes van die intra -sein, byvoorbeeld vir my TV 10 -werke, maar 30 nie. {irsend.sendSony (0xa90, 12); // Sony TV -kragkode, vir my TV moet kode 3x3 gestuur word, dus 3 pulse, drie afsonderlike tye vertraging (10); // "intra sein vertraging" vir (int i = 0; i <3; i ++) {irsend.sendSony (0xa90, 12); // "12" is die bisnommer, verskillende protokolle vereis verskillende bisnommers. NEC is 32, Sony is 12, jy kan die vertraging van die ander opsoek (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 -krag Volume af vertraging (100);}}} vertraging (100);} as (irrecv.decode (& resultate)) // die onderstaande gedeelte van die kode u in staat stel om infrarooi seine van verskillende afstandbeheer te interpreteer. {Serial.println (resultate.waarde, HEX); // dit genereer die prosedure "NEC, Sony, ens.": Serial.println ("DENON"); breek; saak NEC: Serial.println ("NEC"); breek; saak PANASONIC: Serial.println ("PANASONIC"); breek; saak SONY: Serial.println ("SONY"); breek; saak RC5: Serial.println ("RC5"); breek; saak JVC: Serial.println ("JVC"); breek; saak SANYO: Serial.println ("SANYO"); breek; saak MITSUBISHI: Serial.println ("MITSUBISHI"); breek; saak SAMSUNG: Serial.println ("SAMSUNG"); breek; geval LG: Serial.println ("LG"); breek; saak RC6: Serial.println ("RC6"); breek; saak GEREG: Serial.println ("GEREG"); breek; geval SHARP: Serial.println ("SHARP"); breek; saak WHYNTER: Serial.println ("WHYNTER"); breek; saak AIWA_RC_T501: Serial.println ("AIWA_RC_T501"); breek; standaard: saak onbekend: Serial.println ("onbekend"); breek;} irrecv.resume ();}}

Stap 3: Kode in diepte: stuur van IR -seine

Ek verwys na reëls kode volgens hul reëlnommer - gebruik hierdie skakel om saam te volg:

pastebin.com/AQr0fBLg

Eerstens moet ons die IR Remote Library by z3t0 insluit.

Hier is 'n skakel na die biblioteek:

github.com/z3t0/Arduino-IRremote

As u 'n gids benodig oor hoe u 'n biblioteek behoorlik kan aflaai en dit in die IDE kan installeer:

www.arduino.cc/en/guide/libraries

Reël 1 bevat die biblioteek.

Vervolgens moet ons 'n paar veranderlikes verklaar, reëls 2-12 doen dit.

Ons gebruik 'cost int' om veranderlikes te definieer wat nie in hierdie kategorie sal verander nie, behalwe een.

Ons gebruik 'int' om veranderlikes wat sal verander, te definieer.

Ons moet 'n pen met pols met modulasie (PWM) vir ons LED -pen gebruik - enige pen wat '~' langsaan het, sal in my kode voldoende wees - ons gebruik digitale pen 3.

Vervolgens moet ons instel - hierdie kode werk slegs een keer as die Arduino aangeskakel of herstel word.

Let op dat ons ons insette en uitsette (15-20) definieer, die seriële monitor (21) aanskakel, die IR-sensor (22) in staat stel en die Arduino sê om die ingeboude LED te knip wanneer ons 'n sein in die sensor kry (23).

Vervolgens bou ons ons lus uit - hierdie kode sal herhaaldelik loop, van bo na onder 'n handvol kere per sekonde.

Op reël 25 gebruik ons 'n if -stelling, dit sê vir die Arduino 'soek na hierdie spesifieke kriteria, as daar aan die kriteria voldoen word, doen hierdie spesifieke ding'. In hierdie geval is die kriteria analogRead (Button1)> 900, of met ander woorde - "Arduino, kyk na knoppie1, wat ons vroeër gedefinieer het as pin A4, as die analoog sein wat groter is as 900, gaan dan voort met ons volgende instruksies, indien nie, gaan asseblief verder ". Hier is 'n bietjie om uit te pak, dus laat ons duik: 'n analoog sein op die Arduino is 'n waarde gelyk aan of minder as 5V, met 5V gelyk aan 1023 en 0V gelyk aan 0. Enige gegewe spanning tussen 0 en 5V kan gedefinieer word deur 'n getal, en met 'n bietjie wiskunde kan ons die getal, of andersom, 'n spanning uitvind. Verdeel 1024 (ons sluit 0 as 'n eenheid in) met 5, wat ons 204,8 gee. Byvoorbeeld, ons gebruik die getal 900, om dit in spanning te vertaal, ons verdeel eenvoudig 900 met 204,8, wat ons ~ 4,4V gee. Ons vertel die Arduino om te kyk vir 'n spanning groter as ~ 4,4 volt, en as dit die geval is, volg ons volgende instruksie.

As ons van die volgende instruksies (reël 25) praat, sien ons irsend.sendNEC (0xFF02FD, 32). Dit sê "Arduino, stuur 'n gemoduleerde pols wat volg op die NEC -protokol, spesifiek die FF02FD -sein, en maak seker dat dit 32 bisse lank is". Dit laat ons IR -LED flikker op 'n manier wat ander toestelle kan verstaan. Dink daaraan 'n bietjie soos Morse Code, maar net met onsigbare lig! Daar is baie verskillende protokolle, elk met honderde indien nie duisende individuele seine nie, en elkeen met hul spesifieke bisnommer - ons toestel kan baie van hierdie seine herken, maar ons sal later daarop ingaan!

Op reël 28 het ons ons eerste vertraging - dit is hier om onbedoelde herhalingsseine te voorkom, sodra die knoppie gedruk word en die IR -sein gestuur is, het ons 100 millisekondes om ons vinger van die knoppie af te haal. Dit klink nie na baie tyd nie, maar in die praktyk lyk dit asof dit goed werk. die vertragingsfunksie vertel die Arduino "doen niks vir X millisekondes nie" en as verwysing is dit 1000 millisekondes in 'n sekonde.

Gaan na ons volgende knoppie op reël 29, knoppie 5 (ek het oorspronklik 4 knoppies op hierdie afstandsbediening gehad, 'n vyfde bygevoeg, daarom is ons buite werking). In gees is dit dieselfde as knoppie 1, maar met 'n paar belangrike verskille. Die eerste verskil wat u sal sien, is 'n for -statement - dit is in wese nog 'n lus - 'n lus met 'n ander lus, loopception. Ons het spesifiek "for (int i = 0; i <3; i ++)", lees dit as "Arduino, laat ons begin by 0, herhaal die volgende instruksies totdat ons drie keer bereik het". Die for -funksie word gebruik omdat baie toestelle geprogrammeer is om na 'n herhaalde sein te kyk, en in ons geval hier, 3 keer. U kan die nommer 3 eenvoudig in 'n ander nommer verander as u toestel 'n ander herhalingskedule benodig. 'N Ander belangrike verskil met knop 5 is dat dit weer herhaal word, 3 keer of 3x3. Met ander woorde, ons stuur die sein 3 keer, wag 10 millisekondes, stuur dit weer 3 keer, wag nog 10 millisekondes en stuur dit dan weer 3 keer. Hierdie tipe kommunikasie kom gereeld voor om toestelle aan en af te skakel, en dit is dalk net wat u TV of toestel benodig - die sleutel hiervoor is om met al die veranderlikes te speel totdat u die gewenste resultaat kry. Verander die waarde van die kort vertraging, verander die waarde vir herhaal, stuur 6 groepe in plaas van 3, ens. Toestelle word opsetlik geprogrammeer met arbitrêre seinreëls, dink aan of u TV -afstandsbediening dieselfde tipe sein as u klankbalk gestuur het; elke keer as u die kanaal op u TV verander, sluit u klankbalk af - daarom is daar verskillende seinreëls.

Die volgende drie knoppies is geprogrammeer met dieselfde hoofde, ten minste gedeeltelik, soos hierbo beskryf - sodat ons tot by reël 55 kan oorslaan.

Stap 4: Kode in diepte: ontvang IR -seine

Diepte kode: ontvang IR -seine
Diepte kode: ontvang IR -seine

Op reël 55 begin ons met die programmering van die Arduino om IR -seine wat deur ander afstandbeheer gestuur word te interpreteer - dit is nodig sodat u die protokolle en seine wat u afstandbeheer gebruik, kan uitvind. Die eerste reël kode op reël 55 is as (irrecv.decode (& resultate) dit lees as "Arduino, soek 'n IR -kode, as u een vind, gee 'n ware waarde, as niks gevind word nie, vals terugkeer. As dit waar is, teken dit op die inligting in "resultate" ".

Ons gaan na reël 56 en ons het Serial.println (results.value, HEX) wat sê: "Ardunio, druk die resultate in die seriële monitor in 'n HEX -formaat". Hex, wat heksadesimaal beteken, is 'n manier waarop ons 'n binêre string (net 0's en 1's) kan verkort tot iets wat makliker is om te tik. Byvoorbeeld, 101010010000 is "a90", die kode wat gebruik word om my TV aan en aan te skakel, en 111111110000001011111101 is 0xFF02FD, wat my RGB -strook beheer. U kan die bostaande grafiek gebruik om binêre in hex te omskep, en omgekeerd, of u kan die volgende skakel gebruik:

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

Tot by lyn 57, het ons 'n nuwe funksie, 'n skakelaarkas genoem.

In wese kan ons met 'n skakelaar verskillende instruksies spesifiseer op grond van die resultate van 'n gegewe veranderlike (geval). die onderbreking verlaat die skakelaarverklaring en word aan die einde van elke stelling gebruik.

Ons gebruik die skakelaarkas hier om die manier waarop ons in die seriële monitor druk, te verander op grond van die protokolle wat ons Arduino van die verskillende afstandsbedienings sien.

Stap 5: Gevolgtrekking

As u 'n vraag het - kontak my gerus hier! Ek is bly om te probeer om u die beste te help.

Ek hoop jy het iets geleer wat jy kan gebruik om jou lewe net 'n bietjie beter te maak!

-RB

Aanbeveel: