RasPi4+BookwormOSで、WiFiアクセスポイント

参考にしたサイト


RaspberryPiで作品を作る時はいつも、インターネットにつながっていないWiFiルータを用意して、SSHやVNCで接続していました。でも、外に持って行くとWiFiルータがつながりにくくなることがあって、RaspberryPiに直接接続したいなぁと思っていました。そして開発するときはインターネット接続が必要なので、開発と本番の設定を何も変えずにいけるといいなぁと思っていました。そんなとき、上記のサイトで、まさにその方法を知ったのでした。

その方法をおおまかに説明すると、RaspberryPiのWiFiはそのまま、同じWiFiハードウェアで仮想インターフェイスを作成します。そしてその仮想インターフェイスを、RaspberryPiが起動した時に自動生成するようにします。そのとき重要なのは、WiFiハードウェアのMACアドレスと、「iw dev」で確認した「phy#0」などのWi-Fiデバイスの物理インターフェースの番号です。この番号は「phy#1」などに変わることがあるのですが、参考サイトでは特にそのことは書かれていません。この番号が変わると、うまく仮想インターフェイスが生成できませんでした。

具体的には参考サイトの通り「phy#0」を指定してスクリプトを書いたのに、実際には「phy#1」になっていて「phy#0」が存在しないので、スクリプトが機能せず仮想インターフェイスが生成できませんでした。偶然うまくいくこともありましたが、理由がわからず再現できませんでした。何度もOSを焼き直して最初からやり直しても同じでした。


ChatGPTに聞いてみたら、以下のように情報がもらえました。

「phy#0」、「phy#1」などの番号が起動時に変動する理由は、Raspberry PiやLinuxのWi-Fiドライバが物理インターフェースを動的に認識するためです。具体的には、Wi-Fiチップの初期化順序やシステムのデバイス認識順序に依存しています。

phyの番号は、起動中の処理のタイミングによって動的に割り振られるみたいです。ということは、さっきまで上手くいってたのに、開発を進めて行く中で、何か設定を変えたり何かインストールしたりすると、上手くいかなくなる可能性が否めません。

それではとても困るので、なんとか確実にうまくいく方法はないかと試行錯誤していました。そこでChatGPTに相談すると、phyの番号を指定せず、WiFiインターフェイス名「wlan0」で指定するスクリプトを教えてもらえました。

うまく仮想インターフェイスが生成されたら、ネットワークマネージャー(nmcli)のコマンドで、WiFiアクセスポイントをつくります。これはコマンド1つで確実にできるので、とにかく仮想インターフェイスが生成できているるかがポイントになります。


1、「iw dev」で「wlan0」のMACアドレスを確認

iw dev
pi@fukasawa:~ $ iw dev
phy#0
	Unnamed/non-netdev interface
		wdev 0x3
		addr e6:5f:01:65:14:0b
		type P2P-device
		txpower 31.00 dBm
	Interface wlan0
		ifindex 4
		wdev 0x2
		addr e4:5f:01:65:14:0b
		ssid mathrax
		type managed
		channel 11 (2462 MHz), width: 20 MHz, center1: 2462 MHz
		txpower 31.00 dBm

2、WiFi仮想インターフェイス「ap0」を生成するスクリプト

sudo nano /opt/create_virtual_iface.sh
#!/bin/bash

# Wi-Fiインターフェイス名
WIFI_IFACE="wlan0"
# 仮想インターフェイス名
VIRTUAL_IFACE="ap0"
# 仮想インターフェイスのMACアドレス(iw devで確認したwlan0のMACアドレス)
TARGET_MAC="2c:cf:67:4d:16:4e"

# Wi-Fiインターフェイスが存在するか確認
if ip link show "$WIFI_IFACE" &>/dev/null; then
    # 仮想インターフェイスを作成
    sudo iw dev "$WIFI_IFACE" interface add "$VIRTUAL_IFACE" type __ap
    # MACアドレスを設定
    sudo ip link set "$VIRTUAL_IFACE" address "$TARGET_MAC"
    # 仮想インターフェイスを有効化
    sudo ip link set "$VIRTUAL_IFACE" up
    echo "$VIRTUAL_IFACE created and configured successfully."
else
    echo "$WIFI_IFACE not found!"
    exit 1
fi

3、スクリプトに実行権限を与える

sudo chmod +x /opt/create_virtual_iface.sh

4、起動時に自動でスクリプト実行するようにserviceに登録する

sudo nano /etc/systemd/system/create_virtual_iface.service
[Unit]
Description=Create Wi-Fi Virtual Interface
After=network.target

[Service]
ExecStart=/opt/create_virtual_iface.sh
Type=oneshot
RemainAfterExit=true

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable create_virtual_iface.service

5、サービスを起動して動作確認

sudo systemctl start create_virtual_iface.service


6、出来たら再起動

7、インターフェイスの確認

iw dev
pi@fukasawa:~ $ iw dev
phy#0
	Unnamed/non-netdev interface
		wdev 0x3
		addr e6:5f:01:65:14:0b
		type P2P-device
		txpower 31.00 dBm
	Interface wlan0
		ifindex 4
		wdev 0x2
		addr e4:5f:01:65:14:0b
		ssid mathrax
		type managed
		channel 11 (2462 MHz), width: 20 MHz, center1: 2462 MHz
		txpower 31.00 dBm
	Interface ap0
		ifindex 3
		wdev 0x1
		addr e4:5f:01:65:14:0b
		channel 11 (2462 MHz), width: 20 MHz, center1: 2462 MHz
		txpower 31.00 dBm

8、ネットワークマネージャーコマンドでアクセスポイント作成

sudo nmcli connection add type wifi ifname ap0 con-name rpi_ap autoconnect yes ssid SSID_NAME 802-11-wireless.mode ap 802-11-wireless.band bg ipv4.method shared ipv4.address 192.168.20.1/24 ipv4.never-default yes wifi-sec.key-mgmt wpa-psk wifi-sec.pairwise ccmp wifi-sec.proto rsn wifi-sec.psk PASSWORD

SSID_NAMEと、PASSWORDは、好きなものに変えてください

9、VNCで確認してみる

PSoC4 : UART + Capsense Tuner

タッチセンサの感度調整ツール「CapsenseTuner」で、I2C通信を使う例はよく見ます。サンプルもI2C通信のみしかありません。でもUARTにも対応していて、CapsenseTunerでも接続先をUARTに設定することができます。サイトにも、できるよと情報があるのですが、実際のプログラムやプロジェクトの細かい設定までは、説明が見つかりません。

“PSoC4 : UART + Capsense Tuner” の続きを読む

PSoC4 : タッチセンサの反応をよくする

PSoC4の開発環境「ModusToolBox」で、タッチセンサとシリアル通信をするメモです。使用するPSoCは「CY8C4025AXI-S412」です。タッチセンサに使うクロック周波数を上げると反応速度が速くなったり、電源電圧を少し低くすると安定したり、SmartSenseのキャパシタの値を変更して、個別に調整できたりしました。

“PSoC4 : タッチセンサの反応をよくする” の続きを読む

PSoC4 : CapSense & UART(文字化けないポイント)

PSoC4の開発環境「ModusToolBox」で、タッチセンサとシリアル通信をするメモです。使用するPSoCは「CY8C4025AXI-S412」で、タッチセンサのオンオフ情報を、シリアル送信するサンプルです。

何も考えずにタッチセンサとシリアル通信を一緒に使うと、信号が文字化けしてしまいました。理由は、シリアル送信の実行の直後に、タッチセンサの再スキャンをしているためでした。シリアル信号が送信完了するまで時間がかかるのに、それを待たずにタッチセンサ処理が始まり、シリアル信号のタイミングがズレていくんだと思われます。解決するにはシリアル送信のプログラムを書く場所がポイントでした。

“PSoC4 : CapSense & UART(文字化けないポイント)” の続きを読む

CNC:モーターグレードアップ(1)

マスラックスの木の彫刻を削ってくれるCNCは、OpenBuiledsという団体のLeadCNCという名前のものです。オープンソースに設計されていて汎用的な部材で拡張できるのが特徴です。今回はそのCNCのXYZ軸を動かしているモーターに「クローズドループ」という機能を追加して、「位置保持機能つきモーター」にグレードアップする途中報告になります。

“CNC:モーターグレードアップ(1)” の続きを読む

接着と塗装の実験(4)

前回は、隙間があいて失敗だと思ってたヒノキのハトを、クランプして一晩置いたら奇跡の復活!。そのあと液体ガラス塗装して乾かしているところまで進みました。今回はその乾燥状態です。まだ次の液体ガラス塗装が残っていますが、ウレタンシンナーを取り寄せ中のためもうしばらく完成はおあずけ。

“接着と塗装の実験(4)” の続きを読む