LoginSignup
9
8

More than 3 years have passed since last update.

RaspberryPi 4 Model B で USBポートの電源をON/OFFする リトライ

Last updated at Posted at 2021-01-13

RaspberryPi 4 Model B で USBポートの電源をON/OFFする - Qiita
のリトライ版

目標

ラズパイに接続したUSBカメラ映像で異常検知を行い、パトランプで警告を行う

構成

image.png

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も試してみたい。

9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8