Ruby
PHP
Apache
cron
Raspberrypi3

Raspberry pi 3 で部屋の赤外線受信できる機器をコントロール!

最近はまっていたラズパイで赤外線受信できる機器をコントロールした時のメモ

Raspberry Pi 3 BでGitサーバー作ってからRaspberry Piを好んで使うようになりました。
最近では、お家ハックにとりかかっています。

参考になったサイト。
Raspicommunityというラズパイ記事を投稿できる情報サイト
Raspberry Pi 3 model B でエアコンをコントロールした話
http://s4kr4.hatenablog.com/entry/2016/07/24/114444
Raspberry PiでLIRCをインストールする
http://qiita.com/Library/items/35eec18fbe11387be6d5

まずは完成版実物をご覧ください。
IMG_3212.JPG
Screenshot from 2017-02-16 03:54:18.png

自分の部屋の赤外線受信できる機器を携帯で操作する計画!

まずSlack経由で家の外からエアコンをon, offできるという情報を手に入れたのでそれに沿って準備した。
http://qiita.com/KAKY/items/55e6c54fa2073cdc0bbe
今回用意するものは、
* Raspberry Pi 3 B
* 5mm赤外線LED 「OSI5FU5111c-40」
* 赤外線リモコン受信モジュール 「PL-IRM2161-XD1」
* LEDキャップ 「OS-CAP-5MK-1」(私は使用しなかった)
* 抵抗 (50Ωくらい)

さて入手できたら、

Apache, phpのインストール

$ sudo apt-get install apache2
$ sudo apt-get install php5
$ sudo update-rc.d apache2 defaults #起動時にapacheが自動で立ち上がるように設定

インストール直後は、/var/wwwがドキュメントルート
準備ができました。
LEDを光らせてみましょう。

466fb0bd-a137-ea60-db79-f18efdc077d9.png
サイトのとおりにブレッドボードをセットした。
http://qiita.com/KAKY/items/55e6c54fa2073cdc0bbe

プログラムは以下

echo 2 > /sys/class/gpio/export #「GPIO2」を使う
sleep 1
echo out > /sys/class/gpio/gpio2/direction #「GPIO2」を出力用に使う

echo 1 > /sys/class/gpio/gpio2/value #点灯
sleep 1                              #1秒休む
echo 0 > /sys/class/gpio/gpio2/value #消灯
sleep 1
echo 1 > /sys/class/gpio/gpio2/value
sleep 1
echo 0 > /sys/class/gpio/gpio2/value
sleep 1
echo 1 > /sys/class/gpio/gpio2/value
sleep 1
echo 0 > /sys/class/gpio/gpio2/value

echo 2 > /sys/class/gpio/unexport #「GPIO2」の使用を終了

外部からのアクセスは以下のコードで、

<?php exec('sudo sh /var/pi/blink.sh'); ?>
LEDを点滅させました!

上記コードで大丈夫です。
あとsudo権限を追加(visudoにて)

www-data ALL=NOPASSWD:/bin/sh #この行を追加

ここまでサイトのとおりにやってうまく行った。

さていろいろ記事を調べるうちにLIRCを諦めろという記事がいっぱい出てきて「ビビりまくる」私でありました。

結論をいいます。
全然諦める必要はありませんでした。
たしかに途中はまりまくりましたが大丈夫。
きちんと作動しました。

さてここからは、LIRCを交えたメモです。

LIRCに関してはこの記事が大変参考になりました!感謝!

Raspberry Pi 3 Model Bで赤外線受信センサーと赤外線 LEDでリモコン信号を送受信する方法
http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_3_lirc_ir_remote_control/

LIRCの設定

前回からraspberry pi 3を使って部屋のエアコンと電気を携帯電話から操作することを頑張っていましたが、LIRCに苦戦しながらも達成することができたのでメモとして残しておく。

LIRCを使ってリモコンのコードを解析した!
まずLIRCのインストール

$ sudo apt install lirc

上記コマンドで完了。
次にLIRCの設定。
検索で出てくる他のラズパイ記事で「LIRCはあきらめましょう」とか謎の投稿が多々あるのでビビっていたのですがここの設定をきちんとすればうまく行きました。
何度か私もこの段階で失敗していたので、、、笑

まず以下コマンドを実行。

cp /etc/lirc/hardware.conf ~/hardware.conf
sed -i -e "s/LIRCD_ARGS=\"\"/LIRCD_ARGS=\"--uinput\"/g" ~/hardware.conf
sed -i -e "s/DRIVER=\"UNCONFIGURED\"/DRIVER=\"default\"/g" ~/hardware.conf
sed -i -e "s/DEVICE=\"\"/DEVICE=\"\/dev\/lirc0\"/g" ~/hardware.conf
sed -i -e "s/MODULES=\"\"/MODULES=\"lirc_rpi\"/g" ~/hardware.conf
cat ~/hardware.conf
sudo mv /etc/lirc/hardware.conf /etc/lirc/hardware.conf.bak
sudo cp ~/hardware.conf /etc/lirc/hardware.conf

次にピンの指定。
/boot/config.txt
に次のコードを末尾に入力。

# IR-Remote controller
dtoverlay=lirc-rpi
dtparam=gpio_in_pin=24
dtparam=gpio_out_pin=25

ここまでできましたら、一旦再起動します。
私のリモコンでは半自動で生成してくれる$ irrecordというLIRCのコマンドが使用不能でした。
ですので手動で作っていきたいと思います。

信号解析

サイトから借用。Raspberrypiにブレッドボードの通りにつないだ。

http://qiita.com/KAKY/items/55e6c54fa2073cdc0bbe
cd75ec4d-bb3c-e5e4-6038-f6f930b8f319.jpeg
ここで24と書かれていますがGPIOのことなので実際には下図の⑱へつなぐこと!
ピンを間違えないように!(私は間違えました笑)
Raspberry-Pi-GPIO-Layout-Model-B-Plus-rotated-2700x900.png

つないでみた様子!
ダウンロード (3).png

$ mode2 -d /dev/lirc0 | tee AIRON
space 4898472
pulse 3516
space 1710
pulse 460
space 404
pulse 457
space 1278
pulse 457
space 406
pulse 457
space 405
pulse 458
space 404
pulse 448
space 414

$ mode2 -d /dev/lirc0 | tee AIROFF
===以下略===

カレントディレクトリに、"AIRON" "AIROFF"というファイルができる。これらを数値のみのデータに変換し、/etc/lirc/lircd.confに書き込む。

さて変換ですが、Rubyでの変換プログラムを見つけたので拝借。

# parse_pulse.rb
lines =  File.open(ARGV[0]).readlines
lines_without_first = lines.slice(1..-1)
puts lines_without_first.map{|line|line.split(" ")[1]}.join(" ")

2018/10/08追記〜
ちなみに上記コードは適切な改行をしてくれません、あとで困ったことになります。
また、最近リモコンが増えたため、新規にコマンドを追加していたのですが、正直面倒です。
わざわざRubyを使わないのに、raspberrypiにインストールして使う必要はないです。
なので、自分でshellスクリプトを組んで変換しました。

count=0
cat TVon.txt | awk '{print $2}' | while read line
do
  if [ $count = 80 ]; then
     echo "${line}"
     count=0
  else
     echo "${line} \c"
  fi
count=`echo "$count+1" | bc`
done

これで一発変換可能です。〜

$ ruby parse_pulse.rb AIRON
$ ruby parse_pulse.rb AIROFF

さていよいよLIRC設定ファイル作成です。
/etc/lirc/lircd.conf
に以下の内容を記述してください。

begin remote

  name  room
  flags RAW_CODES
  eps            30
  aeps          100

  gap          200000
  toggle_bit_mask 0x0

      begin raw_codes
    name hot_on
# AIR_ONの中身
3483 1748 423 492 370 1307 428 493 370 472 391 491 371 492 369
492 370 493 369 493 375 487 369 493 370 492 369 493 369 1315 422
491 370 493 369 494 367 495 368 493 368 494 368 500 362 1314 420
1368 368 1314 423 495 366 497 367 1319 413 497 366 497 368 442
418 497 365 496 366 496 368 494 366 496 366 496 374 487 367 497
……

    name off
# AIR_OFFの中身
3476 1747 421 468 394 1319 417 466 396 466 395 492 371 466 394
472 392 467 395 467 395 466 395 470 393 467 395 492 371 1338 398
466 395 469 393 469 395 467 394 468 394 470 392 469 393 1321 416
1325 411 1338 401 489 369 494 368 1323 414 468 392 494 369 467
395 468 394 468 394 493 369 467 395 493 370 468 394 492 369 467
……

      name cold_on
===以下略===
      name light_on
===以下略===
      name light_off
===以下略===

      end raw_codes

end remote

ここで注意なのですが必ず変換したコードを八十字ほどで改行してください。
この作業をめんどくさくて飛ばしていた私は後にハマりまくってます。

あとはirsendで信号を送信するだけです。

$ irsend LIST "" ""
irsend: room

$ irsend LIST room ""
irsend: 0000000000000001 hot_on
irsend: 0000000000000002 off
irsend: 0000000000000003 cold_on
irsend: 0000000000000004 light_on
irsend: 0000000000000005 light_off

$ irsend SEND_ONCE room hot_on

上記コマンドでうまく送信できました。
私の場合上の設定で手抜きした箇所やピンを間違えていたりなど、、、
ですが、最後にはきちんと作動しました。

さてわざわざこのコマンドを打たないと操作できないのも不便なので、
とりあえず、shellscriptでコマンドを単純化。
allon.sh
alloff.sh
上記のようなファイルを作成します。

allon.sh
irsend SEND_ONCE room hot_on
irsend SEND_ONCE room light_on

上記のようにファイルに書き込み。
以下のコマンドで実行できるようになります。

$ sh allon.sh

でもまだまだめんどくさい。
それにじゃあslackに文章書くというのも個人的には面倒だと思いました。笑

なので、

Apache , phpでリモコンボタンを作る!

$ sudo apt-get install apache2
$ sudo apt-get install php5
$ sudo update-rc.d apache2 defaults #起動時にapacheが自動で立ち上がるように設定

下図のように、web経由で操作できるようにapache,phpを利用(すでに設定済み)
こんな感じで操作したい!
Screenshot from 2017-02-16 03:54:18.png

以下
/var/www/html
フォルダー内の記述内容です。
このフォルダーへの書き込みはsudo権限が必要です。

$ sudo vim index.html

以下の内容を記述。

index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>MyRoom</title>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet">
    <link rel="apple-touch-icon" href="images/mook_house.jpg"/>
    <!--[if lt IE 9]>
      <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
  </head>
  <body>
    <div class="jumbotron">
     <div class="well">
      <h1>Welcome to My Room Controller!</h1>
      <a class="center btn btn-success" href="http://XX.XX.XX.XX/allon.php">MyRoomを起動する。</a>
<br />
<br />
      <a class="center btn btn-primary" href="http://XX.XX.XX.XX/alloff.php">MyRoomをスリープする。</a>
<br />
<br />
      <a class="center btn btn-default" href="http://XX.XX.XX.XX/lightoff.php">MyRoomの電気を消灯する。</a>
     </div>
    </div>
  </body>
</html>

XX.XX.XX.XXの部分はラズパイのIPアドレスを!

2018/10/08追加〜
Raspberry PiのIPアドレスは動的に変わってしまうことが多いです。

<?php
var_dump( system('hostname -I', $ret) );
var_dump( $ret );
?>

上記のようにIPを取得してあげることで、いちいち書き換える必要が無くなります。
このコードをはめ込んでお使いください。〜

次にコマンド実行ページを作成します。

$ sudo vim allon.php
allon.php
<?php exec('sudo sh /var/pi/allon.sh'); ?>
<script type="text/javascript">
location.replace('http://XX.XX.XX.XX/');
</script>

この記述で、
sudo sh /var/pi/allon.sh
とありますがそのコードの通り先ほど作ったsh実行ファイルを
/var/piに置く必要があります。

$ sudo mkdir /var/pi

上記の要領で全てのコマンド実行ページを作成。(他ファイル生成方法省略しています。)
Screenshot from 2017-02-16 10:56:02.png

それからさっき作ったファイルをpiディレクトリに移動しておいてください。

Screenshot from 2017-02-16 10:59:53.png

最後に、アクセスにはラズパイのIPアドレスをブラウザに直接打ってください。
外出先から操作したければ、http通信のポートをオープンにして
パブリックIPをブラウザに打ってください。
ポートを開けるときはセキュリティーに気をつけてください。
私は80番をポートマッピングして運用しています。

お疲れ様です、これでボタンひとつでコントロールできるようになりました。
これを作ったおかげで私はとても幸せな生活を送れています!

Raspberry pi はすごいですね。

おまけ

最後にcronでタスクを自動化したいと思います。
いつも二時までには睡眠を取るようにしているので、
  ・深夜二時にスリープ
  ・朝六時に起動
上記のように設定しました。
この実現にはRaspberry Pi OS RASPBIANのcrontabを使っています。

$ crontab -e

でnanoエディタが起動し設定内容を記述します。
今回の場合のサンプルです。
次のコードを末尾に入力。

# m h  dom mon dow   command
0 2 * * * sudo sh /home/pi/alloff.sh
0 6 * * * sudo sh /home/pi/allon.sh

上記のコードの

* * *

これは、何を示しているかと言うと、ワイルドカードで毎日を表しています。

0 2
0 6

は順に、
  ・0分2時
  ・0分6時
という意味です。
cronはとても便利です。
詳しくは割愛します。

これでよく眠れるようになりました。笑