長(zhǎng)久以來(lái)一直從事嵌入式硬件開(kāi)發(fā)工作萝喘,使用C語(yǔ)言編寫(xiě)單片機(jī)程序也很長(zhǎng)時(shí)間。近期對(duì)Linux下的python編程比較感興趣…… 簡(jiǎn)單畫(huà)了一塊配合樹(shù)莓派驅(qū)動(dòng)步進(jìn)電機(jī)驅(qū)動(dòng)器的擴(kuò)展板開(kāi)始編程线婚。這次主要是記錄下如何使python程序關(guān)聯(lián)到LIRC紅外驅(qū)動(dòng)庫(kù)遏弱,網(wǎng)上的資料要么不全,要么版本太老塞弊,和現(xiàn)在最新的不兼容。
- 在樹(shù)莓派上安裝lirc和python-lirc(版本為lirc0.10.0,python-lirc 1.2.3)
sudo apt update
sudo apt install lirc
sudo apt-get install liblircclient-dev #如果要使用pylirc, 必須要安裝liblircclient-dev
sudo apt-get install python3-lirc # or python-lirc
- 修改文件 /boot/config.txt 配置lirc的紅外接口IO
sudo nano /boot/config.txt
找到 lirc-rpi module 的部分游沿,注釋掉默認(rèn)的配置饰抒,修改為自己需要的引腳定義:
# Uncomment this to enable the lirc-rpi module
#dtoverlay=lirc-rpi,gpio_out_pin=17,gpio_in_pin=18,gpio_in_pull=up
注意gpio引腳是BCM編碼,我的擴(kuò)展板上紅外接收管連接到物理Pin13腳:
dtoverlay=lirc-rpi,gpio_in_pin=27,gpio_in_pull=up # 沒(méi)有發(fā)射管就不用配發(fā)射IO
給一張樹(shù)莓派2B編碼圖:
- 修改文件 /etc/lirc/lirc_options.conf 配置lirc硬件接口
sudo nano /etc/lirc/lirc_options.conf
找到這兩行
driver = devinput
device = auto
修改為:
driver = default
device = /dev/lirc0
然后诀黍,重啟樹(shù)莓派袋坑,就能開(kāi)始測(cè)試了。
- 測(cè)試lirc庫(kù)是否正常工作
必須停止lircd服務(wù)才能進(jìn)入接收紅外信號(hào)模式
sudo service lircd stop # 停止lircd服務(wù)
mode2 -d /dev/lirc0 # 接收紅外信號(hào)
用遙控器對(duì)著接收管隨便按一些按鈕眯勾,如果出現(xiàn)形式如下的輸出就表示正常:
- 紅外按鍵編碼錄制
查看可用的按鍵名
irrecord -l
根據(jù)遙控器枣宫,選擇了幾個(gè)按鍵名并記錄下來(lái),然后執(zhí)行紅外線編碼錄制命令
irrecord -d /dev/lirc0 ~/lircd.conf
回車(chē)吃环,先給錄制文件起個(gè)名字也颤,再回車(chē),直到看到"Press RETURN now to start recording."郁轻,再回車(chē)一次翅娶,然后把遙控器上的按鍵隨便按,一下一下的按好唯,每次按鍵屏幕上都會(huì)出現(xiàn)一個(gè)"."按滿一行后會(huì)提示再按二行竭沫,和上面一樣,也是一下一下的按骑篙,要有耐心蜕提,千萬(wàn)不要按著不松手。
按滿兩行后屏幕提示"Please enter the name for the next button "靶端,然后依次輸入想要錄制的按鍵谎势,例如輸入:
KEY_PLAY
然后提示“Now hold down button "KEY_PLAY".”這時(shí)候按下遙控器上的播放按鈕,軟件會(huì)自動(dòng)記錄并跳轉(zhuǎn)回"Please enter the name for the next button (press <ENTER> to finish recording)"躲查,把每一個(gè)想錄制的按鈕全部依次輸入一遍它浅,直接回車(chē)結(jié)束。
這時(shí)提示要檢查切換掩碼镣煮,請(qǐng)盡快點(diǎn)按任意按鈕姐霍。終于結(jié)束了……配置文件就保存在當(dāng)前目錄。最后典唇,將錄制好的配置文件(xxx.lircd.conf)拷貝到/etc/lirc/lircd.conf.d目錄:
sudo cp ~lircd.conf /etc/lirc/lircd.conf.d # 根據(jù)自己錄制的文件名修改
lircd.conf.d目錄中的devinput.lircd.conf需要改名為devinput.lircd.dist
- 測(cè)試錄制后的按鍵輸出
重啟lirc服務(wù)镊折,運(yùn)行l(wèi)ircd守護(hù)程序:
sudo service lircd restart
lircd --nodaemon --device /dev/lirc0 --driver default
另外開(kāi)一個(gè)窗口運(yùn)行,執(zhí)行irw命令進(jìn)行測(cè)試(如果沒(méi)有輸出建議reboot重啟一次):
sudo irw
按遙控器按鍵介衔,你應(yīng)該看見(jiàn)一些鍵值恨胚,如下:
我在這個(gè)地方卡了一天,按遙控器總是沒(méi)有按鍵輸出炎咖,守護(hù)程序中報(bào)錯(cuò) Notice: repeat code without last_code received (重復(fù)代碼問(wèn)題), 最后在國(guó)外論壇里找到答案:
上一節(jié)中錄制的編碼文件xx.lircd.conf中有一些多余的重復(fù)編碼
begin remote
name ir1
bits 32
flags SPACE_ENC|CONST_LENGTH
eps 30
aeps 100
header 9043 4446
one 587 1658
zero 587 538
ptrail 595
repeat 9045 2198
gap 107901
toggle_bit_mask 0x0
frequency 38000
begin codes
key_power 0x04FB906F
key_channeldown 0x04FB6897
key_channelup 0x04FBF807
key_volumeup 0x04FBA857
key_volumedown 0x04FBD827
key_play 0x04FB8877
end codes
end remote
這個(gè)是修改后的赃泡,沒(méi)有修改的文件在每個(gè)按鍵編碼后面有2段0xXXXXXXX寒波,第一段每個(gè)按鍵都不一樣,但第二段每個(gè)按鍵都一樣升熊。修改方式就是保留第一個(gè)段編碼俄烁,把鍵值后面重復(fù)的編碼去掉即可。
- 修改lircrc配置文件
參考:https://github.com/tompreston/python-lirc
把/etc/lirc/irexec.lircrc改名為lircrc级野,然后按照需求進(jìn)行配置页屠,例如:
begin
prog = myprogram.py # 關(guān)聯(lián)的python程序名
button = key_power # 這個(gè)是上面錄制的按鍵名
config = KEY_POWER # 傳遞給程序的消息
end
- 在python程序中使用lirc紅外驅(qū)動(dòng)庫(kù)
首選導(dǎo)入lirc模塊,接著初始化lirc驅(qū)動(dòng)庫(kù)
import lirc
sockid = lirc.init("myprogram.py")
這部分網(wǎng)上中文資料很少蓖柔,我詳細(xì)介紹下:
'''
sockid = lirc.init("myprogram.py")
'''
初始化lirc辰企,分為阻塞和不阻塞模式。上面沒(méi)有帶參數(shù)的就是阻塞模式况鸣,不接收消息就一直等待牢贸。
sockid = lirc.init("myprogram.py", blocking=False) # 關(guān)聯(lián)lirc 取消阻塞
帶blocking=False參數(shù),就是不阻塞模式懒闷,消息來(lái)了你不收就沒(méi)有了十减,哈哈,這個(gè)我喜歡愤估,因?yàn)槲业倪b控器有很多空消息(就是上面干掉的編碼)帮辟。
先試試在程序里面打印接收到的按鍵消息:
btn = lirc.nextcode()
print"btn"
然后你想干啥就干啥吧,比如:
btn = lirc.nextcode()
if btn == [u'KEY_PLAY']:
print"KEY_PLAY..."
if STATE_PALY:
STATE_PALY = 0
else:
STATE_PALY = 1
程序結(jié)束時(shí)不要忘了釋放lirc驅(qū)動(dòng)庫(kù):
lirc.deinit()