Antarmuka IR, Raspberry dan LIRC

Tugas saya sekarang adalah mempelajari cara mengirim perintah ke AC dan perangkat lain di rumah. Awalnya, perangkat ini hanya memiliki remote control IR. Untuk mengatasi masalah ini, saya memiliki perisai transceiver Raspberry Pi dan IR. Dalam artikel ini Anda dapat menemukan konfigurasi, tim, kiat, dan sedikit teori. Dari perangkat lunak akan LIRC (Linux Infrared Remote Control) dan Python.


Saya menemukan LIRC dengan bantuan Google. Dalam proses penelitian, saya menemukan bahwa LIRC bekerja dengan pemancar dan penerima sinyal IR, dapat men-decode sinyal yang diterima dan melakukan beberapa tindakan sehubungan dengan ini. Sekarang saya tidak perlu menerima sinyal, tetapi di masa depan mungkin berguna. Jika Anda sendiri mengacaukan LIRC, membaca Panduan Konfigurasi LIRC sangat disarankan.


Konfigurasi


apt-get update apt-get install lirc 

 # /etc/modules (  ) lirc_dev lirc_rpi gpio_in_pin=18 gpio_out_pin=17 

 # /etc/lirc/hardware.conf (   ,  ) LIRCD_ARGS="--uinput --listen" LOAD_MODULES=true DRIVER="default" DEVICE="/dev/lirc0" MODULES="lirc_rpi" 

 # /boot/config.txt (       lirc,  ) dtoverlay=lirc-rpi,gpio_in_pin=18,gpio_out_pin=17 

 # /etc/lirc/lirc_options.conf (    ) driver = default device = /dev/lirc0 

 reboot sudo /etc/init.d/lircd status 

Rekam


Pertama, Anda perlu membuat file konfigurasi dengan urutan data untuk semua perintah yang diperlukan. Saya terus memanggil file ini lircd.conf , tetapi pada setiap perangkat itu sendiri ia menciptakan file my_device_name.lircd.conf di direktori /etc/lirc/lircd.conf.d .


Format file dijelaskan di sini . Jika Anda memiliki remote control, Anda dapat menulis sinyal yang dikirimkan olehnya ke file menggunakan utilitas irrecord .


 /etc/init.d/lircd stop irrecord -d /dev/lirc0 ~/my_device.lircd.conf mv ~/my_device.lircd.conf /etc/lirc/lircd.conf.d/ 

irrecord menganalisis urutan dan mencoba menentukan parameter protokol dan waktu. Dalam beberapa kasus, irrecord gagal dalam analisis, sehingga dimungkinkan untuk menyimpan urutan seperti yang diterima dalam bentuk mentah, ada saklar - --force untuk ini.


Tetapi bahkan dengan - irrecord mencoba menganalisis sesuatu, dan mungkin juga gagal. Kemudian Anda dapat merekam urutan menggunakan mode2 dan membuat file sendiri.


mode2 mencetak secara berurutan durasi ada dan tidak adanya sinyal, dari mana data yang ditransmisikan tersusun. Durasi diukur dalam mikrodetik (1e-6 detik). Dalam format mentah, durasi yang sama ditunjukkan dalam lircd.conf, dimulai dengan 'pulsa' ('spasi' depan tidak diperlukan). Karenanya, harus selalu ada angka ganjil (dimulai dan diakhiri dengan kehadiran sinyal - 'pulsa').


Untuk otomatisasi, saya membuat skrip untuk merekam yang menanyakan nama perintah, menjalankan mode2 selama 5 detik, mengingat dan akhirnya mencetak hasilnya dalam format yang siap untuk lircd.conf (lihat di bawah spoiler).


Skrip
 #!/usr/bin/env python3 import io import sys import os r = """begin remote name DEVICE_NAME_CHANGE_ME flags RAW_CODES eps 30 aeps 100 gap 19037 begin raw_codes """ while True: print() print("enter the command name, or just press Enter to finish") a = sys.stdin.readline().rstrip("\n\r") if not a: break first_space = True n = 0 r += " name " + a + "\n" for line in os.popen('timeout 5s mode2 -d /dev/lirc0 2> /dev/null').read().split('\n'): words = line.split() if len(words) < 2: continue if words[0] != 'space' and words[0] != 'pulse': continue if first_space and words[0] == 'space': first_space = False continue if n % 4 == 0: r += "\n " r += words[1] + " " n = n+1 if n > 5: print ("got", n, "values, looks good") else: print ("no signal, something went wrong") r += "\n\n" r += """ end raw_codes end remote """ print() print(r) print() 

irrecord --analyse file, Anda dapat mencoba "mengenalinya" kembali menggunakan irrecord --analyse . Ini tidak selalu berhasil, jangan buru-buru membuang file lama. Statistik saya adalah sebagai berikut: remote control dari LG TV mudah dimengerti, semua AC dan penyedot debu diperlukan pembuatan manual, penyedot debu kemudian diproses oleh --analyse .


Sebagai contoh: ini adalah bentuk file untuk penyedot debu saya .


Nama Tim Standar


Untuk tujuan yang dimaksud, LIRC harus mengubah sinyal IR yang diterima dan dikenali menjadi peristiwa input Linux . Oleh karena itu, secara default, kita diharuskan memiliki nama perintah di lircd.conf dari daftar standar. Anda dapat melihat daftar nama yang valid:


 irrecord --list-namespace 

Pendingin udara tidak termasuk dalam pola ini. Persyaratan nama dapat dimatikan dengan menambahkan parameter saat menulis:


 irrecord --disable-namespace .... 

Debugging


Periksa penerima membantu utilitas mode2 , yang mencetak semua sinyal yang terlihat.


 /etc/init.d/lircd stop mode2 -d /dev/lirc0 

Cara termudah untuk memeriksa transmisi adalah jika ada receiver lain dan mode2 berjalan di atasnya. Dalam kasus-kasus yang khususnya tidak ada harapan, Anda dapat mengubah nilai pada output GPIO dan memeriksa dengan tester atau osiloskop di mana sinyalnya. Tim gpio adalah bagian dari paket wiringpi .


 while sleep 1; do gpio -g toggle 17 done 

Anda dapat melihat log menggunakan journalctl , khususnya, ini memungkinkan Anda melihat kesalahan dalam file konfigurasi:


 journalctl -b 0 /usr/sbin/lircd 

Mengirim perintah


Ada utilitas irsend untuk mengirimkan perintah yang direkam. Dia juga dapat menampilkan daftar perangkat yang dikenal, dan daftar perintah yang diketahui untuk setiap perangkat. Perhatikan "argumen kosong" pada contoh di bawah, mereka diperlukan di sana.


irsend adalah klien untuk lircd , jadi jika ada yang salah, lihat di log (lihat di atas).


 #   irsend LIST "" "" #     LG_TV irsend LIST LG_TV "" #   ON irsend SEND_ONCE LG_TV ON 

Secara teoritis, ada kemungkinan lain - mengirim perintah ke lircd melalui soketnya. Saya tidak mengerti.


Panggilan dari Python


Hampir semua pustaka hanyalah kit daripada irsend . Satu-satunya perpustakaan yang saya temukan yang mengkompilasi klien untuk API melalui soket tidak berfungsi pada Raspberry (versi lircd lain diperlukan). Oleh karena itu, ada sedikit akal di dalamnya, saya bisa memanggil perintah sendiri:


 import subprocess subprocess.call(["irsend", "send_once", "BEDROOM_AC", "OFF"]) 

Perangkat keras


Topi IR

Saya menggunakan papan yang sudah jadi, ada banyak di Amazon dan AliExpress . Anda dapat google itu seperti "Raspberry infrared sheild." Ini menggunakan GPIO 17 untuk output, dan GPIO 18 untuk input, seperti yang dapat dilihat dari konfigurasi di atas.


Ada tempat di papan untuk D2 LED kedua (tambahan), yang tidak diinstal secara default. Saat menggunakan dua LED, keduanya dihubungkan secara seri . Karena itu, dengan tidak adanya LED D2, Anda harus menutup jumper SJ1. Saya terkejut menemukan bahwa di semua papan saya jumper awalnya terbuka. Saya harus memodifikasi besi solder.


Foto yang lebih besar untuk mereka yang ingin melihatnya

Topi IRDA


Ringkasan


Ini bekerja: sinyal ditransmisikan, perangkat melihatnya dan bereaksi dengan benar.


Banyak tergantung pada posisi emitor dioda, itu harus secara akurat ditujukan pada penerima. Satu pemancar tetap tidak dapat mengontrol semua perangkat di ruangan. Mengkloning solusi berdasarkan Raspberry Pi untuk setiap gadget mahal, Anda perlu memodifikasi emitor untuk "menutupi area yang lebih besar", atau menemukan platform yang lebih murah.


LIRC pada awalnya dibuat untuk mengonversi sinyal IR ke acara Linux standar pada perangkat input. Oleh karena itu, wajar baginya bahwa satu tombol adalah satu kode. Untuk beberapa perangkat (sebagian besar AC) ini tidak demikian: ketika Anda mengklik tombol apa saja, remote control mentransmisikan paket data yang berisi status lengkap perangkat (aktif, mode operasi, suhu, mode operasi kipas, waktu, timer, dll.). Tidak ada cara untuk membangun paket multi-komponen berdasarkan beberapa parameter di LIRC, oleh karena itu membantu sebagai alat cepat di luar kotak, tetapi kemudian Anda harus mencari sesuatu yang lain. Meskipun untuk sebagian besar kasus, data yang direkam dengan pengaturan kipas yang biasa dan tanpa mode eksotis sudah cukup.

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


All Articles