大家好,欢迎来到本教程!上节课我们熟悉了 Raspberry Pi Pico H 开发板,学会了搭建 MicroPython 编译环境,也掌握了一些基础程序的编写方法。本章我们将学习如何通过 GPIO 口控制 LED 灯,一起动手实践吧!
文章目录
- 一、配件功能介绍
- Pico GPIO 引脚对照
- 二、项目一:LED闪烁
- 程序
- 三、项目二:呼吸灯
- 学习目标
- 程序
- 四、改变呼吸节奏(拓展1)
- utime.sleep_ms()
- 程序(1)
- 五、模拟心跳(拓展2)
- 模拟心跳效果
- 程序(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 闪烁代码是怎么写的吧。
程序
from machineimportPin # 从 machine 模块中导入 Pin,用于控制 Pico 的GPIO引脚importutime # 导入 utime 时间模块,用于实现程序延时 led=Pin(15,Pin.OUT)# 将GPIO15设置为输出模式,并将这个GPIO对象保存到变量 ledwhileTrue:# 创建一个无限循环,只要程序不停止,就会一直执行下面的代码 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%亮度。
程序
from machineimportPin,PWM# 从 machine 模块导入 Pin(GPIO引脚)和PWM(脉宽调制)功能importutime # 导入 utime 模块,用于实现延时 pwm=PWM(Pin(15))# 将GPIO15设置为PWM输出,并创建PWM对象 pwm.freq(1000)# 设置PWM频率为 1000Hz(即每秒输出1000个PWM周期)whileTrue:# 创建无限循环,让程序持续运行fordutyinrange(0,65535,512):# duty 从0开始,每次增加512,直到接近65535pwm.duty_u16(duty)# 设置PWM占空比,范围是0~65535utime.sleep_ms(10)# 延时10毫秒,让占空比逐渐增加fordutyinrange(65535,0,-512):# duty 从65535开始,每次减少512,直到接近0pwm.duty_u16(duty)# 设置PWM占空比,范围是0~65535utime.sleep_ms(10)# 延时10毫秒,让占空比逐渐减小现象
我们已经学会利用PWM来控制实现呼吸灯的效果,那么是该上点挑战了!
四、改变呼吸节奏(拓展1)
utime.sleep_ms()
工作原理:
通过修改utime.sleep_ms()的数值,改变呼吸节奏快慢。
utime.sleep_ms()控制的是每次改变亮度后等待多长时间。
规律:
数值越小 → 亮度变化越快 → 呼吸越快
数值越大 → 亮度变化越慢 → 呼吸越慢
程序(1)
from machineimportPin,PWMimportutime pwm=PWM(Pin(15))pwm.freq(1000)whileTrue:fordutyinrange(0,65535,512):pwm.duty_u16(duty)utime.sleep_ms(1)# 延时1毫秒,让占空比逐渐增加fordutyinrange(65535,0,-512):pwm.duty_u16(duty)utime.sleep_ms(1)# 延时1毫秒,让占空比逐渐增加现象
可以看到呼吸灯变快了,符合上述规律,如果想更慢就修改utime.sleep_ms()的参数。
五、模拟心跳(拓展2)
我们已经掌握了通过修改utime.sleep_ms()的数值,改变呼吸节奏快慢。那就可以来模仿心跳效果了。
模拟心跳效果
快速亮-微暗-再亮-熄灭循环往复
程序(2)
from machineimportPin,PWMimportutime pwm=PWM(Pin(15))pwm.freq(1000)whileTrue: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,等待下一次心跳现象
这样就呈现模拟心跳的效果了。
如果想让心跳更明显、更像人体心跳,可以把最后的:
utime.sleep_ms(600)改成
utime.sleep_ms(400)# 心跳更快或者
utime.sleep_ms(800)# 心跳更慢这里和前面的“呼吸灯”不同,不需要连续改变duty,而是直接改变几个亮度等级,所以会产生“砰-砰……砰-砰”的心跳感觉。
六、往期回顾
第一课:Raspberry Pi Pico 硬件开发(入门篇)
如果文章中有不足之处,欢迎大家批评指正,也欢迎在评论区交流讨论。