Daftar Isi:

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

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

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

Halo! Dalam instruksi ini, saya akan menunjukkan kepada Anda bagaimana membangun dan memprogram remote universal Anda sendiri yang akan bekerja dengan banyak hal yang menggunakan remote inframerah, dan itu juga akan "mendengarkan" dan memecahkan kode sinyal inframerah yang dikirim oleh berbagai remote lainnya.

Sedikit latar belakang dari apa yang mengilhami saya untuk membangun remote ini - Saya, seperti kebanyakan dari Anda, kehilangan remote saya terus-menerus, dan bencana ini cukup membuat frustrasi, jadi saya pikir mari kita selesaikan! Saya telah membuat remote ini dan diam-diam menyematkannya ke dalam rangka tempat tidur yang dibuat khusus (saya juga seorang pekerja kayu) - Saya tidak dapat kehilangan remote jika itu adalah bagian dari rangka tempat tidur saya!

Perlengkapan

Hal-hal yang Anda perlukan: -Arduino UNO atau Nano - jarak tempuh dapat berbeda dengan papan lain

- Papan tempat memotong roti tanpa solder (atau papan strip yang dapat disolder jika Anda ingin membuatnya lebih permanen)

-Kabel jumper dengan berbagai warna dan panjang

-Tombol tekan sesaat (5) (Anda dapat menambahkan lebih banyak tombol, tetapi Anda harus menggunakan pin digital, karena semua kecuali 1 pin analog digunakan - Anda harus melihat untuk memastikan Anda menggunakan resistor pull-up dengan benar, atau tarik ke bawah resistor, dan debounce tombol tekan)

-10K Ohm resistor (5) (jika Anda ingin lebih banyak tombol tekan, Anda akan membutuhkan lebih banyak dari ini)

-470 Ohm resistor (2)

-LED inframerah

-LED merah

-Sensor Inframerah (Saya menggunakan nomor bagian VS1838B, Anda bisa menggunakan yang lain, cukup periksa pin-out)

(Opsional) Besi Solder, Solder, Fluks Solder.

Langkah 1: Membangun Sirkuit:

Membangun Sirkuit
Membangun Sirkuit

1). Saya selalu suka memulai dengan meletakkan komponen saya, karena ini selalu mendorong tata letak di papan tempat memotong roti.

-Tekan tombol

-LEDS: LED Merah dan LED IR disambungkan secara bersamaan, sehingga Anda dapat melihat apa yang dilakukan oleh LED IR.

-Sensor

2). Resistor

- Lima resistor 10K yang kami pasang pada tombol tekan disebut resistor "pull down". Tarik ke bawah resistor pastikan bahwa ketika tombol tidak ditekan, pin Arduino yang sesuai mendapat 0 Volt (atau setidaknya mendekatinya). Untuk info lebih lanjut tentang resistor pull down (atau pull up) di sini adalah panduan mendalam:

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

Resistor ini mungkin tidak sepenuhnya diperlukan, tetapi jika Anda mendapatkan dorongan "hantu", kemungkinan besar itu disebabkan oleh kopling kapasitif dan resistor pull down mencegah hal ini.

3). Kabel sirkuit

4). 5V dan Kabel Ground

Gunakan gambar yang disediakan untuk referensi! jangan takut untuk mengubahnya untuk kebutuhan Anda!

Langkah 2: Kode:

#include const int RECV_PIN = 7; // Sensor IR membaca pin int Tombol1 = A4;// Kiri Terjauh int Tombol2 = A3; // 2 dari kiri int Button3 = A2; // Tombol int tengah4 = A1; // 2 ke kanan int Button5 = A0; // Terjauh ke kanan int LED = 3; // LED IR & LED Merah int val = 0; // Mengubah nilai IRsend irsend; IRrecv irecv(RECV_PIN); hasil decode_results;

void setup() {pinMode(Button1, INPUT); pinMode(Tombol2, INPUT); pinMode(Tombol3, INPUT); pinMode(Tombol4, INPUT); pinMode(Tombol5, INPUT); pinMode(LED, OUTPUT); Serial.begin(9600); irrecv.enableIRIn(); irrecv.blink13(true);} void loop() {{{if (analogRead(Button1)>900)irsend.sendNEC(0xFF02FD, 32); // menggunakan pembacaan analog alih-alih pembacaan digital untuk menghindari masalah kapasitansi captive. juga, membantu mendebounce tombol. // Memiliki pembacaan analog pada 900 memungkinkan beberapa ruang gerak dalam nilai, artinya, sinyal infra akan dikirim bahkan jika 5V penuh tidak diterapkan ke pin. //tetapi 900 cukup tinggi untuk tidak salah membaca karena penundaan kopling kapasitif(100);}//RGB Strip On&off {if (analogRead(Button5)>900) {for (int i = 0; i < 3; i++) // mengubah nilai dalam "i < 3" akan mengubah berapa kali sinyal diulang dengan segera. jadi "i < 2" akan mengulang sinyal dua kali. // Anda mungkin perlu bermain-main dengan nomor ini jika TV Anda tidak merespons, umumnya, 1 atau 3 berfungsi paling banyak, jika tidak, coba angka ganjil. // Anda mungkin juga perlu bermain dengan nilai waktu tunda sinyal intra, misalnya, untuk TV saya 10 berfungsi, tetapi 30 tidak. {irsend.sendSony(0xa90, 12); // Kode daya TV Sony, untuk TV saya, kode harus dikirim 3x3, jadi 3 pulsa, tiga kali tunda terpisah (10); // "penundaan sinyal intra" untuk (int i = 0; i < 3; i++) {irsend.sendSony(0xa90, 12); // "12" adalah nomor bit, protokol yang berbeda memanggil nomor bit yang berbeda. NEC adalah 32, Sony adalah 12, Anda dapat mencari penundaan lainnya (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)) // bagian kode di bawah ini memungkinkan Anda untuk menafsirkan sinyal Infra merah dari berbagai remote. { Serial.println(hasil.nilai, HEX); // itu akan menghasilkan prosedur "NEC, Sony, Etc.." dan kode TV "c90, a90, FF02FD " Anda harus menambahkan 0x ke depan sakelar Kode TV (results.decode_type) {case DENON: Serial.println("DENON"); merusak; kasus NEC: Serial.println("NEC"); merusak; kasus PANASONIC: Serial.println("PANASONIC"); merusak; kasus SONY: Serial.println("SONY"); merusak; kasus RC5: Serial.println("RC5"); merusak; kasus JVC: Serial.println("JVC"); merusak; kasus SANYO: Serial.println("SANYO"); merusak; kasus MITSUBISHI: Serial.println("MITSUBISHI"); merusak; kasus SAMSUNG: Serial.println("SAMSUNG"); merusak; kasus LG: Serial.println("LG"); merusak; kasus RC6: Serial.println("RC6"); merusak; kasus DISH: Serial.println("DISH"); merusak; kasus SHARP: Serial.println("SHARP"); merusak; kasus MENGAPA: Serial.println("MENGAPA"); merusak; kasus AIWA_RC_T501: Serial.println("AIWA_RC_T501"); merusak; default: case UNKNOWN: Serial.println("UNKNOWN"); istirahat;} irrecv.resume();}}

Langkah 3: Kedalaman Kode: Mengirim Sinyal IR

Saya akan merujuk ke baris kode dengan nomor barisnya - untuk mengikuti, gunakan tautan ini:

Pastebin.com/AQr0fBLg

Pertama, kita perlu menyertakan IR Remote Library oleh z3t0.

Berikut ini tautan ke perpustakaan:

github.com/z3t0/Arduino-IRremote

Jika Anda memerlukan panduan tentang cara mengunduh perpustakaan dengan benar dan menginstalnya di IDE:

www.arduino.cc/en/guide/libraries

Baris 1 termasuk perpustakaan.

Selanjutnya, kita perlu mendeklarasikan beberapa variabel, baris 2-12 melakukan ini.

Kami menggunakan " cost int " untuk mendefinisikan variabel yang tidak akan berubah, semua kecuali satu termasuk dalam kategori ini.

Kami menggunakan " int " untuk mendefinisikan variabel yang akan berubah.

Kita harus menggunakan pin dengan pulsa dengan modulasi (PWM) untuk pin LED kami - pin apa pun yang memiliki "~" di sebelahnya sudah cukup, dalam kode saya - kami menggunakan pin digital 3.

Selanjutnya, kita perlu melakukan beberapa pengaturan - kode ini hanya akan berjalan sekali ketika Arduino dihidupkan atau diatur ulang.

Perhatikan bahwa kita mendefinisikan input dan output (15-20), menyalakan monitor serial (21), mengaktifkan sensor IR (22), dan memberi tahu Arduino untuk mengedipkan LED onboard kapan saja kita mendapatkan sinyal di sensor (23).

Selanjutnya, kita akan membangun loop kita - kode ini akan berjalan berulang kali, dari atas ke bawah beberapa kali dalam satu detik.

Pada baris 25, kami menggunakan pernyataan if, ini memberi tahu Arduino "cari kriteria khusus ini, jika kriteria itu terpenuhi, lakukan hal khusus ini". Dalam hal ini, kriterianya adalah analogRead(Button1)>900, atau dengan kata lain - "Arduino, Lihat button1, yang kami definisikan sebagai pin A4 tadi, jika sinyal analog yang diterima lebih besar dari 900, silakan lanjutkan ke instruksi kami selanjutnya, jika tidak, silakan lanjutkan". Ada sedikit yang perlu dibongkar di sini, jadi mari selami: sinyal analog pada Arduino adalah nilai yang sama dengan atau kurang dari 5V, dengan 5V sama dengan 1023, dan 0V sama dengan 0. Setiap tegangan yang diberikan antara 0 dan 5V dapat ditentukan oleh angka, dan dengan sedikit matematika, kita dapat mengetahui angka itu, atau sebaliknya, tegangan. Bagilah 1024 (kami memasukkan 0 sebagai satu unit) dengan 5, yang menghasilkan 204,8. Misalnya, kita menggunakan angka 900, untuk menerjemahkannya menjadi tegangan, kita cukup membagi 900 dengan 204,8, menghasilkan ~4,4V. Kami memberi tahu Arduino untuk mencari tegangan yang lebih besar dari ~ 4,4 volt, dan jika ya, lakukan instruksi berikutnya.

Berbicara tentang instruksi selanjutnya (baris 25), kita melihat irsend.sendNEC(0xFF02FD, 32). Ini mengatakan "Arduino, kirim pulsa termodulasi yang mengikuti protokol NEC, khususnya sinyal FF02FD, dan pastikan panjangnya 32 bit". Ini akan membuat LED IR kami berkedip dengan cara yang dapat dipahami oleh perangkat lain. Anggap saja seperti Kode Morse, tetapi hanya dengan cahaya tak terlihat! Ada banyak protokol berbeda di luar sana, masing-masing dengan ratusan bahkan ribuan sinyal individual, dan masing-masing dengan nomor bit spesifiknya - perangkat kami akan dapat mengenali sejumlah besar sinyal ini, tetapi kami akan membahasnya nanti!

Pada baris 28, kami memiliki penundaan pertama kami - ini di sini untuk mencegah sinyal pengulangan yang tidak disengaja, setelah tombol ditekan dan sinyal IR dikirim, kami memiliki 100 milidetik untuk melepaskan jari kami dari tombol. ini tidak terdengar seperti banyak waktu, tetapi dalam praktiknya, tampaknya berfungsi dengan baik. fungsi penundaan memberi tahu Arduino "tidak melakukan apa pun selama X milidetik" dan untuk referensi, mereka adalah 1000 milidetik dalam satu detik.

Pindah ke tombol berikutnya di baris 29, button5 (Saya awalnya memiliki 4 tombol pada remote ini, menambahkan yang kelima, jadi itu sebabnya kami rusak). Ini, dalam semangat, adalah hal yang sama dengan tombol 1, tetapi dengan beberapa perbedaan utama. Perbedaan pertama yang akan Anda lihat adalah pernyataan for - ini pada dasarnya adalah loop lain - loop dengan loop lain yang lebih besar, loopception. Secara khusus kami memiliki " for (int i = 0; i < 3; i++) ", baca ini sebagai "Arduino, mari kita mulai dari 0, ulangi instruksi berikut sampai kita mencapai 3 kali". Fungsi for digunakan karena banyak perangkat diprogram untuk mencari sinyal berulang, dan dalam kasus kami di sini, 3 kali. Anda cukup mengubah nomor 3 menjadi nomor yang berbeda jika perangkat Anda meminta jadwal pengulangan yang berbeda. Perbedaan utama lainnya dengan button5 adalah bahwa itu diulang lagi, 3 kali, atau 3x3. Dengan kata lain, kita mengirim sinyal 3 kali, tunggu 10 milidetik, kirim lagi 3 kali, tunggu 10 milidetik lagi, lalu kirim lagi 3 kali. Jenis komunikasi ini biasa digunakan untuk menghidupkan dan mematikan perangkat dan mungkin sesuai dengan panggilan TV atau perangkat Anda - kuncinya adalah bermain-main dengan semua variabel hingga Anda mendapatkan hasil yang diinginkan. Ubah nilai penundaan singkat, ubah nilai pengulangan, kirim 6 batch bukannya 3, dll. Perangkat diprogram dengan aturan sinyal arbitrer dengan sengaja, bayangkan jika remote TV Anda mengirim sinyal jenis yang sama dengan sound bar Anda; setiap kali Anda mengganti saluran di TV, bilah suara Anda mati - itulah sebabnya ada aturan sinyal yang berbeda.

Tiga tombol berikutnya diprogram dengan prinsip yang sama, setidaknya sebagian, yang dijelaskan di atas - jadi kita bisa melompati sampai ke baris 55.

Langkah 4: Kedalaman Kode: Menerima Sinyal IR

Kode Kedalaman: Menerima Sinyal IR
Kode Kedalaman: Menerima Sinyal IR

Pada baris 55, kami mulai memprogram Arduino untuk menafsirkan sinyal IR yang dikirim oleh remote lain - ini diperlukan agar Anda dapat mengetahui protokol dan sinyal yang digunakan remote Anda. Baris kode pertama pada baris 55 adalah jika (irrecv.decode(&results) membaca ini sebagai "Arduino, cari kode IR, jika Anda menemukannya, kembalikan nilai yang benar, jika tidak ada yang ditemukan, kembalikan salah. Jika benar, catat informasi menjadi "hasil"".

Pindah ke baris 56, kami memiliki Serial.println(results.value, HEX) ini mengatakan "Ardunio, cetak hasil di monitor serial dalam format HEX". Hex, yang berarti heksadesimal, adalah cara kita dapat mempersingkat string biner (hanya 0 dan 1) menjadi sesuatu yang sedikit lebih mudah untuk diketik. Misalnya 101010010000 adalah "a90", kode yang digunakan untuk mematikan dan menghidupkan TV saya, dan 111111110000001011111101 adalah 0xFF02FD, yang mengontrol strip RGB saya. Anda dapat menggunakan grafik di atas untuk mengubah biner menjadi hex, dan sebaliknya, atau Anda dapat menggunakan tautan berikut:

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

Turun ke baris 57, kami memiliki fungsi baru, yang disebut switch case.

Pada dasarnya, switch case memungkinkan kita untuk menentukan instruksi yang berbeda berdasarkan hasil dari variabel (case) yang diberikan. break keluar dari pernyataan switch, dan digunakan di akhir setiap pernyataan.

Kami menggunakan kasus sakelar di sini untuk mengubah cara kami mencetak di monitor serial berdasarkan protokol yang dirasakan Arduino kami dari berbagai remote.

Langkah 5: Kesimpulan

Jika Anda memiliki pertanyaan - jangan ragu untuk menghubungi saya di sini! Saya senang mencoba membantu Anda sebaik mungkin.

Saya harap Anda belajar sesuatu yang dapat Anda gunakan untuk membuat hidup Anda sedikit lebih baik!

-RB

Direkomendasikan: