Raspberry Pi CM5でUSB Wi-Fiは使える?AC600・AC1300とドライバ導入

Raspberry Pi CM5にはWi-Fi搭載モデルがあります。しかし、純正アンテナは弱いという話題をネットでもよく見かけます。
そこで、外付けのUSB Wi-Fiアダプタではどうなのかを試してみました。

もう1つ、Pi 5 / CM5世代になってからは、USB接続型Wi-Fiアダプタがそのままでは動作しないケースも増えています。
Pi 4時代ではあまり気にすることがなかったため、戸惑っている人も多いのではないでしょうか。

今回は、USB2.0接続とUSB3.0接続のWi-Fiアダプタをそれぞれテストしました。
同じチップ構成の製品という前提にはなりますが、ドライバ導入も含めて整理していきます。

今回の環境

試した環境は以下です。

製品:産業用ラズベリーパイ「PL-R5」
Model: Raspberry Pi Compute Module 5 Rev 1.0
CPUアーキテクチャ:ARM64(aarch64)
OS: Debian GNU/Linux 12 (bookworm)
Kernel: 6.12.62+rpt-rpi-v8

Wi-Fi製品はtp-link AC1300とAC600です。どちらもWi-Fi5GHz帯も2.4GHz帯に対応しています。
但し、AC600はUSB2.0接続で、AC1300はUSB3.0接続も可能です。

製品自体はスペックの違いだけで、外観はほぼ同じサイズとデザインでした。

AC600はWindows/Mac対応と謳われ、AC1300はWindowsのみ対応です。
CDーROMでデバイスドライバが付属されています。
Linux対応は謳っていません。

対応しているスペック:
AC600:1 stream (1×1)、最大433Mbps(理論値)
AC1300:2 stream (2×2)、最大866Mbps(理論値)

デバイスドライバ問題

試用した製品は、どちらもLinux対応は謳っていません。専用ドライバも公開されていません。
Raspberry PiのようなLinux環境では、標準のドライバで動作しない場合は自分で探して導入する必要があります。

ドライバは、Kernelのバージョンや搭載チップ、CPUアーキテクチャ、OSによって動作状況が変わります。

特に重要なのは搭載チップです。

そのため、まずはUSBデバイスとして認識されるのか、どのチップが搭載されているのかを確認します。
適切なドライバを導入しないと動作しないため注意が必要です。

搭載チップを調べる(AC600、AC1300)

Wi-FiアンテナをUSBポートに差し込んでから実行します。先にAC600から試します。
USB接続なので、lsusbコマンドで調べてみます。

lsusb
Bus 004 Device 004: ID 2357:0120 TP-Link Archer T2U PLUS [RTL8821AU]

USBとしては認識されていました。チップも明白です。Realtek製で型番が8821AUです。
ベンダーIDも2357:0120でTP-linkのものです。

ip linkコマンドで調べると、Wi-Fiがないモデルのためwlan0が表示されれば、標準kernelで自動認識したわけですが、やはりそのままでは表示されません。

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 2c:cf:67:ba:f9:8e brd ff:ff:ff:ff:ff:ff
3: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000
    link/ether c8:ac:35:05:00:02 brd ff:ff:ff:ff:ff:ff

USBデバイスとしては認識しても、標準のKernelではネットワークインターフェースは生成されないので未対応ということです。

AC1300

AC1300の方も同様に調べると、rtw_8822buと分かりました。

lsusbコマンドでベンダーIDはID 2357:0138と分かりましたが、チップ名が載っていないため、sudo dmesg | grep -i rtwで調べました。(lsusb -tでも分かる)

Bus 003 Device 004: ID 2357:0138 TP-Link 802.11ac NIC

デバイスドライバ探し

ネットには有志が作成してくれているデバイスドライバがあります。同じように困っている人がいるため、意外と見つかるものです。
その前に、Linux側で用意がないかも軽く調べてみます。

1つはRaspberry Pi OSのパッケージ管理aptのapt searchで検索してみます。
しかし、必要なRTL8821AU用のドライバパッケージはありません。ヒットしたのは、rtw88_8821cu、rtw88_8821ce、rtw88_8821cだけで、8821acがない。

apt提供のデバイスドライバはなかったので、次はGithubで探しました。

ただ、検索する条件があります。

  • RTL8821AU(AC600)
  • RTL8822BU(AC1300)
  • Linux Kernel 6.12
  • Raspberry Pi OS Bookworm
  • ARM64

加えて、できればDKMS対応されていると助かります。

  • DKMS(Dynamic Kernel Module Support) DKMSあり → 更新のたびに自動で再ビルドしてくれる
    DKMSなし → kernel更新のたびに手作業で再ビルドする

DKMS対応でないと、OSのアップデートでKernelがバージョンアップしただけでWi-Fiが切れてしまうことがあります。
実機にキーボードが接続されていればいいのですが、容易にアクセスできない遠隔操作だと厄介です。

githubのリポジトリで見つけた

githubで調べていると別のリポジトリで、とある記述を見つけました。そこに書いてあるデバイスドライバを試したところバッチリでした。

使用したリポジトリ:
https://github.com/lwfinger/rtw88

Realtek rtw88シリーズのWiFi 5ドライバの開発、テスト、およびメンテナンスを主な目的としたダウンストリームリポジトリです。
つまり、Linux 6.13に向けて開発されている本流(mainline)系コードを、古いkernelへ対応(backport)させているため、これならKernel 6.12のBookwormでも大丈夫なわけです。

サポートしている一覧に、事前に調べたRTL8821AUとRTL8822BUの記載もあり、確信してインストールすることができました。

PCIe: RTL8723DE, RTL8812AE, RTL8814AE, RTL8821AE, RTL8821CE, RTL8822BE, RTL8822CE
SDIO: RTL8723CS, RTL8723DS, RTL8821CS, RTL8822BS, RTL8822CS
USB : RTL8723DU, RTL8811AU, RTL8811CU, RTL8812AU, RTL8812BU, RTL8812CU
USB : RTL8814AU, RTL8821AU, RTL8821CU, RTL8822BU, RTL8822CU

しかも、DKMSもあり申し分はありません。有り難いですね。

ドライバのインストール

ここからは実際にデバイスドライバをインストールしていきます。
基本はlwfinger/rtw88のREADMEに書いてあることを実行しました。ここではRaspberry Pi OSにインストールすること前提にした手順です。

Raspberry Pi用に事前インストール

Raspberry Piの場合、以下を実行するのですが、bookwromでも既にビルドできる環境かと思います。念のため実行。

sudo apt install -y raspberrypi-kernel-headers build-essential git

このリポジトリにはDKMSが用意されています。ビルドするのにDKMSがRaspberry Pi OSには入っていないで先にインストールが必要です。

sudo apt install dkms

rtw88ドライバのインストール

該当のリポジトリをcloneし、rtw88ドライバのインストール、rtw88ドライバに必要なファームウェアをインストールします。
最後は設定ファイルを決まった場所にコピーします。

git clone https://github.com/lwfinger/rtw88.git

cd rtw88
sudo dkms install $PWD

sudo make install_fw
sudo cp rtw88.conf /etc/modprobe.d/

以上で、再起動してからip linkコマンドを確かめてください。
今度はwlan0(またはwlan1)が表示されているはずです。

接続確認

デバイスドライバがインストールされたので、あとは認識されたwlan0にインターネット接続の設定をすればOKです。

sudo nmcli dev wifi connect "5GHzのSSID" password "WiFiパスワード"

“〜正常にアクティベートされました。”と表示されたら接続完了です。
次回から切断や接続には、次のコマンドでOKです。

# 切断
sudo nmcli dev wifi disconnect wlan0
# 再接続
sudo nmcli con up "SSID"

もちろんGUIのデスクトップにある上部メニューバーから接続と切断も可能です。

電波強度の確認(AC600)

ネットに接続できましたので、今度は性能を測ってみたいと思います。

電波の強度を確認するのに、iw dev wlan0 linkを使いました。

Connected to XX:XX:XX:XX:XX:XX (on wlan0) # sample
    SSID: secret # sample
    freq: 5220
    RX: 1846814 bytes (8763 packets)
    TX: 370914443 bytes (48765 packets)
    signal: -40 dBm
    rx bitrate: 390.0 MBit/s VHT-MCS 9 80MHz VHT-NSS 1
    tx bitrate: 433.3 MBit/s VHT-MCS 9 80MHz short GI VHT-NSS 1

必要な箇所は、signal以下3行の部分です。

    signal: -40 dBm
    rx bitrate: 390.0 MBit/s VHT-MCS 9 80MHz VHT-NSS 1
    tx bitrate: 433.3 MBit/s VHT-MCS 9 80MHz short GI VHT-NSS 1

Signalは0に近い方が良い数字です。

  • -30〜-45 dBm かなり強い
  • -50〜-67 dBm 良好
  • -70以下 弱くなる

今回は-40dBmでしたから、かなり強い帯域幅の結果になりました。

なお、VHT-MCS 9 80MHz VHT-NSS 1のVHTは、Wi-Fi 5 (802.11ac) の通信方式を表し、続くVHT-MCSの数字9は効率化のレベルで9が最大。
その後の80MHzは帯域幅です。
VHT-NSS 1はアンテナ本数です。AC1300は2になるはずです。※Very High Throughput(非常に高い伝送効率)

およそ次のように表現されます。

  • 802.11n → HT = Wi-Fi 4
  • 802.11ac → VHT = Wi-Fi 5
  • 802.11ax → HE = Wi-Fi 6

帯域幅は時代と共に大きくなってきました。

  • 20MHz
  • 40MHz
  • 80MHz ←今回の製品はここ
  • 160MHz

USB3.0ポートへ接続

続いて、本来USB2.0だけ対応しているAC600をUSB3.0ポートに接続して試してみました。
一旦再起動後、ポートを差し替えてからもう一度コマンドを実行します。

同じようにiw dev wlan0 linkの結果は次のように電波強度は -42 dBmでした。

    signal: -42 dBm
    rx bitrate: 351.0 MBit/s VHT-MCS 8 80MHz VHT-NSS 1
    tx bitrate: 433.3 MBit/s VHT-MCS 9 80MHz short GI VHT-NSS 1

その代わり受信側rx bitrateは、390.0 から351.0MBit/sへ僅かに低下しています。
いずれにしても、普段の利用ならUSB2.0/3.0ポートの差は体感的にほぼないことが分かりました。

電波強度の確認(AC1300)

今度はUSB3.0に対応したAC1300を試します。USB3.0対応ですから、USB3.0ポートへ差し込みます。
既にデバイスドライバはインストールしているため、AC1300は追加設定なしで認識します。

同じように電波強度を調べてみます。

    signal: -40 dBm
    rx bitrate: 780.0 MBit/s VHT-MCS 9 80MHz VHT-NSS 2
    tx bitrate: 866.7 MBit/s VHT-MCS 9 80MHz short GI VHT-NSS 2

Signalは-40 dBmなので、これもAC600同様にかなり強い数値です。
理論値が、780.0/866.7 MBit/sと先ほどのAC600と異なっているのが分かります。

帯域幅は同じ80MHzで、アンテナは2本のVHT-NSS 2と表示されました。

USB2.0ポートへ接続

AC600同様に一旦再起動して、逆のUSB2.0ポートへ接続してみます。

    signal: -42 dBm
    rx bitrate: 702.0 MBit/s VHT-MCS 8 80MHz VHT-NSS 2
    tx bitrate: 866.7 MBit/s VHT-MCS 9 80MHz short GI VHT-NSS 2

Signalは-42 dBmなので、僅かに強度が下がったことになります。
理論値は780.0 MBから702.0 MBit/sへ少し減少しています。

別ポートへの接続は大差はなかった

AC600はUSB2.0規格で、AC1300はUSB3.0対応ですが、それぞれを別のポートへ挿しても、動作も速度も問題ありませんでした。
普段の利用ならUSB2.0/3.0ポートの差は、体感としてほぼありません。

Signalも起動直後から計測するタイミングによってバラつきもあります。
どちらというと、ポートの位置によるノイズ差の影響が大きいかもしれません。

対応したポートの方が数字は良かったため、敢えて別のポートに繋ぐ意味は、条件(ポートが空いていないなど)がなければ必要ないと思いました。

速度の実測

ipref3を使って、実際の速度を測ってみました。

PL-R5と別マシン(Mac)にそれぞれiperf3をインストールして、Mac側をサーバモードとして起動します。

brew install iperf3

iperf3 -s

Piにもインストールし、Pi側からMacのIPアドレスを指定して実行します。

iperf3 -c MacのIP

iperf3で実測の結果

確認はMacのレシーバ側にある最後の行です。

# AC1300
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec   359 MBytes   301 Mbits/sec    0             sender
[  5]   0.00-10.02  sec   358 MBytes   300 Mbits/sec                  receiver
# AC600
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec   163 MBytes   137 Mbits/sec    0             sender
[  5]   0.00-10.03  sec   160 MBytes   134 Mbits/sec                  receiver

AC1300では約300Mbps、AC600では約134Mbpsでした。
理論値866.7Mbpsと433.3 MBit/sを考えると、実測でもかなり高い値が出ています。

更にオプション-P 4と並列4ストリームで行うとより正確に測れます。

iperf3 -c IPアドレス -P 4
# AC600

[ ID] Interval           Transfer     Bitrate         Retr
[SUM]   0.00-10.00  sec   161 MBytes   135 Mbits/sec    0             sender
[SUM]   0.00-10.03  sec   154 MBytes   129 Mbits/sec                  receiver

# AC1300

[ ID] Interval           Transfer     Bitrate         Retr
[SUM]   0.00-10.00  sec   363 MBytes   305 Mbits/sec    0             sender
[SUM]   0.00-10.05  sec   351 MBytes   293 Mbits/sec                  receiver

実行結果として自然な数値でした。

検証結果と比較

以下、各項目を表にして並べてみました。
Wi-Fiリンク速度(RX,TX,ipref3)は測定タイミングで変動するため、参考値としてご覧ください。
特にiw dev wlan0 linkは数値が揺れます。

検証の結果、今回はRaspberry Pi OS Bookworm環境ではDKMSドライバが別に必要でした。
一方、このドライバはwireless-next系のbackportであり、今後のkernelでは標準ドライバとして取り込まれる可能性があります。
特にRTL8822BU系はmainline側への統合が進んでいる様子です。公式フォーラムにトピックがありました。

RTW88_8821AU option を有効化すれば RTL8811AU/8821AU 系は対応可能
引用元:https://forums.raspberrypi.com/viewtopic.php?t=392929

Raspberry Pi OS Trixieでは、新しいkernelによって改善され、将来的に標準ドライバへ組み込まれる可能性もあります。
しかし、現時点ではRTL8822BUでもDKMS/backport driverを利用するケースがあり、環境によっては追加導入が必要になる可能性があります。
今回の検証では、lwfinger/rtw88 リポジトリを導入することで安定して利用できました。
同じチップ構成のWi-Fiアダプタでお困りの方は、記事のように試してみてください。


記事寄稿:ラズパイダ

非エンジニアでも楽しく扱えるRaspberry Pi 情報サイト raspida.com を運営。ラズベリーパイに長年触れた経験をもとに、ラズベリーパイを知る人にも、これから始めたいと興味を持つ人にも参考になる情報・トピックを数多く発信。PiLinkのサイトへは産業用ラズベリーパイについて技術ブログ記事を寄稿。