RaspberryPi 4 Model B で USBポートの電源をON/OFFする - Qiita
のリトライ版
目標
ラズパイに接続したUSBカメラ映像で異常検知を行い、パトランプで警告を行う
- BUFFALO 電源連動節電機能付き 4ポートセルフパワーハブ ブラック BSH4AE12BK
- SANWA SUPPLY TAP-RE10SPUN 高性能雷連動タップ 7個口
- LED回転灯 ニコFAX φ45 VL04S型 VL04P-100FAN
USBハブは、Per-port power switching対応のものを使いたかったのだが、BSH4AE12BKが使えるという情報があり、お安かったのでそちらを使った。
パトライトについては、FAX検知用のがお安かったので、それを使いった。
用紙検知部に白紙を巻きつけるだけで常時点灯する。
Per-port power switchingとは
USBハブのポート毎に電源供給をON/OFFできる仕組み。
対応のハブはLinuxであれば、
sudo lsusb -v | less
で、該当のハブのところに
wHubCharacteristic 0x0009
Per-port power switching
Per-port overcurrent protection
と表示されれば使える可能性が高い。
(めっちゃ大量に出てくるのでless推奨)
可能性が高い、というのは、ラズパイ4では上記表示があるのにも関わらず、個別制御が出来ないから。
めんどくさっ!
ラズパイ4のUSB構成
物理的配置は、こう
LAN
+---+ Port1 Port2(USB3.0)
| |
+---+ Port3 Port4(USB2.0)
論理的配置は、多分こんな感じ
Hub1(Root) - Hub 1.1(USB2.0) - Hub 2(USB3.0)
├ Port1 ├ Port1
├ Port2 ├ Port2
├ Port3 ├ Port3
└ Port4 └ Port4
全ポートをON/OFFしていいのであれば、以下でOKだが、個別に制御したいんだよおおおおお。
sudo uhubctl -l 1-1 -a off
事前準備
前の記事では、hub-ctrlを使ったが、その後調べたところ、より使い勝手の良いものが公開されていたので、こちらを使った。
GitHub - mvp/uhubctl: uhubctl - USB hub per-port power control
ファームウェアアップデート
ファームウェアが古いとそもそも動かないらしいのでアップデート。
sudo apt update
sudo apt full-upgrade
sudo reboot
コマンドインストール
git clone https://github.com/mvp/uhubctl
cd uhubctl
make
sudo make install
HUB確認
コマンドを引数なしで呼ぶと、対応しているハブを列挙してくれる。
が、必ずしも確実に対応しているわけではないので、実際に給電状況を見て確認する必要がある。
GitHubのページでも、実際に適当なスマホとかライトとかを繋いで通電確認せよ、とある。
マジめんどくせぇ。。。
sudo uhubctl
Current status for hub 2 [1d6b:0003 Linux 5.4.83-v7l+ xhci-hcd xHCI Host Controller 0000:01:00.0, USB 3.00, 4 ports, ppps]
Port 1: 02a0 power 5gbps Rx.Detect
Port 2: 02a0 power 5gbps Rx.Detect
Port 3: 02a0 power 5gbps Rx.Detect
Port 4: 02a0 power 5gbps Rx.Detect
Current status for hub 1-1 [2109:3431 USB2.0 Hub, USB 2.10, 4 ports, ppps]
Port 1: 0507 power highspeed suspend enable connect [05e3:0608 USB2.0 Hub, USB 2.00, 4 ports, ganged]
Port 2: 0107 power suspend enable connect [1e4e:0100 GroupGets PureThermal (fw:v1.3.0) 800c0031-5109-3538-3731-313200000000]
Port 3: 0100 power
Port 4: 0100 power
Current status for hub 1 [1d6b:0002 Linux 5.4.83-v7l+ xhci-hcd xHCI Host Controller 0000:01:00.0, USB 2.00, 1 ports, ppps]
Port 1: 0503 power highspeed enable connect [2109:3431 USB2.0 Hub, USB 2.10, 4 ports, ppps]
上記で1-1.1に繋がれているHUBをON/OFFする
HUB自体は、Per-port power switching対応していないので、「-f」オプションを付ける
sudo uhubctl -l 1-1.1 -f -a off
「.1」の部分を.2~.4に変更しても動くが、
USB2.0のポート(3,4)を使う場合でも
sudo uhubctl -l 1-1.4 -f -a off
と指定する必要があるので注意。
#推測など
↑は外部給電対応でありながら、大本のUSBの電源連動する、ということで、内部的に何らかのエミュレーション(または誤動作)をしているものと思われる。
また、給電制御ということで、個別ポートの過電圧検知が付いていたり、個別に給電をON/OFFできるハブは、Per-port power switching対応している……かもしれない。
GitHubの情報によると、こちらのメーカーのHUBが対応しているらしい。
(GitHubに報告があるのは16ポート)
ROSONWAY USB ハブ 3.0 16ポート アルミ製 USB Hub 100W セルフパワー USBハブ 5Gbps高速転送 12V/8.3A ACアダプタ付き 独立スイッチ
USBハブ 3.0 ROSONWAY アルミ製 7ポート USB3.0 Hub 24W電源付き バスパワーとセルフパワー両用 独立スイッチ 5Gbps高速転送、12V/2A ACアダプター
今回はBSH4AE12BKで目的達成してしまったので、今後機会があれば上記HUBも試してみたい。