Raspberry Pi 2 でエアコン操作(赤外線リモコン編)
猛暑で帰宅時の部屋の暑さに耐え切れない!
帰宅前にエアコンを稼働させて室温を下げたい!
そうだ、外部からRaspberry Pi 2 経由でエアコンを操作しよう!
と思っていたら、8月も終わりに差し掛かり、急に涼しくなってきて完全に時期を逃してしまった。
残暑とは何だったのか。
気を取り直して、冬の寒さに備えて、外からエアコンを操作する仕組みを構築することにした。
必要な機能
外からエアコンを操作する仕組みを構築するに当たり、最低以下の2つの仕組みが必要そう。
- Raspberry Pi 2 から赤外線でエアコンを操作する
- Raspberry Pi 2 をインターネット経由で遠隔操作する
今回は、1の Raspberry Pi 2 から赤外線でエアコンを操作する所までを実験してみる。
用意したもの
- Raspberry Pi 2
- 赤外線LED(OSI5FU5111C-40)
- 赤外線リモコン受信モジュール(OSRB38C9AA)
- 抵抗(100Ω程度)
赤外線を使う準備
エアコンを操作するには、
- エアコンの赤外線リモコンのコードを赤外線受信モジュールに照射してRaspberry Pi 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個並列に並べて繋いでいる。
リモコンの受信確認
$ 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を遠隔操作する仕組みにとりかかりたい。