Transcoder IR pada Arduino

Perangkat yang dikendalikan oleh remote control inframerah terintegrasi erat ke dalam kehidupan kita. Terkadang remote control dari TV atau sistem audio kuno hilang, dan sudah tidak mungkin untuk membeli yang baru dari masa lalu. Tidak selalu mungkin untuk memesan remote baru, untuk membuat klon juga, tetapi dengan donor atau informasi tentang itu, Anda dapat membuat konverter. Transcoder semacam itu akan menerima perintah dari satu konsol dan menerjemahkannya ke format lain.

Untuk Arduino, ada perpustakaan IRemote yang sangat baik yang membuat membangun berbagai sistem kontrol IR sangat mudah. Tetapi ketika memecahkan bahkan tugas sederhana seperti transcoder, selalu ada masalah yang menarik untuk dipecahkan.
Jadi sebagai permulaan, kita membutuhkan penerima IR terintegrasi seperti TSOP312 atau pelindung yang sesuai untuk Arduino. Jangan lupa bahwa ada banyak penerima IR dan pinoutnya bervariasi secara acak. Sebagai contoh, saya menggunakan elemen tanpa nama tertentu yang cocok dengan TSOP382 tetapi dalam kasus yang lebih kecil dan tanpa kunci pemisah.

Kami membutuhkan sirkuit yang dirakit untuk menerima kode perintah dari kedua konsol, sayangnya menghapus perintah dari perangkat yang konsolnya hilang agak lebih rumit. Anda masih dapat menemukan remote control donor, gunakan remote control universal untuk memilih kode (lalu mengapa Anda memerlukan transcoder, karena remote control telah muncul?) Atau coba gunakan data dari database Internet menggunakan kode IR. Hal termudah bagi saya adalah menggunakan aplikasi untuk android meniru remote yang saya butuhkan.
Untuk membaca data, kami menggunakan contoh IRrecvDumpV2 dari pengiriman IRremote, jika kendali jarak jauh Anda milik pustaka yang dikenali, maka Anda tidak memerlukan hasil pemindaian mentah, meskipun misalnya kendali jarak jauh dari LG saya dikenali sebagai Samsung dan tidak berfungsi ketika saya mencoba mengirim perintah melalui sendLG.
Contoh data yang diperoleh di bawah spoiler:
Encoding: SAMSUNG
Code: 34346897 (32 bits)
Timing[67]:
+4450, -4350 + 600, β€” 500 + 600, β€” 500 + 600, -1600
+ 600, -1600 + 600, β€” 500 + 600, -1600 + 600, β€” 500
+ 600, β€” 500 + 600, β€” 500 + 600, β€” 500 + 600, -1600
+ 600, -1600 + 600, β€” 500 + 600, -1600 + 600, β€” 500
+ 600, β€” 500 + 600, β€” 500 + 600, -1600 + 600, -1600
+ 600, β€” 500 + 600, -1600 + 600, β€” 500 + 600, β€” 500
+ 600, β€” 500 + 550, -1650 + 550, β€” 550 + 550, β€” 550
+ 550, -1650 + 550, β€” 550 + 550, -1650 + 550, -1600
+ 600, -1600 + 600
unsigned int rawData[67] = {4450,4350, 600,500, 600,500, 600,1600, 600,1600, 600,500, 600,1600, 600,500, 600,500, 600,500, 600,500, 600,1600, 600,1600, 600,500, 600,1600, 600,500, 600,500, 600,500, 600,1600, 600,1600, 600,500, 600,1600, 600,500, 600,500, 600,500, 550,1650, 550,550, 550,550, 550,1650, 550,550, 550,1650, 550,1600, 600,1600, 600}; // SAMSUNG 34346897
unsigned int data = 0x34346897;

Jika penangkapan menampilkan pesan β€œkode IR terlalu lama. Edit IRremoteInt.h dan tingkatkan RAWLEN ”pustaka harus diperbaiki sedikit - menambah ukuran buffer untuk perintah. Untuk konsol yang Anda rencanakan untuk dikontrol, cukup mengetahui kode perintah 32-bit, perlu diperhatikan bahwa pada beberapa jarak jauh kode tombol yang ditekan berbeda dari tombol yang sama dalam mode yang ditekan dan dilepaskan. Tombol-tombol ini akan membutuhkan dua nilai. Kami mengurangi kode yang diterima ke tabel yang nyaman bagi Anda. Dalam tabel yang sama kami menyimpan kode untuk remote control donor dalam bentuk mentah.
Kami menghubungkan LED inframerah ke Arduino dan menulis program sederhana yang menerima sinyal inframerah dengan kode yang diberikan dan mengirimkan kode lain melalui LED. Resistor 82 dipilih untuk apa yang ada. Untuk perangkat yang disematkan, dapat ditingkatkan dengan aman hingga 200 Ohm, dan jika pemancar harus jarak jauh, Anda harus menambahkannya dengan cascade transistor sederhana, jika tidak arus dari Arduino tidak akan cukup.

Jika ada kode perintah dari kedua remote, kode transcoder mengambil bentuk berikut

void loop() {
if (irrecv.decode(&results)) {
    switch(results.value){
      case(0x845E5420):{
	irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz);
      }break;
    }
  }
  irrecv.resume();
  irrecv.enableIRIn();
}

Kami memulai sketsa, mengisinya dengan Arduino. Anehnya, setelah memulai satu perintah berlalu, setelah itu semua perangkat berikutnya diabaikan. Agar tidak mengacaukan dengan debugging, kami menambahkan lampu berkedip pada pin 13 ke siklus dan melihat bahwa setelah upaya pertama untuk mengirim perintah, papan membeku. Ya, itu berarti tidak semuanya lancar dalam penggunaan simultan transmisi dan penerimaan sinyal IR dalam satu proyek. Setelah mencari-cari sedikit penghitung waktu yang digunakan, ternyata sejak mengirim dan menerima menggunakan penghitung waktu yang sama, setelah dimulainya pengiriman, kode harus menunggu sampai pengiriman selesai. Anda secara empiris dapat menambahkan penundaan setengah detik (penundaan (500)) dan semuanya akan berfungsi, tetapi mengetahui bahwa data mentah di negara kami adalah sampel waktu dalam milidetik, Anda cukup menambahkan fungsi kirim dengan penundaan. Bahkan ada fungsi custom_delay_usec yang sesuai dalam modul Irsend,yang awalnya saya gunakan salah, lupa untuk mengalikan keterlambatan dengan faktor USECPERTICK dari perpustakaan (50 ms).

void sendDelayed(unsigned int array[]){
  irsend.sendRaw(array, sizeof(array) / sizeof(array[0]), khz);
    int array_size = sizeof(array) / sizeof(array[0]);
    for(int i=0;i<array_size;i++){
      // Using usec, so multiply raw to usec
      irsend.custom_delay_usec(array[i]*USECPERTICK);
    }
}

Kode tersebut berfungsi dengan baik, sebagai gantinya cukup untuk memasukkan jumlah huruf yang diperlukan untuk tombol dan semuanya akan berfungsi. Tapi itu tidak ada di sana. Kode RawData ditulis sebagai array int, dan kami memiliki platform pada mikrokontroler. Memori untuk variabel akan dimakan oleh lima perintah dengan panjang 100 elemen. Namun pada kendali jarak jauh ada 25 tombol.
Tidak ada masalah jika Anda tidak menggunakan representasi data mentah, untuk ini perpustakaan memiliki kemampuan untuk mengirim perintah ke protokol terkenal, misalnya, untuk remote yang kompatibel dengan Sony itu adalah sendSony. Perpustakaan telah menerapkan remote dari pabrikan terkenal, tetapi saya tidak bisa mengatur untuk berurusan dengan remote saya segera. Oleh karena itu, kami beralih ke cara yang lebih primitif untuk menghemat memori yang akan membantu mereka yang memiliki remote yang sama sekali tidak standar.
Hal pertama yang terlintas dalam pikiran adalah untuk mengatur rawData bukan sebagai int, tetapi pergi ke byte. Semua nilai dalam array ini adalah hasil dari membaca sinyal IR dengan timer dengan periode 50 milidetik, dan karena data ini adalah kelipatan 50, membaginya dengan 50 tidak akan kehilangan apa pun. Batas atas akan dibatasi hingga 50 * 255 = 12750, dan ini adalah 12 detik, yang akan cukup bahkan untuk memecahkan kode kode Morse yang santai - jika diperlukan.
Metode yang menerima byte untuk input telah ditambahkan ke perpustakaan, yang mengurangi konsumsi memori hingga setengahnya

IRsend::sendRaw (byte buf[],  unsigned int len,  unsigned int hz)

Hanya Arduino yang hanya memiliki dua kilobyte memori untuk variabel, yang merupakan maksimum 40 perintah masing-masing 50 byte. Kami membutuhkan lebih banyak memori. Dan kami akan mengekstrak memori ini dari segmen perintah. Cukup untuk memesan satu array ukuran cukup dan mengisinya sebelum mengirim serangkaian tugas. Secara keseluruhan, dari segmen kode, sekitar 100 byte akan dihabiskan untuk satu perintah, tetapi kami memiliki setidaknya sepuluh kilobyte ruang kode. Jadi untuk remote rata-rata dengan seratus tombol, kita sudah punya cukup.
Agar tidak mengisi tugas dengan tangan, contoh IRrecvDumpRawByte ditambahkan ke perpustakaan yang menampilkan data mentah tidak hanya dalam bentuk byte tetapi juga dalam bentuk blok tugas
Contoh di bawah spoiler
rawData[0]=87;rawData[1]=87;rawData[2]=10;rawData[3]=9;rawData[4]=10;rawData[5]=9;rawData[6]=10;rawData[7]=10;rawData[8]=10;rawData[9]=9;rawData[10]=10;rawData[11]=9;rawData[12]=10;rawData[13]=29;rawData[14]=10;rawData[15]=9;rawData[16]=10;rawData[17]=9;rawData[18]=10;rawData[19]=10;rawData[20]=10;rawData[21]=9;rawData[22]=10;rawData[23]=9;rawData[24]=10;rawData[25]=10;rawData[26]=10;rawData[27]=9;rawData[28]=10;rawData[29]=9;rawData[30]=10;rawData[31]=10;rawData[32]=10;rawData[33]=9;rawData[34]=10;rawData[35]=86;rawData[36]=10;rawData[37]=9;rawData[38]=11;rawData[39]=9;rawData[40]=10;rawData[41]=9;rawData[42]=10;rawData[43]=9;rawData[44]=10;rawData[45]=28;rawData[46]=10;rawData[47]=29;rawData[48]=10;rawData[49]=28;rawData[50]=10;rawData[51]=9;rawData[52]=10;rawData[53]=28;rawData[54]=10;rawData[55]=10;rawData[56]=10;rawData[57]=9;rawData[58]=10;rawData[59]=28;rawData[60]=10;rawData[61]=10;rawData[62]=10;rawData[63]=9;rawData[64]=10;rawData[65]=9;rawData[66]=10;rawData[67]=28;rawData[68]=10;rawData[69]=9;rawData[70]=11;rawData[71]=27;rawData[72]=10;rawData[73]=29;rawData[74]=10;rawData[75]=9;rawData[76]=10;

Contoh sketsa yang sudah ditulis yang memungkinkan Anda untuk mengontrol Samsung DVD HR-755 menggunakan remote control Daewoo R40A01 ada dalam contoh dengan nama DaewooR40A01toDVDHR755Transcoder. Tidak ada yang menerima permintaan Tarik untuk menambahkan contoh ke cabang umum, sehingga Anda dapat mengunduh perpustakaan yang dimodifikasi dari garpu .
Banyak foto dengan perekam redone











Di bawah kucing adalah foto-foto integrasi Arduino Nano di dalam perekam DVD ini, Arduino Mini tentu saja membutuhkan ruang yang jauh lebih sedikit, tetapi hanya Nano yang ada. Saya mengambil daya dari panel kontrol. Sinyal dari penerima built-in terhubung ke Arduino, dan penerima IR lain yang terletak di sisi berlawanan dari yang pertama disolder secara paralel. Dengan pemasangan yang sama, LED IR disolder. Pada prinsipnya, pengulangan ini bisa dihindari - tetapi sinyal dari penerima IR terbalik - jadi saya tidak bisa mendapatkan sinyal TTL langsung ke perangkat - tetapi saya tidak membuat inverter pada logika atau transistor lagi.

Terlepas dari kenyataan bahwa dalam kasus saya, data mentah berfungsi dengan baik, percobaan dengan peralatan rumah tangga lainnya menunjukkan bahwa tidak semua sinyal yang ditangkap berfungsi dengan benar ketika mencoba mengendalikan perangkat tertentu. Perintah untuk menyalakan AC tidak bekerja, meskipun jika sudah dihidupkan, perubahan mode bekerja dengan benar. Pembicara LG juga menolak untuk menerima perintah mentah, tetapi merespons dengan baik untuk mengirim kode melalui sendSamsung. Pada saat yang sama, lima TV yang dikumpulkan dari kenalan bereaksi sangat baik terhadap data mentah. Saya mencoba opsi dengan frekuensi sinyal yang berbeda - itu tidak membantu. Mungkin masalahnya terletak pada laju sampling sinyal 50 ms. Dilihat oleh operabilitas tim format Samsung yang menggunakan teknologi LG, protokol harus diformalkan sebagai modul terpisah dengan analogi dengan ir_LG.cpp ir_JVC.cpp ir_Dish.cpp,memilih untuk perangkat tertentu header dan parameter pengkodean nol dan satu. Mungkin parsing penulisan protokol seperti itu akan berfungsi sebagai topik yang bagus untuk artikel tersebut.

Selain itu, perpustakaan IR besar kedua untuk Arduino adalah IRLib . Ini memiliki fungsi yang sama, bahkan memiliki modul yang sudah jadi untuk parsing protokol IR untuk desktop. Tes komparatif cepat membaca data mentah dilakukan yang tidak mengungkapkan perbedaan dalam sampel dibandingkan dengan IRemote. Dari plus, IRLib sudah memiliki contoh menentukan pada frekuensi apa pemancar IR bekerja. Contoh Samsung36 sebenarnya mengimplementasikan analisis protokol menggunakan data dari Internet. Selain itu, dokumentasi dengan sempurna menjelaskan cara menghubungkan penerima IR dengan cascading dan banyak lagi. Meskipun menurut saya, IRemote jauh lebih mudah dipahami dan digunakan.

Source: https://habr.com/ru/post/id391001/


All Articles