樹莓派學習手記——製做一個空調遙控器(紅外接收、發射的實現)

使用樹莓派搭配紅外管,進行接收、發射紅外信號是很方便的,同時紅外信號也有很普遍的用途。此次咱們將總結使用樹莓派製做一個空調紅外遙控器的過程。html

準備工具

  • 紅外接收管(參考型號HS0038B)
  • 紅外發射管(參考型號TSAL6200)
  • 遙控器(或能使用萬能遙控器的手機)
  • 用做開關的三極管、限流電阻(非必須、參考型號S9013)

使用開關三極管能夠有效加強紅外發射管的性能,但不是必須的。不使用三極管也能在三五米範圍內成功遙控空調。這些材料總共費用不超過1塊錢,反而是快遞費比較貴了。linux

看到遙控器、接收管、發射管,相信已經有人明白了製做遙控器的原理。是的,咱們只須要事先把遙控器發射出的紅外信號記錄下來,而後經過樹莓派依樣畫葫蘆地把這個信號發射出去,一個「克隆」版的遙控器就作好了。git

硬件鏈接

*注意:兩個GPIO引腳是固定的,與後續安裝的軟件有關。github

接收管信號輸出腳 OUT → GPIO18工具

發射管正極(不使用開關三極管的狀況下) → GPIO17性能

若是你手頭上沒有開關三極管,直接將紅外發射管正極接在GPIO17,以下所示:測試

若是接入三極管,用GPIO17鏈接基極,控制發射極和集電極的通斷:this

(偷懶了沒有接入限流電阻,在乎的同窗自行接入)spa

安裝lirc

解決方案來自: LIRC: Linux Infrared Remote Control for Raspberry Pi
sudo apt update
sudo apt install lirc

修改CONFIG.TXT

修改文件 /boot/config.txtrest

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_codesend 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 offname 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

空調會:

  1. 溫度提高到25℃
  2. 「滴」地響一聲,而後什麼都沒發生,保持在24℃

很遺憾,後者發生了。

實際上遙控器每按下一次按鈕發送的信息是一個「情景」,我剛纔錄製的 add 按鈕其實是表示「溫度設爲24℃、進入製冷模式、風速設爲自動...」這樣的一個「情景」。若是你在空調溫度20℃時運行add命令,那麼它就會一次性提高到24℃!

這意味着,若是你想要設置任意溫度,你須要把每一度都錄製一遍,由於 +- 命令根本就不存在。

固然,這也不全是壞事。

我錄製了一個按鈕 26C ,功能是將溫度調到26℃。而後我意識到, 26C 這個按鈕同時包含了開關狀態的信息。是的!在空調關閉的狀況下,若是我直接發送命令:

irsend SEND_ONCE aircon 26C

那麼空調會打開,而且調整到26℃!

因而,我錄製了一個按鈕 Sleep ,它將空調設置爲「26℃、風速設爲低、開啓掃風、開啓靜音睡眠模式」。睡前運行一次 irsend SEND_ONCE aircon Sleep ,感受離智能家居又近了一步 23333 (•̀ω•́)✧。

小結

其實寫完這篇總結仍是有點慌的,由於不論是樹莓派版本、軟件版本、紅外管型號仍是空調的型號,你們都是不同的,說不許哪一步我這麼作放別人那就是錯的呢。事實上,我本身在作的過程當中參考的一些博客就和個人實際狀況有些出入了。只能但願這篇總結可以有必定的參考價值。最後,感謝你閱讀文章!

相關文章
相關標籤/搜索