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で確認してみる

VS-CodeでPSoC4の開発+書込み

ModusToolBoxのEclipseのIDEがあるのですが、ちょっと重たくて使いにくい部分もあり、VS-Codeで開発できないかと調べると、可能であることがわかりました。いざやってみると苦戦してしまって、1日半かけてようやくEclipseのIDEで開発していた状態と同様に、開発から書込みまでできるようになりました。そこで、忘れないようにメモしておきます。

ーー

情報は公式サイトのPDFにありました。
Visual Studio Code for ModusToolbox™ user guide

VS-Codeの他に必要なExtentionは「C/C++ tools」「Cortex-Debug」「Arm Assembly」「ModusToolBox Assistant」「clangd」です。

ーー

「ModusToolBox Assistant」をインストールすると左のメニューアイコンにロボットアイコンが表示されます。それをクリックします。

「ModusToolBox Tools」の「Global」にある「Create Project」をクリックします。

BSPが起動して、ひながたになるプロジェクトを作成します。

ーー

今回つかう書き込み器は「WCH-Link」です。純正の「MiniProg4」でももちろん書き込めますが、安くて入手しやすい「WCH-Link」を使います。そのための設定を・・というところで苦戦してしまいました。

結果的には、そのままの設定で書込みできました。接続するピンは以下の4つです。

  • SWCLK
  • SWDIO
  • GND
  • 3.3V

書込みは、「RUN AND DEBUG」から書込むような情報が見つかるのですが、デバッグモードになってしまいました。今回は、ただ書き込んで、書込み終わったら動き出して欲しいので、その設定をタスクにしていきます。

「.vscode」の「tasks.json」に設定を追記していきます。

5〜6行目の間に以下を挿入します。

ーー

{
            "label": "Program PSoC4 using OpenOCD (KitProg3)",
            "type": "shell",
            "command": "/Applications/ModusToolbox/tools_3.4/openocd/bin/openocd",
            "args": [
                "-s",
                "/Applications/ModusToolbox/tools_3.4/openocd/scripts",
                "-c",
                "set PSOC4_USE_ACQUIRE 2",
                "-c",
                "adapter speed 2000",
                "-f",
                "interface/kitprog3.cfg",
                "-f",
                "target/psoc4.cfg",
                "-c",
                "kitprog3 power_config on 3300",
                "-c",
                "init",
                "-c",
                "kitprog3 power_control on",
                "-c",
                "program build/last_config/mtb-example-psoc4-capsense-csd-button-tuning.elf verify reset exit"
            ],
            "problemMatcher": [],
            "group": {
                "kind": "build",
                "isDefault": false
            }
        },

ーー

WCH-Linkで書込んでいる様子です。

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(文字化けないポイント)” の続きを読む