4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-01-07

やりたかったこと

ラズパイに接続した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する: パソコン鳥のブログ

4
6
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
4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?