张高兴的 MicroPython 入门指南:(二)GPIO 的使用

news/2024/10/6 3:32:01/文章来源:https://www.cnblogs.com/zhanggaoxing/p/18288379

目录
  • 什么是 GPIO
  • 使用方法
  • 使用微动开关点亮板载 LED
    • 硬件需求
    • 电路
    • 代码
  • 参考

什么是 GPIO

GPIO 是 General Purpose Input Output 的缩写,即“通用输入输出”。 Raspberry Pi Pico 左右两侧各有一列 GPIO 引脚, Pico 通过这两列引脚进行一些硬件上的扩展,与传感器进行交互等等。

简单的讲,每一个 GPIO 引脚都有两种模式:输出模式(OUTPUT)和输入模式(INPUT)。输出模式类似于一个电源,Pico 可以控制这个电源是否向外供电,比如打开外部的 LED 小灯,当然最有用的还是向外部设备发送信号。和输出模式相反,输入模式是接收外部设备发来的信号。GPIO 通常采用标准逻辑电平,即高电平和低电平,用二进制 0 和 1 表示。在这两个值中间还有阈值电平,即高电平和低电平之间的界限。Arduino 会将 -0.5 ~ 1.5 V 读取为低电平,3 ~ 5.5 V 读取为高电平, Pico 未查到相关资料。GPIO 还可用于中断请求,即设置 GPIO 为输入模式,值达到相应的要求时进行中断。

输入模式还包含两种特殊的输入模式:上拉输入(INPUT_PULLUP)和下拉输入(INPUT_PULLDOWN)。上拉输入就是芯片内部的电阻连接 VCC ,将该引脚设置为高电平状态。在没有外部信号输入的情况下,上拉输入可以保持引脚处于高电平状态,从而避免了信号的不确定性。在上拉输入模式中,如果外部输入了低电平信号,由于电阻的存在,引脚会读取到低电平,但不会产生大电流。这样,单片机可以轻易稳定地读取低电平信号。上拉输入的优势在于它可以提供稳定的高电平状态,直到检测到明确的低电平输入。下拉输入则相反,是将芯片内部的电阻连接 GND,将引脚设置为低电平状态,也是为了避免了信号的不确定性。上拉、下拉输入模式适用于一些特定场合,例如需要检测按钮按压(通常连接到低电平)或其他二进制开关状态。

使用方法

使用 MicroPython 控制 GPIO 要使用 machine 包中的 Pin 类。

from machine import Pin

要获取引脚对象,我们先来看一看构造函数有哪些参数。

Pin(id: Any, mode: int = -1, pull: int = -1, *, value: Optional[int] = None, drive: Optional[int] = None, alt: Optional[int] = None)
  • id 是指引脚的编号。对于 Pico 而言就是引脚图中 GPxx 中的数字编号,这个参数是必填的。
  • mode 是指引脚的模式。常用的有 Pin.IN 输入模式,Pin.OUT 输出模式。
  • pull 用来设置引脚输入的模式。Pin.PULL_UP 上拉输入,Pin.PULL_DOWN 下拉输入,None 不设置。
  • value 设置输出引脚的默认状态。参数可以是任何转换为​​布尔值的变量,1 默认输出高电平,0 默认输出低电平。
  • drive 指定引脚的输出功率。参数可以是 Pin.LOW_POWERPin.MED_POWERPin.HIGH_POWER,实际的输出功率还是取决于具体的引脚。

常见的用法参考下面的例子:

pin0 = Pin(0, mode=Pin.IN)  # 设置 0 号引脚为输入模式
pin1 = Pin(1, mode=Pin.IN, pull=Pin.PULL_UP)   # 设置 1 号引脚为上拉输入模式
pin2 = Pin(2, mode=Pin.OUT, value=0)   # 设置 2 号引脚为输出模式,默认输出低电平

在获取到引脚对象后,可以使用 Pin.value(x: Optional[int] = None) 方法设置或读取引脚的值。参数 x 可以是任何转换为​​布尔值的变量,1 输出高电平,0 输出低电平。当不传递参数 x 时,方法为读取引脚的值。

pin2.value(1)   # 设置 2 号引脚输出高电平
print(pin1.value()) # 读取 1 号引脚的输入值

当想要重新改变引脚的设置时,除了重新实例化对象之外,还可以使用 Pin.init(value: int, drive: int, alt: int, mode: int = -1, pull: int = -1)Pin.mode(mode: Optional[int])Pin.pull(pull: Optional[int]) 对引脚重新设置。

pin0.mode(Pin.OUT)  # 设置 0 号引脚为输出模式
pin1.pull(Pin.PULL_DOWN)  # 设置 1 号引脚为下拉输入模式
pin2.init(mode=Pin.IN, pull=Pin.PULL_UP)    # 设置 2 号引脚为上拉输入模式

有些时候当外部输入信号发生改变时,单片机需要执行一些操作,比如按下开关时亮灯。这就需要用到中断,中断是来自设备的一个信号,通知处理器暂停当前正在执行的任务,以优先处理该信号代表的工作,在处理完中断请求后,处理器才会恢复之前的任务。要设置引脚的中断,可以使用 Pin.irq(handler: Callable[[Pin], Any] = None, trigger: int = (IRQ_FALLING | IRQ_RISING), priority: int = 1, wake: int = None) 方法。

  • handler 是中断触发时要调用的方法。
  • trigger 用来设置触发中断的条件。Pin.IRQ_FALLING 下降沿(高电平变低电平)触发,Pin.IRQ_RISING 上升沿(低电平变高电平)触发,Pin.IRQ_LOW_LEVEL 低电平触发,Pin.IRQ_HIGH_LEVEL 高电平触发。这些值可以一起进行或运算,从而设置多条件触发。
  • priority 中断的优先级,值越大优先级越高。
  • wake 设置中断唤醒系统的电源模式。machine.IDLE 空闲状态,可以快速恢复设备的运行,machine.SLEEP 浅睡眠状态,唤醒后从请求睡眠的点恢复执行,machine.DEEPSLEEP 深睡眠状态,唤醒后类似硬重置,程序从头执行。
# 设置 0 号引脚为上拉输入模式
pin = Pin(0, machine.Pin.IN, machine.Pin.PULL_UP)   
# 定义一个中断处理函数
def irq_handler(pin, event):print(pin, event)
# 设置引脚的中断,触发条件为下降沿
pin.irq(handler=irq_handler, trigger=machine.Pin.IRQ_FALLING)

使用微动开关点亮板载 LED

给 Pico 接入一个外部开关,当按下开关时,板载的 LED 小灯点亮。

硬件需求

名称 数量
微动开关 x1
杜邦线 若干

电路

微动开关

  • 引脚 1 - GP2
  • 引脚 2 - GND

代码

将 Pico 的 GP2 引脚配置成上拉输入模模式,将开关的一端与 GP2 连接。由于上拉输入在没有外部输入时读取始终为高电平信号,因此开关的另一段需要连接 GND。当按下开关时 GP2 引脚会检测到低电平信号。那么怎样去不断检测开关是否被按下?最简单的一种方式,可以使用 while 循环,在循环体内不停读取 GP2 的值,从而判断开关的状态。具体的代码如下。

from machine import Pin# 初始化引脚
button = Pin(2, mode=Pin.IN, pull=Pin.PULL_UP)
led = Pin('LED', mode=Pin.OUT)# 在循环体内不停读取,当检测到低电平信号时,表明开关被按下
while True:if not button.value():led.value(1)else:led.value(0)

这个程序虽然能够实现效果,但也有一个致命问题:不断的循环使得程序只能检测开关是否被按下,而做不了任何其他事情。使用中断可以将检测与 CPU 处理完全分离,无需不断扫描引脚的值。当硬件检测到信号更改时,中断都会在信号变化后触发功能执行。具体的代码如下。

from machine import Pin# 初始化引脚
button = Pin(2, mode=Pin.IN, pull=Pin.PULL_UP)
led = Pin('LED', mode=Pin.OUT)# 定义一个中断服务方法,当检测到低电平信号时,改变 LED 的状态
def button_isr(pin):led.value(not led.value())# 配置中断,下降沿触发
button.irq(trigger=Pin.IRQ_FALLING, handler=button_isr)while True:pass  # 可以做一些其他事情

在运行上面的代码时,你可能已经注意到,按下按钮后 LED 存在闪烁的现象,这是为什么?是代码的错误吗?这是因为按钮并不是一个完美的开关,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,因而在闭合及断开的瞬间均伴随有一连串的“抖动”。信号从稳定状态移动,经过不稳定的过渡状态,最终到达新的稳定状态,如下图所示。

针对这种抖动现象,可以通过硬件进行去除,比如利用电容的充放电平滑的补偿信号的抖动。也可以利用软件进行去抖,信号抖动的状态有时间限制,添加一个短暂的延时再去检测电平信号。

from machine import Pin
import utimelast_time = 0 # 记录按下的时间# 初始化引脚
button = Pin(2, mode=Pin.IN, pull=Pin.PULL_UP)
led = Pin('LED', mode=Pin.OUT)# 定义一个中断服务方法,当检测到低电平信号时,改变 LED 的状态
def button_isr(pin):global last_timenew_time = utime.ticks_ms()# 延时if (new_time - last_time) > 50: led.value(not led.value())last_time = new_time# 配置中断,下降沿触发
button.irq(trigger=Pin.IRQ_FALLING, handler=button_isr)while True:pass  # 可以做一些其他事情

参考

  1. MicroPython documentation:https://docs.micropython.org/en/latest/library/machine.Pin.html
  2. MicroPython for Kids:https://www.coderdojotc.org/micropython/advanced-labs/02-interrupt-handlers

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL-17.其他数据日志

C-17.其他数据日志 在之前的数据库事务的章节中,已经讲过,redo log和undo log。 对于线上数据库应用系统,突然遭遇数据库宕机怎么办?在这种情况下,定位宕机的原因就非常关键。我们可以查看数据库的错误日志。因为日志中记录了数据库运行中的诊断信息,包括了错误,警告和注…

如何恢复SSD NVME固态硬盘的数据恢复

一、使用数据恢复软件 操作步骤(以EaseUS Data Recovery Wizard为例): 安装软件:从EaseUS官网或其他可靠来源下载并安装EaseUS Data Recovery Wizard。 连接固态硬盘:将SSD NVMe固态硬盘连接到电脑上,并确保系统能够识别。 启动软件并选择恢复选项:打开EaseUS Data Reco…

raid5存储池已损毁硬盘数据

RAID 5存储池中的硬盘数据损毁是一个复杂的问题,因为它涉及到数据的冗余、存储方式以及恢复策略。 一、RAID 5的工作原理 RAID 5是一种使用条带化和奇偶校验技术的存储解决方案,它至少需要三个硬盘来构建。在这种配置中,数据和奇偶校验信息被分布在所有硬盘上,以提供数据冗…

SSD NVME固态 硬盘 数据恢复

SSD NVMe固态硬盘数据恢复是一个复杂但并非不可能的任务,以下是一些建议的方法和步骤: 一、了解数据恢复的基本原理 数据恢复的基本原理在于,即使文件在操作系统中被删除或格式化,其实际数据在硬盘的物理介质上可能仍然存在,只是被标记为可覆盖。 SSD NVMe固态硬盘与传统的…

磁盘阵列中raid5坏了一个硬盘数据恢复

RAID5数据恢复步骤包括备份数据、更换故障硬盘、重建RAID阵列和数据恢复注意事项。在恢复过程中,需遵循正确的步骤并保持冷静,不要尝试自行解决复杂的数据恢复问题,以免造成不可逆转的数据损失。完成恢复后,应进行完整性检查和验证。 一、概述 RAID 5是一种存储配置,它将多…

电脑开机检测不到硬盘怎么办 电脑检测不到硬盘问题解决

电脑开机检测不到硬盘,无法进入系统或者显示“Reboot and Select proper Boot device”等错误信息。这种情况可能会导致我们的数据丢失或者无法使用电脑。 一、电脑检测不到硬盘的可能原因 电脑检测不到硬盘的原因主要有以下几种:1、硬盘连接线松动或损坏:硬盘是通过SATA线或…

CentOS 7 下载 网络配置 ssh配置 JDK配置 Python3配置 Git配置 nvm配置 防火墙配置

背景 CentOS 8系统2021年12月31日已停止维护服务,CentOS 7系统将于2024年06月30日停止维护服务。CentOS官方不再提供CentOS 9及后续版本,不再支持新的软件和补丁更新。 所以我们如果要安装服务器操作系统就需要安装centos7。这里我是用虚拟机安装的centos7mini版,mini版本是…

IBM服务器raid1数据恢复

IBM服务器RAID1数据恢复是一个相对复杂的过程,因为RAID1涉及数据的镜像和冗余,但一旦数据丢失,恢复的可能性仍然存在。以下是一些建议的步骤和注意事项,以帮助您进行IBM服务器RAID1数据恢复: 一、停止使用受影响的服务器 一旦发现数据丢失,首要任务是停止使用受影响的服务…

服务器刷新BIOS后死机

服务器刷新BIOS后死机是一个比较常见的问题,可能由多种原因引起。 一、原因分析 BIOS文件问题: 刷新的BIOS文件可能本身就是坏的,或者与服务器硬件不兼容。 BIOS版本选择不当,也可能导致兼容性问题。 刷新过程问题: 刷新过程中突然断电或操作不当,可能导致BIOS损坏。 硬件…

其他计算机系统基础知识

计算机语言计算机语言是指用于人与计算机之间交流的一种语言,是人与计算机之间传递信息的媒介。计算机语言主要由一套指令组成,而这种指令一般包括表达式、流程控制和集合三大部分内容。表达式又包含变量、常量、字面量和运算符。 流程控制有分支、循环、函数和异常。 集合包…

函数,调试,循环,头文件

1.关于函数 作用:避免代码重复 可以方便维护,因为当多个地方需要用到同样的代码时,如果要做出修改只需要改函数就能整体修改。 函数通常都会有返回值,什么类型的函数返回什么样的类型的值 函数通常分为函数声明和函数参数通常声明放在头文件中 函数定义发在C++文件中 这样做…

ENVI无缝镶嵌、拼接栅格数据的方法

本文介绍基于ENVI软件,利用“Seamless Mosaic”工具实现栅格遥感影像无缝镶嵌的操作~本文介绍基于ENVI软件,利用“Seamless Mosaic”工具实现栅格遥感影像无缝镶嵌的操作。在遥感图像镶嵌拼接:ENVI的Pixel Based Mosaicking工具操作方法这篇文章中,我们介绍了在ENVI软件中通…