iPad ProとRaspberry Pi 5をUSB-C同士で接続して色々使いたい。やっと実現できました。魚住惇です。

今回は、Raspberry Pi 4では当たり前のようにできていたが、5になってから何故か実現できなかったこと。USB-OTGのg_etherを使ってiPad Proと接続した時にあたかも有線LANのクロスケーブルで接続したかのようなネットワークを作る方法を紹介します。

これができれば、iPad ProのUSB-C端子を通してラズパイ5に電源を供給しながらSSHできたりするので、iPad Proを使いながらLinuxできてウハウハですよ。

ラズパイ4と同じ設定箇所

この手法はラズパイ4の頃にも一部で盛んに行われていました。ラズパイ5も途中までは同じ設定を施します。

まずはMicroSDを別マシンで読み込み、config.txtとcmdline.txtにそれぞれ追記します。

/boot/config.txtの[all]の下に追記

dtoverlay=dwc2

/boot/cmdline.txtのrootwaitの後に追記

modules-load=dwc2,g_ether

ラズパイ4やZero2だと、ここまで設定すれば完了でした。ただラズパイ5はこれだけでは設定が足りず、しかもケーブルを交換する必要もありました。

Thunderbolt 3以上のケーブルが必須

Raspberry Pi 5に4の頃と同じ設定を施して接続しても、iPad ProにEthernetの項目が出ない。僕自身ずっとこの現象で困っていました。なんで同じように設定してもできないのって。

まず必要だったのが、ケーブルの交換でした。僕が使っていたのはAnkerのUSBーCアダプタに付属していたUSB 3.2 Gen 2のケーブル。これでも認識しませんでした。

そこで試したのがThunderbolt3のケーブル。ちょうどeGPUボックスに使っていたケーブルがあったのでそれを流用してみると、iPad Proの設定アプリに項目が表示されました。

帯域が足りないのか、原因は定かではありませんが、手持ちのThunderbolt 3や4のケーブルでは認識してくれました。少なくともThunderbolt 3以上のケーブルが必要です。dmesgとか見てもg_etherがちゃんと動いてんのに、なんでiPad Proで認識してくれんのかなってずっと思っていたんですが、原因がケーブルだったとはね。

僕はこれを機会に、このケーブルを買い足しました。

usb0の追加の設定

ケーブルを交換することで、iPad Proの設定アプリにEthernetの項目が出現しました。しかし様子を見ていると、自動プライベートIPが割り振られず、このままではネットワークが疎通しませんでした。なのでusb0には追加で設定を行います。

なお、こちらで紹介する設定内容は、僕がすべて考えたのではなくて、GitHubに記事を書いてくださったものを参考にしました。

RaspberryPi/Pi5-ethernet-and-power-over-usbc.md at main · verxion/RaspberryPi

Notes to myself about RaspberryPi configuration. Contribute to verxion/RaspberryPi development by creating an account on GitHub.

まず、ラズパイ側でusb0というネットワークインターフェイスを作っておきます。

nmcli con add type ethernet con-name ethernet-usb0

上記コマンドを実行後に作られたnmconnectionファイルを次のように編集します。

僕は設定ファイルを編集するのに、nanoを使いました。

sudo nano /etc/NetworkManager/system-connections/ethernet-usb0.nmconnection

これが設定後の状態です。

[connection]
id=ethernet-usb0
uuid=<random group of characters here>
type=ethernet
autoconnect=true
interface-name=usb0
  
[ethernet]
  
[ipv4]
method=shared
  
[ipv6]
addr-gen-mode=default
method=auto
  
[proxy]

具体的にはconnectionに次の内容を追記して、

autoconnect=true
interface-name=usb0

ipv4のmethodをsharedに変更しました。

method=shared

起動時にusb0をupするサービスを作る

続いて、ラズパイ起動時にusb0を有効化するためのサービスを作って、enableします。

まずはusb0を起動するためのシェルスクリプトを作ります。

sudo nano /usr/local/sbin/usb-gadget.sh

usb-gadget.shの中身

#!/bin/bash

nmcli con up ethernet-usb0

作り終わったら、読み取りと実行権限を与えるのを忘れずに。

chmod a+rx /usr/local/sbin/usb-gadget.sh

続いて、ラズパイ起動時にusb-gadget.shを実行するための専用サービスを作ります。

sudo nano /lib/systemd/system/usbgadget.service

usbgadget.serviceの中身

[Unit]
Description=My USB gadget
After=NetworkManager.service
Wants=NetworkManager.service
  
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/sbin/usb-gadget.sh
  
[Install]
WantedBy=sysinit.target

ラズパイOSが起動する際、NetworkManager.serviceが起動した後にusbgadget.serviceが起動するようにしています。

保存ができたら、serviceをenableしときます。

systemctl enable usbgadget.service

serviceがenableできたら、再起動します。

shutdown -r now

再起動後にIPアドレスが割り当てられる

ここまでの設定が完了すると、iPad Proにラズパイ5をUSB-C同士で接続すればiPad Proの設定アプリにEthernetが現れて、IPアドレスも表示されます。僕の環境ではクラスAのプライベートIPアドレスが自動で割り振られていました。

これだよ。これがやりたかったんだ。ラズパイ5が発売されてからずっとやりたかったことが、ようやくこれで実現できました。iPad Proにラズパイ5が繋がったら、かなりPCライクな作業ができます。VNC接続すればデスクトップだって触れます。ラズパイ4ではVNC接続すると力不足な感じも正直ありましたが、割とサクサク動いて満足です。

CodeServerを入れたらブラウザ経由でVSCodeだって触れます。あぁ、最高。ラズパイ5でusb0が使えなくてうずうずされていた方に朗報な記事となりますように。

最後に繰り返しになりますが、参考記事があります。僕がこの手法の第一発見者というわけではありませんが、補足を入れつつ、自分用のメモとして残したいと思いました。この方もかなりご苦労されたんだなと思います。

RaspberryPi/Pi5-ethernet-and-power-over-usbc.md at main · verxion/RaspberryPi

Notes to myself about RaspberryPi configuration. Contribute to verxion/RaspberryPi development by creating an account on GitHub.

iPad Pro M4で動作させる方法

2024年5月に発売したiPad Pro M4チップ搭載モデルでは、なぜかラズパイ5をUSB-C to USB-Cケーブルでは認識しませんでした。Thunberbolt4ケーブルもダメだし、Thuderbolt3ケーブルでもだめ。

ただ、写真の通り、USB-CをAに変換するアダプタとUSB-C to Aケーブルを組み合わせることで、無事認識しました。ケーブル1本でスマートに接続しても認識しないってところが、ちょっと気になるところですが、まぁ動いたのでヨシ。

今回、この記事を書くにあたり、Raspberry Pi 5本体は販売店よりご提供いただきました。 動作検証が終わったので、これは僕が顧問を務めている商業部に寄付します。