Raspberry Pi (RPi) 3B+や4BにはWi-Fi通信モジュールが内蔵されていますが、外付けのWi-Fiモジュールをつけることで通信状況が改善されるといわれています。

そこでRPi 4Bに外付けWi-Fiモジュールをつけて動かしてみます。RPiに外付けWi-Fiモジュールをつけて使うには、Wi-Fiモジュールで使われているチップセットの型番が必要です。ネット上でチップセットが分かるWi-Fiモジュールを探したところ、「tp-link TL-WN725N」という製品が見つかったので、今回はこれを使います。

RPi:Raspberry Pi 4B
OS:Raspbian GNU/Linux 10 (buster) ($ lsb_release -a で確認)
外付けWi-Fiモジュール:tp-link TL-WN725N

コマンドはRPiにログインして実行します。

Wi-Fiモジュールに使われているチップセットを確認する

外付けWi-FiモジュールをRPiのUSBに挿して、次のコマンドを実行します。

$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 0bda:8179 Realtek Semiconductor Corp. RTL8188EUS 802.11n Wireless Network Adapter
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

2行目のRealtek SemiconductorのRTL8188EUSが使われているチップセットです。

カーネルバージョンを確認する

次にカーネルのバージョンを確認します。

# ファームウェアを最新に更新
$ sudo rpi-update

# カーネルバージョンを調べる
$ uname -a
Linux raspi5 5.10.20-v7l+ #1404 SMP Thu Mar 4 19:44:07 GMT 2021 armv7l GNU/Linux

Wi-Fiモジュールのドライバをダウンロードしてインストールする

チップセットとカーネルバージョンに対応したドライバをダウンロードします。次のサイト( http://downloads.fars-robotics.net/wifi-drivers/8188eu-drivers/ )で「チップセット名-カーネルバージョン-ビルド番号.tar.gz」というファイルを見つけて、wgetコマンドでダウンロードします。この例だとチップセット名が8188eu、カーネルバージョンが5.10.20-v7l (最後は小文字のエル)、ビルド番号は1404なので、ファイル名は「8188eu-5.10.20-v7l-1404.tar.gz」になります。

$ mkdir wifi
$ cd wifi
$ wget http://downloads.fars-robotics.net/wifi-drivers/8188eu-drivers/8188eu-5.10.20-v7l-1404.tar.gz

赤字の部分をカーネルバージョンによって変えてください。ドライバをダウンロードしたら、展開してインストールし、RPiをリブートします。

$ tar xzf 8188eu-5.10.20-v7l-1404.tar.gz
$ ./install.sh

$ sudo reboot

Wi-Fiアクセスポイントのssidとパスワードを指定する

接続するWi-Fiアクセスポイントのssidとパスワードをwpa_supplicant.confに設定してリブートします。TL-WN725Nは2.4GHzでしか通信できないので、2.4GHzのssid、パスワードを指定します。

$ sudo sh -c 'wpa_passphrase ssid パスワード | grep -v "#psk=" >> /etc/wpa_supplicant/wpa_supplicant.conf'

$ sudo reboot

ネットワークインタフェースを確認する

これで外付けWi-Fiのドライバが組み込まれ、アクセスポイントに接続されているはずなので、確認します。

$ ip link show
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: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DEFAULT group default qlen 1000
 link/ether dc:a6:32:6d:1a:bf brd ff:ff:ff:ff:ff:ff
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT group default qlen 1000
 link/ether 28:ee:52:1c:b9:7e brd ff:ff:ff:ff:ff:ff
4: wlan1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DORMANT group default qlen 1000
 link/ether dc:a6:32:6d:1a:c0 brd ff:ff:ff:ff:ff:ff

wlan0とwlan1があり、一方が内蔵Wi-Fiモジュール、他方が外付けWi−Fiモジュールです。どちらが0、1になるかはタイミングによるようです。link/ether (MACアドレス) の先頭が28:ee:52のもの(上の例ではwlan0)がTL-WN725Nです。このインタフェースの<…>の中にNO-CARRIERがなく、stateの次がUPであることを確認します。そうでない場合はwpa_supplicant.confの設定を再確認します。tp-link社の製品のMACアドレスはいくつかのパターンがあります。MACアドレスがどのベンダーのものかは、「MACアドレス検索」などのサイトで確認できます。

内蔵Wi-Fiモジュールを無効化する

内蔵Wi-Fiモジュールを無効化して外付けWi−Fiで通信するようにします。/etc/modprobe.d/raspi-blacklist.confファイルで内蔵Wi-Fiモジュールを使わないように指定してリブートします。

$ sudo vi /etc/modprobe.d/raspi-blacklist.conf
#wifi
blacklist brcmfmac
blacklist brcmutil

$ sudo reboot

ネットワークインタフェースを確認します。link/ether の先頭がdc:a6:32のものがなくなり、28:ee:52のものだけになっているはずです。

$ ip link show
 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: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DEFAULT group default qlen 1000
 link/ether dc:a6:32:6d:1a:bf brd ff:ff:ff:ff:ff:ff
 3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT group default qlen 1000
 link/ether 28:ee:52:1c:b9:7e brd ff:ff:ff:ff:ff:ff

ip addr show wlan0 とするとwlan0に割り振られたIPアドレスを確認できます。

$ ip addr show wlan0
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 28:ee:52:1c:b9:7e brd ff:ff:ff:ff:ff:ff
    inet 192.168.11.2/24 brd 192.168.11.255 scope global dynamic noprefixroute wlan0
       valid_lft 168731sec preferred_lft 147131sec
    inet6 2404:7a80:2b40:5700:f073:60a9:777d:bd2d/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 7141sec preferred_lft 3541sec
    inet6 fe80::e56a:606c:945e:f553/64 scope link
       valid_lft forever preferred_lft forever