カイワレスタイル

ゲーム、アニメ、プログラム、興味のあることをツラツラと。

Raspberry Pi 2 でエアコン操作(赤外線リモコン編)

猛暑で帰宅時の部屋の暑さに耐え切れない!
帰宅前にエアコンを稼働させて室温を下げたい!
そうだ、外部からRaspberry Pi 2 経由でエアコンを操作しよう!

と思っていたら、8月も終わりに差し掛かり、急に涼しくなってきて完全に時期を逃してしまった。
残暑とは何だったのか。

気を取り直して、冬の寒さに備えて、外からエアコンを操作する仕組みを構築することにした。


必要な機能

外からエアコンを操作する仕組みを構築するに当たり、最低以下の2つの仕組みが必要そう。

  1. Raspberry Pi 2 から赤外線でエアコンを操作する
  2. Raspberry Pi 2 をインターネット経由で遠隔操作する

今回は、1の Raspberry Pi 2 から赤外線でエアコンを操作する所までを実験してみる。


用意したもの


赤外線を使う準備

エアコンを操作するには、

  1. エアコンの赤外線リモコンのコードを赤外線受信モジュールに照射してRaspberry Pi 2 に覚えさせる
  2. 覚えさせたコードを赤外線LEDから照射してエアコンを操作する

の2段階の工程が必要。

赤外線LEDは GPIO20
赤外線受信モジュールは GPIO21
に接続することにするが、
まずは回路を組む前に必要なモジュール等をインストールする。

LIRCのインストール

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install lirc

LIRCの設定その1

$ sudo vim /etc/lirc/hardware.conf

hardware.confを以下の様に修正する。

# /etc/lirc/hardware.conf
#
# Arguments which will be used when launching lircd
LIRCD_ARGS="--uinput"
 
#Don't start lircmd even if there seems to be a good config file
#START_LIRCMD=false
 
#Don't start irexec, even if a good config file seems to exist.
#START_IREXEC=false
 
#Try to load appropriate kernel modules
LOAD_MODULES=true
 
# Run "lircd --driver=help" for a list of supported drivers.
DRIVER="default"
# usually /dev/lirc0 is the correct setting for systems using udev
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"
 
# Default configuration files for your hardware if any
LIRCD_CONF=""
LIRCMD_CONF=""

起動時にLIRCを有効にする。

$ sudo vim /boot/config.txt

/boot/condig.txt の末尾に以下の行を追加

dtoverlay=lirc-rpi,gpio_in_pin=21,gpio_out_pin=20

一旦再起動する。

sudo reboot

再起動後、LIRCが有効になっているか確認する

$ lsmod | grep lirc
  lirc_rpi                6638  0
  lirc_dev                8169  1 lirc_rpi
  rc_core                16956  1 lirc_dev

回路

回路は以下の通り、モーター制御に比べたら大分簡素。
図にするとシンプルだが、実際は手元に抵抗が330Ωのものしか無かったので、抵抗を下げるために6個並列に並べて繋いでいる。

f:id:kaiware007:20150828011822p:plain

リモコンの受信確認

$ sudo /etc/init.d/lirc stop
$ mode2 -d /dev/lirc0

エアコンのリモコンを赤外線受信モジュールに向けて適当なボタンを押してみて、変な文字の羅列が流れてきたら受信成功。 とりあえず、各種ボタンを押した時のデータを個別に保存する。

$ mode2 -d /dev/lirc0 | tee airon.dat
$ mode2 -d /dev/lirc0 | tee airoff.dat

赤外線データ整形

保存したデータはそのままでは、lircでは使えないので整形する必要がある。
以下のpythonスクリプトを作って変換するようにした。

#coding: UTF-8
import sys

argvs = sys.argv
argc = len(argvs)

if (argc < 2):
    print 'Error: argument not enough'
    quit()

f = open(argvs[1])
line = f.readline() # 一行目は不要なので読み捨てる
line = f.readline()

count = 0

while line:
    print line.split(' ')[1].strip(),
    line = f.readline()
    count += 1
    if (count > 20):      # 1行が長すぎると後で困る為適当に改行を入れる
        count = 0
        print

f.close

作成したスクリプトで保存したデータを整形する

$ python lirc_cut.py airon.dat > airon_parse.dat

LIRCの設定その2

$ sudo vim /etc/lirc/lircd.conf

/etc/lirc/lircd.confに先ほど整形したデータを追加してコマンドにする。
どうも設定ファイルの1行が長すぎるとlircがエラーを出すようで、対策のため整形データを適当な長さで改行するようにした。

# Please make this file available to others
# by sending it to <lirc@bartelmus.de>
#
# this config file was automatically generated
# using lirc-0.9.0-pre1(default) on Sat Mar 22 16:16:12 2014
#
# contributed by 
#
# brand:                       
# model no. of remote control: 
# devices being controlled by this remote:
#

begin remote

  name  aircon
  flags RAW_CODES
  eps            30
  aeps          100

  gap        200000
  toggle_bit_mask 0x0

      begin raw_codes
    name off
420 450 373 506 367 493 375 493 380 507 377 25279 3425 1794 383 1359 396 475 386 488 378
490 378 1360 379 494 378 491 379 491 378 493 420 1320 380 492 378 1360 381 1359 379 493
(省略)

    name on
401 496 377 497 372 500 368 505 366 525 357 25256 3450 1770 409 1332 415 488 376 514 365
480 383 1333 404 493 380 488 379 492 380 489 381 1335 408 488 381 1334 406 1334 407 489
(省略)

    name cooler28
360 534 325 547 352 516 325 544 326 544 327 25318 3400 1820 355 1386 354 544 326 545 326
543 327 1386 355 569 301 544 326 544 326 544 327 1385 355 544 326 1387 354 1385 355 544
(省略)

    name heater26
430 485 385 440 427 467 409 441 428 464 415 25227 3480 1741 431 1309 457 419 431 438 431
445 425 1305 433 467 404 451 420 466 405 464 405 1311 429 465 403 1309 436 1317 420 445
(省略)

      end raw_codes

end remote

これでエアコンを操作する準備が整った。


エアコン操作

LIRC再起動

LIRCを起動する。

$ sudo /etc/init.d/lirc start

ここでエラーが出た場合は、/etc/lirc/lircd.confの設定がおかしいので見直すこと。

リモコンコマンドの確認

以下のコマンドでリモコンコマンドの確認が出来る。
全て表示されていれば問題なし。

$ irsend LIST "" ""
  irsend: aircon
$ irsend LIST aircon ""
  irsend: 0000000000000001 off
  irsend: 0000000000000002 on
  irsend: 0000000000000003 cooler28
  irsend: 0000000000000004 heater26

赤外線照射

いよいよRaspberry Pi 2 からエアコンを操作する。

$ irsend SEND_ONCE aircon on

エアコンの電源がONになれば成功。
実際は、赤外線LEDの向きを合わせるのがシビアだったり、出力が弱いのか1m程度の距離まで赤外線LEDを近づけないと電源がONにならなかった。
改善するには、赤外線LEDの出力を上げるのと、LEDキャップを被せて拡散させるという処置が必要になりそう。
しかし、今回使った赤外線LED(OSI5FU5111C-40)の定格が100mAで、今回使った抵抗が合成抵抗55Ωで、Raspberry Pi 2のGPIOの電圧が5Vだとして、90mA程度の電流なのでこれ以上出力を上げるのが難しそう。
もっと出力が高い赤外線LEDに変更した方がいいのかもしれない。


とりあえず

今回はRaspberry Pi 2からエアコンを操作する事ができるようになった。
次回は、Raspberry Pi 2を遠隔操作する仕組みにとりかかりたい。


参考資料

qiita.com

Umbrella RaspberryPiでLIRCする

tiger-star.net

make.bcde.jp