在树莓派Pico W 板上初步使用WiFi

原文链接:Getting started with WiFi on Raspberry Pi Pico W board 由Jean-Luc Aufranc撰写。
本文共计 6298 字,预计阅读 12 分钟

不久前 Raspberry Pi Trading 推出了树莓派 Pico W开发板,该板与原始的树莓派 Pico 开发板拥有基本相同的设计。它们都带有 RP2040 双核 Cortex-M0+ 微控制器,比较不同的是 Pico W 增加了一个带 WiFi 4 和蓝牙 LE 5.2 的无线模块,虽然目前其蓝牙 LE 5.2 并未在板上启用,但未来可能就会开放了。

最近该公司给我寄一个树莓派 Pico W用来评测,本文我会集中精力测一下它 WiFi 相关的内容,因为树莓派 Pico W 支持与树莓派 Pico 板相同的 MicroPython  C/C++ SDK,还有用于无线连接的其他 API。

树莓派 Pico W 拆箱

树莓派Pico W 开发板及附件
树莓派Pico W 开发板及附件

我收到的这块板子是从一个 480 单元的卷盘上剪下来的。此外,我还收到了一根 1 米长的微型 USB 转 USB 数据线。注意,如果你只订购了 6 美元的开发板,默认情况下是不包含数据线的。

树莓派Pico W 板
树莓派Pico W 板

就像它的前身一样,其电路板很小,而且引脚排列与第一块 RP2040 板相同,他们在板的底部也有清楚的标记。

树莓派Pico W的PCB
树莓派Pico W的PCB

树莓派 Pico W 连接到计算机

将树莓派 Pico W 连接到计算机上
将树莓派 Pico W 连接到计算机上

一旦我们将开发板连接到主机,它就会在计算机中显示为 RPI-RP2 驱动器。我的笔记本电脑虽然运行的是 Ubuntu 20.04,但它与在 Windows 或 macOS 上运行是一样的。

RPI-RP2 驱动器文件
RPI-RP2 驱动器文件

RPI-RP2 驱动器中有两个文件包含了 UF2 引导加载程序版本和板子型号的 INFO_UF2.txt 和 重定向到树莓派网站Pico 文档INDEX.HTM 。所以这里其实没有任何改变。

以下是其内核日志的输出,仅供参考:

带有 MicroPython 的 WiFi

树莓派 Pico 和 Pico W 共享相同的引导加载程序,但两者的 MicroPython 固件不同。我想可能是由于小的硬件差异,比如:用户 LED的连线;也可能是因为将 WiFi 栈添加到树莓派 Pico 上并没有什么意义,因为Pico上并没有WiFi,如果添加可能会浪费 Pico 上资源有限微控制器的宝贵存储和内存。

我们可以在树莓派网站上找到正确的固件文件,或者也可以直接下载它,如下所示:


下载完成后,只需要将 rp2-pico-w-latest.uf2 复制到 RPI-RP2 驱动器上就可以了。

复制固件到 RPI-RP2 驱动器
复制固件到 RPI-RP2 驱动器

复制完成后,快驱动器就消失了。树莓派 Pico W 现在将会显示为串口设备:


BootTerm 或 Putty、minicom、tio 等其他工具中也可以检测到树莓派 Pico W :


如果我们连接到串行设备中,就会进入一个 REPL 界面,现在我们可以在其中键入一些命令来列出 2.4 GHz 接入点:


很棒!这样操作是有用的。因为我住在农村,所以只检测到一个可见的接入点。另一个值 (”)是我的小米路由器上开启的隐藏 SSID。根据MicroPython API 文档来看,其他五个值应该分别是用于 bssid、通道号、RSSI、authmode 和隐藏状态的,但最后两个数字则超出了范围:

安全性有五个值:

  • 0 – 打开
  • 1 – WEP
  • 2 – WPA-PSK
  • 3 – WPA2-PSK
  • 4 – WPA/WPA2-PSK

两个隐藏状态

  • 0 – 可见
  • 1 – 隐藏

接下来更进一步,我们来查看该板连接到 Internet指导文档。更新代码最简单方法是先安装 Thonny 编辑器:


在运行—选择解释器选择“MicroPython (Raspberry Pi Pico)”后,我们就可以毫无问题地在 Thonny IDE 中运行之前的 MicroPython 程序了。

在 Thonny IDE 中编写的树莓派 Pico W示例
在 Thonny IDE 中编写的树莓派 Pico W示例

现在我们使用以下程序连接到 CNX_Software_Xiaomi SSID:


连接到 CNX_Software_Xiaomi SSID
连接到 CNX_Software_Xiaomi SSID

由上可以看到我的树莓派 Pico W 获得了一个 IP 地址,我可以 ping 通它:


作为参考,我们可以看到它在网络上显示为 PYPB:


其固件附带安全的全局设置,但用户是可以通过设置国家和地区的方式来启用额外的频道:


如果你们遇到因通道不可用而无法连接到路由器的开发板,别着急,这其实也特别有用。

这种类型的板有一个很典型的用例就是具有控制 LED 或 GPIO 的 Web 界面。现在我们运行一个 Web 服务器来控制板上的用户 LED:


代码有点长,因为它还包含一些错误处理。通过观看这个简短的演示视频中,我们其实也能看出它运行良好。相关视频链接,点击此处可查看

在这里通过修改代码我们可以轻松控制继电器或 GPIO。还可以在树莓派 Pico W 上安装和运行流行的 iperf3 工具:


代码很短,因为我们跳过了连接的错误处理。无论如何,我们总算得到了网络基准测试的输出:


这个速度对我来说其实相当慢了,尽管有些性能并不不是这种平台的核心要求。其实这个基准测试它也可能是此类硬件上的典型代表。作为参考,MicroPython 的主要开发人员 Damien George 在 Pyboard D 系列板上对其进行了测试,得到的测试结果达到了大约 7 Mbits/sec。

其实树莓派 Pico W 也可以用作最多四个客户端的接入点。我在 MicroPython 中暂时没有找到任何教程,但 ESP8266 和 ESP32 有相关说明,所以现在我们尝试设置以下 CNX-PICO SSID 并从手机连接:


操作之后,好消息是我的树莓派 Pico W 现在确实是一个接入点(AP),但不太好的是自定义 ssid 配置并不起作用,反而是板子会自动生成一个开放网络的接入点名称 — PICO349B。

可作为 AP 的树莓派 Pico W
可作为 AP 的树莓派 Pico W

因此要么是 API 不同,要么是树莓派 Pico W MicroPython 固件暂时还不支持自定义接入点名称。

通过 C 编程在树莓派 Pico W 上使用 WiFi

现在我们尝试使用 C/C++ SDK 重现以下上面的代码示例。如果你们没这么尝试过,那么就需要像我们为树莓派 Pico 板所做的那样设置一下 SDK,并在一个 Linux 计算机或树莓派板上获取该示例:


现在我们得到了一个 Pico W 的新目录:


这是 WiFi 扫描的示例代码:


这比我们上面的 MicroPython 示例要复杂一些。现在我们准备系统来构建 C 示例:


很显然,在这里我们需要更改 SSID 和密码用来匹配网络中的密码,以下是该命令的输出,仅供参考:


我们现在可以构建 wifi_scan 示例了:


输出相当长,但基本应该都是按照如下方式开始和结束的:


该构建将会生成一堆文件,其中也包括了我们要用来复制到板上的 UF2 文件:


由于我们已经在开发板上安装了 MicroPython 固件,现在我们需要按下 BOOT 按钮并重启开发板,从而进入大容量存储模式、并将picow_wifi_scan_poll.uf2文件复制到 RPI-RP2 驱动器。

将picow_wifi_scan_poll.uf2文件复制到 RPI-RP2 驱动器
将picow_wifi_scan_poll.uf2文件复制到 RPI-RP2 驱动器

在这里驱动器会直接消失,然后需要重新启动并自动启动程序,而且我还注意到该开发板已经不再显示为串口设备了。主要的原因是我们需要通过树莓派Pico W 的 UART 引脚(引脚 1 Tx、引脚 2 Rx 和引脚 3 GND)访问串行控制台。因此,我在树莓派Pico W 上的相关引脚上焊接了一个短接头,并使用 USB 转 TTL 板连接到我的笔记本电脑,但如果你们使用的是树莓派SBC 对 Pico W 板进行编程,可以把 UART改为 40 针 GPIO 接头。

树莓派 Pico W 的 UART串口引脚连接到 PC
树莓派 Pico W 的 UART串口引脚连接到 PC

现在我可以使用 BootTerm 、而且可以正确检测到 CNX_Software_Xiaomi SSID 和路由器中的隐藏 SSID:


所以扫描是有效的,虽然它多次显示相同的 SSID。现在我们可以尝试使用wifi_connect/wifi_connect.c中的以下示例(示例来自 Pico W 文档)连接到我们的 WiFi 路由器:


这里只需要确保更改 ssid 、传递值,以及国家和地区(比如:CYW43_COUNTRY_TH) 。接着我们还需要一个CMakeLists.txt文件:


对了,还需要将一些额外的文件复制到工作目录中:


现在你们应该会得到有四个文件的文件夹:


现在就可以像以前一样构建程序了:


如果在 cmake 步骤中出现问题,只需要更正 CMakeLists.txt 文件并删除 build 文件夹中的所有文件,然后再次运行 cmake 命令就可以了。

因为我在泰国,所以最初以为 CYW43_COUNTRY_TH 就可以。然而结果却报错了!!!


如果你们也遇到了这种问题,pico-sdk/lib/cyw43-driver/src/cyw43_country.h 中提供了可用的国家/地区目录。下面是一个摘录,可以查看了解:


我改用 CYW43_COUNTRY_THAILAND 之后就能完成构建了。我们所需的 UF2 文件如下所示:


现在我们用通常的方法把它刷到板子上,看看我们是否真的可以连接到路由器:


这里并没有打印太多信息,但至少程序运行没有错误。如果想要在树莓派Pico W 上使用 C 语言其实需要一段时间的学习,包括学习新的 CYW43 API、LWiP 库,甚至使用 FreeRTOS 来获得更复杂的示例。

因为目前没有通过一个网页来控制 LED 的示例代码,所以我们还是先来查看一下 iperf的 示例。我们先进入 /pico-examples/build/pico_w/iperf文件夹,并构建示例:


在这种情况下,我们有两个 UF2 文件:


我们要查看通过 PICO_CYW43_ARCH_POLL 选择的代码:

  1. PICO_CYW43_ARCH_POLL = 1 –如果使用 pico_cyw43_arch_poll,那么必须从主循环(而不是计时器)定期轮询,从而来检查需要完成的 WiFi 驱动程序或 lwIP 工作
  2. PICO_CYW43_ARCH_POLL != 1 – 如果不使用 pico_cyw43_arch_poll,则 需要 WiFI 驱动程序和 lwIP 工作通过后台中断的方式来完成。当然这个睡眠只是一些例子

使用轮询或中断程序流是两种不同的编程方法。中断程序流通常更有效,但更复杂。这里我只是将picow_iperf_server_background.uf2复制到板上进行了测试。注意,该实现要基于 iperf2,而不是像 MicroPython 示例那样基于 iperf3。如下所示,iperf 服务器可以在树莓派 Pico W 上运行:


现在我们在笔记本电脑上运行 iperf 客户端:


运行得到的结果是 8 Mbps,比使用 MicroPython 运行时要好一点,但仍然在同一个范围内。其结果也显示在了 Pico W 串口控制台中:


如果你们想要在 Pico W 上以客户端的方式运行 iperf 示例,就需要在标题后添加以下两行:


这个“入门指南”感觉越写越长了,比我最初预期的要更多,所以这部分我直接跳过了。

现在,我们使用树莓派 Pico W 的接入点演示来完成 WiFi 教程。在构建示例之前,要先查看pico-examples/pico_w/access_point/picow_access_point.c 中的代码:


在 main() 函数中,这部分我们可以看到默认的 SSID(接入点name0 是 picow_test,密码是 password(WPA2安全),子网是192.168.4.0,这个程序还会启动 DHCP 服务器,让客户端获取 IP 地址,如果设置密码为 NULL,应该就是一个开放网络,因此我把ap_name改成picow_cnxsoft,密码改成了 123456。


现在像往常一样构建示例,并将picow_access_point_poll.uf2picow_access_point_background.uf2复制到板上。下面就是其终端输出:


注意端口 80 上的服务器不是 Web 服务器,而是一个基本的 TCP 服务器,我认为它主要应该是为了与安装在另一个树莓派 Pico 上的 TCP 客户端示例一起使用的。

不过,我也可以将手机连接到 picow_cnxsoft 接入点中。

树莓派 Pico W 的 Android客户端接入点
树莓派 Pico W 的 Android客户端接入点

也可以在我的 Ubuntu 笔记本电脑中接入

ubuntu电脑连接到接入点
ubuntu电脑连接到接入点

这两款设备也出现在了树莓派 Pico W 的串口终端中:


树莓派 Pico W 的文档对于 WiFi 入门来说其实还是不错的,但不一定完整,比如目前还没有在 MicroPython 中设置接入点的示例代码。又比如我必须要查看 C/C++ SDK 中的代码,而不是文档,才能找到对应国家和地区的设置。不过,我觉得大多数人在该开发板上首先使用的还会是 MicroPython,因为 C/C++ SDK 虽然更灵活,但学习难度和学习时长也会大很多。

分享这篇文章
订阅评论
提醒
0 评论
内联反馈
查看所有评论