大家好,欢迎来到本教程!上节课我们熟悉了 Raspberry Pi Pico H 开发板,学会了搭建 MicroPython 编译环境,也掌握了一些基础程序的编写方法。本章我们将学习如何通过 GPIO 口控制 LED 灯,一起动手实践吧!
文章目录
- 一、配件功能介绍
-
- [Pico GPIO 引脚对照](#Pico GPIO 引脚对照)
- 二、项目一:LED闪烁
- 三、项目二:呼吸灯
- 四、改变呼吸节奏(拓展1)
- 五、模拟心跳(拓展2)
- 六、往期回顾
一、配件功能介绍
这次我们使用的是优信电子的 Pico 基础入门版学习套件,本文章以及后续教程基本会用到以下配件:
色环口诀
棕(1) 红(2) 橙(3) 黄(4) 绿(5) 蓝(6) 紫(7) 灰(8) 白(9) 黑(0)
这里说明一下电阻色环应该怎么看?本次用到的是四环电阻,以 330Ω 电阻举例:
通常:金色、银色是误差环,会与其他色环拉开一点距离,所以要把金色、银色放在最后读。
330Ω 色环电阻的颜色是 橙橙棕金,前两位是数字,第三位是倍数,第四位是精度。由此可得,橙橙棕金 表示 3 3 ×10,精度为 ±5%,对应上图口诀可得出 橙橙棕金 是 330Ω±5% 的电阻。
Pico GPIO 引脚对照

注意!
Pico使用3.3V逻辑电平!
不要直接连接5V信号到GPIO引脚,否则可能永久损坏芯片。USB供电为5V,但GPIO引脚仅支持3.3V输入/输出。
二、项目一:LED闪烁
本小节在上一篇文章中已有详细说明,这里只回顾一下基本的闪灯操作,如果有遗忘的可以回顾哦。点击此处:点亮第一个LED------闪烁与流水灯## 程序
上篇文章我们学习了如何在 MicroPython 上编写程序,点击此处 可以回顾。现在来看一下 LED 闪烁代码是怎么写的吧。
程序
javascript
from machine import Pin # 从 machine 模块中导入 Pin,用于控制 Pico 的 GPIO 引脚
import utime # 导入 utime 时间模块,用于实现程序延时
led = Pin(15, Pin.OUT) # 将 GPIO15 设置为输出模式,并将这个 GPIO 对象保存到变量 led
while True: # 创建一个无限循环,只要程序不停止,就会一直执行下面的代码
led.value(1) # GPIO15 输出高电平,LED 点亮
utime.sleep(0.5) # 程序暂停 0.5 秒,让 LED 保持点亮状态
led.value(0) # GPIO15 输出低电平,LED 熄灭
utime.sleep(0.5) # 程序暂停 0.5 秒,让 LED 保持熄灭状态
现象

三、项目二:呼吸灯
既然会点亮闪烁了,那是不是就可以让led灯的状态更丰富些?
来到本文章的重点
呼吸灯
这里我们引入一个新的概念PWM 。
那么什么是PWM呢?
PWM 是 脉冲宽度调制(Pulse Width Modulation)。
简单理解就是:让一个数字引脚快速地"开---关---开---关",通过改变"开"的时间比例,来实现不同的输出效果。这个开的时间比例就是叫做 占空比 。
这里依旧是用GPIO15引脚进行测试。
学习目标
学习PWM脉冲宽度调制。
1、元件清单
Pico + 红色LED×1 + 330Ω电阻 + 面包板 + 跳线×2
2、接线示意图

该项目的供电电源来自USB口,PICO板上标记了数字的引脚都是GND,每个引脚所对应的功能各不相同,具体可看PICO引脚图。
注意:该图的电阻并不是实际的330欧电阻
3、工作原理
PWM通过快速切换高低电平来模拟0~100%的亮度。占空比(duty)越大,LED越亮。
duty_u16()范围0-65535对应0%-100%亮度。
程序
javascript
from machine import Pin, PWM # 从 machine 模块导入 Pin(GPIO引脚)和 PWM(脉宽调制)功能
import utime # 导入 utime 模块,用于实现延时
pwm = PWM(Pin(15)) # 将 GPIO15 设置为 PWM 输出,并创建 PWM 对象
pwm.freq(1000) # 设置 PWM 频率为 1000Hz(即每秒输出1000个PWM周期)
while True: # 创建无限循环,让程序持续运行
for duty in range(0, 65535, 512): # duty 从0开始,每次增加512,直到接近65535
pwm.duty_u16(duty) # 设置 PWM 占空比,范围是0~65535
utime.sleep_ms(10) # 延时10毫秒,让占空比逐渐增加
for duty in range(65535, 0, -512): # duty 从65535开始,每次减少512,直到接近0
pwm.duty_u16(duty) # 设置 PWM 占空比,范围是0~65535
utime.sleep_ms(10) # 延时10毫秒,让占空比逐渐减小
现象

我们已经学会利用PWM来控制实现呼吸灯的效果,那么是该上点挑战了!
四、改变呼吸节奏(拓展1)
utime.sleep_ms()
工作原理:
通过修改 utime.sleep_ms() 的数值,改变呼吸节奏快慢。
utime.sleep_ms() 控制的是每次改变亮度后等待多长时间。
规律:
数值越小 → 亮度变化越快 → 呼吸越快
数值越大 → 亮度变化越慢 → 呼吸越慢
程序(1)
javascript
from machine import Pin, PWM
import utime
pwm = PWM(Pin(15))
pwm.freq(1000)
while True:
for duty in range(0, 65535, 512):
pwm.duty_u16(duty)
utime.sleep_ms(1) # 延时1毫秒,让占空比逐渐增加
for duty in range(65535, 0, -512):
pwm.duty_u16(duty)
utime.sleep_ms(1) # 延时1毫秒,让占空比逐渐增加
现象

可以看到呼吸灯变快了,符合上述规律,如果想更慢就修改 utime.sleep_ms() 的参数。
五、模拟心跳(拓展2)
我们已经掌握了通过修改 utime.sleep_ms() 的数值,改变呼吸节奏快慢。那就可以来模仿心跳效果了。
模拟心跳效果
快速亮-微暗-再亮-熄灭循环往复
程序(2)
javascript
from machine import Pin, PWM
import utime
pwm = PWM(Pin(15))
pwm.freq(1000)
while True:
pwm.duty_u16(0) # LED 熄灭
utime.sleep_ms(200) # 熄灭 200ms
pwm.duty_u16(65535) # 第一次快速亮到最亮
utime.sleep_ms(80) # 保持最亮 80ms
pwm.duty_u16(20000) # 第一次跳动后变成微暗
utime.sleep_ms(100) # 微暗保持 100ms
pwm.duty_u16(65535) # 第二次快速亮到最亮
utime.sleep_ms(100) # 保持最亮 100ms
pwm.duty_u16(0) # 熄灭
utime.sleep_ms(600) # 停顿 600ms,等待下一次心跳
现象

这样就呈现模拟心跳的效果了。
如果想让心跳更明显、更像人体心跳,可以把最后的:
javascript
utime.sleep_ms(600)
改成
javascript
utime.sleep_ms(400) # 心跳更快
或者
javascript
utime.sleep_ms(800) # 心跳更慢
这里和前面的"呼吸灯"不同,不需要连续改变 duty ,而是直接改变几个亮度等级,所以会产生"砰-砰......砰-砰"的心跳感觉。
六、往期回顾
第一课:Raspberry Pi Pico 硬件开发(入门篇)
如果文章中有不足之处,欢迎大家批评指正,也欢迎在评论区交流讨论。