Talaan ng mga Nilalaman:

Remote ng Universal TV - Ardiuino, Infrared: 5 Hakbang
Remote ng Universal TV - Ardiuino, Infrared: 5 Hakbang

Video: Remote ng Universal TV - Ardiuino, Infrared: 5 Hakbang

Video: Remote ng Universal TV - Ardiuino, Infrared: 5 Hakbang
Video: How to use Arduino as TV Remote Controller with Infrared 2024, Hulyo
Anonim
Remote ng Universal TV - Ardiuino, Infrared
Remote ng Universal TV - Ardiuino, Infrared

Kamusta! Sa itinuturo na ito, ipapakita ko sa iyo kung paano bumuo at magprogram ng iyong sariling unibersal na remote na gagana sa karamihan ng mga bagay na gumagamit ng isang infrared na remote, at "makikinig" din ito at magde-decode ng isang infrared signal na ipinadala ng iba't ibang mga remote.

Ang kaunting background ng kung ano ang nagbigay inspirasyon sa akin na itayo ang remote na ito - Ako, tulad ng karamihan sa iyo, ay patuloy na nawawala ang aking mga remote, at ang kalamidad na ito ay medyo nakakabigo, kaya't hinayaan ko itong malutas! Itinayo ko ang malayuang ito at maingat na naka-embed ito sa aking pasadyang built frame ng kama (ako rin ay isang manggagawa sa kahoy) - Hindi ko mawawala ang remote kung ito ay isang bahagi ng aking frame ng kama!

Mga gamit

Mga bagay na kakailanganin mo: -Arduino UNO o Nano - ang mileage ay maaaring mag-iba sa iba pang mga board

-Soldless breadboard (o solderable stripboard kung nais mong gawin itong mas permanenteng)

-Humperwires ng iba't ibang mga kulay at haba

-Menteng pindutan ng itulak (5) (maaari kang magdagdag ng higit pang mga pindutan, ngunit kakailanganin mong gumamit ng mga digital na pin, dahil lahat ngunit 1 sa mga analog na pin ang ginamit - kakailanganin mong tingnan upang matiyak na maayos mong ginagamit ang mga pull up resistors, o hilahin pababa ang mga resistor, at i-debug ang mga pindutan ng push)

-10K Ohm risistor (5) (kung nais mo ng higit pang mga pindutan ng push, kakailanganin mo ng higit sa mga ito)

-470 Ohm risistor (2)

-Infrared LED

-Red LED

-Infrared Sensor (Gumamit ako ng bahagi ng numero VS1838B, maaari kang gumamit ng isa pa, suriin lamang ang pin-out)

(Opsyonal) Soldering Iron, Solder, Solder Flux.

Hakbang 1: Pagbuo ng Circuit:

Pagbuo ng Circuit
Pagbuo ng Circuit

1). Palagi kong nais na magsimula sa pagtula ng aking mga bahagi, dahil palagi nitong hinihimok ang layout sa breadboard.

-Mga pindutan ng push

-LEDS: ang Red LED at IR LED ay wired nang magkasabay, upang makita mo kung ano ang ginagawa ng IR LED.

-Sensor

2). Mga lumalaban

- Ang limang resistors na 10K na na-attach namin sa mga pindutan ng push ay tinatawag na "pull down" na resistors. Hilahin ang mga resistor siguraduhin na kapag ang isang pindutan ng push ay hindi pinindot, ang kaukulang Arduino pin ay makakakuha ng 0 Volts (o hindi bababa sa malapit dito). Para sa karagdagang impormasyon sa pull down (o hilahin) ang mga resistor dito ay isang malalim na gabay:

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

Ang mga resistors na ito ay maaaring hindi ganap na kinakailangan, ngunit kung nakakakuha ka ng "ghost" na pagtulak, higit sa malamang na sanhi ito ng capacitive kopling at hilahin pababa ang resistors na pigilan ito.

3). Mga wire sa circuit

4). 5V at Ground Wires

Gamitin ang ibinigay na larawan para sa sanggunian! huwag matakot na baguhin ito para sa iyong mga pangangailangan kahit na!

Hakbang 2: Code:

# isama ang const int RECV_PIN = 7; // IR sensor read pin int Button1 = A4; // Farthest Left int Button2 = A3; // 2nd from the left int Button3 = A2; // Middle int Button4 = A1; // Ika-2 sa kanan int Button5 = A0; // Pinakamalayo sa kanan int LED = 3; // IR LED & Red LED int val = 0; // Pagbabago ng halaga IRsend irsend; IRrecv irrecv (RECV_PIN); mga resulta sa pag-decode_resulta;

void setup () {pinMode (Button1, INPUT); pinMode (Button2, INPUT); pinMode (Button3, INPUT); pinMode (Button4, INPUT); pinMode (Button5, INPUT); pinMode (LED, OUTPUT); Serial.begin (9600); irrecv.enableIRIn (); irrecv.blink13 (true);} void loop () {{{if (analogRead (Button1)> 900) irsend.sendNEC (0xFF02FD, 32); // gamit ang analog na basahin sa halip na digital na basahin upang maiwasan ang mga isyu ng bihag na capacitance. Gayundin, tumutulong sa pag-debug ng mga pindutan. // Ang pagkakaroon ng nabasa na analog sa 900 ay nagbibigay-daan para sa ilang falgle room sa mga halaga, ibig sabihin, ipapadala ang signal ng infra kahit na ang isang buong 5V ay hindi mailapat sa pin. // ngunit 900 ay sapat na mataas upang hindi mabasa nang mali dahil sa pagkaantala ng capacitive coupling (100);} // RGB Strip On & off {kung (analogRead (Button5)> 900) {para sa (int i = 0; i <3; i ++) // pagbabago ng halaga sa "i <3" ay magbabago ng bilang ng mga oras na ang signal ay inuulit agad. kaya ulitin ng "i <2" ang signal ng dalawang beses. // maaaring kailanganin mong maglaro kasama ang numerong ito kung hindi tumutugon ang iyong TV, sa pangkalahatan, 1 o 3 ang pinaka-gumagana, kung hindi, subukan ang mga kakaibang numero. // maaaring kailangan mo ring maglaro kasama ang mga halagang pag-antala ng oras ng intra signal, halimbawa, para sa aking TV 10 na gumagana, ngunit 30 ay hindi. {irsend.sendSony (0xa90, 12); // Sony TV power code, para sa aking TV, kailangang maipadala ang code ng 3x3, kaya 3 pulso, tatlong magkakahiwalay na beses na pagkaantala (10); // "intra signal delay" para sa (int i = 0; i <3; i ++) {irsend.sendSony (0xa90, 12); // "12" ang bit number, iba't ibang mga protocol ang tumatawag para sa iba't ibang mga bit number. Ang NEC ay 32, ang Sony ay 12, maaari mong tingnan ang pagkaantala ng iba (10); para sa (int i = 0; i 900) {para (int i = 0; i 900) {para (int i = 0; i 900) {para (int i = 0; i <3; i ++) {irsend.sendSony (0xc90, 12); // Sony TV power Volume Down na pagkaantala (100);}}} pagkaantala (100);} kung (irrecv.decode (& mga resulta)) // ang bahagi sa ibaba ng code ay nagbibigay-daan sa iyo upang bigyang kahulugan ang mga pulang signal ng Infra mula sa iba't ibang mga remote. {Serial.println (results.value, HEX); // bubuo ito ng pamamaraang "NEC, Sony, Etc.." at isang TV code na "c90, a90, FF02FD" kakailanganin mong idagdag ang 0x sa harap ng switch ng TV Code (results.decode_type) {case DENON: Serial.println ("DENON"); pahinga; kaso NEC: Serial.println ("NEC"); pahinga; kaso PANASONIC: Serial.println ("PANASONIC"); pahinga; kaso SONY: Serial.println ("SONY"); pahinga; kaso RC5: Serial.println ("RC5"); pahinga; kaso JVC: Serial.println ("JVC"); pahinga; kaso SANYO: Serial.println ("SANYO"); pahinga; kaso MITSUBISHI: Serial.println ("MITSUBISHI"); pahinga; kaso SAMSUNG: Serial.println ("SAMSUNG"); pahinga; kaso LG: Serial.println ("LG"); pahinga; kaso RC6: Serial.println ("RC6"); pahinga; kaso DISH: Serial.println ("DISH"); pahinga; kaso SHARP: Serial.println ("SHARP"); pahinga; kaso WHYNTER: Serial.println ("WHYNTER"); pahinga; kaso AIWA_RC_T501: Serial.println ("AIWA_RC_T501"); pahinga; default: case UNKNOWN: Serial.println ("UNKNOWN"); basagin;} irrecv.resume ();}}

Hakbang 3: Code sa Lalim: Pagpapadala ng Mga signal ng IR

Magtutukoy ako sa mga linya ng code sa pamamagitan ng kanilang numero sa linya - upang sundin, gamitin ang link na ito:

pastebin.com/AQr0fBLg

Una, kailangan naming isama ang IR Remote Library sa pamamagitan ng z3t0.

Narito ang isang link sa silid-aklatan:

github.com/z3t0/Arduino-IRremote

Kung kailangan mo ng isang gabay sa kung paano maayos na mag-download ng isang silid-aklatan at mai-install ito sa IDE:

www.arduino.cc/en/guide/libraries

Ang linya 1 ay may kasamang library.

Susunod, kailangan naming ideklara ang ilang mga variable, mga linya 2-12 gawin ito.

Gumagamit kami ng "cost int" upang tukuyin ang mga variable na hindi magbabago, lahat maliban sa isang pagkahulog sa kategoryang ito.

Gumagamit kami ng "int" upang tukuyin ang mga variable na magbabago.

Dapat kaming gumamit ng isang pin na may pulso na may modulate (PWM) para sa aming LED pin - ang anumang pin na may "~" sa tabi nito ay sapat na, sa aking code - gumagamit kami ng digital pin 3.

Susunod, kailangan naming gumawa ng ilang pag-setup - ang code na ito ay tatakbo nang isang beses lamang kapag ang Arduino ay pinapagana o na-reset.

Pansinin na tinutukoy namin ang aming mga input at output (15-20), pinapaputok ang serial monitor (21), pinapagana ang IR sensor (22), at sinasabihan ang Arduino na pumikit ang onboard LED anumang oras na makakakuha kami ng isang senyas sa sensor (23).

Susunod, bubuo namin ang aming loop - ang code na ito ay tatakbo nang paulit-ulit, pagpunta mula sa itaas hanggang sa ibaba ng isang maliit na beses sa isang segundo.

Sa linya 25, gumagamit kami ng isang kung pahayag, sasabihin nito sa Arduino na "hanapin ang tukoy na pamantayan na ito, kung natutugunan ang pamantayan na iyon, gawin ang tukoy na bagay na ito". Sa kasong ito, ang pamantayan ay analogRead (Button1)> 900, o sa madaling salita - "Arduino, Tingnan ang button1, na tinukoy namin bilang pin A4 mas maaga, kung ang natanggap na analog signal ay mas malaki sa 900, mangyaring magpatuloy sa aming susunod na mga tagubilin, kung hindi, mangyaring magpatuloy ". Mayroong kaunti upang i-unpack dito, kaya hinayaan ang pagsisid: ang isang analog signal sa Arduino ay isang halaga na katumbas o mas mababa sa 5V, na may 5V na katumbas ng 1023, at 0V na katumbas ng 0. Ang anumang naibigay na boltahe sa pagitan ng 0 at 5V ay maaaring tukuyin ng isang numero, at sa kaunting matematika, maaari nating malaman ang numerong iyon, o kabaligtaran, isang boltahe. Hatiin ang 1024 (isinasama namin ang 0 bilang isang yunit) ng 5, na nagbibigay sa amin ng 204.8. Halimbawa, ginagamit namin ang bilang 900, upang isalin iyon sa boltahe, simpleng hinahati namin ang 900 ng 204.8, binibigyan kami ng ~ 4.4V. Sinasabi namin sa Arduino na maghanap ng isang boltahe na mas malaki sa ~ 4.4 volts, at kung ito ay, gawin ang aming susunod na tagubilin.

Pinag-uusapan ang mga susunod na tagubilin (linya 25), nakikita namin ang irsend.sendNEC (0xFF02FD, 32). Sinasabi nito na "Arduino, magpadala ng isang na-modulate na pulso na sumusunod sa NEC protocol, partikular na ang signal ng FF02FD, at tiyakin na ang haba ng 32 bits". Gagawin nito ang aming IR LED flicker sa paraang mauunawaan ng ibang mga aparato. Isipin ito nang kaunti tulad ng Morse Code, ngunit mayroon lamang hindi nakikitang ilaw! Mayroong maraming magkakaibang mga protokol doon, bawat isa ay may daan-daang kung hindi libu-libong mga indibidwal na signal, at bawat isa ay may kanilang tukoy na bilang ng bit - makikilala ng aming aparato ang isang malaking halaga ng mga signal na ito, ngunit sasabak kami doon sa paglaon!

Sa linya 28, mayroon kaming unang pagkaantala - narito ito upang maiwasan ang hindi sinasadyang mga paulit-ulit na signal, sa sandaling ang pindutan ay pinindot at ipinadala ang signal ng IR, mayroon kaming 100 milliseconds upang maalis ang aming daliri sa pindutan. ito ay hindi katulad ng maraming oras, ngunit sa pagsasagawa, mukhang maayos itong gumana. ang pagpapaandar ng pagkaantala ay nagsasabi sa Arduino na "huwag gumawa para sa X milliseconds" at para sa sanggunian, ang mga ito ay 1000 milliseconds sa isang segundo.

Ang paglipat sa aming susunod na pindutan sa linya 29, button5 (Orihinal na mayroon akong 4 na mga pindutan sa remote na ito, nagdagdag ng ikalimang, kaya't bakit wala kami sa order). Ito, sa espiritu, ay ang parehong bagay tulad ng pindutan 1, ngunit may ilang mga pangunahing pagkakaiba. Ang unang pagkakaiba na makikita mo ay para sa pahayag - ito ay mahalagang isa pang loop - isang loop na may isa pang mas malaking loop, loopception. Partikular na mayroon kaming "para (int i = 0; i <3; i ++)", basahin ito bilang "Arduino, magsisimula sa 0, ulitin ang mga sumusunod na tagubilin hanggang sa makarating kami sa 3 beses". Ginamit ang for function dahil maraming mga aparato ang na-program upang maghanap ng paulit-ulit na signal, at sa aming kaso dito, 3 beses. Maaari mo lamang baguhin ang numero 3 sa isang iba't ibang mga numero kung ang iyong aparato ay tumawag para sa isang iba't ibang iskedyul ng pag-uulit. Ang isa pang pangunahing pagkakaiba sa button5 ay naulit ito muli, 3 beses, o 3x3. Sa madaling salita, nagpapadala kami ng senyas ng 3 beses, maghintay ng 10 milliseconds, ipadala itong muli ng 3 beses, maghintay ng isa pang 10 milliseconds, at pagkatapos ay ipadala ulit ito ng 3 beses. Karaniwan ang ganitong uri ng komunikasyon para sa pag-on at pag-on ng mga aparato at maaaring maging kung ano ang tawag sa iyong TV o aparato - ang susi dito ay upang maglaro kasama ang lahat ng mga variable hanggang makuha mo ang nais na resulta. Baguhin ang maikling halaga ng pagkaantala, palitan ang para sa umuulit na halaga, magpadala ng 6 na batch sa halip na 3, atbp. Ang mga aparato ay na-program na may di-makatwirang mga patakaran ng signal ng sadya, isipin kung ang iyong remote sa TV ay nagpadala ng parehong uri ng signal bilang iyong sound bar; tuwing binago mo ang channel sa iyong TV, nakasara ang iyong sound bar - iyon ang dahilan kung bakit may iba't ibang mga panuntunan sa signal.

Ang susunod na tatlong mga pindutan ay na-program na may parehong mga punong-guro, hindi bababa sa bahagi, na inilarawan sa itaas - upang maaari naming laktawan ang lahat hanggang sa linya 55.

Hakbang 4: Code sa Lalim: Pagtanggap ng Mga IR Signal

Code sa Lalim: Tumatanggap ng mga IR Signal
Code sa Lalim: Tumatanggap ng mga IR Signal

Sa linya 55, nagsisimula kaming mag-program ng Arduino upang bigyang kahulugan ang mga signal ng IR na ipinadala ng iba pang mga remote - kinakailangan ito upang malaman mo ang mga protokol at signal na ginagamit ng iyong mga remote. Ang unang linya ng code sa linya 55 ay kung (irrecv.decode (& mga resulta) basahin ito bilang "Arduino, maghanap ng isang IR code, kung makahanap ka ng isa, ibalik ang isang tunay na halaga, kung walang nahanap, bumalik nang hindi totoo. Kapag totoo, itala ang impormasyon sa "mga resulta" ".

Ang paglipat sa linya 56, mayroon kaming Serial.println (results.value, HEX) na sinasabi na "Ardunio, i-print ang mga resulta sa serial monitor sa isang HEX format". Ang Hex, na nangangahulugang hexadecimal, ay isang paraan na maaari nating paikliin ang isang binary string (0 lamang at 1) sa isang bagay na medyo madaling i-type. Halimbawa 101010010000 ay "a90", ang code na ginamit upang paandarin ang aking TV at paandar, at 111111110000001011111101 ay 0xFF02FD, na kumokontrol sa aking RGB strip. Maaari mong gamitin ang tsart sa itaas upang i-convert ang binary sa hex, at kabaliktaran, o maaari mong gamitin ang sumusunod na link:

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

Bumaba sa linya 57, mayroon kaming isang bagong pag-andar, na tinatawag na isang switch case.

Mahalaga, pinapayagan ka ng isang switch case na tukuyin ang iba't ibang mga tagubilin batay sa mga resulta ng isang naibigay na variable (kaso). ang break ay lumalabas sa switch statement, at ginagamit sa dulo ng bawat pahayag.

Ginagamit namin ang switch case dito upang baguhin kung paano kami mag-print sa serial monitor batay sa mga protocol na nadarama ng aming Arduino mula sa iba't ibang mga remote.

Hakbang 5: Konklusyon

Kung mayroon kang isang katanungan - mangyaring huwag mag-atubiling makipag-ugnay sa akin dito! Masaya akong subukan na tulungan ka sa abot ng makakaya ko.

Inaasahan kong may natutunan ka na maaari mong magamit upang mapagbuti ang iyong buhay nang medyo mas mahusay!

-RB

Inirerekumendang: