Raspberry pi 3 を使って、 LINE から 赤外線リモコンを操作(その1:赤外線リモコンからエアコンを操作)


はじめに

出先からおうちの家電を動かしたい!ということで、
LINE の Messaging API (webhook) を利用し、
Raspberry pi 3 経由で、赤外線を使って、
おうちの家電製品を操作するような仕組み作りました。
備忘録として、思い出しながら記載します。

今回の構成は以下の通りです。
LINE -> raspberry pi(httpsサーバ) -> 赤外線リモコン -> エアコン

以下の通り分けて説明します
- 赤外線リモコン から エアコン を操作(今回)
- httpsサーバ(apache + mod_wsgi) の構築
- LINE から 赤外線リモコンを操作

必要機材

Raspberry pi 3
赤外線リモコン受信モジュール:PL-IRM2121(38kHz)
赤外線LED:OSI5FU5111C-40
NPNトランジスタ:2SC1815-GR
抵抗:45Ω(赤外線LED脇)、500Ω(出力用GPIO脇)

環境

OS: Raspbian 9.1
赤外線リモコンデーモン:lircd 0.9.4c
バージョンによって、設定方法など変わることに注意

手順

1. Raspberry pi 3 に赤外線受信/送信するための回路を構築

具体的な回路構成は
(1)Raspberry Pi 2を赤外線リモコンで操作可能にする

(2)Alexa Skills Kit + AWS IoT + Raspberry Pi + 赤外線LED でテレビリモコンを作る
を参考にしてください。
赤外線LEDやNPNトランジスタの配線に注意
自分はデータシートの見方、展開図の方向を間違えておりハマりました

GPIOの接続は、以下の通り繋げていることを前提にします。
- 赤外線リモコン受信モジュールからGPIOへの入力:GPIO 18
- GPIOからNPNトランジスタへの出力:GPIO 17

2. 赤外線リモコンデーモン のインストール と 設定

まずは、赤外線リモコンデーモンである lircd のインストールする

terminal
$ sudo apt-get install lirc

lirc をインストール後、lircd の設定ファイルを2行修正する

terminal
$ sudo emacs /etc/lirc/lirc_options.conf

driver = default
device = /dev/lirc0

さらに、利用するgpioの設定するために、一番下の行に以下を追加する
(=や, の間に空白は入れないようにする)

terminal
$ sudo emacs /boot/config.txt

dtoverlay=lirc-rpi:gpio_out_pin=17,gpio_in_pin=18,gpio_in_pull=up

システムを再起動する

terminal
$ sudo reboot

3. エアコンリモコンから赤外線のパターンを取得

赤外線リモコン受信するために、lircd を停止する

terminal
$ sudo /etc/init.d/lircd stop

赤外線リモコンを受信するために、待ち受け状態にする。

terminal
$ mode2 -d /dev/lirc0

コマンド入力後、エアコンのリモコンを赤外線リモコン受信機モジュールに向けてボタンを押すと、
以下の通りに表示する(Crtl + c で終了)

terminal
pulse 5689
space 29388
pulse 3384
space 1785
pulse 376
space 1335
pulse 395
space 467
pulse 401
space 464
pulse 419
space 448
・・・

mode2 を利用して、赤外線のデータを取得するには、以下のコマンドを実行する
(コマンドを実行したフォルダに、 OFF というファイルができる)

terminal
$ mode2 -d /dev/lirc0 | tee OFF

エアコンのリモコンから取得した赤外線データを赤外線送信するために、
以下の ruby の実行ファイルを使う
実行ファイルは (5)Slack経由で家の外からエアコンをon, offできる装置を、Raspberry Piで作ってみた から抜粋し、さらに、1行80文字程度に抑える処理も追加

parse.rb
# coding: utf-8
lines =  File.open(ARGV[0]).readlines #行ごとに配列として読み込み
lines_without_first = lines.slice(1..-1) #先頭の行は不必要なので省く
str = lines_without_first.map{|line|line.split(" ")[1]}.join(" ") #整形して表示

# 1行80文字以内に抑える処理
items = str.split(" ")

count = 0
items.each do |item|
  count += item.length
  if count < 80 then
    print(item," ")
  else
    print(item," \n")
    count = item.length
  end
  count += 1
end

OFFファイル を 赤外線送信できる形式に変更するコマンドは以下の通り実行する

terminal
$ ruby parse.rb OFF

出力は以下の通り表示される

OFF
5689 29388 3384 1785 376 1335 395 467 401 464 419 448 ・・・

terminalに出力した、OFFファイルのデータを格納するために、
以下のファイルを作成する

terminal
$ sudo emacs /etc/lirc/lircd.conf.d/aircon.lircd.conf

以下のように、内容を記載し、特に、
OFFファイルのデータを name off 以下にコピペする
(コピペデータは parseから始まり、spaceで終わるようなデータでないとエラーになる)

aircon.lircd.conf
begin remote
  name  aircon
  flags RAW_CODES
  eps   30
  aeps  100
  gap   200000
  toggle_bit_mask 0x0

  begin raw_codes

name off
5689 29388 3384 1785 376 1335 395 467 401 464 419 448 ・・・

name hoton
(暖房をONした時のデータを入れる)

name iceon
(冷房をONした時のデータを入れる)

  end raw_codes
end remote

4. 赤外線データの正規化

赤外線送信データは業界標準フォーマットが2つ存在している
(6)赤外線リモコンフォーマット を参照ください

  • NECフォーマット
  • 家電協フォーマット

各自のリモコンがどちらのフォーマットで動作しているかはparseとspaceの組み合わせで推測ください。
ここでは、家電協フォーマットを前提で進める。

3章の parse.rb に、赤外線データを家電協フォーマットに正規化する処理を追加したファイルは以下の通りである。
正規化の方法は自分が持っていたリモコンをベースに実装しているため、取得したいリモコンの赤外線データによっては
実装を変えて使ってください

parse_opt.rb
# coding: utf-8
lines =  File.open(ARGV[0]).readlines #行ごとに配列として読み込み
lines_without_first = lines.slice(1..-1) #先頭の行は不必要なので省く
str = lines_without_first.map{|line|line.split(" ")[1]}.join(" ") #整形して表示

items = str.split(" ")

count = 0
items.each do |item|
  count += item.length

# 赤外線データを家電協フォーマットに正規化
  value = Integer(item)
  if value < 800 then
    value = 400
  elsif value < 1400 then
    value = 1200
  elsif value < 2000 then
    value = 1600
  elsif value < 4000 then
    value = 3200
  else
  end

# 1行80文字以内に抑える処理
  if count < 80 then
    print(value," ")
  else
    print(value," \n")
    count = item.length
  end
  count += 1

end

OFFファイルに対して、上記のrbファイルの実行方法は以下の通りである。

terminal
$ ruby parse_opt.rb OFF

出力は以下の通りになる

output
5689 29388 3200 1600 400 1200 400 400 400 400 400 ・・・

この出力を見てみると、先頭から見て2つ目のデータが、
space 29388 であり、これは、リモコンフォーマットを見てみると、
フレーム開始前になることから、それ以前のデータは削除する

aircon.lircd.conf ファイルの変更するため、以下のコマンドを実行する

terminal
$ sudo emacs /etc/lirc/lircd.conf.d/aircon.lircd.conf

記載するデータは以下の通りになる。
(記載するデータは parseから始まり、spaceで終わるようなデータでないとエラーになる)

aircon.lircd.conf
begin remote
  name  aircon
  flags RAW_CODES
  eps   30
  aeps  100
  gap   200000
  toggle_bit_mask 0x0

  begin raw_codes

name off
3200 1600 400 1200 400 400 400 400 400 ・・・

name hoton
(暖房をONした時のデータを入れる)

name iceon
(冷房をONした時のデータを入れる)

  end raw_codes
end remote

5. 赤外線データを赤外線送信機で送出

赤外線送信するために、lircd を再開する

terminal
$ sudo /etc/init.d/lircd start

赤外線送信できるデータを確認するために、以下のコマンドを実行する

terminal
$ irsend LIST '' ''

すると、以下のフィードバックが返却される

terminal
aircon

さらに、 aircon にどのようにコマンドがあるか調べる

terminal
$ irsend LIST aircon ''

すると、以下のフィードバックが返却される

terminal
0000000000000001 off
0000000000000002 hoton
0000000000000003 iceon

aircon の off コマンドを使う場合には、以下のコマンドを実行する

terminal
$ irsend SEND_ONCE aircon off

これで、エアコンがOFFになる
もちろん、赤外線LEDがきちんとエアコンに向いていないと反応しない ので注意が必要!

参考URL

(1)Raspberry Pi 2を赤外線リモコンで操作可能にする
(2)Alexa Skills Kit + AWS IoT + Raspberry Pi + 赤外線LED でテレビリモコンを作る
(3)Raspberry Pi 3 Model B で赤外線リモコン学習&操作
(4)Raspbian Stretchで LIRC機能を使った学習リモコン、赤外線リモコンを動かす方法
(5)Slack経由で家の外からエアコンをon, offできる装置を、Raspberry Piで作ってみた
(6)赤外線リモコンフォーマット