树莓派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日

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/1741.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python如何快速采集美~女视频?无反爬

人生苦短 我用python~ 这次康康能给大家整点好看的不~ 环境使用: Python 3.8 Pycharm mou歌浏览器 mou歌驱动 —> 驱动版本要和浏览器版本最相近 <大版本一样, 小版本最相近> 模块使用: requests >>> pip install requests selenium >>> pip …

Monkey Test简单介绍

什么是Monkey Test&#xff1f;顾名思义&#xff0c;就像一只猴子一样&#xff0c;它的下一步具有随机性。所以Monkey Test可以简单地理解为动作随机性测试&#xff01; Monkey是android模拟器或设备上运行的一个程序。它可以生成伪随机用户事件&#xff08;例如点击、触碰或滑…

树莓派(3B):启动流程,系统初始化配置,引脚图图示说明

目录 一&#xff0c;树莓派刷机及串口方式登陆 ① 准备工具 ② 操作步骤 二&#xff0c;配置树莓派接入网络 ① 树莓派入网 ② 固定树莓派的ip地址 三&#xff0c;网络SSH方式登陆树莓派 ① 打开树莓派SSH功能 ② 登陆SSH 四&#xff0c;用国内的源更新vim 五&…

【云原生|Docker】04-docker的资源限制

目录 前言 容器的生命周期 1. 容器的启动过程 2. 容器的生命周期 ​编辑 内存限制 1. 内存限制的相关参数 2. 内存限制方式 2.1 设置-m,--memory&#xff0c;不设置--memory-swap 2.2 设置-m,--memorya&#xff0c;--memory-swapb&#xff0c;且b >a 2.…

【小猫爪】AUTOSAR学习笔记06-Communication Stack之ComM模块

【小猫爪】AUTOSAR学习笔记06-Communication Stack之ComM模块前言1 ComM简介2 ComM功能介绍2.1 PNC 状态管理2.2 Channel状态管理2.3 通信禁止功能2.4 不同类型的NM2.5 User、PNC 与 Channel 的映射2.6 状态保存END前言 因为一个偶然的机会让我接触到了AUTOSAR&#xff0c;所以…

AI独立开发者:一周涨粉8万赚2W美元;推特#HustleGPT GPT-4创业挑战;即刻#AIHackathon创业者在行动 | ShowMeAI周刊

&#x1f440;日报&周刊合辑 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; 这是ShowMeAI周刊的第7期。聚焦AI领域本周热点&#xff0c;及其在各圈层泛起的涟漪&#xff1b;拆解AI独立开发者的盈利案例&#xff0c;关注中美AIG…

使用Hexo+Github搭建部署个人博客

准备工作&#xff1a;本地需要安装Git&#xff0c;Node.js环境&#xff0c;GitHub账号 Node.js安装&#xff1a;Node.js安装详细教程_I’m Jie的博客-CSDN博客 入门操作 安装 Hexo 打开命令运行命令安装 Hexo npm install -g hexo-cli执行 hexo -v 命令验证 Hexo 是否安装成功…

PyTorch 之 神经网络 Mnist 分类任务

文章目录一、Mnist 分类任务简介二、Mnist 数据集的读取三、 Mnist 分类任务实现1. 标签和简单网络架构2. 具体代码实现四、使用 TensorDataset 和 DataLoader 简化本文参加新星计划人工智能(Pytorch)赛道&#xff1a;https://bbs.csdn.net/topics/613989052 一、Mnist 分类任…

学习 Python 之 Pygame 开发魂斗罗(八)

学习 Python 之 Pygame 开发魂斗罗&#xff08;八&#xff09;继续编写魂斗罗1. 创建敌人类2. 增加敌人移动和显示函数3. 敌人开火4. 修改主函数5. 产生敌人6. 使敌人移动继续编写魂斗罗 在上次的博客学习 Python 之 Pygame 开发魂斗罗&#xff08;七&#xff09;中&#xff0…

动态规划算法

一、前言动态规划是一种常用的算法&#xff0c;在算法领域十分重要&#xff0c;但对于新手来说&#xff0c;理解起来有一定的挑战性&#xff0c;这篇博客将明确步骤来一步一步讲解动态规划到底该如何理解与运用。二、解析动态规划算法1.特点①把原来的问题分解成了【要点相同】…

断言assert

assert作用&#xff1a;我们使用assert这个宏来调试代码语法&#xff1a;assert&#xff08;bool表达式&#xff09;如果表达式为false&#xff0c;会调用std::cout<<abort函数&#xff0c;弹出对话框&#xff0c;#include<iostream> #include<cassert> void…

【多线程】多线程案例

✨个人主页&#xff1a;bit me&#x1f447; ✨当前专栏&#xff1a;Java EE初阶&#x1f447; ✨每日一语&#xff1a;we can not judge the value of a moment until it becomes a memory. 目 录&#x1f35d;一. 单例模式&#x1f364;1. 饿汉模式实现&#x1f9aa;2. 懒汉模…

GitHub 上有些什么好玩的项目?

前言 各个领域模块的都整理了一下&#xff0c;包含游戏、一些沙雕的工具、实用正经的工具以及一些相关的电商项目&#xff0c;希望他们可以给你学习的路上增加几分的乐趣&#xff0c;我们直接进入正题~ 游戏 1.吃豆人 一款经典的游戏开发案例&#xff0c;包括地图绘制、玩家控…

不是,到底有多少种图片懒加载方式?

一、也是我最开始了解到的 js方法&#xff0c;利用滚动事件&#xff0c;判断当时的图片位置是否在可视框内&#xff0c;然后进行渲染。 弊端&#xff1a;代码冗杂&#xff0c;你还要去监听页面的滚动事件&#xff0c;这本身就是一个不建议监听的事件&#xff0c;即便是我们做了…

【正点原子FPGA连载】 第三十三章基于lwip的tftp server实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

第三十三章基于lwip的tftp server实验 文件传输是网络环境中的一项基本应用&#xff0c;其作用是将一台电子设备中的文件传输到另一台可能相距很远的电子设备中。TFTP作为TCP/IP协议族中的一个用来在客户机与服务器之间进行文件传输的协议&#xff0c;常用于无盘工作站、路由器…

Java基础:笔试题

文章目录Java 基础题目1. 如下代码输出什么&#xff1f;2. 当输入为2的时候返回值是多少?3. 如下代码输出值为多少?4. 给出一个排序好的数组&#xff1a;{1,2,2,3,4,5,6,7,8,9} 和一个数&#xff0c;求数组中连续元素的和等于所给数的子数组解析第一题第二题第三题第四题方案…

复制带随机指针的复杂链表

目录一、题目题目链接二、题目分析三、解题思路四、解题步骤4.1 复制结点并链接到对应原节点的后面4.2 处理复制的结点的随机指针random4.3 分离复制的链表结点和原链表结点并重新链接成为链表五、参考代码六、总结一、题目题目链接 ​​​​ ​ 题目链接&#xff1a;https://…

【二】一起算法---队列:STL queue、手写循环队列、双端队列和单调队列、优先队列

纸上得来终觉浅&#xff0c;绝知此事要躬行。大家好&#xff01;我是霜淮子&#xff0c;欢迎订阅我的专栏《算法系列》。 学习经典算法和经典代码&#xff0c;建立算法思维&#xff1b;大量编码让代码成为我们大脑的一部分。 ⭐️已更系列 1、基础数据结构 1.1、链表➡传送门 1…

【微信小程序】-- 分包 - 独立分包 分包预下载(四十五)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

Java 到底是值传递还是引用传递?

C 语言是很多变成语言的母胎&#xff0c;包括 Java。对于 C 语言来说&#xff0c;所有的方法参数都是通过 “值” 传递的&#xff0c;也就是说&#xff0c;传递给被调用方法的参数值存放在临时变量中&#xff0c;而不是存放在原来的变量中。这就意味着&#xff0c;被调用的方法…
最新文章