树莓派pico上手

news2024/11/15 13:39:36

0 介绍

不同于作为单板计算机的树莓派5,树莓派 pico 是一款低成本、高性能的微控制器板,具有灵活的数字接口。主要功能包括:

  • 英国树莓派公司设计的 RP2040 微控制器芯片
  • 双核 Arm Cortex M0+ 处理器,弹性的时钟频率高达 133 MHz
  • 264kB SRAM 和 2MB 板载闪存
    • RP2040 能够支持高达 16MB 的片外闪存,不过在 Pico 中只有 2MB。
  • USB 1.1,支持设备和主机
  • 低功耗睡眠和休眠模式
  • 通过 USB 使用大容量存储器进行拖放编程
  • 26 × 多功能 GPIO 引脚
  • 2 × SPI、2 × I2C、2 × UART、3 × 12 位 ADC、16 × 可控 PWM 通道
  • 精确的片上时钟和定时器
  • 温度传感器
  • 片上加速浮点库
  • 8 × 用于支持定制外设的可编程 I/O (PIO) 状态机

树莓派 pico W/WH 引脚定义布局

在这里插入图片描述

引脚附加说明:

  • 板子上有好几个地线,GPIO 有 8 个地线加上 3 针 Debug 连接器上的一个附加地线
  • 一个位于33号针脚的地线被指定为模拟地线
  • 所有与电源相关的引脚都被安排在了一起,靠近 microUSB 连接器
    • VBUS,这是来自 microUSB 总线的输出电源,5 V。如果 Pico 不是由 microUSB 连接器供电,那么这里将没有输出。
    • VSYS,这是输入电压,范围为 2 至 5 V。板载电压转换器将为 Pico 将其改为 3.3 V。
    • 3V3,这是 Pico 内部调节器的 3.3 伏输出。只要将负载保持在 300ma 以下,它就可用于为其他组件供电。
  • 几个输入可以控制 Pico 的电源
    • 3V3_EN,可以使用此输入禁用 Pico 的内部电压调节器,从而关闭 Pico 和由其供电的任何组件。
    • RUN,可以启用或禁用 RP2040 微控制器,也可以将其复位。

树莓派 Pico W 在保留 Pico 外形尺寸的同时,使用英飞凌 CYW43439 增加了板载单频 2.4GHz 无线接口(802.11n)。板载 2.4GHz 无线接口具有以下功能:

  • 无线(802.11n),单频(2.4 千兆赫)
  • WPA3
  • 软接入点,最多支持四个客户端
  • 蓝牙 5.2
    • 支持蓝牙 LE 中央和外设功能
    • 支持经典蓝牙

天线采用 ABRACON(前 ProAnt)授权的板载天线。无线接口通过 SPI 与 RP2040 微控制器连接。

由于引脚限制,部分无线接口引脚是共享的。CLK 与 VSYS 监视器共享,因此只有在没有 SPI 传输时,才能通过 ADC 读取 VSYS。英飞凌 CYW43439 DIN/DOUT 和 IRQ 均共享 RP2040 上的一个引脚。只有当 SPI 没有进行传输时,才适合检查 IRQ。接口的运行频率通常为 33MHz。

在 Pico 上进行编程开发

可以使用两种编程语言之一开始使用 Pico:

  • MicroPython,一种专门为微控制器制作的解释语言
  • C++,许多微控制器用户都熟悉 C++,因为它被用于 Arduino 和 ESP32 板上

使用 C++ 在树莓派 pico 上进行开发,能够更有效榨干 pico 的性能,但是 MicroPython 更容易上手。

1 使用 MicroPython 在 Pico 上进行编程开发

1.1 Thonny IDE

Thonny IDE 适用于Windows、Mac OSX 和 Linux,也是树莓派操作系统(以前的 Raspbian)的一部分。

这里在 Windows11 上使用 Thonny IDE 尝试利用 MicroPython 进行编程开发。

1.2 安装和启动 MicroPython
  • 将 microUSB 连接到 Pico 上,并准备将另一端插入电脑。在插入之前,先按下Pico上的Boot Select(开关)按钮。按住BOOTSEL键几秒钟,然后松开。

  • 在电脑上应该会看到一个新的驱动器,类似于将 U 盘插入电脑时的情况

    • 如果这里没有反应,可能是线的问题,需要使用具备数据传输功能的线
  • 打开新的 “驱动器”,会看到一个名为 RPI-RP2 的文件夹。在这个驱动器里,会看到几个文件,其中一个是网页文档index.htm,点击该网页文件,浏览器就会打开,会被重定向到树莓派 Pico 入门页面

  • 点击 MicroPython 入门的标签。会看到一个链接来下载一个 UF2 文件,这就是可下载的 MicroPython 文件。把这个文件下载到电脑上
    在这里插入图片描述

  • 现在将下载的文件拖到 Pico 的 RPI-RP2 文件夹中。一旦这样做了,文件夹就会消失,Pico 将以 MicroPython 模式启动

注:这里实际上将之前下载的 MUF2 文件拖进去之后,pico 会自动重启,重启后就看不到那个移动硬盘了

打开设备管理器,在端口一栏下有一个 USB 串行设备,记住方框中的东西,例如我的是 COM4
在这里插入图片描述

1.3 安装并配置 Thonny IDE
  • 去官网下载即可,链接:https://thonny.org/

    • 官网下载速度非常慢,还容易下载失败,也可以去 github 下载:https://github.com/thonny/thonny/releases
  • 安装并打开Thonny,然后选择视图,打开这三个
    在这里插入图片描述

  • 选择:工具 - 设置,按下图选择
    在这里插入图片描述

  • 下面的端口选择刚刚记住的那个,我的是 COM4 。点击确认,完成!

1.4 点亮板载 LED

在 Shell 中依此执行:

from machine import Pin
led = Pin(25, Pin.OUT)
led.value(1)

可以看到板载的 LED 亮了。

  • Hello World
    在 shell 中输入如下代码:

    print("Hello World")
    
  • 查看板子的型号
    对于用 MicroPython 编写的脚本,没有直接的方法可以通过查看硬件来确定它是运行在树莓派 Pico还是Pico W上。不过,可以通过查看特定 MicroPython 固件中是否包含网络功能来间接判断:

    import network
    if hasattr(network, "WLAN"):
        print("pico-W")
    else:
        print("pico")
    

    也可以使用 sys 模块检查 MicroPython 固件版本,以查看它是针对树莓派Pico还是Pico W编译的。

    import sys
    sys.implementation
    
1.5 脚本测试

前面的实验都是在 Shell 中执行的,这样存在缺点:

  • 一旦执行了程序,代码就会消失
  • 对于比较大/复杂的程序来说,很不方便

可以直接在编辑器中编写程序代码,代码编写完成之后,可以通过 ctrl+s 来保存代码,这个时候会弹出选择存放在本地电脑或Pico上。可以选择存放在 pico 上,并给代码命名,名称需要以 .py 结尾。

此时脚本就保存在 pico 上了,可以通过执行按钮来执行脚本。

1.6 在没有主机的情况下运行脚本

开发好的程序,希望能够独立在 pico 上运行,由 microUSB 端口或通过 Pico VSYS 电源输入供电,而不是每次都需要让其通过连接主机上手动执行。前面的方式都是从 Thonny IDE 将程序加载到 Pico 上运行的,依赖连接的主机。

前面已经将脚本保存在 pico 上了,只需要把脚本命名为main.py即可,这样当 Pico 启动时,它会查找名为main.py的程序。如果它找到了它,就会加载它并在启动时运行它。

此时把 pico 从主机上拔下来,只需要给其供电,pico 就会在启动之后自动执行 main.py

2 使用 C/C++ 在 Pico 上进行编程开发

这里使用的编辑器是 CLion 和 VS-Code,这两个二选一即可。

2.1 准备软件/文件
2.1.1 下载 SDK

clone 这个仓库,也就是下载这个仓库的代码:https://github.com/raspberrypi/pico-sdk

git clone https://github.com/raspberrypi/pico-sdk
2.1.2 下载示例代码

clone这个仓库,也就是下载这个仓库的代码:https://github.com/raspberrypi/pico-examples

git clone https://github.com/raspberrypi/pico-examples
2.1.3 下载安装 gcc-arm-none-eabi

下载链接在这个网站里:https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads

windows 下载这个就可以:gcc-arm-none-eabi-xxxx-win32.exe
在这里插入图片描述

安装,注意记住安装位置。

2.2 配置环境
2.2.1 CLion

在 CLion 中打开示例代码项目文件夹 pico-examples,进入设置,找到 CMake
在这里插入图片描述

配置环境
在这里插入图片描述

加入两个:

  • PICO_SDK_PATH :值为下载的 pico sdk 的目录
  • PICO_TOOLCHAIN_PATH :安装 gcc-arm-none-eabi 的目录下的 bin 目录

配置完成!

2.2.2 VS-Code

打开Visual StudioDeveloper Command Prompt 命令行,cmd 不行的

输入 code 打开 VSCode,必须这样打开!

然后安装 cmake tools 插件,重启 VSCode,依然是从 Developer Command Prompt 命令行打开 VSCode!

打开设置,选择拓展 - CMake Tools Configuration - Configure Environment - 添加项

在这里插入图片描述

加入两个:

  • PICO_SDK_PATH :值为下载的 pico sdk 的目录
  • PICO_TOOLCHAIN_PATH :安装 gcc-arm-none-eabi 的目录下的 bin 目录

再选择拓展 - CMake Tools Configuration - Generator,设置值为 NMake Makefiles
在这里插入图片描述

关闭设置,打开示例代码文件夹,右下角出现是否配置项目,点 。然后提示配置项目,选择 GCC for arm-none-eabi
在这里插入图片描述

配置完成!

2.3 点亮板载 LED

以 CLion 为例,打开示例代码下的 blink 下的 blink.c ,点击构建:
在这里插入图片描述

构建完成后,在 cmake-build-debug/blink/elf2uf2 目录下可以找到 blink.uf2 文件,这即是编译后的需要烧录的文件

按住 pico 上的按钮,使用 USB 线连接电脑后松开按钮,将 blink.uf2 拖进去。

OK,pico 自动重启,LED 已经亮了!

这个时候应该已经发现了,没错,MicroPython 的固件也是 .uf2 后缀,说明 MicroPython 也是用 C 写出来、编译好的。

3 添加 OLED 屏幕

可以将一个 OLED 显示器连接到 Pico 上,这样就可以在上面打印一些东西。

显示屏使用的是 0.91 英寸 I2C 协议的 OLED 屏,OLED 屏幕模块和树莓派 Pico 的 GPIO 连线如下:

OLEDPICO
VCC(电源正3.3-5V)3V3
GNDGND
SCL(I2C时钟线)GP21
SDA(I2C数据线)GP20

显示器需要一个库,可以使用 Thonny ID 安装:

  • 点击 "工具 "菜单
  • 点击 “管理包”
  • 搜索 “ssd1306”
  • 找到 "ssd1306"并安装它
3.1 OLED 显示屏的演示脚本
# 树莓派 Pico OLED Display Test
# Uses ssd1306 module

import machine
import utime

sda=machine.Pin(20)
scl=machine.Pin(21)

i2c=machine.I2C(0, sda=sda, scl=scl, freq=400000)

from ssd1306 import SSD1306_I2C
oled = SSD1306_I2C(128, 32, i2c)


print(i2c.scan())

oled.text('Welcome to the', 0, 0)
oled.text('Pi Pico-W', 0, 10)
oled.text('Display Demo', 0, 20)
oled.show()
utime.sleep(4)

oled.fill(1)
oled.show()
utime.sleep(2)
oled.fill(0)
oled.show()

while True:
    oled.text("Hello World",0,0)
    for i in range (0, 164):
        oled.scroll(1,0)
        oled.show()
        utime.sleep(0.01)

这里的 OLED 显示屏是一个 I2C 设备,所以在脚本的开头将两个 GPIO 引脚定义为 SDA (GPIO 20) 和 SCL (GPIO 21)。

Pico 有两条 I2C 总线,可以使用几种不同的 GPIO 引脚来连接它们。但它们并不是随便的引脚,例如某些引脚被指定为总线 0 的 SDA,只有它们才能用于 SDA 总线 0。

使用机器库的I2C函数定义一个 I2C 连接。我们需要给它提供以下参数。

  • I2C总线号,例子中是 0
  • SDA引脚
  • SCL引脚
  • I2C总线频率,例子中是400KHz

这里我们没有传递 I2C 地址。因为 SD1306 OLED 显示器有一个固定的 I2C 地址,所以我们不需要指定它。不过,在这里添加了一行与显示器无关的内容,但可以扫描 I2C 总线,并打印出它发现占用的地址。在 Shell 中打印出来的是十进制,而不是十六进制。

3.2 显示 Pico 的系统信息

下面的代码可以用来打印树莓派 Pico 的系统信息,包括 MicroPython 版本号、内建模块清单、CPU 频率、内存大小、磁盘空间使用情况等。

import uos
d = uos.uname()
print('board name:', d[4])
print('micropython version:', d[2])
print('\nbuildin modules:')
help('modules')
 
import machine
print('\nsystem freq: {} MHz'.format(machine.freq()//1000000))
 
import gc
print('memory:', gc.mem_free() + gc.mem_alloc())
 
d = uos.statvfs('/')
print('Disk size:')
print('total:', d[0]*d[2])
print('free:', d[0]*d[3])

对上面的脚本做一点点的修改,并保存到 pico 上,命名为main.py,就可以在 pico 启动后再 OLED 上显示 pico 的系统信息。
main.py

import uos
import machine
import utime
import gc
import time


def stat():
  sda=machine.Pin(20)
  scl=machine.Pin(21)
  i2c=machine.I2C(0, sda=sda, scl=scl, freq=400000)

  from ssd1306 import SSD1306_I2C
  oled = SSD1306_I2C(128, 32, i2c)


  d = uos.uname()
  oled.text(f'{d[4]}', 0, 0)
  oled.text('Mem: {:.2f}% {:.0f}KB'.format(gc.mem_alloc()/(gc.mem_free() + gc.mem_alloc()) * 100, (gc.mem_free() + gc.mem_alloc()) / 1024), 0, 11)

  d = uos.statvfs('/')
  if int(time.time()) % 2 == 0:
     oled.text(f'CPU Freq: {machine.freq()//1000000}MHz', 0, 22)
  else:
    oled.text('Disk: {:.2f}% {:.0f}KB'.format((d[0]*d[2] - d[0]*d[3]) / (d[0]*d[2]) * 100, d[0]*d[2] / 1024), 0, 22)

  oled.show()
  utime.sleep(1.5)

if __name__ == "__main__":
  d = uos.statvfs('/')
  print("d[0]*d[2] - d[0]*d[3]:", d[0]*d[2] - d[0]*d[3])
  print("d[0]*d[2]:", d[0]*d[2])
  print("d[0]*d[3]:", d[0]*d[3])
  while True:
    stat()

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt笔记(十七)cmake编译Qt项目

Qt笔记(十七)cmake编译Qt项目 1. 文件内容与文件结构1.1.文件目录1.2. CMakeLists.txt内容1.3. main.cpp文件1.4. mouseevent.h1.5. mouseevent.cpp1.6. 生成Visual Studio项目后编译报错1.7. 界面显示中文乱码问题 1. 文件内容与文件结构 1.1.文件目录…

神奇的可变模板参数的应用(C++标准库双向链表 list 中的emplace函数实现)

我们先来看一个可以构造任意对象的函数&#xff1a; /// <summary> /// 可以构造任意对象的函数 /// </summary> /// <typeparam name"MyClass">要转换对象的类型</typeparam> /// <typeparam name"...MyClassConstructorParameterT…

传输层 II(TCP协议——协议的特点、报文段、连接管理)【★★★★】

&#xff08;★★&#xff09;代表非常重要的知识点&#xff0c;&#xff08;★&#xff09;代表重要的知识点。 一、TCP 协议的特点 TCP 是在不可靠的 IP 层之上实现的可靠的数据传输协议&#xff0c;它主要解决传输的可靠、有序、无丢失和不重复问题。TCP 是 TCP/IP 体系中非…

使用Stream实现事件流

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了Flutter中的异步操作&#xff0c;本章回中将介绍Flutter中的事件流.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 我们在上一章回中介绍了异步操作相关的内容&#xff0c;本章回中将介绍如何把…

施耐德EcoStruxure Machine SCADA Expert(EMSE)与SQL数据库连接(十五)

我习惯使用SQL Server 数据库与EMSE进行连接。 用的是sql 2017 关于数据库软件的安装教程 网上一大把。 1.新建数据库 打开数据库管理工具&#xff0c;新建数据库 2.新建表单 &#xff08;ps:这里先做一个小测试-----目的是验证与EMSE软件的链接是否顺畅。) 添加两个元素进去…

图神经网络的新篇章:通用、强大、可扩展的图变换器

人工智能咨询培训老师叶梓 转载标明出处 图变换器&#xff08;Graph Transformers, GTs&#xff09;因其在处理节点间全局依赖关系方面的能力而受到广泛关注。然而&#xff0c;现有的GTs模型在处理大规模图时面临着计算复杂度高、泛化能力有限等问题。为了解决这些问题&#x…

对比评测5款实用在线翻译工具,包括有道在线翻译

大家好&#xff0c;今天咱们来聊聊在线翻译工具。在这个信息爆炸的时代&#xff0c;语言不再是沟通的障碍&#xff0c;多亏了这些强大的翻译神器。今天&#xff0c;我将带大家比较五款热门的在线翻译工具&#xff0c;究竟谁更胜一筹呢&#xff1f;让我们一探究竟&#xff01; …

用友U8CRM relobjreportlist.php SQL注入漏洞复现

0x01 漏洞描述&#xff1a; 用友U8 CRM客户关系管理系统是一款专业的企业级CRM软件&#xff0c;旨在帮助企业高效管理客户关系、提升销售业绩和提供优质的客户服务。 用友 U8 CRM客户关系管理系统relobjreportlist.php 文件存在SQL注入漏洞&#xff0c;未经身份验证的攻击者通过…

Linux 一些快捷键使用操作技巧

ctrl c : 强制停止 如图仅输入tail命令时程序会卡住&#xff0c;这时就需要强制停止 ctrl d : 退出或者登出 history : 查看历史输入命令 &#xff01;命令 &#xff1a;自动执行上一次匹配前缀的命令 &#xff08;注意不要用这个命令执行太过久远的&#xff0c;容易执行错误…

字节数据转16进制对应十进制数

在数据处理中经常面临字节数据需要转换成不同位宽的十进制数据&#xff0c;尤其是在嵌入式处理中该现象特别常见&#xff0c;这里以转换为16位位宽的十进制为例&#xff0c;采用python校本进行数据转换&#xff0c;具体数据如下&#xff1a; 要将上面数据转换为双字节十进制数…

英语六级-学习

01 英语分值比例 02听力学习 听力练习&#xff0c;基础好选择标准VOA和BBC。基础差选择VOA慢速。 听力内容包括不受政治争议的内容&#xff0c;社会生活类(奇闻趣事、日常生活)、经济类(商务、职场相关)、环保类、互联网类---------根据各类主题快速找到录音材料中心点。 研…

文心一言 VS 讯飞星火 VS chatgpt (352)-- 算法导论24.1 3题

三、给定 G(V,E) 是一带权重且没有权重为负值的环路的有向图&#xff0c;对于所有结点 v∈V ,从源结点 s 到结点 v 之间的最短路径中&#xff0c;包含边的条数的最大值为 m 。&#xff08;这里&#xff0c;判断最短路径的根据是权重&#xff0c;不是边的条数。&#xff09;请对…

leetcode:最高乘法得分

用auto可以过 class Solution { public:long long maxScore(vector<int>& a, vector<int>& b) {int n b.size();vector<vector<long long>> memo(4,vector<long long>(b.size(), LLONG_MIN));auto dfs [&](auto&& dfs, i…

Java-Part 0

Advanced Java and Cutting-edge Applications Part 0: Course presentation Part 1 其实就是个括号匹配问题&#xff0c;Stack 经典问题&#xff0c;但是好久没用Java&#xff0c;有一点点生疏&#xff0c;感觉老师的版本要简洁的多 package tiei.ajp.test;import java.uti…

二叉树的层序遍历(含八道leetcode相关题目)

文章目录 二叉树层序遍历模板102. 二叉树的层序遍历107. 二叉树的层序遍历 II199. 二叉树的右视图637. 二叉树的层平均值515. 在每个树行中找最大值429. N 叉树的层序遍历116. 填充每个节点的下一个右侧节点指针117. 填充每个节点的下一个右侧节点指针 II 二叉树层序遍历模板 …

深度学习笔记(8)预训练模型

深度学习笔记&#xff08;8&#xff09;预训练模型 文章目录 深度学习笔记&#xff08;8&#xff09;预训练模型一、预训练模型构建一、微调模型&#xff0c;训练自己的数据1.导入数据集2.数据集处理方法3.完形填空训练 使用分词器将文本转换为模型的输入格式参数 return_tenso…

C++迭代器 iterator详解

目录 什么是迭代器 迭代器的类型 迭代器的用法 三种迭代器 范围for 什么是迭代器 它提供了一种访问容器&#xff08;如列表、集合等&#xff09;中元素的方法&#xff0c;而无需暴露容器的内部表示。迭代器使得程序员能够以统一的方式遍历不同的数据结构&#xff0c;而无需…

项目集成sharding-jdbc

目录 项目集成sharding-jdbc 1.业务分析 2.数据库构建 3.分库分表策略 项目配置默认数据源 一&#xff1a;导入sharding-jdbc依赖 二&#xff1a;在application文件中编写配置 三&#xff1a;注释掉主配置文件中配置的数据源 注意&#xff1a;这里添加了spring.main.allow…

基于51单片机的矿井安全检测系统

基于51单片机的矿井安全检测系统使用51单片机作为系统主控&#xff0c;LCD1602进行显示同时系统集成了ADC0808和烟雾传感器、甲烷传感器&#xff0c;二者结合测量环境烟雾值&#xff0c;同时使用DHT11温湿度传感器获取环境温湿度值&#xff0c;使用L298N驱动风扇&#xff0c;利…

2009考研数学真题解析-数二:

第一题&#xff1a; 解析&#xff1a;先找间断点&#xff1a;分母不能等于0&#xff0c;分母是sinΠx&#xff0c; 因此不难看出间断点是x0&#xff0c;-1&#xff0c;-2&#xff0c;-3。。。。。 接着一个一个来算这些点是什么间断点。 &#xff0c;从x趋于2开始&#xff0c;分…