やりたかったこと
ラズパイに接続したwebカメラで異常検出を行い、異常ケースでパトランプを回す、というようなことがしたかった。
(正確にはこれからやる予定)
色々調べた結果、USB連動で電源ON/OFFするのが、最も手軽&電子工作等しなくてもできそうだったのですが、懸念点がいくつか。
- 世の中にラズパイ4での記事が無い
- ラズパイ3ではUSBポートの親子関係?があり、色々面倒らしい
- 回避策としては、個別給電ON/OFFに対応している別のUSB-Hubを挟むといいらしい
やりたいことが「USBカメラ」を回して監視しつつ、「USB電源制御」で別の機器を動かしたい、というニーズなので、個別にON/OFFできないのは致命的…。
が、しかしラズパイ4ではUSB3.0ポートが搭載されたりとハードウェア的に大きく変わっているので、できるのでは…?
ということでやってみましたー。
結論:できた ような気がした
完全に個別でON/OFFできました!完全勝利!
できたような気がしたが、接続機器が連動してくれない。。。
調査中
USB per-port power switching - Qiita
GitHub - mvp/uhubctl: uhubctl - USB hub per-port power control
1/13追記
結局、別のUSBハブを挟まないと出来なかった。
RaspberryPi 4 Model B で USBポートの電源をON/OFFする リトライ - Qiita
以下はメモとして残しておきます
用意したもの
- RaspberryPi 4 Model B
- USB接続のwebカメラ
- USB給電で動くガジェット(今回は適当なものがなかったのでそのへんに落ちてた有線マウス)
検証手順
- USBポートのうち1つにカメラを接続し、VedeoStreamを開いて表示
- の状態で残りのポートにUSB給電ガジェットを接続して、電源OFF
- VedeoStreamが止まらない=カメラへの給電が止まらないことを確認
- 以上をポート毎にぐるぐる検証
実際の手順
hub-ctrl導入
sudo apt-get install libusb-dev
wget http://www.gniibe.org/oitoite/ac-power-control-by-USB-hub/hub-ctrl.c
gcc -O2 hub-ctrl.c -o hub-ctrl-armhf-static -lusb -static
sudo cp hub-ctrl-armhf-static /usr/local/bin/hub-ctrl
USBポートの状態を確認
この場合。ポート2にカメラ、ポート4にマウスが刺さっている。
sudo lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 027: ID 05ac:0304 Apple, Inc. Mighty Mouse [Mitsumi, M1152]
Bus 001 Device 026: ID 1e4e:0100 Cubeternet WebCam
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
USB2.0と3.0で別々のrootを持っているらしいことが分かる。
sudo hub-ctrl -v
Hub #0 at 002:001
INFO: ganged switching.
WARN: Port indicators are NOT supported.
Hub Port Status:
Hub #1 at 001:002
INFO: ganged switching.
Hub Port Status:
Port 1: 0000.0100 power
Port 2: 0000.0103 power enable connect
Port 3: 0000.0100 power
Port 4: 0000.0303 lowspeed power enable connect
Hub #2 at 001:001
INFO: individual power switching.
WARN: Port indicators are NOT supported.
Hub Port Status:
Port 1: 0000.0503 highspeed power enable connect
Hub #1がUSB関連、Hub #2がイーサネットらしい。
こっちでは結局USB2.0も3.0も同じHubに属している。
物理的配置はこんな感じ。
ラズパイ3ではPort2からだったのが1からになってるのがちょっといい感じ。
LAN
+---+ Port1 Port2(USB3.0)
| |
+---+ Port3 Port4(USB2.0)
給電制御してみる
※出来たっぽく見えるが、実際には制御できてない
sudo hub-ctrl -b 1 -d 2 -P 4 -p 0 -v
Hub Port Status:
Hub #1 at 001:002
INFO: ganged switching.
Hub Port Status:
Port 1: 0000.0100 power
Port 2: 0000.0103 power enable connect
Port 3: 0000.0100 power
Port 4: 0000.0303 lowspeed power enable connect
Hub Port Status:
Port 1: 0000.0503 highspeed power enable connect
Send control message (REQUEST=1, FEATURE=8, INDEX=4)
Hub Port Status:
Port 1: 0000.0100 power
Port 2: 0000.0103 power enable connect
Port 3: 0000.0100 power
Port 4: 0000.0000
コマンドオプション
-b バスNo Hub #1 at 001:002の001の方
-d デバイスNo Hub #1 at 001:002の002の方 ※lsusbで出てくるDeviceは関係ない
-P PortNo(USBポートの番号)
-p 0:OFF 1:ON
-v 詳細表示オプション(普段はつけなくて良い)
参考記事
raspberry pi 3 b+とパトランプで遊ぶ - 不動産情報ボット
RaspberryPI 3 Model B で USBポートの電源をON/OFFする: パソコン鳥のブログ