Satura rādītājs:

Universāla TV tālvadības pults - Ardiuino, infrasarkanais: 5 soļi
Universāla TV tālvadības pults - Ardiuino, infrasarkanais: 5 soļi

Video: Universāla TV tālvadības pults - Ardiuino, infrasarkanais: 5 soļi

Video: Universāla TV tālvadības pults - Ardiuino, infrasarkanais: 5 soļi
Video: Lesson 21: Using Infrared Remote Control with Arduino | SunFounder Robojax 2024, Jūlijs
Anonim
Universālā TV tālvadības pults - Ardiuino, infrasarkanais
Universālā TV tālvadības pults - Ardiuino, infrasarkanais

Sveiki! Šajā pamācībā es jums parādīšu, kā izveidot un programmēt savu universālo tālvadības pulti, kas darbosies ar lielāko daļu lietu, kas izmanto infrasarkano tālvadības pulti, un kas arī "klausīsies" un dekodēs dažādu citu tālvadības pulti sūtīto infrasarkano signālu.

Neliels priekšstats par to, kas mani iedvesmoja izveidot šo tālvadības pulti - es, tāpat kā lielākā daļa no jums, pastāvīgi pazaudēju tālvadības pults, un šī nelaime ir diezgan nomākta, tāpēc es domāju, ka ļaujiet to atrisināt! Es esmu uzbūvējis šo tālvadības pulti un diskrēti ielaidis to savā pielāgotajā gultas rāmī (es esmu arī kokapstrādes darbinieks) - es nevaru pazaudēt tālvadības pulti, ja tā ir daļa no mana gultas rāmja!

Piegādes

Nepieciešamās lietas: -Arduino UNO vai Nano - nobraukums var atšķirties atkarībā no citiem dēļiem

-bez lodēšanas maizes dēlis (vai lodējams sloksnes dēlis, ja vēlaties to padarīt pastāvīgāku)

-Dažādu krāsu un garuma džemperi

-Momentārās spiedpogas (5) (jūs varat pievienot vairāk pogu, bet jums būs jāizmanto digitālās tapas, jo tiek izmantotas visas analogās tapas, izņemot vienu - jums būs jāpārliecinās, vai pareizi izmantojat uzvilkšanas rezistorus vai nojauciet rezistorus un atvienojiet spiedpogas)

-10K omu rezistors (5) (ja vēlaties vairāk spiedpogu, jums būs nepieciešams vairāk no tiem)

-470 omu rezistors (2)

-Infrasarkanā gaismas diode

-Sarkana LED

-Infrasarkanais sensors (es izmantoju detaļas numuru VS1838B, jūs varētu izmantot citu, vienkārši pārbaudiet izvilkšanu)

(Pēc izvēles) Lodāmurs, lodēt, lodēt.

1. darbība: ķēdes izveide:

Ķēdes veidošana
Ķēdes veidošana

1). Man vienmēr patīk sākt ar sastāvdaļu izvietošanu, jo tas vienmēr nosaka maizes dēļa izkārtojumu.

-Spiediet pogas

-LEDS: Sarkanais LED un IR LED ir savienoti kopā, lai jūs varētu redzēt, ko IR LED dara.

-Sensors

2). Rezistori

- Piecus 10K rezistorus, kurus esam pievienojuši spiedpogām, sauc par "nolaižamajiem" rezistoriem. Pavelciet uz leju rezistorus, lai pārliecinātos, ka, nospiežot spiedpogu, atbilstošā Arduino tapa iegūst 0 voltu (vai vismaz tuvu tai). Lai iegūtu papildinformāciju par nolaižamajiem (vai uzvelkamajiem) rezistoriem, šeit ir padziļināta rokasgrāmata:

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

Šie rezistori var nebūt pilnīgi nepieciešami, bet, ja jūs saņemat "spoku" spiedienu, tas, visticamāk, ir saistīts ar kapacitatīvo savienojumu un nolaižamie rezistori to novērš.

3). Ķēdes vadi

4). 5V un zemes vadi

Izmantojiet pievienoto attēlu kā atsauci! tomēr nebaidieties to mainīt savām vajadzībām!

2. darbība: kods:

#include const int RECV_PIN = 7; // IR sensors nolasa tapu int Poga1 = A4; // Tālākā kreisā int poga2 = A3; // 2. no kreisās int Poga3 = A2; // Vidējā int Poga4 = A1; // 2. pa labi int Poga5 = A0; // Vistālāk pa labi int LED = 3; // IR gaismas diode un sarkana gaismas diode int val = 0; // Mainīga vērtība IRsend irsend; IRrecv irrecv (RECV_PIN); decode_results rezultāti;

void setup () {pinMode (Button1, INPUT); pinMode (Button2, INPUT); pinMode (Button3, INPUT); pinMode (Button4, INPUT); pinMode (Button5, INPUT); pinMode (LED, OUTPUT); Sērijas sākums (9600); irrecv.enableIRIn (); irrecv.blink13 (true);} void loop () {{{if (analogRead (Button1)> 900) irsend.sendNEC (0xFF02FD, 32); // izmantojot analogo lasīšanu digitālās lasīšanas vietā, lai izvairītos no ieslodzījuma kapacitātes problēmām. arī palīdz atslēgt pogas. // Analoga lasīšana pie 900 ļauj vērtībām nedaudz svārstīties, tas nozīmē, ka infrasignāls tiks nosūtīts pat tad, ja tapai netiks piemērots pilns 5V spriegums. // bet 900 ir pietiekami augsts, lai nevarētu kļūdaini nolasīt kapacitatīvās sakabes aizkaves dēļ (100);} // RGB joslas ieslēgšana un izslēgšana {if (analogRead (Button5)> 900) {for (int i = 0; i <3; i ++) // mainot vērtību "i <3", tiks mainīts signāla atkārtošanas reižu skaits. tāpēc "i <2" atkārtos signālu divas reizes. // jums, iespējams, vajadzēs spēlēties ar šo numuru, ja jūsu televizors nereaģē, parasti vislabāk darbojas 1 vai 3, ja ne, mēģiniet nepāra skaitļus. // jums, iespējams, būs jāspēlē arī ar iekšējā signāla aizkaves laika vērtībām, piemēram, manam TV 10 darbam, bet 30 ne. {irsend.sendSony (0xa90, 12); // Sony TV barošanas kods, manam televizoram kods jānosūta 3x3, tātad 3 impulsi, trīs atsevišķu laiku aizkave (10); // "iekšējā signāla aizture" (int i = 0; i <3; i ++) {irsend.sendSony (0xa90, 12); // "12" ir bitu numurs, dažādi protokoli pieprasa dažādus bitu numurus. NEC ir 32, Sony ir 12, jūs varat meklēt pārējos kavēšanos (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 barošanas skaļuma samazināšanas aizkave (100);}}} aizkave (100);} ja (irrecv.decode (& results)) // zemāk esošā koda daļa ļauj interpretēt dažādu tālvadības pultu infrasarkanos signālus. {Serial.println (results.value, HEX); // tas ģenerēs procedūru "NEC, Sony, utt." un TV kodu "c90, a90, FF02FD", jums būs jāpievieno 0x TV koda slēdža priekšpusē (results.decode_type) {case DENON: Serial.println ("DENON"); pārtraukums; gadījums NEC: Serial.println ("NEC"); pārtraukums; gadījums PANASONIC: Serial.println ("PANASONIC"); pārtraukums; gadījums SONY: Serial.println ("SONY"); pārtraukums; gadījums RC5: Serial.println ("RC5"); pārtraukums; gadījums JVC: Serial.println ("JVC"); pārtraukums; korpuss SANYO: Serial.println ("SANYO"); pārtraukums; korpuss MITSUBISHI: Serial.println ("MITSUBISHI"); pārtraukums; korpuss SAMSUNG: Serial.println ("SAMSUNG"); pārtraukums; korpuss LG: Serial.println ("LG"); pārtraukums; gadījums RC6: Serial.println ("RC6"); pārtraukums; korpuss DISH: Serial.println ("DISH"); pārtraukums; korpuss SHARP: Serial.println ("SHARP"); pārtraukums; gadījums WHYNTER: Serial.println ("WHYNTER"); pārtraukums; gadījums AIWA_RC_T501: Serial.println ("AIWA_RC_T501"); pārtraukums; noklusējums: gadījums UNKNOWN: Serial.println ("UNKNOWN"); pārtraukums;} irrecv.resume ();}}

3. darbība: kods dziļumā: IR signālu sūtīšana

Es atsaucos uz koda rindām pēc to rindas numura - lai sekotu, izmantojiet šo saiti:

pastebin.com/AQr0fBLg

Pirmkārt, mums ir jāiekļauj IR tālvadības bibliotēka ar z3t0.

Šeit ir saite uz bibliotēku:

github.com/z3t0/Arduino-IRremote

Ja jums ir nepieciešams ceļvedis par to, kā pareizi lejupielādēt bibliotēku un instalēt to IDE:

www.arduino.cc/en/guide/libraries

1. rindā ir bibliotēka.

Tālāk mums ir jādeklarē daži mainīgie, 2.-12.

Mēs izmantojam "cost int", lai definētu mainīgos, kas nemainīsies, visi, izņemot vienu, ietilpst šajā kategorijā.

Mēs izmantojam “int”, lai definētu mainīgos, kas mainīsies.

Mūsu LED tapai ir jāizmanto tapa ar impulsu ar modulāciju (PWM) - ar jebkuru tapu, kurai blakus ir “~”, manā kodā - mēs izmantojam digitālo tapu 3.

Tālāk mums ir jāveic iestatīšana - šis kods darbosies tikai vienu reizi, kad Arduino tiek ieslēgts vai atiestatīts.

Ievērojiet, ka mēs definējam savas ieejas un izejas (15-20), ieslēdzam seriālo monitoru (21), iespējojam IR sensoru (22) un sakām Arduino, lai mirgo iebūvētā LED ikreiz, kad mēs saņemam signālu sensorā (23).

Tālāk mēs izveidosim savu cilpu - šis kods darbosies atkārtoti, pārejot no augšas uz leju dažas reizes sekundē.

25. rindā mēs izmantojam paziņojumu if, kas liek Arduino "meklēt šos īpašos kritērijus, ja šie kritēriji ir izpildīti, dariet šo konkrēto lietu". Šajā gadījumā kritēriji ir analogRead (Button1)> 900, vai citiem vārdiem sakot - "Arduino, paskaties uz pogu1, kuru mēs agrāk definējām kā tapu A4, ja saņemtais analogā signāls ir lielāks par 900, lūdzu, turpiniet mūsu nākamos norādījumus ja nē, lūdzu, turpiniet. " Šeit ir mazliet jāizpako, tāpēc ļaujiet ienirt: Arduino analogā signāla vērtība ir vienāda ar vai mazāka par 5V, 5V ir vienāds ar 1023 un 0V ir vienāds ar 0. Jebkurš spriegums no 0 līdz 5V var tikt definēts ar skaitli, un ar nelielu matemātikas palīdzību mēs varam noskaidrot šo skaitli vai otrādi - spriegumu. Sadaliet 1024 (mēs iekļaujam 0 kā vienību) ar 5, kas dod mums 204,8. Piemēram, mēs izmantojam skaitli 900, lai to pārvērstu spriegumā, mēs vienkārši dalām 900 ar 204,8, dodot mums ~ 4,4 V. Mēs sakām Arduino meklēt spriegumu, kas lielāks par ~ 4,4 voltiem, un, ja tas ir, izpildiet mūsu nākamo norādījumu.

Runājot par nākamajiem norādījumiem (25. rinda), mēs redzam irsend.sendNEC (0xFF02FD, 32). Tas saka: "Arduino, nosūtiet modulētu impulsu, kas seko NEC protokolam, jo īpaši FF02FD signālam, un pārliecinieties, vai tas ir 32 biti garš". Tādējādi mūsu IR LED mirgos tā, lai citas ierīces to saprastu. Padomājiet par to mazliet kā par Morzes kodu, bet tikai ar neredzamu gaismu! Tur ir daudz dažādu protokolu, katrs ar simtiem, ja ne tūkstošiem atsevišķu signālu, un katrs ar savu konkrēto bitu skaitu - mūsu ierīce spēs atpazīt lielu daudzumu šo signālu, bet mēs tajā ienirsim vēlāk!

28. rindā mums ir pirmā kavēšanās - tas ir šeit, lai novērstu nejaušus atkārtotus signālus, kad poga ir nospiesta un IR signāls ir nosūtīts, mums ir 100 milisekundes, lai noņemtu pirkstu no pogas. tas neizklausās pēc daudz laika, bet praksē šķiet, ka tas darbojas labi. aizkaves funkcija saka Arduino "neko nedarīt X milisekundēs", un atsaucei tie ir 1000 milisekundes sekundē.

Pārejot pie mūsu nākamās pogas 29. rindā, 5. poga (man sākotnēji bija 4 pogas uz šīs tālvadības pults, pievienoju piekto daļu, tāpēc mēs neesam kārtībā). Tas pēc būtības ir tas pats, kas 1. poga, bet ar dažām galvenajām atšķirībām. Pirmā atšķirība, ko redzēsit, ir paziņojums - tas būtībā ir vēl viena cilpa - cilpa ar citu lielāku cilpu, cilpas uztveršana. Konkrēti mums ir "for (int i = 0; i <3; i ++)", lasiet to kā "Arduino, ļauj sākt no 0, atkārtojiet tālāk sniegtos norādījumus, līdz nonāksim līdz 3 reizēm". Funkcija for tiek izmantota, jo daudzas ierīces ir ieprogrammētas meklēt atkārtotu signālu, un mūsu gadījumā šeit - 3 reizes. Jūs varat vienkārši nomainīt numuru 3 uz citu numuru, ja jūsu ierīce pieprasa citu atkārtojumu grafiku. Vēl viena būtiska atšķirība ar pogu 5 ir tā, ka tā tiek atkārtota vēlreiz, 3 reizes vai 3x3. Citiem vārdiem sakot, mēs nosūtām signālu 3 reizes, pagaidām 10 milisekundes, nosūta to vēlreiz 3 reizes, pagaidām vēl 10 milisekundes un pēc tam nosūta to vēlreiz 3 reizes. Šāda veida komunikācija ir izplatīta ierīču ieslēgšanai un izslēgšanai, un tas var būt tieši tas, ko prasa jūsu televizors vai ierīce - galvenais ir spēlēties ar visiem mainīgajiem, līdz tiek sasniegts vēlamais rezultāts. Mainiet īsās aizkaves vērtību, mainiet atkārtotās vērtības vērtību, nosūtiet 6 partijas, nevis 3 utt. Ierīces ir apzināti ieprogrammētas ar patvaļīgiem signāla noteikumiem, iedomājieties, vai jūsu televizora tālvadības pults nosūtīja tāda paša veida signālu kā jūsu skaņas josla; katru reizi, kad televizorā maināt kanālu, skaņas josla tiek izslēgta - tāpēc ir atšķirīgi signāla noteikumi.

Nākamās trīs pogas ir ieprogrammētas ar tiem pašiem principiem, vismaz daļēji, kas aprakstīti iepriekš - lai mēs varētu izlaist līdz 55. rindai.

4. solis: kods dziļumā: IR signālu saņemšana

Kods dziļumā: IR signālu saņemšana
Kods dziļumā: IR signālu saņemšana

55. rindā mēs sākam programmēt Arduino, lai interpretētu citu tālvadības ierīču sūtītos IR signālus - tas ir nepieciešams, lai jūs varētu saprast, kādi protokoli un signāli tiek izmantoti jūsu tālvadības pultīs. Pirmā koda rinda 55. rindā ir, ja (irrecv.decode (& rezultāti) to nolasa kā "Arduino, meklējiet IR kodu, ja atrodat, atgrieziet patiesu vērtību, ja nekas nav atrasts, atgrieziet nepatiesu. Ja patiess, ierakstiet informāciju "rezultātos".

Pārejot uz 56. rindu, mums ir Serial.println (results.value, HEX), kurā teikts: "Ardunio, izdrukājiet rezultātus sērijveida monitorā HEX formātā". Hex, kas nozīmē heksadecimāli, ir veids, kā mēs varam saīsināt bināro virkni (tikai 0 un 1), lai to ierakstītu nedaudz vieglāk. Piemēram, 101010010000 ir "a90", kods, ko izmanto, lai izslēgtu un ieslēgtu televizoru, un 111111110000001011111101 ir 0xFF02FD, kas kontrolē manu RGB joslu. Varat izmantot iepriekš minēto diagrammu, lai pārvērstu bināro par heksadecimālo skaitli un otrādi, vai arī varat izmantot šo saiti:

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

Līdz 57. rindai mums ir jauna funkcija, ko sauc par slēdža korpusu.

Būtībā slēdža korpuss ļauj mums norādīt dažādus norādījumus, pamatojoties uz konkrētā mainīgā (gadījuma) rezultātiem. pārtraukums iziet no slēdža paziņojuma un tiek izmantots katra priekšraksta beigās.

Mēs šeit izmantojam slēdža korpusu, lai mainītu drukāšanas veidu sērijas monitorā, pamatojoties uz mūsu Arduino sajūtu protokoliem no dažādām tālvadības pultīm.

5. darbība. Secinājums

Ja jums ir jautājums - lūdzu, sazinieties ar mani šeit! Ar prieku cenšos jums palīdzēt, cik vien varu.

Es ceru, ka jūs uzzinājāt kaut ko, ko varat izmantot, lai padarītu savu dzīvi nedaudz labāku!

-RB

Ieteicams: