树莓派Pico W无线开发板UDP协议MicroPython网络编程实践
树莓派Pico W无线开发板(简称Pico W)是树莓派基金会于2022年6月底推出的搭载无线通信芯片的树莓派Pico开发板。本文在介绍树莓派Pico W无线开发板接口信号和TCP/IP和UDP通信协议基础上,给出Pico W无线开发板的UDP协议MicroPython网络编程实例。
一、树莓派Pico W无线开发板
树莓派Pico W无线开发板(简称Pico W)是树莓派基金会于2022年6月底推出的搭载无线通信芯片的树莓派Pico开发板,主要技术规格如下:
•工作电压:1.8~5.5V;
•MCU:MCU采用树莓派基金会自研的RP2040芯片,该芯片內部包括32位双核ARM Cortex-M0+,运行时钟133MHz;
•SRAM大小:264KB;
•Flash存储器容量:2MB(QSPI接口);
•WiFi无线通信功能:2.4GHz 802.11n
•Bluetooth 5.2蓝牙通信功能:2023年2月已支持C程序蓝牙开发,暂不支持MicroPython开发;
•GPIO接口引脚:26个,包括3个模拟输入引脚、16个PWM通道;
•串行通信接口:2个UART、2个SPI控制器和2个I2C控制器;
•USB接口:内置USB 1.1控制器和PHY,支持主控端(host)和设备端(device);
•片内温度传感器:RP2040内置一个片内温度传感器(可用来测量RP2040芯片的温度,以便进行温度补偿或保护),可以通过ADC4读取片内温度传感器的值并转换为摄氏或华氏温度。
Pico W搭载英飞凌公司的AIROC CYW43439无线通信芯片,具备2.4GHz WiFi 4(802.11n,支持WPA3)和Bluetooth 5.2(目前可使用官方提供的SDK 1.5编写C蓝牙程序代码;暂不支持MicroPython蓝牙程序开发,官方后期会推出MicroPython蓝牙程序驱动支持),带板载天线。
二、树莓派Pico W无线开发板接口信号
Pico W的外观尺寸和接口信号引脚也跟Pico开发板一样,两侧各有20個接口信号引脚(如图1所示),这些引脚采用邮票孔设计,以方便下游厂商以表面粘着方式把Pico W开发板焊接到产品的主板。
Pico W无线开发板接口信号引脚说明如下:
•VSYS:2V~5V电源输入引脚。
•VBUS:从Micro USB接口获得的5V电源输出,可供电给需要5V电源的电子元件。
•3V3:3.3V电源,与Pico W的工作电压相同。
•3V3_EN:使能或禁止电源;使能或禁止Pico W以及3V3引脚的电源输出。
•RUN/RESET:启用或停用Pico∕重置,输入低电平将使Pico W停止运行。
•GP0-GP28:GPIO(通用输入/输出)引脚,板载LED与WL_GPIO0相连。
•ADC0 ~ ADC2:具备模拟输入功能的GPIO引脚,可当作模拟输入或数字输入/输出引脚。
•ADC_VREF:模数转换器(ADC)的参考电压输入。
•GND:模数转换器的接地引脚,与ADC_VREF引脚配合使用。
图1
特别说明的是,Pico W开发板板载LED引脚与Pico开发板接GPIO25不同,在MicroPython中,Pico W开发板板载LED引脚就叫做‘LED’或者‘WL_GPIO0’(均为字符串类型),例如,下面两行MicroPython语句都代表建立控制Pico W板载LED对象:
led = Pin(‘LED’, Pin.OUT)
或
led = Pin(‘WL_GPIO0’, Pin.OUT)
三、使用UDP协议无线控制Pico W板载LED灯的亮灭
Pico W开发板相较于Pico开发板,重点是是WiFi无线通信功能。使用MicroPython编写Pico W开发板WiFi无线通信相关应用,程序与ESP8266或ESP32的写法完全相同。
1、Pico W开发板连接WiFi无线网络
以下程序代码将Pico W开发板的WiFi设置为STA模式,连上指定的无线WiFi路由器并显示其IP地址:
# Filename: Pico_W_1.py
import network
ssid = '你的无线WiFi名称'
password = '你的无线WiFi密码'
wlan = network.WLAN(network.STA_IF) # 设为STA模式
wlan.active(True) # 启用网络
wlan.connect(ssid, password) # 连接网络AP
while not wlan.isconnected(): # 重复直到连上网络为止
pass
print('IP: ', wlan.ifconfig()[0]) # 显示Pico W开发板IP地址
ifconfig()用于设定或返回网络接口参数。连线成功后调用此方法,它将返回包含4个参数的4元组,依次代表Pico W开发板IP地址、子网掩码、网关地址和DNS服务器地址,如:(‘192.168.0.10’, ‘255.255.255.0’, ‘192.168.0.1’, ‘192.168.0.1’)。所示wlan.ifconfig()[0]將返回Pico W开发板的IP地址。
现将以上程序复制粘贴到Thonny IDE编辑器,再按下[F5]或点击[播放]按钮,稍后将在Thonny Shell窗口看到Pico W开发板分配到的IP地址(如图2所示)。
图2
2、使用Socket库
Socket库主要用于网络通信。UDP(用户数据报)和TCP/IP是通过网络发送和接收数据最常用的两种通信协议。TCP/IP是一种可靠的包含握手从而确保数据包传递到所需的目的地的可靠通信协议。而UDP不那么可靠但是一个快速的通信协议,可用于快速的无线网线控制。UDP和TCP/IP通信协议的比较如表1所示。
表1 TCP/IP和UDP通信协议的比较
基于UDP和TCP/IP通信协议的程序是基于服务器-客户机模式的,其中一个节点发送数据,另一个节点接收数据,反之亦然。数据通过端口传输,服务器和客户端必须使用相同的端口号。
关于UDP程序:UDP是一种无连接的通信协议,因此在将数据包发送到目的节点之前,不需要与目的节点建立连接。下面是服务器和客户机间的基本通信过程。
(1)服务器
•定义目的节点IP地址和端口号;
•构建数据包;
•创建socket套接字;
•将套接字绑定到本地端口;
•从客户端接收数据;
•向客户端发送数据;
•关闭连接。
(2)客户端
•定义目的节点IP地址和端口号;
•创建socket套接字;
•向服务器发送数据;
•从服务器接收数据;
•关闭连接。
注意:服务器和客户端都可以相互发送和接收数据包。
3、使用UDP协议无线控制Pico W板载LED的亮灭
(1)MicroPython程序清单(程序文件名:Pico_W_2.py)
# Filename: Pico_W_2.py
#----------------------------------------
# 使用UDP协议控制Pico W开发板板载LED的亮灭
#----------------------------------------
from machine import Pin
import network
import socket
import time
led = Pin('WL_GPIO0', Pin.OUT) # 板载LED连到WL_GPIO0
led.value(0) # 板载LED熄灭
# 定义连接WiFi函数
def connect():
global wlan
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("你的无线WiFi名称", "你的无线WiFi密码")
while wlan.isconnected() == False:
print("等待连接...")
time.sleep(1)
print("已连接...")
connect()
port = 5000
UDP = ("", port)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(UDP)
# 主循环
while True:
buf, addr = sock.recvfrom(1024)
if buf:
buf = buf.decode('utf-8')
if buf[0]=="D" and buf[1]=="O" and buf[2]=='N':
led.value(1)
if buf[0]=="D" and buf[1]=='O' and buf[2]=='F' and buf[3]=='F':
led.value(0)
本程序使用UDP通信协议控制Pico W开发板板载LED的亮灭(DON: 点亮LED灯;DOFF: 熄灭LED灯)。现对程序做了简要说明:
•导入相关模块,包括machine、network、socket和time。
•创建一个Pin对象led,将其设置为输出模式,并连接到WL_GPIO0引脚,它板载LED所连接的引脚。
•定义一个函数connect,用于连接WiFi网络。函数中创建一个WLAN对象wlan,并激活STA模式。然后使用wlan.connect方法连接到所使用的WiFi网络SSID和密码。使用while循环等待连接成功,并显示提示信息。
•调用connect函数,连接到WiFi网络。
•定义一个端口号port为5000,并创建一个元组UDP,包含空字符串和端口号。空字符串表示绑定到所有可用地址。
•创建一个socket对象sock,并指定使用IPv4协议和UDP协议。
•使用sock.bind方法将socket绑定到UDP元组指定的地址和端口上。
•进入主循环,不断接收来自客户端的数据包。使用sock.recvfrom方法接收最多1024字节的数据,并返回一个元组,包含数据buf和发送方地址addr。
•如果接收到数据,则将其解码为utf-8格式的字符串,并判断其内容。如果接收到的字符串以"DON"开头,则表示点亮Pico W板载LED灯,此时led对象被置为高电平(1)。如果字符串以"DOFF"开头,则表示熄灭Pico W板载LED灯,此时led对象被设置为低电平(0)。
关于MicroPython网络编程的相关技术文档,可以参考以下网站:
https://docs.micropython.org/en/latest/library/network.WLAN.html。
(2)使用Android手机客户端测试无线WiFi控制Pico W板载LED的亮灭
复制粘贴程序文件“pico_W_2.py”的内容到Thonny IDE,运行程序,若无线WiFi网络正确连接,Thonny Shell窗口将显示“已连接…”字符串。这里树莓派Pico W的IP地址为192.168.1.10(即与前面图2显示的IP地址相同)。
在使用Android智能手机测试之前,我们应在Android手机上安装一种UDP App程序,这里安装并使用UDP Terminal (可从https://apkpure.com/cn网站搜索UDP Terminal下载该UDP终端App程序),如图3所示。
图3
使用Android客户端测试无线WiFi控制Pico W板载LED亮灭的步骤如下:
•运行安装在Android手机的UDP Terminal程序;
•在UDP Terminal程序中,设置Pico W开发板的IP地址(这里为192.168.1.10),如图4所示。
图4
•单击[Start Terminal]按钮。
•在屏幕底部输入命令DON,然后单击[Send ASCII] (如图5所示), Pico W板载LED灯被点亮(如图6所示);若在屏幕底部输入命令DOFF,Pico W板载LED灯熄灭。
图5
图6
我们还可将图5的[Btn1]和[Btn2]按钮分别设置为“DON”和“DOFF”,在手机中直接点击[Btn1]和[Btn2]按钮远程无线控制Pico W板载LED灯的亮灭。
四、使用UDP协议无线控制获取Pico W开发板RP2040芯片片内温度传感器值
(1)MicroPython程序清单(程序文件名:Pico_W_3.py)
#----------------------------------------------------------、
# Filename: Pico_W_3.py
# Android手机远程读取Pico W无线开发板RP2040芯片片内温度传感器值
#------------------------------------------------------------
from machine import ADC
import network
import socket
import time
AnalogIn = ADC(4) # ADC4
Conv = 3300 / 65535 # Conversion factor
Conv = 3.3 / 65535 # Conversion factor
# 定义获取Pico W开发板RP2040芯片片内传感器温度值函数
def GetChipTemperature():
V = AnalogIn.read_u16()
V = V * Conv
Temp = 27 - (V - 0.706) / 0.001721
return Temp
# 定义连接WiFi无线网络
def connect():
global wlan
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("你的无线WiFi名称", "你的无线WiFi密码")
while wlan.isconnected() == False:
print("等待连接...")
time.sleep(1)
print("已连接...")
connect()
port = 5000
UDP = ("", port)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(UDP)
# 主循环
while True:
buf, addr = sock.recvfrom(1024)
if buf:
buf = buf.decode('utf-8')
if buf[0]=="G" and buf[1]== 'T':
T = GetChipTemperature()
Tstr = "T=" + str(T)[:5]
Tlen = len(Tstr)
sock.sendto(Tstr, addr)
(2)使用Android手机客户端测试获取Pico W开发板RP2040芯片片内温度传感器温度值
以上Pico_W_3.py程序使用UDP协议双向通信来接收和发送数据。
现Pico_W_3.py程序下载到Pico W并运行。当手机需要从Pico W开发板获取RP2040芯片片内温度传感器温度数据时,我们通过UDP Terminal输入“GT”命令以向Pico W开发板发送数据请求,Pico W便会将温度值显示在手机屏幕上(如图7所示)。
图7
需要说明的是,本文在手机客户端使用了UDP Terminal对Pico W开发板UDP无线通信程序进行了测试,我们还可开发专用手机UDP通信App程序或电脑UDP通信应用程序以满足实际应用需求。
发布日期:2023年3月19日