樹(shù)莓派中使用python程序關(guān)聯(lián)LIRC紅外驅(qū)動(dòng)庫(kù)

長(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)在最新的不兼容。

  1. 在樹(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

  1. 修改文件 /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編碼圖:

image
  1. 修改文件 /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è)試了。

  1. 測(cè)試lirc庫(kù)是否正常工作

必須停止lircd服務(wù)才能進(jìn)入接收紅外信號(hào)模式


sudo service lircd stop    # 停止lircd服務(wù)

mode2 -d /dev/lirc0    # 接收紅外信號(hào)

用遙控器對(duì)著接收管隨便按一些按鈕眯勾,如果出現(xiàn)形式如下的輸出就表示正常:

image
  1. 紅外按鍵編碼錄制

查看可用的按鍵名


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

  1. 測(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)一些鍵值恨胚,如下:


image

我在這個(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ù)的編碼去掉即可。

  1. 修改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

  1. 在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()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末玩焰,一起剝皮案震驚了整個(gè)濱河市由驹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌昔园,老刑警劉巖蔓榄,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異默刚,居然都是意外死亡甥郑,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)荤西,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)澜搅,“玉大人,你說(shuō)我怎么就攤上這事邪锌∶闾桑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵觅丰,是天一觀的道長(zhǎng)饵溅。 經(jīng)常有香客問(wèn)我,道長(zhǎng)妇萄,這世上最難降的妖魔是什么蜕企? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任咬荷,我火速辦了婚禮,結(jié)果婚禮上糖赔,老公的妹妹穿的比我還像新娘萍丐。我一直安慰自己轩端,他們只是感情好放典,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著基茵,像睡著了一般奋构。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拱层,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天弥臼,我揣著相機(jī)與錄音,去河邊找鬼根灯。 笑死径缅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的烙肺。 我是一名探鬼主播纳猪,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼桃笙!你這毒婦竟也來(lái)了氏堤?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤搏明,失蹤者是張志新(化名)和其女友劉穎鼠锈,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體星著,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡购笆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了虚循。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片同欠。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖邮丰,靈堂內(nèi)的尸體忽然破棺而出行您,到底是詐尸還是另有隱情,我是刑警寧澤剪廉,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布娃循,位于F島的核電站,受9級(jí)特大地震影響斗蒋,放射性物質(zhì)發(fā)生泄漏捌斧。R本人自食惡果不足惜笛质,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捞蚂。 院中可真熱鬧妇押,春花似錦、人聲如沸姓迅。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)丁存。三九已至肩杈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間解寝,已是汗流浹背扩然。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留聋伦,地道東北人夫偶。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像觉增,于是被迫代替她去往敵國(guó)和親兵拢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容