2017/01/07

日の出が遅いので、Raspberry Piで電気を点けて気持ちよく目覚めてみる

みなさん、今日は2017年の東京の日の出が最も遅い日ですね。*1 寒い上に日の出が遅いと早起きができない方も多いのではないでしょうか? 私もその一人です。

「朝起きたら日光を浴びる」これは早起き術としてよく紹介されている技ですが、日の出より前に起きる場合には適用不可能です。そこで、今回はそろそろ日本でも発売するというRaspberry Pi Zeroを使って、朝になったら部屋の電気を点けて部屋を明るくするということをしてみたいと思います。

実行環境

  • とても寒い冬季の日本
  • 日の出前の6時ごろ
  • LEDシーリングライト(赤外線リモコンによる操作が可能)

ハードウェアの準備

今回は赤外線を使ってシーリングライトをRaspberry Pi Zeroで制御します。このため、リモコンの信号を学習するための受信モジュールと赤外線LEDが必要です。まず、これらをRaspberry Pi Zeroに接続します。
Raspberry Pi のGPIOはそれほど多くの電流を流せないため、トランジスタで増幅しています。10Ωの抵抗をつけてだいたい100mAぐらい流すようにしてあります。

受信モジュールの出力は5Vであるのに対して、Raspberry Pi のGPIOは3.3Vであり5Vトレラントではないそうです。そこで、出力ピンに40kΩの抵抗(実際には10kΩの直列4本)をぶら下げておき、分圧することで3.3Vにしています。

使用している部品は全て秋月電子で入手可能です。型番などは以下の表の通りです。

部品名 型番 個数 URL
赤外線リモコン受信モジュール PL-IRM2121-A538 1 http://akizukidenshi.com/catalog/g/gI-01570/
赤外線LED OSI5LA5113A 2 http://akizukidenshi.com/catalog/g/gI-04311/
トランジスタ 2SC1815GR 2 http://akizukidenshi.com/catalog/g/gI-00881/
抵抗 10Ω 2 http://akizukidenshi.com/catalog/g/gR-25100/
抵抗 10kΩ 4 http://akizukidenshi.com/catalog/g/gR-25103/

作成した回路はこのような感じになりました。(ピンヘッダは1のModel B用に作ってしまったため、今回はジャンパで接続...)手前の白いキャップが付いているのが赤外線LEDで、その隣の黒いのが受信モジュールです。

ハードウェアの準備はこれで完了です。

LIRCの導入

LIRCというソフトウェアを使うと、Linuxで赤外線信号の送受信ができるようになります。まずはこれをインストールしましょう。OSはRaspbianを使用しました。
sudo apt update
sudo apt install lirc
インストールが終わったら、LIRCの有効化とピンの設定を行います。/boot/config.txtの51行目を次のように変更します。
# dtoverlay=lirc-rpi (変更前)
↓
dtoverlay=lirc-rpi,gpio_in_pin=17,gpio_out_pin=18 (変更後)
また、/etc/lirc/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=""
変更が終わったら再起動します。
sudo reboot

再起動が終わったら、受信がうまくできるか確認します。
mode2 -d/dev/lirc0
このコマンドを実行を始めたら、リモコンを受信モジュールに向けてリモコンのボタンを押します。ここで、次のような出力が現れたらうまくいっています。出力の確認が終わったらCtrl-Cで実行を終了します。
space 1907936
pulse 10217
space 5133
space 641
pulse 632
.
.
.

リモコンの信号の学習

irrecord というコマンドを実行すると対話的にリモコンの学習を行うことができます。学習が終わると、設定ファイルが生成されます。-dオプションはデバイスの指定(デフォルトのデバイス名と違ったものが現れるので明示的に指定します)、--disable-namespaceはリモコンのボタンの名前を自由につけるためのオプション、-fオプションはraw mode(届いた信号をコード化せずにそのまま保存する)で学習を行うためのオプションです。以下はコマンドの実行例です。
$ sudo /etc/init.d/lirc stop  # 学習を行うので一旦止める
$ irrecord -d/dev/lirc0 --disable-namespace -f ceiling_light.conf

irrecord -  application for recording IR-codes for usage with lirc

Copyright (C) 1998,1999 Christoph Bartelmus(lirc@bartelmus.de)
省略
Press RETURN to continue. (ENTERを押す)


Now start pressing buttons on your remote control.

It is very important that you press many different buttons and hold them
down for approximately one second. Each button should generate at least one
dot but in no case more than ten dots of output.
Don't stop pressing buttons until two lines of dots (2x80) have been
generated.

Press RETURN now to start recording.(ENTERを押したらボタンをランダムに1秒ずつ押し続ける)
................................................................................
Found const length: 122383
Please keep on pressing buttons like described above.
Creating config file in raw mode.
Now enter the names for the buttons.

Please enter the name for the next button (press <ENTER> to finish recording)
FULL(ボタンの名前を入力してENTERを押す、押したらすぐに学習したいボタンを押下する)

Now hold down button "FULL".
Got it.
Signal length is 69

Please enter the name for the next button (press <ENTER> to finish recording)
OFF

Now hold down button "OFF".
Got it.
Signal length is 67

Please enter the name for the next button (press <ENTER> to finish recording)
(ENTERを押して終了する)
設定ファイルが出来上がったら、/etc/lirc/lircd.confに生成した設定を追記し(初回の場合は>>を>に変えて、上書きします)、lircdを起動します。
sudo bash -c "cat /path/to/ceiling_light.conf(生成した設定ファイル) >> /etc/lirc/lircd.conf"
$ sudo /etc/init.d/lirc start
起動できたら、実際に電気を操作してみます。
$ irsend SEND_ONCE ceiling_light.conf(設定の名前) FULL(ボタンの名前)
うまく動かなかったら、信号を複数回送信するオプションをつけてみます。raw modeで学習した場合は、信号のきちんとした区切りではないところで切れて学習されている場合があるので、複数回送るとつながってうまくいく場合があります。
$ irsend -#2 SEND_ONCE ceiling_light.conf(設定の名前) FULL(ボタンの名前)
それでもうまくいかない場合は学習をやり直してみましょう。

タイマーを設定する

朝になったらコマンドを実行する、という機能を実現するためにcronを使いました。次のコマンドを実行して設定ファイルを開きます。
touch /home/pi/crontab.log  # 適当なログを取るファイルを作っておく
crontab -e
設定ファイルの中には、次のような記述をします。これで、毎朝6時に電気がつきます。絶対に起きたいのでボタンは10回押します。
  0 6    *   *   *   irsend -#10 SEND_ONCE ceiling_light FULL && echo "`date` - Light turned on" >> /home/pi/crontab.log
タイムゾーンがJSTになってないとUTCで起こされたりして大変なので、ちゃんとタイムゾーンも確認しておきましょう。
timedatectl  # 確認。違ったら以下を実行
timedatectl set-timezone Asia/Tokyo
sudo systemctl restart cron.service  # タイムゾーンの変更をcronにも反映
これで朝のお目覚めバッチリですね!!!

参考サイト

http://alexba.in/blog/2013/01/06/setting-up-lirc-on-the-raspberrypi/


*1: 実は冬至と一番遅い日の出の日はズレています。(http://kuusou.asablo.jp/blog/1970/03/07/7925757?year=2017&rg=r25)