それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Raspi Zero / WH をOTGで使う。

Raspi Zero / WH をOTGで使う。

OTGで使うと、pi zero がUSBデバイスのフリをすることができる。

こんな事ができる。

  • USBシリアルポートデバイス
  • USBネットワークデバイス
  • USBストレージデバイス
  • USBキーボード(HID)
  • USBマウス

のように、USBに挿し込んだPi ZeroがPCからUSB機器に見える。

対応機種

pizero と raspberry pi 4 以降がOTG対応

raspi3 もバージョン次第で大応してた気がする。

USB ガジェットモードの主な使い方 / PC → Pi zero へアクセス

主な使い方は、Pi Zeroをセットアップするための使います。

USBシリアルデバイスやUSBネットワークデバイスとしてPi ZeroをPCへ接続し、PC側からSSHで、Pi Zeroにログインして使うと便利です。

またPi Zeroを「USBストレージ」にしてPC側からファイルを書き換えたり送り込んだりするのに便利です。

Pi zero → PC にアクセスで使う(逆)

ネットワークで認識させた場合

Pi Zero WH はWifiを使えます。ノートPC→ Pi zero へWifi経由でSSHで接続したうえで、Pi ZeroからPCへUSB経由で接続すると、PCをリモート管理ができるようになりますが、あまり使いどころは無いと思います。

キーボードとして認識させた場合

USBキーボードとして認識させたうえで、Pi ZeroへSSHしてPCにキーを送り込むことが可能になります。これは便利かもしれません。PCをリモートで管理するときにUSBキーボードとしてショートカットを送り込んでしまえば、ほとんどの機器で自動化のツールとして使えるようになります。

出番は少ない

インストールで使うためにありましたが、現在では出番は少ないかもしれませんが

Raspi Imagerみたいな初心者向けツールを使わずに、昔からのdd / ddrescue などでサクッとイメージをコピーしてたら、初期設定ではまだまだ使います。Windowsとは限らないです専用ソフトもいらないので重宝します。

OTG有効にする

これらのUSB機能を有効にするには、cmdline.txt に書き込みます。

OTG 設定

modules-load=dwc2,g_cdc

dwc2 がOTGの有効化で、g_cdc はシリアルコンソール+イーサネットの略称です。

cmdline.txt の例

console=tty1 root=PARTUUID=055f10f4-02 rootfstype=ext4 fsck.repair=yes rootwait modules-load=dwc2,g_cdc

シリアルコンソールで通信

OTG(dwc2,g_cdc) でシリアルコンソールを有効にした場合、

pi zero 側にシリアルコンソールデバイス ttyGS0が生成

raspberry pi zero 側に ttyGS0 が生成される。

ls /dev/ttyGS0

[PC側] PCはシリアルコンソール /dev/ttyACM0 が生成される

USB経由で接続されたPC側には、 /dev/ttyACM0 が生成される(Linux)の場合

ls /dev/ttyACM0

あとは、これを使って、gettyがリッスンすればいい。

PC 側にログインする場合。

PC側でgettyを起動

sudo systemctl status serial-getty@ttyACM0.service
sudo systemctl start serial-getty@ttyACM0.service

pi-zero 側で screen を使って接続

takuya@pi-otg $  sudo screen  /dev/ttyGS0

逆にやれば、Raspi側にログインできる。

OTGつないだときだけ起動するとか。systemdで制御すればいい。(後で考える。)

イーサネットで通信

USBイーサネットは、初期設定がDHCPになっているのでDHCPでIPを渡してあげればいいはず。

pi zero側のデバイス

Pi Zeroからは、usb0の名前で見える

ip link show  dev usb0
2: usb0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000

PC側のデバイス

PC側からも usb0で見える(Linux)の場合。Windowの場合はイーサネットバイス

Raspberry Pi と PCがLANケーブル(クロス)でつながった状態になる。

pizero が usb0 経由して接続できるよう、PCのusb0 を 外部に接続してあげればいい

ネットワークの共有はOSや目的や手段によって異なる(Linuxの場合 btrctl など、詳細は割愛)

pi のOTG側から見たとき。

takuya@pizero-otg:~ $ ip link show dev usb0
2: usb0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 56:bd:66:c1:06:02 brd ff:ff:ff:ff:ff:ff
takuya@pizero-otg:~ $ ip addr show dev usb0
2: usb0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 56:bd:66:c1:06:02 brd ff:ff:ff:ff:ff:ff
    inet 169.254.39.187/16 brd 169.254.255.255 scope global noprefixroute usb0
       valid_lft forever preferred_lft forever
    inet6 fe80::e05d:3a75:e46a:83e1/64 scope link
       valid_lft forever preferred_lft forever
takuya@pizero-otg:~ $

USBキーボード(HID)

USBキーボードとして動作させることができる。

差し込むだけで、あれこれ自動入力をしてくれる機械の完成です。やったね。

USBキーボードを差し込んでリモートからコマンドを流し込んでー。。。とか出来ますね。Raspiにはカメラが付いてるので、カメラで画面出力を監視しし画面を学習してしまえば。。。リモートから大体のデバイスは制御できますね。

他のWebサイトにはg_hidというモジュールを使ってUSB入力機器化する情報が掲載されている可能性がある。これは古いOSでしかできない方法のようで、実際にやろうとしてもg_hidが見当たらず読み込めないハズ。最近のOSの場合にはlibcompositeを使う必要があるようだ。

https://qiita.com/exthnet/items/98aa9b6d6a606f8f2cf8

キーボードとして認識された時点で満足したので詳細は割愛。

USBストレージ

USBストレージ機器として振る舞う事ができます。

USBマスストレージに対応した機器にRaspiをつないでしまえばいいのです。

USBメモリになる。USBメモリ領域はRaspi側からも見えるので、リモートから書き換えができるUSBメモリが完成する。

ネットワーク非対応のフォトパネルやTVなど、家電にUSBメモリを差し込んで設定を流し込んだりするとき、いちいち抜き差しなどせずに、USBメモリの中身を書き換えるので便利。うちの機器でためしたときは、既存ファイルの再読み込みがUSB抜き差しタイミングで発生知るので、Raspi側でUSBストレージのオンオフしなくちゃいけなかった。そもそUSBメモリが機器の預かり知らないタイミング書き換わるなど想定されるはずもない。なので、意外と使い途はないかもしれない。

https://qiita.com/haniokasai/items/427b7481881e065ae2f2

USB マウス

コロナ禍でマウスを少し動かすUSBがガジェットがバカ売れしましたが、RaspberryPiがあれば、その機能を作ることができる。僕は監視されてないので、ここまでする必要なかかったけど、ゲームのマクロなどをUSBマウスで実行するととても楽になるかもしれない。ようはプログラマブルなマウス、自動化・マウスしかもUSBの正しいデバイスとして作ることができる。最高じゃん?ラグナロク・オンラインやメイプルストーリーが流行ってた頃にほしかったよ。

動かし方は、次のサイトを参考に動かした。 https://toki-blog.com/pi4-gadget-mouse/

マウス1ピクセル動かして飽きたので、詳細は割愛。

USBドングル化

USB-OTGを使えるデバイスとして挿しっぱなしで使えるようにした。

これで、Raspi zero W をPCに差し込んでしまえば、USB機器に見えるが

Raspi自体はWifi ( AP or Client ) でネットワークに接続されるので、PCにいろいろインジェクションできる機械の出来上がりである。

[f:id:takuya_1st:20220606223250p:plain]

動作時の注意(USBハブは使わない)

理由として、OTGの先にハブが接続されていた場合。 ここから想像するに、Zero にハブをいれたらOTGが無効になるのではないか

RaspberryにUSBハブを付けて、ドングルを挿し込む→PC側にUSBとして認識される。

dwc2 を指定したとき

RaspberryにUSBハブを付けて、ドングルを挿し込む→PC側にUSB機器が見えない。

takuya@pizero-otg:~ $ dmesg | grep -i otg
[    2.426245] dwc_otg: version 3.00a 10-AUG-2012 (platform bus)
[    2.426696] dwc_otg: FIQ enabled
[    2.426719] dwc_otg: NAK holdoff enabled
[    2.426733] dwc_otg: FIQ split-transaction FSM enabled
[    4.037631] systemd[1]: Set hostname to <pizero-otg>.
[   19.194164] dwc2 20980000.usb: DWC OTG Controller
[   19.195087] usb usb1: Product: DWC OTG Controller
[   19.195110] usb usb1: Manufacturer: Linux 5.10.92+ dwc2_hsotg

https://raspberrypi.stackexchange.com/questions/271/can-i-use-raspberry-pi-as-a-usb-peripheral-device#:~:text=Yes%20you%20can%20if%20you,class%20you%20want%20to%20implement.

Raspi A/B は OTGが無効になってる。

理由として、OTGの先にハブが接続されていた場合。 ここから想像するに、Zero にハブをいれたらOTGが無効になるのではないか

rasberry PI A/A+/B/B+ models have OTG mode disabled by variety of reasons:

  • USB port occupied with USB hub (ethernet),
  • missing OTG 5th pin (grounded), or
  • data pins are not connected (power port). You’d need Raspberry PI Zero for OTG or so called Gadget Mode. Data USB port can be used for OTG and “power”. As of time of this writing Serial and Ethernet were tested, but others should work with proper amount of efforts (keyboard, disk, camera, etc.) Composite devices should work as well. See more info at

ドングル化しているばあい、USBハブを開いてるからと繋いだら面倒くさい。

今回使った商品

参考資料