読者です 読者をやめる 読者になる 読者になる

廊下の電灯を自動でOn / OffするデバイスをRaspberry Piで作った(スイッチ操作側)

自分が住んでる部屋の廊下の電灯はスイッチは玄関側に付いていて、部屋から廊下の電灯を付けるのにわざわざ玄関まで行く必要があって面倒だった。 とくに仕事から帰ってきたときが面倒で、

  1. 玄関から入ってすぐの廊下の電灯を点ける
  2. 廊下の先まで行って部屋の電灯を点ける
  3. 玄関まで戻って廊下の電灯を消す
  4. 部屋に行く

と、廊下を1.5往復する必要があった。

そこでセンサーを使って廊下に人がいるのを検知して、電灯スイッチを操作できるシステムをRaspberry Piで作ってみた。 今回は廊下の電灯スイッチを操作する側について書く。(センサー側は後日書く予定。)

設計

構成はこんな感じにした。

f:id:LocaQ:20150124174637p:plain

人の動きを検知するセンサーを、スイッチのある場所から離れた所に設置する必要があったので、センサー側と電灯のスイッチを操作する側を分けて構成した。

今回は右の赤い枠の部分の話。

廊下に入ったことをセンサー側のRaspberry PiからHTTPで通知されたら電灯をOnにする。ただし既にOnならそのまま維持して、一定時間経ったら自動で電灯をOffにする。

ハードウェア

HTTPで通知を受けるのにLANケーブルを引っ張りたくはなかったのでWifiアダプタを使った。スイッチの切替は構成図にある通りサーボで行う。

それとマイコンとサーボ剥き出しだと常用するには見た目が良くないので、モールドケースというのがスイッチカバーと同じ大きさで高さもちょうどよく、安かったので使うことにした。


f:id:LocaQ:20150125114016j:plain f:id:LocaQ:20150125113542j:plain f:id:LocaQ:20150125113415j:plain

左はRaspberry Piを取り付ける前。モールドケース(のフタ側)に電灯のスイッチとが入る大きさの穴を開けて、そこに合わせてプラ版でサーボを固定した。サーボは1個で電力に余裕があるのでRaspberry Piと直接接続した。高さを抑えるためにGPIOピンを横向きにするピンソケットを使ってケーブルが横に出るようにしている。

真ん中はRaspberry Piをプラ版に取り付けた後。小さいのでケースにギリギリ入る大きさ。

右は裏側の様子。この面が壁と接する。上下の穴は壁にあるスイッチカバー取り付け用のネジ穴に合わせて開けたネジ穴。


f:id:LocaQ:20150125233752p:plain f:id:LocaQ:20150125233759p:plain

左は斜めから見た様子。ケースの高さに収まるようにRaspberry Piを上下逆さまに取り付けてる。

右はケースに収めた状態。Raspberry Pi自体はケースにギリギリ収まったけど、USBの電源コネクタがModel A+は横(HDMIコネクタと同じ辺)についてるのでケースに収まらなかったのでケースに穴を開けてUSBケーブルを接続してる。

使ったもの

  • マイコン:Raspberry Pi Model A+
  • サーボ:Tower Pro SG90
  • Wifiアダプタ:BUFFALO 無線LAN子機 WLI-UC-GNM
  • microSDカード:東芝 microSDHC 16GB(Class10 30MB/s UHS-I 防水 耐X線
  • ケース:テイシン モールドケース TB54B
  • その他:
    • USBケーブル
    • Raspberry Pi用 L字ピンソケット2×13(26P)
    • リード線
    • Qiコネクタ
    • 熱収縮チューブ
    • プラバン
    • ネジ
    • ナット
    • スペーサー

回路図

回路はこんな感じで作成した。サーボのVCCと5V、GND同士、信号線とGPIO18を繋いでいる。

GPIO18はPWM出力をできるピンだ。

f:id:LocaQ:20150123191059p:plain

(図のRaspberry PiはModel A+がなかったのでB+のものを使った。)

ソフトウェア

HTTPで通知を受けるためのサーバーはflask-restfulというPythonのライブラリを使って実装した。

flask-restful

flask-restfulは簡単にREST APIのサーバーを書けるフレームワークで、今回もサーバー部分はAPIが少ないのもあって20行程度でサクッと実装できた。 マイコンで動かすサーバープログラムは小規模なもので済むものも多いだろうからこれくらいサクッと書けるのはうれしい。

また、サーボの制御はWiringPi2-Pythonを使った。

WiringPi2-Python

サーボの制御は拙著でまとめてる(言語はC++だけども)ので、そのままのやり方で行った。

RaspberryPiとWiringPiでサーボを動かす - Qiita

REST API

APIは今のところスイッチのOn / Off状態の取得と設定を行うものだけ定義した。

スイッチをOnにするときは、

[URL] http://example.com/Switch
[POSTデータ] {'state': 'on'}

というリクエストを送るとサーボがスイッチをOnにして電気が点いて、自動Offまでのタイマーをスタートする。 ただし既にOn状態ならサーボは動かさず、自動Offまでのタイマーをリスタートする。 また、'on'を'off'にすればスイッチをOffにして電気が消える。

スイッチの状態を取得するときは、

[URL] http://example.com/Switch

というリクエストを送ると {'state': 'on'} というJSONデータが返ってくる。

ソースコード

ソースコードgithubで公開している。

locatw/autonek-halitch · GitHub

設置

f:id:LocaQ:20150125235820p:plain f:id:LocaQ:20150125235826p:plain f:id:LocaQ:20150125235843p:plain

光が入らないので少し暗いけど、設置した様子はこんな感じ。

廊下の電灯のスイッチカバーを外した所と、設置してケースを被せる前と、ケースを被せて電源ケーブルを接続した所。

(スイッチカバーを外した状態がずいぶん雑だったんだけど、どこの家もこんなものなのか気になる。)


実際に動作してる様子。

廊下の電灯を自動On / Offするデバイス - YouTube

課題

動作音が意外と大きい

ケースに入れててもサーボの動作音とスイッチの切り替え音が結構大きくて少し気になる。ケースを密閉したりして防音する方法もあるかもしれないけど、Raspberry Piが出した熱が籠もってしまう。

ただRaspberry Pi Model A+は発熱が少なめで、ヒートシンクをつけた旧式のModel Bはアイドル状態でも触ると結構熱いけど、Model A+はヒートシンクなしでも40℃で温かい程度だった。夏はどうなるか分からないけど熱対策はやりやすそう。

REST API以外のインターフェースがない

実際に24時間動かして使ってみたら、料理したりするために台所に立つと、まだいるのに自動で電灯がOffになったり、動くとまたOnになったりして十数回スイッチが切り替わってしまってうるさかった。

人感センサーは動いた人間を検知するものなので、じっと立ってるだけだど検知しないのが原因。なので常時点灯モードみたいなのを作って切り替える機能を付ければ解決できるんだけど、この装置には現状HTTPアクセスしないと操作できないのでスマホかPCからアクセスする以外に方法がないが、わざわざスマホやPCを操作するのは少し面倒だ。

解決策として物理ボタンを付ける、タッチディスプレイをつける(PiTFTとか)、音声認識やジェスチャー認識機能をつけるとかが思いつく。

Raspberry Piの長期運用の対策

上の2つの課題があるけれどうまく動いてるのでずっと動かしておくつもり。けど、そうするとmicroSDカードの寿命が気になってくる。Linuxが動いているのでmicroSDカードにログが書き込まれるから、セルの書き換え寿命が来たらmicroSDカードを交換しないといけない。

対策としてRAMディスクを作ったり、ファイルシステムをリードオンリーにしたりする方法があるみたいなので、これもその内やっておきたい。