前回はpico-examples のビルドをパスしていたので今回はやってみます。
pico-examplesのpico_wフォルダーにはwifi とbt (Bluetooth)の2つのサンプル集が納められています。
wifiの中の2つのサンプルを覗いてみます。
tcp_server、tcp_clientとwifi_scan です。
tcp_server、tcp_clientでは、Pico W 同士で通信してみます。
wifi_scan では、参照可能な Wi-Fi アクセス ポイントのリストを取得します。
これまでと同様に母艦にはラズパイ4 Model B を使います。
改めてpico-sdkのインストールからやってみます。
picoディレクトリを作成し、そこにpico-sdkをクローンします。
1 2 3 4 5 6 7 8 9 |
sudo apt update sudo apt install -y build-essential cmake gcc-arm-none-eabi git curl mkdir ~/pico cd ~/pico git clone https://github.com/raspberrypi/pico-sdk cd pico-sdk git submodule update --init echo "export PICO_SDK_PATH=$HOME/pico/pico-sdk" >> ~/.bashrc . ~/.bashrc |
picoディレクトリにpico-examplesをインストールします。
1 2 3 4 5 6 |
cd ~/pico git clone https://github.com/raspberrypi/pico-examples.git --branch master cd pico-examples mkdir build cd build cmake .. |
ここでmake -j4 を実行すると全ソースが一挙にコンパイルされてuf2ファイルが生成されますが、めっぽう時間がかかります(といっても10分くらいですが)。
examples のサンプルを一通りやってみたい場合は実行してみてください。
ただmakeを実行してもここで眼目のpico_wのプロジェクトは生成されません。
makeは個別に実行します。
USBシリアルのモニタリングを有効にします。
現状のままでは、minicom などでシリアルポートをモニターしても何も見えません。
ソースのCMakeLists.txtを編集します。
wifi_scan
~/pico/pico-examples/pico_w/wifi/wifi_scan/CMakeLists.txtを開きます。
2行あるpico_add_extra_outputsの上に以下をそれぞれ追加します。
pico_enable_stdio_usb(picow_wifi_scan_background 1)
pico_enable_stdio_usb(picow_wifi_scan_poll 1)
tcp_server
~/pico/pico-examples/pico_w/wifi/tcp_server/CMakeLists.txtを編集。
pico_enable_stdio_usb(picow_tcpip_server_background 1)
pico_enable_stdio_usb(picow_tcpip_server_poll 1)
tcp_client
~/pico/pico-examples/pico_w/wifi/tcp_client/CMakeLists.txtを編集。
pico_enable_stdio_usb(picow_tcpip_client_background 1)
pico_enable_stdio_usb(picow_tcpip_client_poll 1)
wifi_scan
makeを実行します。
以下のSSIDとPASSWORD は個別の環境のもので書き換えてください。
実行
1 2 |
cd ~/pico/pico-examples/build cmake -DPICO_BOARD=pico_w -DWIFI_SSID="SSID" -DWIFI_PASSWORD="PASSWORD" .. |
これでwifi_scanをビルドできるようになります。
buildフォルダー内のwifi_scanに移動してmake実行
1 2 |
cd ~/pico/pico-examples/build/pico_w/wifi/wifi_scan make -j4 |
~/pico/pico-examples/build/pico_w/wifi/wifi_scanに以下のファイルが生成されています。
どちらを使ってもかまいません。
picow_wifi_scan_background.uf2
picow_wifi_scan_poll.uf2
picoのBOOTSELボタンを押しながらラズパイにUSBケーブルで接続してRPI-RP2フォルダーを開いてuf2をドラッグ・ドロップ。
minicomを使ってシリアルポートをモニターできます。
1 2 3 |
sudo apt install minicom -y minicom -b 115200 -o -D /dev/ttyACM0 |
こんな感じです。minicomを開いてしばらくすると、Wi-FiのAPがリストされます。
Pico 同士で通信してみます。
tcp_server
wifi_scanのところでSSIDとPASSWORDを使ったcmakeが実行されているので、後はmakeするだけです。
buildフォルダー内のtcp_serverに移動してmake。
1 2 |
cd ~/pico/pico-examples/build/pico_w/wifi/tcp_server make -j4 |
~/pico/pico-examples/build/pico_w/wifi/tcp_serverに以下のファイルが生成されています。
picow_tcpip_server_background.uf2
picow_tcpip_server_poll.uf2
RPI-RP2フォルダーを開いてuf2をドラッグ・ドロップ。
minicom で確認
tcp_client
serverと通信するので、serverのIPアドレスを使ってcmakeを実行しておく必要があります。
1 |
cd ~/pico/pico-examples/build |
SSIDとPASSWORDはご自分のものに変更。
IPアドレスもtcp_serverを起動して確認したものに変更してください。
cmake -DPICO_BOARD=pico_w -DWIFI_SSID="SSID" -DWIFI_PASSWORD="PASSWORD" -DTEST_TCP_SERVER_IP="192.168.0.25" ..
make実行
1 2 |
cd ~/pico/pico-examples/build/pico_w/wifi/tcp_client make -j4 |
~/pico/pico-examples/build/pico_w/wifi/tcp_clientに以下のファイルが生成されています。
picow_tcpip_client_background.uf2
picow_tcpip_client_poll.uf2
RPI-RP2フォルダーを開いてuf2をドラッグ・ドロップ。
serverをモニターしているminicom を見てみます。Clientとの通信結果が表示されています。イテレーションの変数に10がセットされているので、同じものが10回繰り返されています。
Writing 2048 bytes to client
tcp_server_sent 1460
tcp_server_sent 588
Waiting for buffer from client
tcp_server_recv 1460/0 err 0
tcp_server_recv 588/1460 err 0
tcp_server_recv buffer ok
Appendix
その他のexamples
uf2ファイルの作成の仕方は上記と同じです。
ntp_server
Pico は内部に時計を持っていないのでそのままでは現在時刻を知ることはできません。
Pico W は通信チップを持っているので外部の時刻同期サーバに接続すれば現在時を知ることができます。
こんな感じです。時刻同期サーバが pool.ntp.org なので時刻は+9 することが必要です。
udp_beacon
udpポートに信号をブロードキャストします。端末側でポートを開けて待っていればメッセージを受信します。
受信コード(Python)
ポート番号:4444
【udp_receive.py】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import socket UDP_PORT = 4444 # create a UDP socket sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # bind the socket to a specific port sock.bind(('0.0.0.0', UDP_PORT)) # continuously receive packets while True: data, addr = sock.recvfrom(1024) # receive up to 1024 bytes print(f"Received packet from {addr}: {data.decode()}") |
Pico W でudp_beaconを実行、パケットを送信します。
端末で受信実行
1 |
python3 udp_receive.py |
iperf
使用可能なネットワーク帯域幅を知ることができるそうですが……使い方が分かりませんでした。
以上です。
Pi Pico W でWi-Fi 通信をやってみる(1) – Server-Client (メモ)
Leave a Reply