BV1AL 之無所不記

2021-07-17

Linux環境下的IR receiver

在Linux環要用紅外線遙控器來做一些事,找到最多都文章都是用lirc, 但是我發現
可以完全不用lirc, 只要裝了ir-keytable加上python pexpect就可以做任何事了。

對於有GPIO腳可以裝IR sensor的機器來說,例如各種pi(主要都是ARM電腦), 只要把
IR sensor三支腳的
信號腳接到GPIO
一支腳接供電
一支腳接地
就可以利用IR遙控你的電腦了。

至於沒有GPIO腳的電腦(例如一般X86電腦),最簡單的方法是買一支RTL-SDR(露天或
PCHome大約400元)它上面就有IR sensor, 而且附紅外線發射器。

至於要怎麼把接IR sensor的GPIO腳enable ?

在ARM電腦可能稍微麻煩一點,有的要在/boot/config.txt設定(如Raspberry Pi),
有的要用distribution附的工具設定(例如armbian-config).

而x86電腦只要把RTL-SDR插入就可以了,不用任何設定IR sensor.

再來就是要安裝 ir-keytable, 每個Linux distribution應該都有這個package,
用系統工具(例如apt-get, yum)就能裝好。

必需以root身份執行 ir-keytable,如果不知道發射器的協定,就用
sudo ir-keytable -c -p all -t
如果知道那個搖控器的protocol, 例如 NEC, 那就可以用
sudo ir-keytable -c -p nec -t
(我還在用網樂通的遙控器,它就是NEC protocol, 感謝黎智英先生,很多台灣人都有
黎先生贈送的網樂通,可惜香港蘋果已經在2021/6/24被中國政府強迫關門了)

然後拿著紅外線遙控器對著電腦把每個遙控鍵都按一遍,記錄一下每個鍵的值,
再來就是寫個程式讓你要的動作對應某個按鍵(或按鍵組合),這程式用
python3 + pexpect 就夠用了

import pexpect
ir = pexpect.spawn('sudo ir-keytable -c -p nec -t')

ir.timeout = None

while True:
    ir.expect("EV_SYN")
    T = ir.before.split()
    if not b'repeat' in T:
	K = str(T[-4])
	if '902' in K:	print('Mute') #0x732902
	elif '91e' in K:     print('Home')  #0x73291e
	elif '91d' in K:     print('Power') #0x73291d
        elif '940' in K:     print('Blue')  #0x732940
        elif '909' in K:     print('Up')    #0x732909
把對應按鍵的值找出來,做為你要執行的動作代碼,就能完全不必用鍵盤、螢幕來
操作一台電腦,不管是X86或是ARM。
用一台小小的什麼ARM pi,透過espeak-ng可以做為報時、報氣象、網路收音機,
不過pi本身的音效不太好,最好就是接一台USB DAC來撥放高品質的音樂。

標籤: , , ,