Isi kandungan:

Jauh TV Universal - Ardiuino, Inframerah: 5 Langkah
Jauh TV Universal - Ardiuino, Inframerah: 5 Langkah

Video: Jauh TV Universal - Ardiuino, Inframerah: 5 Langkah

Video: Jauh TV Universal - Ardiuino, Inframerah: 5 Langkah
Video: How to use Arduino as TV Remote Controller with Infrared 2024, Julai
Anonim
Jauh TV Universal - Ardiuino, Inframerah
Jauh TV Universal - Ardiuino, Inframerah

Helo! Dalam arahan ini, saya akan menunjukkan kepada anda cara membina dan memprogram remote universal anda sendiri yang akan berfungsi dengan kebanyakan perkara yang menggunakan remote inframerah, dan itu juga akan "mendengarkan" dan menyahkod isyarat inframerah yang dihantar oleh pelbagai alat kawalan jauh yang lain.

Sedikit latar belakang apa yang memberi inspirasi kepada saya untuk membina alat kawalan jauh ini - Saya, seperti kebanyakan anda, kehilangan alat kawalan jauh saya, dan malapetaka ini agak mengecewakan, jadi saya fikir boleh menyelesaikannya! Saya telah membina alat kawalan jauh ini dan memasukkannya secara berhati-hati ke dalam bingkai katil khas saya (saya juga tukang kayu) - Saya tidak boleh kehilangan alat kawalan jauh itu jika ia adalah bahagian dari bingkai katil saya!

Bekalan

Perkara yang anda perlukan: -Arduino UNO atau Nano - jarak tempuh mungkin berbeza dengan papan lain

-Papan roti tanpa solder (atau papan jalur yang boleh dipateri jika anda ingin menjadikannya lebih kekal)

-Jumperwire pelbagai warna dan panjang

-Tombol tekan sementara (5) (anda boleh menambah lebih banyak butang, tetapi anda perlu menggunakan pin digital, kerana semua kecuali 1 pin analog digunakan - anda perlu melihat untuk memastikan anda menggunakan perintang penarik dengan betul, atau tarik perintang ke bawah, dan lepaskan butang tekan)

-10K Ohm perintang (5) (jika anda mahu lebih banyak butang tekan, anda memerlukan lebih banyak lagi)

-470 Perintang Ohm (2)

- LED Inframerah

- LED Merah

-Infrared Sensor (Saya menggunakan nombor bahagian VS1838B, anda boleh menggunakan yang lain, hanya periksa pin-out)

(Pilihan) Soldering Iron, Solder, Solder Flux.

Langkah 1: Membina Litar:

Membina Litar
Membina Litar

1). Saya selalu suka memulakan dengan meletakkan komponen saya, kerana ini selalu mendorong susun atur di papan roti.

-Tekan butang

-LEDS: LED Merah dan LED IR disambungkan secara beriringan, jadi anda dapat melihat apa yang dilakukan oleh LED IR.

-Sensor

2). Perintang

- Lima perintang 10K yang kami pasangkan pada butang tekan dipanggil perintang "tarik ke bawah". Tarik perintang ke bawah memastikan bahawa apabila butang tekan tidak ditekan, pin Arduino yang sesuai mendapat 0 Volt (atau sekurang-kurangnya dekat dengannya). Untuk maklumat lebih lanjut mengenai perintang tarik ke bawah (atau tarik ke atas) berikut adalah panduan mendalam:

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

Perintang ini mungkin tidak diperlukan sepenuhnya, tetapi jika anda mendapat "hantu" tolak, kemungkinan besar disebabkan oleh gandingan kapasitif dan perintang tarik menghalang ini.

3). Wayar litar

4). 5V dan Wayar Tanah

Gunakan gambar yang disediakan untuk rujukan! jangan takut untuk mengubahnya untuk keperluan anda!

Langkah 2: Kod:

#masuk const int RECV_PIN = 7; // Sensor IR pin pin int Butang1 = A4; // Butang Kiri Jauh Jauh 2 = A3; // ke-2 dari kiri int Butang3 = A2; // Butang int tengah4 = A1; // 2 ke kanan int Butang5 = A0; // Jauh ke kanan int LED = 3; // IR LED & LED Merah int val = 0; // Menukar nilai IRsend irsend; IRrecv irrecv (RECV_PIN); keputusan decode_results;

kekosongan persediaan () {pinMode (Button1, INPUT); pinMode (Butang2, INPUT); pinMode (Butang3, INPUT); pinMode (Butang4, INPUT); pinMode (Butang5, INPUT); pinMode (LED, OUTPUT); Serial.begin (9600); irrecv.enableIRIn (); irrecv.blink13 (true);} gelung kekosongan () {{{if (analogRead (Button1)> 900) irsend.sendNEC (0xFF02FD, 32); // menggunakan pembacaan analog dan bukan pembacaan digital untuk mengelakkan masalah kapasitansi tertawan. juga, membantu melepaskan butang. // Memiliki pembacaan analog pada 900 memungkinkan ruang goyangan dalam nilai, yang bermaksud, isyarat infra akan dihantar walaupun 5V penuh tidak digunakan pada pin. // tetapi 900 cukup tinggi untuk tidak membaca secara salah kerana kelewatan gandingan kapasitif (100);} // RGB Strip On & off {if (analogRead (Button5)> 900) {untuk (int i = 0; i <3; i ++) // mengubah nilai dalam "i <3" akan mengubah berapa kali isyarat diulang dengan segera. jadi "i <2" akan mengulangi isyarat dua kali. // anda mungkin perlu bermain-main dengan nombor ini jika TV anda tidak bertindak balas, umumnya, 1 atau 3 bekerja paling banyak, jika tidak, cubalah angka ganjil. // anda mungkin juga perlu bermain dengan nilai masa penangguhan isyarat intra, misalnya, untuk TV 10 saya berfungsi, tetapi 30 tidak. {irsend.sendSony (0xa90, 12); // Kod kuasa TV Sony, untuk TV saya, kod perlu dihantar 3x3, jadi 3 denyutan, tiga kali berlengah-lengah (10); // "kelewatan isyarat intra" untuk (int i = 0; i <3; i ++) {irsend.sendSony (0xa90, 12); // "12" adalah nombor bit, protokol yang berbeza memanggil nombor bit yang berbeza. NEC adalah 32, Sony berumur 12 tahun, anda boleh melihat kelewatan yang lain (10); untuk (int i = 0; i 900) {untuk (int i = 0; i 900) {untuk (int i = 0; i 900) {untuk (int i = 0; i <3; i ++) {irsend.sendSony (0xc90, 12); // Kelewatan Kelantangan Kelantangan Kuasa TV Sony (100);}}} kelewatan (100);} jika (irrecv.decode (& hasil)) // bahagian kod di bawah ini membolehkan anda mentafsirkan isyarat Infra merah dari pelbagai jarak jauh. {Serial.println (results.value, HEX); // itu akan menghasilkan prosedur "NEC, Sony, Dll.." dan kod TV "c90, a90, FF02FD" anda perlu menambahkan 0x ke bahagian depan suis Kod TV (hasil.decode_type) {case DENON: Serial.println ("DENON"); rehat; kes NEC: Serial.println ("NEC"); rehat; kes PANASONIC: Serial.println ("PANASONIC"); rehat; kes SONY: Serial.println ("SONY"); rehat; kes RC5: Serial.println ("RC5"); rehat; kes JVC: Serial.println ("JVC"); rehat; kes SANYO: Serial.println ("SANYO"); rehat; kes MITSUBISHI: Serial.println ("MITSUBISHI"); rehat; kes SAMSUNG: Serial.println ("SAMSUNG"); rehat; kes LG: Serial.println ("LG"); rehat; kes RC6: Serial.println ("RC6"); rehat; kes DISH: Serial.println ("DISH"); rehat; kes SHARP: Serial.println ("SHARP"); rehat; kes WHYNTER: Serial.println ("WHYNTER"); rehat; kes AIWA_RC_T501: Serial.println ("AIWA_RC_T501"); rehat; lalai: kes TIDAK DIKETAHUI: Serial.println ("UNKNOWN"); rehat;} irrecv.resume ();}}

Langkah 3: Kod Kedalaman: Menghantar Isyarat IR

Saya akan merujuk kepada garis kod dengan nombor barisnya - untuk mengikuti, gunakan pautan ini:

pastebin.com/AQr0fBLg

Pertama, kita perlu memasukkan Perpustakaan Jauh IR oleh z3t0.

Berikut adalah pautan ke perpustakaan:

github.com/z3t0/Arduino-IRremote

Sekiranya anda memerlukan panduan mengenai cara memuat turun perpustakaan dengan betul dan memasangnya di IDE:

www.arduino.cc/en/guide/libraries

Baris 1 merangkumi perpustakaan.

Seterusnya, kita perlu menyatakan beberapa pemboleh ubah, baris 2-12 melakukan ini.

Kami menggunakan "cost int" untuk menentukan pemboleh ubah yang tidak akan berubah, kecuali satu jatuh dalam kategori ini.

Kami menggunakan "int" untuk menentukan pemboleh ubah yang akan berubah.

Kita mesti menggunakan pin dengan nadi dengan modulasi (PWM) untuk pin LED kita - mana-mana pin yang mempunyai "~" di sebelahnya akan mencukupi, dalam kod saya - kami menggunakan pin digital 3.

Seterusnya, kita perlu melakukan beberapa persediaan - kod ini akan dijalankan hanya sekali apabila Arduino dihidupkan atau diset semula.

Perhatikan bahawa kita menentukan input dan output kita (15-20), menyalakan monitor bersiri (21), mengaktifkan sensor IR (22), dan memberitahu Arduino untuk mengedip LED onboard setiap kali kita mendapat isyarat di sensor (23).

Seterusnya, kami akan membina gelung kami - kod ini akan dijalankan berulang kali, dari atas ke bawah beberapa kali sesaat.

Pada baris 25, kami menggunakan pernyataan if, ini memberitahu Arduino "cari kriteria khusus ini, jika kriteria itu dipenuhi, lakukan perkara spesifik ini". Dalam kes ini, kriteria adalah analogRead (Button1)> 900, atau dengan kata lain - "Arduino, Lihat butang1, yang kami tetapkan sebagai pin A4 sebelumnya, jika isyarat analog yang diterima lebih besar dari 900, teruskan ke arahan kami yang seterusnya., jika tidak, teruskan ". Ada sedikit yang perlu dibongkar di sini, jadi mari kita selami: isyarat analog pada Arduino adalah nilai yang sama dengan atau kurang dari 5V, dengan 5V sama dengan 1023, dan 0V sama dengan 0. Mana-mana voltan yang diberikan antara 0 dan 5V dapat ditentukan oleh nombor, dan dengan sedikit matematik, kita dapat mengetahui nombor itu, atau sebaliknya, voltan. Bahagikan 1024 (kita sertakan 0 sebagai unit) dengan 5, yang memberi kita 204.8. Sebagai contoh, kita menggunakan nombor 900, untuk menerjemahkannya menjadi voltan, kita hanya membahagikan 900 dengan 204.8, memberi kita ~ 4.4V. Kami memberitahu Arduino untuk mencari voltan lebih besar daripada ~ 4,4 volt, dan jika ya, lakukan arahan seterusnya.

Bercakap mengenai arahan seterusnya (baris 25), kita melihat irsend.sendNEC (0xFF02FD, 32). Ini bertuliskan "Arduino, kirimkan denyut modulasi yang mengikuti protokol NEC, khususnya isyarat FF02FD, dan pastikan panjangnya 32 bit". Ini akan menjadikan LED IR kita berkelip dengan cara yang difahami oleh peranti lain. Fikirkannya seperti Morse Code, tetapi hanya dengan cahaya yang tidak kelihatan! Terdapat banyak protokol yang berlainan di luar sana, masing-masing dengan beratus-ratus jika tidak beribu-ribu isyarat individu, dan masing-masing dengan nombor bit tertentu - peranti kami akan dapat mengenali sejumlah besar isyarat ini, tetapi kami akan menyelidikinya kemudian!

Pada baris 28, kita mempunyai kelewatan pertama - ini di sini untuk mengelakkan isyarat berulang yang tidak disengajakan, setelah butang ditekan dan isyarat IR dihantar, kita mempunyai 100 milisaat untuk mengeluarkan jari kita dari butang. ini tidak kedengaran seperti banyak masa, tetapi dalam praktiknya, ini nampaknya berfungsi dengan baik. fungsi kelewatan memberitahu Arduino "tidak melakukan apa-apa untuk X milisaat" dan untuk rujukan, mereka adalah 1000 milisaat dalam satu saat.

Beralih ke butang kami yang seterusnya pada baris 29, butang5 (pada mulanya saya mempunyai 4 butang pada alat kawalan jauh ini, menambah kelima, jadi itulah sebabnya kami tidak berfungsi). Ini, dalam semangat, adalah perkara yang sama dengan butang 1, tetapi dengan beberapa perbezaan utama. Perbezaan pertama yang akan anda lihat adalah untuk pernyataan - ini pada dasarnya adalah gelung lain - gelung dengan gelung lain yang lebih besar, gelung. Secara khusus kami memiliki "untuk (int i = 0; i <3; i ++)", baca ini sebagai "Arduino, mari kita mulakan pada 0, ulangi arahan berikut sehingga kita sampai 3 kali". Fungsi untuk digunakan kerana banyak peranti diprogramkan untuk mencari isyarat berulang, dan dalam kes kami di sini, 3 kali. Anda boleh menukar nombor 3 menjadi nombor yang berbeza jika peranti anda memerlukan jadual pengulangan yang berbeza. Perbezaan utama lain dengan butang5 ialah ia diulang sekali lagi, 3 kali, atau 3x3. Dengan kata lain, kami menghantar isyarat 3 kali, tunggu 10 milisaat, hantar sekali lagi 3 kali, tunggu 10 milisaat lagi, dan kemudian hantarkan 3 kali lagi. Jenis komunikasi ini biasa untuk menghidupkan dan mematikan peranti dan mungkin seperti yang diperlukan oleh TV atau peranti anda - kuncinya adalah bermain-main dengan semua pemboleh ubah sehingga anda mendapat hasil yang diinginkan. Tukar nilai kelewatan pendek, ubah nilai untuk ulang, kirim 6 kumpulan bukannya 3, dll. Peranti diprogramkan dengan peraturan isyarat sewenang-wenangnya, bayangkan jika alat kawalan jauh TV anda menghantar isyarat jenis yang sama dengan bar suara anda; setiap kali anda menukar saluran di TV anda, bar bunyi anda dimatikan - sebab itulah terdapat peraturan isyarat yang berbeza.

Tiga butang seterusnya diprogramkan dengan prinsipal yang sama, sekurang-kurangnya sebahagiannya, yang dijelaskan di atas - jadi kita boleh melangkau hingga ke baris ke-55.

Langkah 4: Kod Kedalaman: Menerima Isyarat IR

Kod dalam Kedalaman: Menerima Isyarat IR
Kod dalam Kedalaman: Menerima Isyarat IR

Pada baris 55, kami mula memprogram Arduino untuk menafsirkan isyarat IR yang dihantar oleh alat kawalan jauh lain - ini diperlukan supaya anda dapat mengetahui protokol dan isyarat yang digunakan oleh alat kawalan jauh anda. Baris pertama kod pada baris 55 adalah jika (irrecv.decode (& hasil) membacanya sebagai "Arduino, cari kod IR, jika anda menjumpai, kembalikan nilai sebenar, jika tidak ada yang dijumpai, kembalikan palsu. Apabila benar, catat maklumat menjadi "hasil" ".

Melangkah ke baris 56, kita mempunyai Serial.println (results.value, HEX) yang mengatakan "Ardunio, cetak hasilnya dalam monitor bersiri dalam format HEX". Heks, yang bermaksud heksadesimal, adalah cara kita dapat memendekkan rentetan binari (hanya 0 dan 1) menjadi sesuatu yang lebih mudah ditaip. Contohnya 101010010000 adalah "a90", kod yang digunakan untuk mematikan dan menghidupkan TV saya, dan 111111110000001011111101 adalah 0xFF02FD, yang mengawal jalur RGB saya. Anda boleh menggunakan carta di atas untuk menukar binari menjadi hex, dan sebaliknya, atau anda boleh menggunakan pautan berikut:

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

Di baris ke-57, kita mempunyai fungsi baru, yang disebut case switch.

Pada asasnya, kes suis membolehkan kita menentukan arahan yang berbeza berdasarkan hasil pemboleh ubah yang diberi (case). jeda keluar dari pernyataan beralih, dan digunakan pada akhir setiap pernyataan.

Kami menggunakan casing suis di sini untuk mengubah cara kami mencetak di monitor bersiri berdasarkan protokol penginderaan Arduino kami dari pelbagai alat kawalan jauh.

Langkah 5: Kesimpulannya

Sekiranya anda mempunyai soalan - sila hubungi saya di sini! Saya gembira dapat membantu anda dengan sebaik mungkin.

Saya harap anda belajar sesuatu yang boleh anda gunakan untuk menjadikan hidup anda sedikit lebih baik!

-RB

Disyorkan: