使用樹莓派搭配紅外管,進行接收、發射紅外信號是很方便的,同時紅外信號也有很普遍的用途。此次咱們將總結使用樹莓派製做一個空調紅外遙控器的過程。html
使用開關三極管能夠有效加強紅外發射管的性能,但不是必須的。不使用三極管也能在三五米範圍內成功遙控空調。這些材料總共費用不超過1塊錢,反而是快遞費比較貴了。linux
看到遙控器、接收管、發射管,相信已經有人明白了製做遙控器的原理。是的,咱們只須要事先把遙控器發射出的紅外信號記錄下來,而後經過樹莓派依樣畫葫蘆地把這個信號發射出去,一個「克隆」版的遙控器就作好了。git
*注意:兩個GPIO引腳是固定的,與後續安裝的軟件有關。github
接收管信號輸出腳 OUT → GPIO18工具
發射管正極(不使用開關三極管的狀況下) → GPIO17性能
若是你手頭上沒有開關三極管,直接將紅外發射管正極接在GPIO17,以下所示:測試
若是接入三極管,用GPIO17鏈接基極,控制發射極和集電極的通斷:this
(偷懶了沒有接入限流電阻,在乎的同窗自行接入)spa
解決方案來自: LIRC: Linux Infrared Remote Control for Raspberry Pi
sudo apt update sudo apt install lirc
修改文件 /boot/config.txt
:rest
sudo nano /boot/config.txt
找到 lirc-rpi module
的部分,修改成:
# Uncomment this to enable the lirc-rpi module dtoverlay=lirc-rpi,gpio_out_pin=17,gpio_in_pin=18,gpio_in_pull=up
!!!注意:config.txt的配置內容,彷佛根據不一樣Linux內核版本有微妙的變化,手頭上暫時沒有其餘平臺能夠測試。若是後續測試時出問題,請Google關鍵詞「lirc lirc-rpi gpio-ir」查閱相關資料。
修改文件 /etc/lirc/lirc_options.conf
:
sudo nano /etc/lirc/lirc_options.conf
# 把: driver = devinput device = auto # 修改成: driver = default device = /dev/lirc0
最後,重啓樹莓派。
# 必須中止lircd服務才能進入接收紅外信號模式 sudo service lircd stop mode2 -d /dev/lirc0
運行上述命令後,用遙控器對着接收管隨便按一些按鈕,若是出現形式以下的輸出就表示正常:
space 16777215 pulse 8999 space 4457 pulse 680 space 1627 ......
解決方案來自: How to Control Your Air Conditioner with Raspberry Pi Board and ANAVI Infrared pHAT
lirc有一個自動錄入紅外信號、生成遙控器文件的功能。但此方法只適用於簡單設備,好比風扇,這裏就不記錄過程了。有須要的直接運行 irrecord -d /dev/lirc0 --disable-namespace
,按提示作完後把生成的文件放到 /etc/lirc/lircd.conf.d/
目錄就好了。
這邊就主要針對空調這種複雜設備,記錄錄入紅外信號的過程。
另外,簡單瞭解一下紅外NEC協議能夠幫助你理解配置的過程。
爲何沒法直接錄製複雜設備的紅外控制信號?
由於空調遙控器每次發送的信號不是單純的一個"byte",與其說它是「控制信號」,不如說是一個「狀態」、「情景」。後文還會有實例幫助你理解。
空調這類複雜設備的遙控器配置文件,是須要本身手動輸入的。但不可能整個文件都本身寫——咱們連格式都不知道。
因此咱們須要用剛纔提到的自動錄入功能生成一個樣板,但請記住,這個樣板中記錄的信號很可能是不正確的!咱們只是經過它來了解配置內容的格式。
開始自動錄製:
# 請cd到有讀寫權限的目錄下,由於須要建立一個遙控器配置文件 # 參數-f --force 表示 Force raw mode irrecord -f -d /dev/lirc0 --disable-namespace
認真閱讀提示信息,根據提示按Enter、輸入 遙控器名稱
、按Enter、按照要求隨機按遙控器、輸入 按鈕名稱
、按對應的遙控器按鈕。因爲只是爲了生成樣板,因此錄製一個按鈕就夠了。完成錄製後,當前目錄下會生成一個遙控器配置文件 遙控器名稱.lircd.conf
。
若是發現錄製過程十分緩慢,最後提示「未發現gap」之類的信息,請嘗試跳過自動生成這一步,複製下面的配置文件當作生成的配置,直接進入下一步。(我在錄製一些老式空調的命令時遇到了這種問題,只能這樣解決,若是你有什麼想法懇請提出)
我在錄製時輸入的 遙控器名稱
是aircon,錄製的一個按鈕是on,因此配置文件的內容形式以下:
begin remote name aircon flags RAW_CODES eps 30 aeps 100 gap 19991 begin raw_codes name on 9042 4438 700 1602 705 526 678 528 681 531 674 527 679 528 679 528 677 527 677 528 679 528 678 528 677 1632 676 529 676 531 676 531 649 556 672 532 650 558 654 552 652 553 649 558 648 1661 650 558 648 558 648 1661 649 562 644 558 647 558 648 1657 651 558 647 1659 650 557 653 553 648 1660 648 557 649 end raw_codes end remote
若是你閱讀了紅外NEC協議,就能立刻意識到,這一串數字其實就是紅外信號脈衝(pulse)、空白(space)的持續時間。
打開剛纔生成的樣板文件 遙控器名稱.lircd.conf
,很容易發現 begin raw_codes
和 end raw_codes
之間的內容就是須要咱們手動修改的內容。剛纔也提到過,樣板中記錄的信號很可能是不正確的,因此咱們先把自動生成的 on
按鈕下方的信號數據刪除掉。
還記得剛纔測試時使用的mode2命令嗎。咱們如今須要作的就是使用mode2命令接收遙控器發出的信號,而後將其加入到文件 遙控器名稱.lircd.conf
中。首先,咱們來錄入正確的 on
按鈕的信號數據:
# -m --mode 使用行列顯示模式,不顯示pulse、space mode2 -m -d /dev/lirc0
按下遙控器上的「開」按鈕,獲得形式以下的輸出:
16777215 9059 4432 706 1604 706 528 679 524 681 1603 703 526 680 1602 715 1596 704 526 679 527 679 527 680 527 679 1604 705 530 673 530 674 529 682 529 675 530 674 532 674 532 650 557 648 556 654 1653 676 533 649 559 647 1667 639 559 648 558 656 553 647 1658 648 558 650 1659 649 559 647 559 648 1659 648 558 646 19991 648 558 648 558 650 567 638 557 648 1668 640 557 649 558 650 558 646 1660 650 556 649 557 649 559 654 552 648 1657 651 558 647 554 660 549 649 559 647 557 649 559 648 559 647 557 644 561 648 559 648 556 647 560 648 556 652 563 642 1658 648 1661 649 1660 646 1658 650
除去第一行很大的那個數,把其餘數據所有複製,粘貼到配置文件的 name on
下方。例如如今我必須刪除「16777215」這個數,剩下的內容粘貼到配置文件的 name on
下方。
重複上述操做,增長更多的按鈕,例如 name off
、 name 26C
等。最後我錄製了3個按鈕,配置文件編輯成了這樣:
begin remote name aircon flags RAW_CODES eps 30 aeps 100 gap 19991 begin raw_codes name on 9059 4432 706 1604 706 528 679 524 681 1603 703 526 680 1602 715 1596 704 526 679 527 679 527 680 527 679 1604 705 530 673 530 674 529 682 529 675 530 674 532 674 532 650 557 648 556 654 1653 676 533 649 559 647 1667 639 559 648 558 656 553 647 1658 648 558 650 1659 649 559 647 559 648 1659 648 558 646 19991 648 558 648 558 650 567 638 557 648 1668 640 557 649 558 650 558 646 1660 650 556 649 557 649 559 654 552 648 1657 651 558 647 554 660 549 649 559 647 557 649 559 648 559 647 557 644 561 648 559 648 556 647 560 648 556 652 563 642 1658 648 1661 649 1660 646 1658 650 name off 9029 4432 715 1594 706 526 682 523 681 525 680 526 681 1601 708 1607 699 524 688 519 682 526 678 527 681 1601 708 524 687 520 682 525 677 527 677 529 675 531 676 531 674 532 651 558 646 1659 650 557 648 557 650 1659 653 554 650 559 647 558 649 1657 649 558 648 1661 648 557 646 562 645 1666 643 558 649 19992 651 555 650 558 648 562 645 557 648 1661 653 552 646 560 650 557 648 1657 649 561 647 557 647 558 650 556 650 1659 649 559 647 557 649 558 648 559 647 557 651 564 642 559 646 557 649 557 657 552 647 557 648 558 650 557 645 560 653 1653 646 1661 650 1659 648 558 647 name 26C 9026 4430 705 1604 706 528 679 535 670 1604 705 527 675 532 679 1607 702 530 673 531 683 1625 672 535 672 1633 676 530 673 534 649 558 648 563 642 556 651 556 650 558 672 532 649 556 652 1659 648 558 656 551 646 1659 650 558 648 558 648 558 649 1658 649 561 648 1659 647 559 650 556 648 1660 646 559 647 19990 648 1659 649 558 648 558 647 558 650 1658 650 557 650 555 650 558 648 558 649 555 652 561 667 534 648 559 648 1658 656 550 650 557 672 533 649 555 650 559 649 558 647 559 648 558 648 566 641 558 647 558 648 558 650 558 648 558 648 1660 646 558 648 558 646 562 647 end raw_codes end remote
是的,若是你想要實現完整的控制,你就須要把全部按鈕都錄製一遍。若是你對配置文件中開頭的eps、aeps等參數感興趣,或者最後遙控不太正常,閱讀lircd.conf manual或許能幫到你。我使用的是默認的數值,一切工做正常。
最後,把配置文件複製到指定目錄 /etc/lirc/lircd.conf/
並重啓lircd服務:
sudo cp aircon.lircd.conf /etc/lirc/lircd.conf.d/ sudo service lircd restart
*後續步驟出現問題的同窗可使用service lircd status查看服務啓動的log,幫助定位bug。
終於,咱們能夠嘗試着使用樹莓派控制空調了。若是你沒有使用開關三極管,你可能須要把樹莓派拿到靠近空調的地方,而且把紅外發射管對準空調。若是你使用了三極管,那麼注意樹莓派和空調之間不要有明顯的物體阻隔便可。
# 發射命令:irsend SEND_ONCE 遙控器名稱 按鈕名稱 irsend SEND_ONCE aircon on
若是前面的步驟一切正常,但在發射信號時報錯「transmission failed」。請檢查生成的遙控器配置文件,查看flags項,如果flags RAW_CODES|CONST_LENGTH
,請嘗試將其修改爲flags RAW_CODES
並重啓lircd服務。再測試可否發射信號。
最後,咱們來討論一個比較有意思的東西。
考慮一下這種狀況:我爲了錄入 +
按鈕,運行mode2命令開始錄製。在遙控器顯示溫度23℃時按 +
,而後按照前面的方法編輯配置文件,寫入了按鈕 name add
。
此時空調屏幕上顯示溫度是24℃。提問:若是我運行
irsend SEND_ONCE aircon add
空調會:
很遺憾,後者發生了。
實際上遙控器每按下一次按鈕發送的信息是一個「情景」,我剛纔錄製的 add
按鈕其實是表示「溫度設爲24℃、進入製冷模式、風速設爲自動...」這樣的一個「情景」。若是你在空調溫度20℃時運行add命令,那麼它就會一次性提高到24℃!
這意味着,若是你想要設置任意溫度,你須要把每一度都錄製一遍,由於 +
、 -
命令根本就不存在。
固然,這也不全是壞事。
我錄製了一個按鈕 26C
,功能是將溫度調到26℃。而後我意識到, 26C
這個按鈕同時包含了開關狀態的信息。是的!在空調關閉的狀況下,若是我直接發送命令:
irsend SEND_ONCE aircon 26C
那麼空調會打開,而且調整到26℃!
因而,我錄製了一個按鈕 Sleep
,它將空調設置爲「26℃、風速設爲低、開啓掃風、開啓靜音睡眠模式」。睡前運行一次 irsend SEND_ONCE aircon Sleep
,感受離智能家居又近了一步 23333 (•̀ω•́)✧。
其實寫完這篇總結仍是有點慌的,由於不論是樹莓派版本、軟件版本、紅外管型號仍是空調的型號,你們都是不同的,說不許哪一步我這麼作放別人那就是錯的呢。事實上,我本身在作的過程當中參考的一些博客就和個人實際狀況有些出入了。只能但願這篇總結可以有必定的參考價值。最後,感謝你閱讀文章!