Raspberry Pi Pico 硬件开发 —— 第二课:MicroPython 从入门到项目实践(LED篇)

大家好,欢迎来到本教程!上节课我们熟悉了 Raspberry Pi Pico H 开发板,学会了搭建 MicroPython 编译环境,也掌握了一些基础程序的编写方法。本章我们将学习如何通过 GPIO 口控制 LED 灯,一起动手实践吧!

文章目录

一、配件功能介绍

这次我们使用的是优信电子的 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 硬件开发(入门篇)

如果文章中有不足之处,欢迎大家批评指正,也欢迎在评论区交流讨论。

相关推荐
黑妹天下第一乖1 小时前
第 12 讲:阿加犀 AidLux 部署与量产——把端侧 AI 应用做成 7×24 产品
人工智能·嵌入式硬件·数码相机·接口隔离原则·iot
xiangw@GZ2 小时前
Type‑C USB DRD 电路
单片机·嵌入式硬件
常州晟凯电子科技3 小时前
sigmaStar SSC305DE/SSC308开发笔记之开发环境搭建和SDK编译
人工智能·笔记·嵌入式硬件·物联网·性能优化·视频编解码
沐欣工作室_lvyiyi3 小时前
基于单片机的跑步机控制系统设计(论文+源码)
c语言·单片机·嵌入式硬件·课程设计·keil·跑步机设计
黑妹天下第一乖4 小时前
第 11 讲:阿加犀 AidLux 多组件综合实战——端侧“智能摄像头解说“全链路
人工智能·嵌入式硬件·语言模型·自然语言处理·iot
py有趣4 小时前
硬件SPI和软件模拟SPI在配置方面的一点区别
c语言·stm32·单片机
AUTO_150756759654 小时前
【KT70022】昆腾微 单片音频编解码器
单片机·音频
LCG元4 小时前
STM32F103 GPIO 翻转方式耗时实测:CRL/CRH 逐位拆解、BSRR 原子写与 ODR 读改写竞态陷阱
stm32·单片机·嵌入式硬件
搁浅小泽4 小时前
压敏电阻(MOV)选型与设计规范
单片机·嵌入式硬件