USB接続された機器のオンオフの制御
デバイス上にUSB接続されている機器を、uhubctlを使用してオンオフを制御します。 uhubctlを使用することで、USBケーブルを物理的に抜き差しせずに、ソフトウェアからUSBからの給電を停止することができます。
例えば、遠隔地に置かれたデバイスで夜間に自動的にUSBライトをオンにしたい場合や、気温や湿度が一定を超えた場合にUSBファンをオンにしたい場合などに役立ちます。
uhubctlがサポートしているUSBハブは、こちらに記載されています。 今回は、Raspberry Pi 4BのUSBポートを使用して、USB接続されたライトのオンオフを制御します。
https://github.com/mvp/uhubctl
準備
- あらかじめOSがインストールされ、ネットワークが構成されたRaspberry Pi 4B
- SSH接続する作業用のPC
- 必要があればキーボード、ディスプレイ、マウス
- USB機器
uhubctlのインストール
インストール手順はこちらに記載されています。 以下は、Raspberry Pi OS上での作業手順です。
1.uhubctlをインストールする
1 |
git clone https://github.com/mvp/uhubctl.git |
1 |
sudo apt-get install libusb-1.0-0-dev |
3.ビルド
1 2 |
cd uhubctl make |
4.インストール
1 |
sudo make install |
5.権限の設定 必要に応じて、sudoなしてuhubctlを実行できるように、権限を設定します。 こちらを参考にしてください。
uhubctlのコマンドをテストする
ターミナルからuhubctlの挙動をテストしていきます。 以下のコマンドを打つと、それぞれのUSBポートの情報が出てきます。
Raspberry Pi 4Bの場合のUSBポートの構成は、こちらに記載されています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ uhubctl Current status for hub 2 [1d6b:0003 Linux 6.1.0-rpi7-rpi-v8 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: 0100 power Port 2: 0100 power Port 3: 0100 power Port 4: 0100 power Current status for hub 1 [1d6b:0002 Linux 6.1.0-rpi7-rpi-v8 xhci-hcd xHCI Host Controller 0000:01:00.0, USB 2.00, 1 ports, ppps] Port 1: 0507 power highspeed suspend enable connect [2109:3431 USB2.0 Hub, USB 2.10, 4 ports, ppps] |
lsusb
コマンドでオンオフ制御を行う対象のデバイスを見つけます。 今回はUSBライトをオンオフしてみます。
1 2 |
$ lsusb -d 2109:3431 Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub |
以下のコマンドでUSB3 hub2のport 2をオフにします。
1 |
$ uhubctl -l 2 -p 2 -a off |
以下のコマンドでUSB3 hub2のport 2をオンにします。
1 |
$ uhubctl -l 2 -p 2 -a on |
python script でポートを制御する
uhubctlのPythonラッパー python3-uhubctlがGitHub公開されています。こちらを使用して、PythonスクリプトでUSBのポートのオンオフを制御してみます。こちらのパッケージはpipからインストールすることができないので、GitHubのレポジトリからwhlファイルを入手してインストールします。pipコマンドを利用する際は、venvの使用をお勧めします。
1.whlファイルのダウンロード こちらからuhubctl-0.1.2-py3-none-any.whl
をダウンロードします。
2.venvの作成
1 2 3 |
python -m venv .venv source .venv/bin/activate deactivate |
3.パッケージのインストール
1 |
pip3 install ./uhubctl-0.1.2-py3-none-any.whl |
4.スクリプトの作成
以下のスクリプトでは、前述のコマンドと同様にhub 1-1のport 2のオンオフを制御します。
on_usb(2)
, off_usb(2)
の部分をコメントアウトして、それぞれ実験してみてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
import uhubctl from uhubctl import Hub, Port uhubctl.utils.UHUBCTL_BINARY = "sudo /usr/sbin/uhubctl" def off_usb(port_num): off_hub = Hub("1-1") off_port = off_hub.add_port(port_num) off_port.status = False def on_usb(port_num): on_hub = Hub("1-1") on_port = on_hub.add_port(port_num) on_port.status = True hubs = uhubctl.discover_hubs() # Show USB port status for hub in hubs: print(f"Found hub: {hub}") for port in hub.ports: print(f" Found port: {port}") print(f" Port State: {port.status}") # on_usb(2) # Onにする場合 off_usb(2) # Offにする場合 # Show USB port status for hub in hubs: print(f"Found hub: {hub}") for port in hub.ports: print(f" Found port: {port}") print(f" Port State: {port.status}") |
まとめ
今回は、uhubctlを使用してRaspberry Pi 4Bに接続されたUSB機器のON/OFFをソフトウェアから制御しました。
これを使用することで物理的にケーブルを抜き差しできない場合でも、ソフトウェアからUSB機器への給電の制御を行うことができます。