RaspberryPiのUSBポートの電源On/Offを制御する

はじめに

RaspberryPiのUSBポートの電源On/Offを操作してみました。

前回の記事でBlynkサーバー経由でRaspberryPiとスマートフォンを接続したので、スマートフォン側から操作して電源操作をしています。

使用した物

使用機器の全体像

上記の使用機器の全体像はこのような感じです。
全体像.jpg
スマートフォンとRaspberryPiは同じローカルエリア内で接続をしており、それとBlynkサーバーが繋がっているイメージです。
RaspberryPiと今回制御するUSB-HUB/USB-FANを繋いでいます。

事前準備

1.Blynkの導入と接続

以降のやり方はBlynkを使用したやり方なので、スマートフォン/RaspberryPiの双方でBlynkのインストールと接続が必要になります。

やり方はこちらを参照ください。
↓↓↓
Blynkを使ってRaspberryPiとスマートフォンを接続する

2.Blynk のプログラム修正

初期設定ではスクリプトが扱いづらいので下記サイトを参考にして変更しています。

http://blog.livedoor.jp/victory7com/archives/48432885.html

その結果、ウィジェットの設定とRaspberryPi側のスクリプトの関係性は以下の図のようになっています(※同サイトから画像を引用)

image.png

実装

スマートフォン側の作業

スマートフォン側ではBlynkのプロジェクトにウィジェットとスクリプトに紐づくピンを選択します。
blynk.jpg

【左】ウィジェットをタップしウィジェット設定を開く
【中】今回はボタンなので、ボタンを押したときに紐づくピンを選ぶためタップ
【右】ピンの種類とピンの番号を選択する

※ピンの種類はDigital(GPIOポート)/Virtual(スクリプト)から選べますが、今回はスクリプトと紐づけたいため、後者を選択
※ピンの番号はスクリプトの名称と紐づける番号なので、何でもいいですがV10にしました。

RaspberryPi側の作業

1.USBポートを制御するためのツール(hub-ctrl)を導入

pi@raspberrypi:~ $ sudo apt-get install libusb-dev
pi@raspberrypi:~ $ git clone https://github.com/codazoda/hub-ctrl.c
pi@raspberrypi:~ $ cd hub-ctrl.c
pi@raspberrypi:~/hub-ctrl.c $ gcc -O2 hub-ctrl.c -o hub-ctrl-armhf-static -lusb –static
pi@raspberrypi:~/hub-ctrl.c $ sudo cp hub-ctrl-armhf-static /usr/local/bin/hub-ctrl

※補足
1行目:libusbをインストール
2行目:Githubから「hub-ctrl.c」をダウンロード
4行目:hub-ctrl.cのインストール

2.USBポートの接続状況を確認する

「lsusb」コマンドを実行するとUSBポートに接続しているデバイスとそのBus番号とDevice番号が返されます。
今回USB-HUBが操作対象なので、デバイス名が「Genesys Logic」であることを確認します。

pi@raspberrypi:~ $ lsusb

Bus 001 Device 005: ID 046d:c016 Logitech, Inc. Optical Wheel Mouse
Bus 001 Device 004: ID 05e3:0608 Genesys Logic, Inc. Hub
Bus 001 Device 006: ID 0424:7800 Standard Microsystems Corp. 
Bus 001 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 002: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

3.USB-HUBの電源ON/OFFのシェルスクリプトを作成する

ウィジェット設定でピンの番号を「V10」にしたため、スクリプトのファイル名に「V10」としています。

pi@raspberrypi:~ $ sudo vi /home/pi/blynk/BLYNK_WRITE_V10.sh

スクリプトの中身はこのような内容にしています。

/home/pi/blynk/BLYNK_WRITE_V10.sh
#!/bin/sh

HUB=`/usr/bin/lsusb -v 2>/dev/null | grep ^Bus | grep "Genesys Logic, Inc. Hub" | head -1`
BUS=`echo $HUB | awk '{print $2}'`
DEV=`echo $HUB | awk '{print $4}' | sed -e "s/\(.*\)\:/\1/p;d"`

for i in 1 2 3 4
do
     /usr/local/bin/hub-ctrl -b $BUS -d $DEV -P $i -p 0
done
スクリプトの補足
デバイス情報の設定(3行目)
lsusbの命令の結果を、デバイスの名称で抽出し変数HUBにセットする。
Bus番号の設定(4行目)
HUBに設定された2番目のフィールドを変数BUSにセットする。
Device番号の設定(5行目)
HUBに設定された4番目のフィールドを文字の置き換えをして変数DEVにセットする。
for文(7行目)
USB-HUBのポートが4つあるので、4回ループさせている。
hub-ctrlコマンド(9行目)
「-b」は対象のBus番号、「-d」は対象のDevice番号、「-P」はポート番号を指定する。
最後の「-p」は電源供給On/Offの指定で、「0」(Off)/「1」(On)のいずれかを指定する。

これでウィジェットで指定したピンの番号に相対するスクリプトができたため、スマートフォン側でボタンを押せばこのスクリプトが起動します。
その結果、USB扇風機の電源のOn/Offを切り替えができます。

USBポートの電源操作の補足

RaspberryPiの昔のバージョンだと本体のUSBポートを個別に電源制御できるようでしたが、バージョンが上がったため不可能になりました。

「Per-port power switching」仕様のUSB-HUBであれば制御可能ということでしたが、それに対応したHUBが現在販売されてません。
今回使用したBUFFALOのBSH4AE12BKであればUSB-HUB単位に電源制御可能ということで、これを利用することにしました。

まとめ

ウィジェットで指定したピンとそれに紐づくスクリプトを作成すれば、スマートフォン側からスクリプトを実行させることができました。
まずは動かし方の基本を理解できたので、次は違うウィジェットを使って動かしてみたいです。

参考リンク

masatarou
仕事ではCOBOL、Javaのアプリ設計を担当。 趣味でAndroidアプリ制作、RaspberryPiで工作をしています。 また、業務上チーム運営に携わっているため、それに関係するツール制作も行っています。
ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
ユーザーは見つかりませんでした