Raspi Zero / WH をOTGで使う。
OTGで使うと、pi zero が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) でシリアルコンソールを有効にした場合、シリアルポートが使えるが、一部不安定だった。g_cdc の代わりに g_serial を使ったほうが良さそう。
pi zero 側にシリアルコンソールデバイス ttyGS0が生成
raspberry pi zero 側に ttyGS0 が生成される。
ls /dev/ttyGS0
[PC側] PCはシリアルコンソール /dev/ttyACM0 が生成される
USB経由で接続されたPC側には、 /dev/ttyACM0 が生成される(Linux)の場合
ls /dev/ttyACM0
名前が似ているので注意する
OTG側(Raspi側)/dev/ttyAMA0 OTG差し込み(PC側) /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にいろいろインジェクションできる機械の出来上がりである。
このUSBドングル化キットは、https://wiki.52pi.com/index.php?title=EP-0097#How_to_use のURLで仕様と利用方法が公開されていて。
- Open up the "boot" partition and edit "config.txt", adding "dtoverlay=dwc2" to the bottom
- Open up "cmdline.txt" and add "modules-load=dwc2,g_ether" after "rootwait"
- Create a new file named "ssh" in the boot folder
- Insert this TF card to Raspberry Pi Zero/Zero W
- Pop your newly set up SD card into your Pi Zero
- plug it into a USB port and you should be able to SSH in to "raspberrypi.local",
とのことである。
パッケージの内容は次のとおりです。
- 1 x USB dongle extension board
- 4 x M2.5 Long Screws
- 4 x M2.5 Nuts
- 2 x Acrylic Sheild
動作時の注意(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
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ハブを開いてるからと繋いだら面倒くさい。