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

  • 30
    いいね
  • 3
    コメント

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

ラズパイでGitサーバー作ってからラズパイにすごくはまってしまい笑
ついにはお家ハックにとりかかっています笑

参考になったサイト!!
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
用意するものは
* ラズパイ3
* 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(" ")
$ 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

これでうまく送信できました!
私の場合上の設定で手抜きした箇所やピンを間違えていたりなど
ハマりましたが最後にはうまく動いてくれました!

さてわざわざこのコマンドを打たないと操作できないのも不愉快ですので笑
とりあえずshでコマンドを単純化!
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アドレスを!

次にコマンド実行ページを作成

$ 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をブラウザに打ってください。
ポートを開けるときはセキュリティーに気をつけて!

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

Raspberry pi はすばらしい

おまけ

最後にcronでタスクを自動化したいと思います
いつも二時までには睡眠を取るようにしているので、
深夜二時にスリープ、朝六時に起動するように設定しました!
この設定はラズパイの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はとても奥が深いです!
詳しくはググってください!

これでなんかよく眠れるようになった気がします笑

さて、今回同じ内容の投稿をすでにRaspicommunityでも投稿してます!
Raspicommunityは日本向けにラズパイの情報を集めたラズパイファンには熱いサイトです!
日記感覚で記録を細々と残すことができるので良いです!
Screenshot from 2017-02-16 03:09:44.png

私のアカウントページです!
raspicommunity/kazuya