スマホから電源スイッチのリモート操作を可能にするシステムをDIYしよう。

スポンサーリンク



サーバ管理経験者なら、これって意外と夢だったりしませんかね?

パソコンの電源スイッチをリモート(自宅の外)からON/OFF操作する。

これ、意外と簡単にできちゃいます。電子工作経験とRaspberry Piみたいな小型低消費電力サーバと、低消費電力無線機能付きマイコンXBeeが2つあれば。

XBeeを使ってできること

こちらに概要を書いていますが、Arduinoほどの自由度はありません。

でもXBee自身が結構な数のI/Oを持つ上、ADCもあったりするので、ちょっとしたことならXBeeだけで出来てしまいます。今回のようなリレー操作なら超簡単。

とあるピンにリモートで0か1を指定して、それがそのままリレーのON/OFFに変換されるというだけでの仕組みです。

XBeeLayout

そんなシステムの構成

それなりにシーケンス図を書いてみるとこうなります。

sequence_web.png

PC電源をON/OFFするには、マザーボードの電源スイッチ端子をショートさせればいいので、リレーを使います。

リレー制御は3.3V highにできるGPIOがあれば十分なので、XBeeのdigital I/O操作APIを叩くだけというお手軽さ。

設定やら構築やらの手順

RaspberryPi + XBee Coordinatorの組み立てと設定

RaspberryPiがWebサーバとして動作して、ユーザはブラウザ経由でXBee Coordinatorを操作することになります。

家庭菜園リモート監視の記事のCoordinatorの設定Raspberry Pi側のサーバ環境構築を参考にXBeeとRaspberryPiを設定してみてください。

この辺も整理しないと・・・。

小型リレーボードキットLK-RB1 + XBee Routerの組み立てと設定

お手軽にリレーを使えるようにしたキットがあります。小型リレーボードキットLK-RB1です。

これらを以下のように配線します。

リレーの初期状態をOFF(PC電源ボタン端子アンショート)にするため、DIO10 pin6はpull downしておき、J1はPCの電源ボタン端子に接続しています。

remote power controller_回路図.png

絵にするとこんな感じです。実際の電源は電池ではなく、太陽光だったりしますが。

remote power controller_ブレッドボード.png

XCTUツールを操作して、XBee Routerを以下のように設定します。

  1. PAN ID, Scan Channels, Baud Rateは、RaspberryPiに接続したCoordinatorと同じ値を設定する。
  2. Destination Address Low/Highには0を設定する。0は、通信相手がCoordinatorであることを示す。
  3. API Enableを2に設定する。
  4. D0〜D5, P1〜P2を全てDisabledに設定する。リレーの初期状態をOFF(PC電源ボタン端子アンショート)にするため、P0(DIO10 pin6)のみDigital Out Lowに設定する。

スクリーンショット 2015-07-22 1.33.26.png

でもって、LK-RB1とAE-XBee-REG-DIPを回路図の通りに配線したボードを作ります。下記はあくまで一例なので、適当で構いません。動けばいいんです。

IMG_7495.JPG

基盤を載せて、

IMG_7494.JPG

本体電源スイッチとリモートスイッチの両方で操作可能にするため、どちらでもショートできるように配線し、

IMG_7497.JPG IMG_7496.JPG

あとは基盤の電源を入れるだけ。

IMG_7498.JPG

あとはRaspberry Piでスイッチ操作ツールを実行すれば、リモートから電源ONすることができます。

リモート電源スイッチ操作ツール(コマンドライン版)インストール

Pythonで書きました。

Raspberry Piにログインして、以下のようにコマンド実行するとインストール出来ます。…初心者丸出しコードで恥ずかしい… 書き直そう。

$ git clone https://github.com/dodo5522/rpwc.git
$ cd rpwc
$ virtualenv .
$ . bin/activate
(rpwc)$ ./setup.sh

以下のようにコマンドを実行すると、電源ボタンを押下して1秒後に離す、といった動作をします。

$ python3 -m rpwc -d 0x0013A20040AFBCCE -g P0 -i 1
{'status': b'\x00', 'source_addr': b'%Y', 'source_addr_long': b'\x00\x13\xa2\x00@\xaf\xbc\xce', 'frame_id': b'\x01', 'command': b'P0', 'id': 'remote_at_response'}
{'status': b'\x00', 'source_addr': b'%Y', 'source_addr_long': b'\x00\x13\xa2\x00@\xaf\xbc\xce', 'frame_id': b'\x02', 'command': b'P0', 'id': 'remote_at_response'}

オプションの概要は以下の通り。

optional arguments:  
  -h, --help            show this help message and exit
  -d L, --xbee-dest-addr L
                        destination address of xbee terminal as hexdecimal
  -g P, --xbee-gpio-power P
                        GPIO pin name which is assigned to power control on
                        xbee
  -p M, --serial-port M
                        serial port device file path to communicate with xbee
                        terminal
  -b N, --serial-baurate N
                        serial port baurate
  -i I, --interval I    interval time between press and release of power buton

まとめ

PyPIにxbeeパッケージが公開されているので、同梱されるZigBeeクラスを使えば楽勝で実装できると踏んでたんですが、remote_at関数を見つけるのに手間取って、意外とハマりました。

zibee.pyのapi_commandsとbase.pyのgetattrの実装を覚えておくと、いつか役に立つ気がします。

comments powered by Disqus