1 树莓派 PICO 简介

1.1 简介

  Raspberry Pi Pico是具有灵活数字接口的低成本,高性能微控制器板。它集成了Raspberry Pi自己的RP2040微控制器芯片,运行速度高达133 MHz的双核Arm Cortex M0 +处理器,嵌入式264KB SRAM和2MB板载闪存以及26个多功能GPIO引脚。对于软件开发,可以使用Raspberry Pi的C / C ++ SDK或MicroPython。[1]

1.2 配置 [2]
树莓派 PICO配置
双核 Arm Cortex-M0 + @ 133MHz
2 个 UART、2 个 SPI 控制器和 2 个 I2C 控制器
芯片内置 264KB SRAM 和 2MB 的板载闪存
16 个 PWM 通道
通过专用 QSPI 总线支持最高 16MB 的片外闪存
USB 1.1 主机和设备支持
DMA 控制器
8 个树莓派可编程 I/O(PIO)状态机,用于自定义外围设备支持
30 个 GPIO 引脚,其中 4 个可用作模拟输入
支持 UF2 的 USB 大容量存储启动模式,用于拖放式编程
1.3 引脚图

1.4 尺寸

2 安装

2.1 烧录固件
  1. 点击 https://micropython.org/download/rp2-pico/rp2-pico-latest.uf2 链接下载UF2文件;

如果连接失效,可以进入 https://www.raspberrypi.org/documentation/rp2040/getting-started/#getting-started-with-micropython官网下载

  1. 按住BOOTSEL键不放,将Pico插入电脑的USB串口,电脑上会弹出一个新的U盘文件夹,把刚刚下载的UF2文件拖拽到文件夹中,树莓派 PICO将会自动重启,此时,固件烧录完成。
2.2 安装IDE(Thonny IDE)
  1. 进入软件官网 https://thonny.org/下载软件,最好下载最新版的,否则可能不支持树莓派 PICO;
  2. 安装Thonny,安装完成后打开Thonny软件,打开工具->设置-> 解释器,选择MicroPython(Raspberry Pi Pico)解释器,并在串口处选择树莓派PICO的串口号(如果板子已经连接在电脑上,软件一般会自动检测串口号)
  3. 重启软件,可以看到软件左下方显示了树莓派PICO中的文件;

如果没有显示左侧文件树的话可以勾选 视图->文件

2.3 离线运行程序

  新建文件,编写完代码后,按住ctrl+s将该文件保存在树莓派PICO上,并命名为main.py(一定要加后缀.py),下次树莓派PICO通电时便会自动运行main.py中的程序。

3 基础

3.01 点亮板载LED灯
from machine import Pin

if __name__ == '__main__':
# 构建led对象
# 板载LED灯连接与引脚25相连
# LED = Pin(id, mode, pull)
# id:PICO引脚编号
# mode:输入输出方式,有Pin.IN(输入)和Pin.OUT(输出)两种
# pull:上下拉电阻配置,有None(无上下拉电阻)、Pin.PULL_UP(上拉电阻)和Pin.PULL_DOWN(下拉电阻)三种
LED = Pin(25, Pin.OUT)
# 高电平点亮
LED.value(1)
3.02 板载LED闪烁
from machine import Pin
from utime import sleep
import utime led = Pin(25, Pin.OUT) if __name__ == '__main__':
while True:
# led点亮
led.value(1)
utime.sleep_ms(1000)
# led熄灭
led.value(0)
utime.sleep_ms(1000)
3.03 LED流水灯
  1. LED发光二极管图片

  1. LED发光二极管正负极区分
  • 一般引脚长的一端为正极,引脚短的为负极
  • 看发光二极管内部,支架大的为负极,支架小的为负极
  1. 电路连线图

  1. 代码
from machine import Pin
import utime # 定义LED引脚数组
leds = [Pin(i,Pin.OUT) for i in range(0,5)] if __name__ == '__main__':
while True:
# 依次点亮
for n in range(0,5):
leds[n].value(1)
utime.sleep_ms(200)
# 依次熄灭
for n in range(0,5):
leds[n].value(0)
utime.sleep_ms(100)

3.04 按键实验
  1. 四角按键图片

  1. 四角按键怎么连接

默认按键未按下的情况下,12相连接,34相连接;当按下按键时,1234才相连接。

  1. 电路接线图

  1. 代码
from machine import Pin
import utime # 配置按键
# key = machine.Pin(id, mode, pull)
# id:树莓派Pico引脚编号
# mode:输入输出方式,有Pin.IN(输入)和Pin.OUT(输出)两种
# pull:上下拉电阻配置,有None(无上下拉电阻)、Pin.PULL_UP(上拉电阻)和Pin.PULL_DOWN(下拉电阻)三种
key = Pin(0, Pin.IN, Pin.PULL_UP) if __name__ == '__main__':
while True:
# print(key.value())
if key.value() == 0:
# 等待一段时间,防止抖动
utime.sleep_ms(100)
if key.value() == 0:
print('The button is pressed')

按键消抖可以参考https://baike.baidu.com/item/%E6%8C%89%E9%94%AE%E6%B6%88%E6%8A%96

3.05 外部中断(改进3.04 按键实验)
  1. 什么是外部中断

  外部中断是单片机实时地处理外部事件的一种内部机制。当某种外部事件发生时,单片机的中断系统将迫使CPU暂停正在执行的程序,转而去进行中断事件的处理;中断处理完毕后.又返回被中断的程序处,继续执行下去。[3]

  1. 外部中断的作用
  • 节省CPU资源
  1. 代码实现

  在3.04 按键实验中,检测按键是否被按下采用的是在主程序中写死循环的办法,假如这个按键被按下的频率十分低(一天只有几次被按下),采用死循环的方法将会浪费大量的CPU资源,而采用外部中断的方式检测按键是否被按下将大大节省CPU资源。

from machine import Pin
import utime #配置按键
key = Pin(0, Pin.IN, Pin.PULL_UP) def external_interrupt(key):
# 消除抖动
utime.sleep_ms(100)
# 再次判断按键是否被按下
if key.value() == 0:
print('The button is pressed') if __name__ == '__main__':
# KEY.irq(handler,trigger)
# handler:中断执行的回调函数
# trigger:触发中断的方式,分别为Pin.IRQ_FALLING(下降沿触发)、
# Pin.IRQ_RISING(上升沿触发)、Pin.IRQ_LOW_LEVEL(低电平触发)和
# Pin.IRQ_HIGH_LEVEL(高电平触发)四种
# 定义中断,下降沿触发
key.irq(external_interrupt, Pin.IRQ_FALLING)
3.06 定时器中断(改进3.02 板载LED闪烁)
  1. 什么是定时器中断
  • 定时器中断是由单片机中的定时器溢出而申请的中断,即设定一个时间,到达这个时间后就会产生中断
  1. 代码

通过设置定时器中断使树莓派PICO板载LED每隔两秒闪烁一次

from machine import Pin, Timer

# 创建LED对象
led=Pin(25, Pin.OUT) # 闪烁回调函数
def twinkle(tim):
# toggle方法:LED状态翻转
led.toggle() if __name__ == '__main__':
# 构建定时器
tim = Timer()
# tim.init(period, mode, callback)
# period:周期时间(单位为ms)
# mode:工作模式,有Timer.ONE_SHOT(执行一次)和Timer.PERIODIC(周期性执行)两种
# callback:定时器中断的回调函数
tim.init(period=2000, mode=Timer.PERIODIC, callback=twinkle)
3.07 PWM 脉冲宽度调制(实现板载LED呼吸灯)
  1. 什么是PWM

  脉冲宽度调制是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。[4]

  1. 代码
from machine import Pin, Timer, PWM
import utime led = PWM(Pin(25))
# 设置频率值
led.freq(1000) led_value = 0
# led以5%增长/减少的速度变化亮度
led_space = 5 if __name__ == '__main__':
while True:
led_value += led_space
if led_value >= 100:
led_value = 100
led_space = -5
elif led_value <= 0:
led_value = 0
led_space = 5
# 设置占空比,需在0-65535之间
led.duty_u16(int(led_value * 500))
utime.sleep_ms(100)

3.08 I2C总线(使用SSD1306 OLED屏幕)
  1. I2C总线简介

  I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。I2C由 2 条线组成:SDA(串行数据线)和SCL(串行时钟线),都是双向I/O线。[5]

  1. SSD1306 OLED简介

  SSD1306是一款带控制器的用于OLED点阵图形显示系统的单片CMOS OLED/PLED驱动器。它由128个SEG(列输出)和64个COM(行输出)组成。该芯片专为共阴极OLED面板设计。

  SSD1306内置对比度控制器、显示RAM(GDDRAM)和振荡器,以此减少了外部元件的数量和功耗。该芯片有256级亮度控制。数据或命令由通用微控制器通过硬件选择的6800/8000系通用并行接口、I2C接口或串行外围接口发送。该芯片适用于许多小型便携式应用,如手机副显示屏、MP3播放器和计算器等。[6][7]

  1. 电路连线图

  1. 代码

ssd1306.py下载地址: https://elijah.lanzoui.com/iJ13fpnq6je

下载完成后,在Thonny软件左侧的文件窗口内找到这个文件,右键点击文件,选择上载到选项,文件即可传输到树莓派PICO上

from machine import SoftI2C, Pin
# 导入SSD1306驱动模块
from ssd1306 import SSD1306_I2C if __name__ == '__main__':
# 初始化SoftI2C
# OLED屏幕的scl连接到树莓派PICO的GPIO0, sda连接到GPIO1
i2c = SoftI2C(scl=Pin(0), sda=Pin(1))
# oled = SSD1306_I2C(width, height, i2c, addr)
# width:屏幕宽
# height: 屏幕高
# i2c:已定义的I2C对象
oled = SSD1306_I2C(128, 64, i2c) #OLED显示屏初始化:128*64分辨率,OLED的I2C地址是0x3c
# OLED显示的字符串,横坐标和纵坐标
oled.text("Hello World!", 0, 0)
# OLED显示
oled.show()

4 传感器程序

4.1 温度传感器(DS18B20)

DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。

  • 测温范围: -55℃~+125℃,固有测温误差1℃

  • 工作电源: 3.0~5.5V/DC

  • 单总线驱动,只占用一个IO口

import machine, onewire, ds18x20, time, utime

# 使用GPIO0口传输数据
# 将DS18B20的VCC端连接到树莓派PICO的3V3(OUT)端
# 将DS18B20的数据端连接到树莓派PICO的GPIO0口
# 将DS18B20的GND端连接到树莓派PICO的GND端
pin = machine.Pin(0)
sensor = ds18x20.DS18X20(onewire.OneWire(pin)) # 扫描是否存在DS18B20设备
roms = sensor.scan()
print('Found a ds18x20 device') # 获取温度数据
def detect_tem():
while True:
sensor.convert_temp()
for rom in roms:
# 打印出温度值
# 第一个打印出来的数值可能不太准确,从第二条数据开始才会显示出正常数据
print("{:.3f}".format(sensor.read_temp(rom)))
utime.sleep_ms(2000) # 程序入口
if __name__ == '__main__':
detect_tem()
4.2 温湿度传感器

DHT22.py文件下载地址: https://elijah.lanzoui.com/iFueapnq6id

文件上传方法参考3.08 I2C总线

4.2.1 DHT11

DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度湿度±5%RH, 温度±2℃,量程湿度5-95%RH, 温度0-+50℃。[8]

from machine import Pin
from DHT22 import DHT22
import utime pin = Pin(0,Pin.IN,Pin.PULL_UP)
# 创建dht11对象
# 将DHT11的VCC端连接到树莓派PICO的3V3(OUT)端
# 将DHT11的数据端连接到树莓派PICO的GPIO0口
# 将DHT11的GND端连接到树莓派PICO的GND端
dht_sensor=DHT22(pin, dht11=True) # 循环函数
def detection():
while True:
T, H = dht_sensor.read()
if T is None:
print("sensor error")
else:
print("{}'C {}%".format(T, H))
utime.sleep_ms(2000) # 程序入口
if __name__ == '__main__':
detection()
4.2.1 DHT22

  DHT22也称AM2302,是一款含有已校准数字信号输出的温湿度复合传感器,湿度量程范围0-99.9%RH,精度±2%RH,而温度量程范围是-40℃-80℃,精度±0.5℃。[9]

from machine import Pin
from DHT22 import DHT22
import utime pin = Pin(0,Pin.IN,Pin.PULL_UP)
# 创建dht11对象
# 将DHT11的VCC端连接到树莓派PICO的3V3(OUT)端
# 将DHT11的数据端连接到树莓派PICO的GPIO0口
# 将DHT11的GND端连接到树莓派PICO的GND端
dht_sensor=DHT22(pin, dht11=False) # 循环函数
def detection():
while True:
T, H = dht_sensor.read()
if T is None:
print("sensor error")
else:
print("{:.2f}'C {:.2f}%".format(T, H))
utime.sleep_ms(2000) # 程序入口
if __name__ == '__main__':
detection()

  1. https://www.waveshare.com/wiki/Raspberry_Pi_Pico

  2. https://pico.org.cn/

  3. https://baike.baidu.com/item/外部中断

  4. https://baike.baidu.com/item/脉冲宽度调制/10813756?fromtitle=PWM&fromid=3034961&fr=aladdin

  5. https://baike.baidu.com/item/I2C总线/918424?fromtitle=I2C&fromid=1727975&fr=aladdin

  6. https://blog.csdn.net/qq_39829913/article/details/104716829

  7. https://wenku.baidu.com/view/10b60c264a73f242336c1eb91a37f111f1850d88.html

  8. https://baike.baidu.com/item/DHT11/1206271?fr=aladdin

  9. https://blog.csdn.net/k1ang/article/details/98789397

树莓派 PICO基础教程(基于MicroPython)的更多相关文章

  1. 《有限元分析基础教程》(曾攀)笔记一-二维杆单元有限元程序(基于Python)

    曾攀老师的<有限元分析基础教程>第三章有二维杆单元的推导,并结合一个例题进行了解析解和基于Matlab的程序求解.但是我感觉书中的MATLAB代码有点罗嗦,而且一些实现方法也比较麻烦,比如 ...

  2. 树莓派PICO刷入MicroPython内核的两种方式

    一.MicroPython简介 MicroPython 是 Python 3编程语言的精简高效实现,其中包括 Python 标准库的一小部分,并且经过优化,可在微控制器和受限环境中运行. 可以在 25 ...

  3. SpringCloud2.0 Hystrix Feign 基于Feign实现断路器 基础教程(七)

    1.启动[服务中心]集群,工程名:springcloud-eureka-server 参考 SpringCloud2.0 Eureka Server 服务中心 基础教程(二) 2.启动[服务提供者]集 ...

  4. SpringCloud2.0 Hystrix Ribbon 基于Ribbon实现断路器 基础教程(六)

    1.启动[服务中心]集群,工程名:springcloud-eureka-server 参考 SpringCloud2.0 Eureka Server 服务中心 基础教程(二) 2.启动[服务提供者]集 ...

  5. html快速入门(基础教程+资源推荐)

    1.html究竟是什么? 从字面上理解,html是超文本标记语言hyper text mark-up language的首字母缩写,指的是一种通用web页面描述语言,是用来描述我们打开浏览器就能看到的 ...

  6. 每周一书-《Bootstrap基础教程》

    首先说明,本周活动有效时间为8月15日到21日.本周为大家送出的书是有电子工业出版,贺臣/陈鹏编著的<Bootsrap基础教程>,为前端入门必读书籍. 下面是从书中摘录的内容. “ Boo ...

  7. CSS基础教程 -- 媒体查询屏幕适配

    响应式布局 Media Query 的使用方法 在上例中, 我们使用Media Queries来根据3种不同尺寸的窗口使用3种不同的样式.通过不同的媒体类型和条件定义样式表规则,媒体查询让CSS可以更 ...

  8. .Net程序员之Python基础教程学习----列表和元组 [First Day]

    一. 通用序列操作: 其实对于列表,元组 都属于序列化数据,可以通过下表来访问的.下面就来看看序列的基本操作吧. 1.1 索引: 序列中的所有元素的下标是从0开始递增的. 如果索引的长度的是N,那么所 ...

  9. [转]《Hadoop基础教程》之初识Hadoop

    原文地址:http://blessht.iteye.com/blog/2095675 Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoop不 ...

随机推荐

  1. (十二)docker --privileged

    1. privileged参数作用 --privileged Give extended privileges to this container 大约在0.6版,privileged被引入docke ...

  2. 老和尚给小和尚讲故事引发了Java设计模式:组合模式

    目录 示例 组合模式 定义 意图 主要解决问题 优缺点 安全式和透明式的组合模式 安全式的合成模式的结构 透明式的合成模式的结构 老和尚和小和尚的故事 示例 有一个绘图系统,可以描绘各种图形,假设现在 ...

  3. Linux入门之基本的概念、安装和操作

    目录 Linux基本概念 Linux的安装 虚拟机安装CentOS7 CentOS设置网络 Linux基本操作命令 文件目录操作命令 进程操作命令 文本操作命令 Linux权限操作 用户和组操作命令 ...

  4. hdu4966 最小树形图(最少辅导花费)

    题意:       以一些科目,和辅导班,每个科目最终要求修到某个等级,可以花一定的钱在辅导班把某一科目修到某一等级,进入辅导班的时候会有一个限制,那就是达到他给出的科目和等级限制,比如a b c d ...

  5. hdu5248序列变换(二分+贪心)基础题

    题意(中文的直接粘题意吧)                                                                                      序 ...

  6. PowerShell-6.文件操作

    1.显示文本内容 Get-Content "°C:\\Program Files (x86)\\PsUpdate\\b.dat" 2.得到b.dat文件内容,然后把里面的所有'C' ...

  7. Access+Mssql+Oracle数据库注入

    Access数据库注入 前言:在常见的注入测试中,由于每个数据库内置架构和应用不同,导致数据库类型将决定注入的手法,Access数据库是小型数据库类型,普遍用于小型WEB应用,其中Access注入手法 ...

  8. .NET 在信创常用软件适配清单之中?

    2020年8月份写了一篇文章<.NET Core也是国产化信息系统开发的重要选项>, 这又过去了大半年了,在信创领域发生了很大的变化,今天写这篇文章主要是想从信创常用软件适配清单 看一看. ...

  9. Windows进程间通讯(IPC)----信号量

    线程同步内核对象 操作系统进行进程间同步是利用信号量机制.对于windows系统而言,可以利用一些内核对象进行线程同步,因为这些内核对象可以命名并且属于系统内核,所以可以支持不同进程间的线程同步进而实 ...

  10. java设计模式之单例模式你真的会了吗?(懒汉式篇)

    java设计模式之单例模式你真的会了吗?(懒汉式篇) 一.什么是单例模式? 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供 ...