はじめに
出先からおうちの家電を動かしたい!ということで、
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を赤外線リモコンで操作可能にする] (https://yagi.tc/archives/2017/03/28/raspberry-pi-2-ir-reciever/)
や
(2)Alexa Skills Kit + AWS IoT + Raspberry Pi + 赤外線LED でテレビリモコンを作る
を参考にしてください。
赤外線LEDやNPNトランジスタの配線に注意
自分はデータシートの見方、展開図の方向を間違えておりハマりました
GPIOの接続は、以下の通り繋げていることを前提にします。
- 赤外線リモコン受信モジュールからGPIOへの入力:GPIO 18
- GPIOからNPNトランジスタへの出力:GPIO 17
2. 赤外線リモコンデーモン のインストール と 設定
まずは、赤外線リモコンデーモンである lircd のインストールする
$ sudo apt-get install lirc
lirc をインストール後、lircd の設定ファイルを2行修正する
$ sudo emacs /etc/lirc/lirc_options.conf
driver = default
device = /dev/lirc0
さらに、利用するgpioの設定するために、一番下の行に以下を追加する
(=や, の間に空白は入れないようにする)
$ sudo emacs /boot/config.txt
dtoverlay=lirc-rpi:gpio_out_pin=17,gpio_in_pin=18,gpio_in_pull=up
システムを再起動する
$ sudo reboot
3. エアコンリモコンから赤外線のパターンを取得
赤外線リモコン受信するために、lircd を停止する
$ sudo /etc/init.d/lircd stop
赤外線リモコンを受信するために、待ち受け状態にする。
$ mode2 -d /dev/lirc0
コマンド入力後、エアコンのリモコンを赤外線リモコン受信機モジュールに向けてボタンを押すと、
以下の通りに表示する(Crtl + c で終了)
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 というファイルができる)
$ mode2 -d /dev/lirc0 | tee OFF
エアコンのリモコンから取得した赤外線データを赤外線送信するために、
以下の ruby の実行ファイルを使う
実行ファイルは (5)Slack経由で家の外からエアコンをon, offできる装置を、Raspberry Piで作ってみた から抜粋し、さらに、1行80文字程度に抑える処理も追加
# 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ファイル を 赤外線送信できる形式に変更するコマンドは以下の通り実行する
$ ruby parse.rb OFF
出力は以下の通り表示される
5689 29388 3384 1785 376 1335 395 467 401 464 419 448 ・・・
terminalに出力した、OFFファイルのデータを格納するために、
以下のファイルを作成する
$ sudo emacs /etc/lirc/lircd.conf.d/aircon.lircd.conf
以下のように、内容を記載し、特に、
OFFファイルのデータを name off 以下にコピペする
(コピペデータは parseから始まり、spaceで終わるようなデータでないとエラーになる)
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 に、赤外線データを家電協フォーマットに正規化する処理を追加したファイルは以下の通りである。
正規化の方法は自分が持っていたリモコンをベースに実装しているため、取得したいリモコンの赤外線データによっては
実装を変えて使ってください
# 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ファイルの実行方法は以下の通りである。
$ ruby parse_opt.rb OFF
出力は以下の通りになる
5689 29388 3200 1600 400 1200 400 400 400 400 400 ・・・
この出力を見てみると、先頭から見て2つ目のデータが、
space 29388 であり、これは、リモコンフォーマットを見てみると、
フレーム開始前になることから、それ以前のデータは削除する
aircon.lircd.conf ファイルの変更するため、以下のコマンドを実行する
$ sudo emacs /etc/lirc/lircd.conf.d/aircon.lircd.conf
記載するデータは以下の通りになる。
(記載するデータは parseから始まり、spaceで終わるようなデータでないとエラーになる)
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 を再開する
$ sudo /etc/init.d/lircd start
赤外線送信できるデータを確認するために、以下のコマンドを実行する
$ irsend LIST '' ''
すると、以下のフィードバックが返却される
aircon
さらに、 aircon にどのようにコマンドがあるか調べる
$ irsend LIST aircon ''
すると、以下のフィードバックが返却される
0000000000000001 off
0000000000000002 hoton
0000000000000003 iceon
aircon の off コマンドを使う場合には、以下のコマンドを実行する
$ irsend SEND_ONCE aircon off
これで、エアコンがOFFになる
もちろん、赤外線LEDがきちんとエアコンに向いていないと反応しない ので注意が必要!
参考URL
(1)[Raspberry Pi 2を赤外線リモコンで操作可能にする] (https://yagi.tc/archives/2017/03/28/raspberry-pi-2-ir-reciever/)
(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)赤外線リモコンフォーマット