これまでラズパイpicoを用いてリニアアンプ用液晶表示装置を開発してきましたが、WiFiで通信してPCからリモートコントロールできるようにしたいので、ラズパイpicoからラズパイpicoWに移行したいと思います。
2021年頃からESP32を使って、いくつかのIoT機器を作ってきたので、WiFiのプログラミング方法は経験済みですが、何年も経つと忘れています。
そこで、初心に戻り一から順を追ってラズパイpicoWのプログラミングをして行きます。
手始めにスケッチ例をコンパイルして実行してみました。先ず、ツールタブでボードを"Raspberry Pi Pico W"に設定します。これで、ラズパイpicoWのスケッチ例を使うことができるようになります。
次に、ファイルタブからスケッチ例-->WiFi-->ScanNetworksを選択します。コンパイル、書き込みの後、Arduino IDEのシリアルモニタを開くと次のように表示されました。
Beginning scan at 156096
Found 3 networks
次に、ファイルタブからスケッチ例-->WiFi-->ScanNetworksを選択します。コンパイル、書き込みの後、Arduino IDEのシリアルモニタを開くと次のように表示されました。
Beginning scan at 156096
Found 3 networks
SSID ENC BSSID CH RSSI
Buffalo-G-96C8 AUTO 34:3D:C4:B7:96:C8 11 -90
Buffalo-G-96C8_EXT AUTO 74:DA:88:3B:80:A5 11 -83
Buffalo-G-A9E0 WPA2 84:E8:CB:6D:E2:80 2 -41
--- Sleeping ---
Buffalo社製のWiFiルータを使っており、Buffalo-G-xxxxというのは2.4GHzを利用時のSSIDです。WiFiルーターは5GHzもサポートしていますが、ラズパイpicoWからは2.4GHzのものしか見えません。しかし、パソコンに表示されないアクセスポイントも表示されるので、受信感度はパソコンよりも良さそうです。
次にUdpを試しました。ファイルタブからスケッチ例-->WiFi-->Udpを選択します。ソースコードの22行目辺りの次の部分を修正しました。
#define STASSID "your-ssid"
#define STAPSK "your-password"
先に実行したScanNetworksで見つけた3つアクセスポイントの内の一つを使うので次のように修正しました。
#define STASSID "Buffalo-G-A9E0"
#define STAPSK "ルータに書いてある通り(ここでは秘密)"
コンパイル、書き込みの後、Arduino IDEのシリアルモニタを開くと次のように表示されました。
Connected! IP address: 192.168.0.19
UDP server on port 8888
IPアドレスは、DHCPにより自動的に割り当てられたものです。UDPサーバーのポートアドレスは、8888と表示されていますが、この値はプログラム中で次のように記述されているからです。
unsigned int localPort = 8888; // local port to listen on
ラズパイpicoWのネットワークレイヤーが動作しているかどうか、pingを使って確かめました。
PS C:\Users\namva> ping 192.168.0.19
192.168.0.19 に ping を送信しています 32 バイトのデータ:
192.168.0.19 からの応答: バイト数 =32 時間 =114ms TTL=255
192.168.0.19 からの応答: バイト数 =32 時間 =2ms TTL=255
192.168.0.19 からの応答: バイト数 =32 時間 =2ms TTL=255
192.168.0.19 からの応答: バイト数 =32 時間 =2ms TTL=255
192.168.0.19 の ping 統計:
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 2ms、最大 = 114ms、平均 = 30ms
次に、固定IPで接続してみました。次のURLの記事を参考にしました。
https://zenn.dev/stranger396/articles/15d5021e61fab7
WiFi.config()を使えば固定IPにすることができるようです。
https://reference.arduino.cc/reference/en/libraries/wifi/wifi.config/
WiFi.begin()の前に WiFi.config(ipaddress);を記述することが重要です。具体的には、スケッチ例(Udp.ino)の一部を次のように変更しました。
WiFiUDP Udp;
IPAddress myIP(192,168,0,222);
void setup() {
Serial.begin(115200);
WiFi.config(myIP);
WiFi.begin(STASSID, STAPSK);
何か良いUDPテストツールは無いかとネットで検索したところ、以前私が作ってものが引っかかりました。自分ではとっくに忘れていたのです。
https://blog.goo.ne.jp/namva/e/fb7c8c737dd9b2ebe82ab60fb7a2c321
これでテストしたところ、シリアルモニタには次のように表示されました。
Received packet of size 7 from 192.168.0.11:59110
(to 192.168.0.222:8888)
Contents:
hello!
Buffalo-G-96C8 AUTO 34:3D:C4:B7:96:C8 11 -90
Buffalo-G-96C8_EXT AUTO 74:DA:88:3B:80:A5 11 -83
Buffalo-G-A9E0 WPA2 84:E8:CB:6D:E2:80 2 -41
--- Sleeping ---
Buffalo社製のWiFiルータを使っており、Buffalo-G-xxxxというのは2.4GHzを利用時のSSIDです。WiFiルーターは5GHzもサポートしていますが、ラズパイpicoWからは2.4GHzのものしか見えません。しかし、パソコンに表示されないアクセスポイントも表示されるので、受信感度はパソコンよりも良さそうです。
次にUdpを試しました。ファイルタブからスケッチ例-->WiFi-->Udpを選択します。ソースコードの22行目辺りの次の部分を修正しました。
#define STASSID "your-ssid"
#define STAPSK "your-password"
先に実行したScanNetworksで見つけた3つアクセスポイントの内の一つを使うので次のように修正しました。
#define STASSID "Buffalo-G-A9E0"
#define STAPSK "ルータに書いてある通り(ここでは秘密)"
コンパイル、書き込みの後、Arduino IDEのシリアルモニタを開くと次のように表示されました。
Connected! IP address: 192.168.0.19
UDP server on port 8888
IPアドレスは、DHCPにより自動的に割り当てられたものです。UDPサーバーのポートアドレスは、8888と表示されていますが、この値はプログラム中で次のように記述されているからです。
unsigned int localPort = 8888; // local port to listen on
ラズパイpicoWのネットワークレイヤーが動作しているかどうか、pingを使って確かめました。
PS C:\Users\namva> ping 192.168.0.19
192.168.0.19 に ping を送信しています 32 バイトのデータ:
192.168.0.19 からの応答: バイト数 =32 時間 =114ms TTL=255
192.168.0.19 からの応答: バイト数 =32 時間 =2ms TTL=255
192.168.0.19 からの応答: バイト数 =32 時間 =2ms TTL=255
192.168.0.19 からの応答: バイト数 =32 時間 =2ms TTL=255
192.168.0.19 の ping 統計:
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 2ms、最大 = 114ms、平均 = 30ms
次に、固定IPで接続してみました。次のURLの記事を参考にしました。
https://zenn.dev/stranger396/articles/15d5021e61fab7
WiFi.config()を使えば固定IPにすることができるようです。
https://reference.arduino.cc/reference/en/libraries/wifi/wifi.config/
WiFi.begin()の前に WiFi.config(ipaddress);を記述することが重要です。具体的には、スケッチ例(Udp.ino)の一部を次のように変更しました。
WiFiUDP Udp;
IPAddress myIP(192,168,0,222);
void setup() {
Serial.begin(115200);
WiFi.config(myIP);
WiFi.begin(STASSID, STAPSK);
何か良いUDPテストツールは無いかとネットで検索したところ、以前私が作ってものが引っかかりました。自分ではとっくに忘れていたのです。
https://blog.goo.ne.jp/namva/e/fb7c8c737dd9b2ebe82ab60fb7a2c321
これでテストしたところ、シリアルモニタには次のように表示されました。
Received packet of size 7 from 192.168.0.11:59110
(to 192.168.0.222:8888)
Contents:
hello!

UDP通信はちゃんと動作しているようなので、これをベースにしてリニアアンプ用液晶表示装置の操作をWiFi(UDP)で通信できるように開発を進めたいと思います。