树莓派Pico W无线WiFi开发板使用方法及MicroPython编程实践
树莓派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 -= 1print('等待连接!')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',则开LEDif onboard_led_on > -1:print('开LED')onboard_led.value(1)# 若找到'?onboard_led=0',则关LEDif 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网络服务器独立运行。
相关文章:
树莓派Pico W无线WiFi开发板使用方法及MicroPython编程实践
树莓派Pico W开发板是树莓派基金会于2022年6月底推出的一款无线WiFi开发板,它支持C/C和MicroPython编程。本文介绍树莓派Pico W无线WiFi开发板的使用方法及MicroPython编程示例,包括树莓派Pico W开发板板载LED使用及控制编程示例,Pico W开发板…...
Redis学习【11】之分布式系统
文章目录一 数据分区算法1.1 顺序分区1.1.1 轮询分区算法1.1.2 时间片轮转分区算法1.1.3 数据块分区算法1.1.4 业务主题分区算法1.2 哈希分区1.2.1 节点取模分区算法1.2.2 一致性哈希分区算法1.2.3 虚拟槽分区算法二 分布式系统环境搭建与运行2.1 系统搭建2.1.1 系统架构2.1.2 …...
光速c数列的猜想:光猜
光速c数列的猜想:光猜 2023-03-05 10:26:30 猜测:不同的宇宙光速c并不同 分成等级数列c0,c1,c2,...cn... 地球所处宇宙的真空光速c为c1,其中c0或许假设为光在纯水中速度乎 亦有可能仅有六级对应六道。 宇宙外,容器外也,超过光速c1,为光速c2,可看到容器…...
2023年全国最新交安安全员精选真题及答案12
百分百题库提供交安安全员考试试题、交安安全员考试预测题、交安安全员考试真题、交安安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 21.作业场所监督检查是安全生产监督管理的一种重要形式,作业场所监督…...
2023年全国最新安全员精选真题及答案14
百分百题库提供安全员考试试题、建筑安全员考试预测题、建筑安全员ABC考试真题、安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 81.(单选题)正常工作状态下,高处作业吊篮悬挂机构抗…...
让Vue响应Map或Set的变化操作,在vue中响应map和set数据结构,计算属性的用法,计算属性特点
明确一点 vue的响应式系统不支持Map和Set,也就是说,当Map与Set里面的元素变化时Vue追踪不到这些变化,因此无法做出响应。 如下demo其实是不会进行数据相应的 <h1 v-for"(item,index) in mySetAsList" :key"index"&…...
Unable to find a valid cuDNN algorithm to run convolution
Unable to find a valid cuDNN algorithm to run convolution 今天在复习HumanNerf的时候发现了这个报错, import torch print(torch.cuda.is_available()) 使用上面的代码发现GPU是可以用的,可自己的torch版本对应。 后面继续看帖子,总结有…...
Linux 进程:进程退出返回值的获取
目录一、对输出参数status的理解二、获取进程退出返回值1.位运算(1)异常退出码(2)进程返回值2.宏函数我们常使用函数 wait 和 waitpid 来执行进程等待的功能:处理退出的子进程并释放资源,防止子进程变成僵尸进程。而这两个函数都有一个输出参数status&am…...
JavaScript核心高级内容复习1
本节概述 数据类型的分类和判断 基本(值)类型 Number ----- 任意数值 -------- typeofString ----- 任意字符串 ------ typeofBoolean ---- true/false ----- typeofundefined — undefined ----- typeof/null -------- null ---------- 对象(引用)类型 Object ----- typeof…...
2D图像处理:Qt + Opencv使用光度立体法检测Halcon中提供的缺陷图像
文章目录 不需知道光源方向一、光度立体法(后续有时间在查资料研究)1.1 问题1:Slants和Tilts的理解(暂时是理解的)1.2 问题1:Gradient通道数为1,为何像素点对应的值会有两个?1.3 问题2:F(r,c)=(u(r,c),v(r,c)) 关于高斯曲率和平均曲率如何计算的?二、非标定光源实现光…...
怎样用sql去查一个订单表中一个店铺一段时间的营业收入的环比
一:思路 要查询一个订单表中一个店铺一段时间的营业收入的环比,可以按照以下步骤进行操作: 使用SELECT语句选择需要的数据列,如订单日期和订单金额,以及店铺名称列。 使用WHERE语句过滤出指定店铺和时间段的订单数据…...
SpringSecurity: 默认添加的15个Filter是怎么添加进去的?
总的流程分为两部分,一是先用Map把configurer收集起来,然后再把maper中所有的configurer应用到HttpSecurity对象。 其中的map位于AbstractConfiguredSecurityBuilder这个类。 private final LinkedHashMap<Class<? extends SecurityConfigurer&l…...
学习记录---latent code 潜在编码
文章目录参考文献1. 什么是潜在编码?2.什么是潜在空间?3.同类潜在编码的相似性4.潜在编码的应用4.1 Antoencoders4.2 Generative models5.结论个人学习总结,持续更新中……参考文献 [1] 快速理解深度学习中的latent code潜在编码 1. 什么是…...
Cesium三维数据格式以及生产流程详解(glb,osgb,obj,bim,ifc)等
最近收到私信问我在cesium上展示的一些三维数据是如何生产和处理的,这篇文章就给大家一次性讲个透彻。 首先我们来做做分类。市面上能接触到的,常见的,cesium上支持展示的三维数据大致分为以下几种: 1.倾斜摄影(osgb,obj) 2.点云数据(las,pts) 3.手工模型(gltf,…...
2023年备考信息安全工程师每日知识点(1)
信息安全工程师在软考中属于中级认证,难度尚可,如果从今天开始学的话,肯定来得及 作者简介: 吉林师范大学网络空间安全的一名普通的大一学生已于2022年拿到华为阿里腾讯三家认证吉师信网中心的一名可怜打工人华为MindSpore截至目…...
Unity记录3.1-地图-TileMap简单使用、鼠标拖动放置Tile
文章首发及后续更新:https://mwhls.top/4456.html,无图/无目录/格式错误/更多相关请至首发页查看。 新的更新内容请到mwhls.top查看。 欢迎提出任何疑问及批评,非常感谢! 汇总:Unity 记录 上章的课程接下来是巡逻的敌人…...
Decoupled Knowledge Distillation(CVPR 2022)原理与代码解析
paper:Decoupled Knowledge Distillationcode:https://github.com/megvii-research/mdistiller/blob/master/mdistiller/distillers/DKD.py背景与基于响应logits-based的蒸馏方法相比,基于特征feature-based的蒸馏方法在各种任务上的表现更好…...
IronWebScraper 2023.2.2 Crack
关于 .NET 的 IronWebScraper 用于从 HTML Web 应用程序中提取干净的结构化数据的 C# 框架。 IronWebScraper for .NET 是一个 C# 网络抓取库,它允许开发人员模拟和自动化人类浏览行为,以从 Web 应用程序中提取内容、文件和图像作为本机 .NET 对象。Iron…...
【2.1 golong中条件语句if】
1. 条件语句if 1.1.1. Go 语言条件语句: 条件语句需要开发者通过指定一个或多个条件,并通过测试条件是否为 true 来决定是否执行指定语句,并在条件为 false 的情况在执行另外的语句。 Go 语言提供了以下几种条件判断语句: 1.1…...
Scala编程(第四版)
Scala编程可伸缩的语言面向对象与函数式编程Scala优势Scala是兼容的可伸缩的语言 1、适合构建将java组件组装在一起的脚本 2、用于编写可复用组件,并讲这些组件构建成大型框架 Scala是一门综合面向对象和函数式编程概念的静态类型编程语言 面向对象与函数式编程 面…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
