树莓派Pico W开发板是树莓派基金会于2022年6月底推出的一款无线WiFi开发板,它支持C/C++和MicroPython编程。本文介绍树莓派Pico W无线WiFi开发板的使用方法及MicroPython编程示例,包括树莓派Pico W开发板板载LED使用及控制编程示例,Pico W开发板用作WiFi无线HTTP网络服务器的MicroPython编程示例。
1、树莓派Pico W无线WiFi开发板简介
树莓派Pico W无线WiFi开发板是在树莓派Pico基础上,添加了无线通讯功能模块,无线模块硬件采用了英飞凌CYW43439无线芯片,支持WiFi 4无线网络,给无线网络控制和通信相关的嵌入式系统与智能硬件应用开发提供了极大的方便。
Pico W开发板主要功能特性有:
•采用树莓派官方自主设计的RP2040 MCU芯片;
•搭载双核ARM Cortex M0+处理器,运行频率高达133MHz(灵活时钟);
•采用英飞凌CYW43439线芯片,支持WiFi 4无线网络;
•内置264KB的SRAM和2MB片上Flash;
•邮票孔设计,可直接焊接集成到用户自主设计的PCB底板上;
•USB1.1主机和设备支持;
•支持低功耗睡眠和休眠模式;
•可通过USB接口识别海量存储器进行拖放式程序下载;
•多达26个多功能GPIO引脚;
•2个SPI,2个I2C,2个UART,3个12位ADC,16个程控PWM通道;
•精确的片上时钟和定时器;
•温度传感器;
•片上加速浮点库;
•8个可编程I/O(PIO)状态机,用于支持自定义外设。
2、下载Pico W开发板MicroPython固件
可从网址https://datasheets.raspberrypi.com/soft/micropython-firmware-pico-w-290622.uf2直接下载Pico W开发板UF2格式MicroPython固件文件,也可从网址https://www.raspberrypi.com/documentation/microcontrollers/micropython.html或https://micropython.org/download/rp2-pico-w下载Pico W开发板最新版本UF2格式MicroPython固件文件。
3、安装MicroPython固件到Pico W开发板
找到Pico W开发板的[BOOTSEL]按钮,将连接PC机与Pico W的USB-Micro USB电缆线Micro USB接头插入Pico W开发板,如图1所示。按住[BOOTSEL]按钮并保持,然后将USB-Micro USB电缆线USB接头插入PC机USB接口,即通过USB接口将Pico W开发板连接到已开机的电脑,稍后松开Pico W开发板的[BOOTSEL]按钮。此时,Pico W开发板进入USB海量存储工作模式(USB mass storage device mode),说得通俗一点,此时,Pico W开发板就相当于是一个U盘,它会显示一个名为RPI-RP2的盘符和两个文件。将刚下载好的micropython-firmware-pico-w-290622.uf2固件文件拖拽到(或复制到)RPI-RP2所在盘中,Pico W开发板MicroPython固件安装成功,Pico W重新启动进入虚拟串口终端工作模式。
图1
4、安装Thonny IDE
Thonny IDE支持Windows、Mac、Linux操作系统,可从Thonny官方网站https://thonny.org下载最新版Thonny IDE,如图2所示。这里下载Windows版Thonny并安装到PC机。
图2
5、使用Thonny IDE设置Pico W开发板MicroPython编程环境
运行Thonny,单击菜单栏的[Tools],选择[Options…],弹出[Thonny Options]对话框,选择【Which interpreter or device should Thonny use for running your code?】下拉列表中的[MicroPython(Raspberry Pi Pico)]选项,如图3所示。如果没有发现[MicroPython(Raspberry Pi Pico)]选项,那么请检查PC机是否连接了Pico W开发板。
图3
选择【Port】下拉列表,本人笔记本电脑连接Pico W开发板设备后,其设备名称是[USB串行设备(COM24)],如图4所示。
图4
6、使用Thonny Shell输入MicroPython命令点亮Pico W开发板板载LED
与树莓派Pico开发板板载LED通过470Ω贴片电阻直接连接到RP2040 MCU芯片的GPIO25(GP25)引脚不同,树莓派Pico W开发板板载LED没有连接到RP2040 MCU芯片引脚,而是连到无线芯片的GPIO引脚。树莓派Pico W开发板MicroPython固件针对GPIO引脚的变化、新增WiFi无线连接等功能做了修改。
运行Thonny,在Thonny IDE开发环境MicroPython Shell命令行下,控制树莓派Pico W板载LED的亮/灭基本语句如下:
>>> import machine
>>> onboard_led = machine.Pin("LED", machine.Pin.OUT)
>>> onboard_led.value(1) # Pico W板载LED点亮
>>> onboard_led.value(0) # Pico W板载LED熄灭
>>> onboard_led.on() # Pico W板载LED点亮
>>> onboard_led.off() # Pico W板载LED熄灭
若查看Pico W板载LED对象onboard_led,可直接输入onboard_led:
>>> onboard_led
此时,Thonny Shell显示:
Pin(WL_GPIO0, mode=OUT)
以上MicroPython命令操作界面执行情况如图5所示。
图5
我们也可以执行如下命令:
>>> onboard_led = machine.Pin("LED", machine.Pin.OUT, value=1)
该命令将配置Pico W板载lED对象onboard_led,并将该对象与Pico W板载LED关联并点亮板载LED。
7、控制Pico W开发板板载LED闪烁MicroPython程序示例
Pico W板载LED闪烁程序清单如下:
# Filename: pico_w_onboard_led.py
import time
def onboard_led_blink():
led = machine.Pin('LED', machine.Pin.OUT)
led.on()
time.sleep(.5)
led.off()
time.sleep(.5)
while True:
onboard_led_blink()
在Thonny IDE编辑窗口录入以上程序,顺序点击[File]→[Save as…]→[Raspberry Pi Pico]将程序以文件名“pico_w_onboard_led.py”存储到Pico W开发板,如图6所示。点击Thonny中的播放按钮运行程序,此时可看到Pico W板载LED间断闪亮。
图6
8、Pico W开发板用作WiFi无线HTTP网络服务器MicroPython编程示例
这里将Pico W开发板用作WiFi无线HTTP网络服务器,我们在任意一台电脑或手机的浏览器输入Pico W开发板的IP地址打开index.html网页。当点击网页中的[1]/[0]按钮时即可WiFi无线控制Pico W开发板板载LED的亮/灭。
下面分别编写main.py程序文件、index.html网页文件。
(1)main.py程序文件清单
# Filename: main.py
# Raspberry Pi Pico W
# 导入Pico W MicroPython模块
import rp2 # 导入rp2模块,该模块包含专门用于RP2040的函数和类
import network # 导入network模块,用于连接WiFi
import ubinascii # 导入ubinascii模块,用于将MAC地址转换为十六进制字符串
import machine # 导入machine模块,用于GPIO控制
import urequests as requests # 导入urequests模块,用于HTTP请求
import time # 导入time模块,用于延时
import socket # # 导入socket模块,用于建立套接字
# 设置国家/地区代码以避免发生可能的错误
# CN/US/DE/DK/GB/JP(国家或地区代码:中国/美国/德国/丹麦/英国/日本)
rp2.country('CN') # 这里设置Pico W的国家/地区代码为中国
wlan = network.WLAN(network.STA_IF) # 创建WLAN连接对象
wlan.active(True) # 激活WLAN接口
# 查看Pico W开发板无线WiFi的MAC地址
# 获取MAC地址,并将其转换为十六进制字符串
mac = ubinascii.hexlify(network.WLAN().config('mac'),':').decode()
print('Pico W MAC地址=' + mac) # 显示Pico W开发板十六进制MAC地址
ssid = '所使用的WiFi名称' # 设置WiFi名称 (ssid: service set identifier)
psw = '所使用的WiFi密码' # 设置WiFi密码
wlan.connect(ssid, psw) # 连接到WiFi网络
timeout = 10 # 设置最长等待连接时间为10秒
while timeout > 0:
if wlan.status() < 0 or wlan.status() >= 3: # 如果WiFi连接成功或者失败
break # 跳出循环
timeout -= 1
print('等待连接!')
time.sleep(1) # 延时1秒
# 定义Pico W板载LED闪亮函数
def onboard_led_blink(blink_numbers):
onboard_led = machine.Pin('LED', machine.Pin.OUT) # 创建GPIO控制对象
for i in range(blink_numbers):
onboard_led.value(1) # 点亮LED
# onboard_led.on() # 另一种点亮LED的方法
time.sleep(0.5)
onboard_led.value(0) # 熄灭LED
# onboard_led.off() # 另一种熄灭LED的方法
time.sleep(0.5)
wlan_status = wlan.status() # 获取当前WiFi连接状态
onboard_led_blink(wlan_status) # 根据WiFi连接状态控制LED
# 处理连接错误
if wlan_status != 3: # 如果WiFi连接失败
raise RuntimeError('WiFi连接失败!') # 抛出异常
else:
print('WiFi已连接...')
status = wlan.ifconfig() # 获取WiFi接口配置信息
print('IP地址=' + status[0]) # 输出IP地址
# 定义加载HTML页面函数
def get_html(html_name):
with open(html_name, 'r') as file: # 打开HTML文件
html = file.read() # 读取HTML内容
return html
# 打开HTTP Web服务器套接字socket
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1] # 获取IP地址和端口号
s = socket.socket() # 创建socket对象
s.bind(addr) # 绑定socket到IP地址和端口号
# 开始监听端口号,最多只允许1个客户端连接
s.listen(1)
print('正在监听', addr)
onboard_led = machine.Pin('LED', machine.Pin.OUT)
# 进入循环,监听连接
while True:
try:
# 接受客户端连接,获取连接和地址
cl, addr = s.accept()
print('客户机连接来自', addr)
# 接收客户端请求消息
r = cl.recv(1024)
r = str(r)
# 在请求消息中查找是否有开/关LED的命令
onboard_led_on = r.find('?onboard_led=1')
onboard_led_off = r.find('?onboard_led=0')
print('LED=', onboard_led_on)
print('LED=', onboard_led_off)
# 若找到'?onboard_led=1',则开LED
if onboard_led_on > -1:
print('开LED')
onboard_led.value(1)
# 若找到'?onboard_led=0',则关LED
if onboard_led_off > -1:
print('关LED')
onboard_led.value(0)
# 获取HTML文件内容
response = get_html('index.html')
# 发送HTTP响应头
cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
# 发送HTML文件内容
cl.send(response)
# 关闭客户端套接字
cl.close()
# 若发生OSError错误,则关闭客户端套接字并输出相关信息
except OSError as e:
cl.close()
print('关闭连接')
在main.py程序中,ssid = '所使用的WiFi名称’要用具体的WiFi名称替换,psw = '所使用的WiFi密码’要用相应的密码替换。由于本程序代码已给出了详细注释,这里不再作进一步解释。
(2)index.html网页文件清单
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>树莓派Pico W开发板</title>
</head>
<body>
<h3>树莓派Pico W</h3>
<p>控制板载LED亮灭</p>
<a href=\"?onboard_led=1\"><button>1</button></a>
<a href=\"?onboard_led=0\"><button>0</button></a>
</body>
</html>
复制粘贴上面的main.py程序和index.html文件内容,并用相同的文件名分别存到Pico W开发板,如图7所示。
图7
运行Pico W开发板中的main.py程序后,在Thonny Shell窗口显示情况如图8所示。
图8
从图8可知,这里的Pico W开发板用作WiFi无线HTTP网络服务器的IP地址为192.168.1.12。现用一台笔记本电脑打开浏览器,在浏览器地址栏输入IP地址192.168.1.12,将显示index.html网页。在网页中,当点击[1]按钮(标红色框的按钮)时(图9所示),Pico W开发板板载LED被点亮(图10)。点击[0]按钮时,Pico W开发板板载LED熄灭。
图9
图10
打开手机浏览器,在地址栏输入IP地址192.168.1.12,同样可以实现WiFi无线控制Pico W板载LED的亮灭。
若Pico W开发板无法正常连接WiFi,可按下面几条进行处理:
(1)查看使用的SSID和密码是否正确;
(2)如果使用学校或工作场所的WLAN,未经授权的设备可能无法访问WiFi;
(3)如果Pico W开发板WiFi连接一次不成功,可尝试再次连接WiFi。
最后,我们还可以拔下Pico W开发板USB-Micro USB电缆线连接到电脑端的USB插头,断开Pico W开发板与电脑之间的连接。将Pico W开发板USB-Micro USB电缆线接电脑端的USB插头转接到一个5V USB直流电源(如使用Samsung 5V手机USB充电器电源)。此时,Pico W开发板将作为HTTP网络服务器独立运行。