Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >张高兴的 MicroPython 入门指南:(二)GPIO 的使用

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

作者头像
张高兴
发布于 2025-05-21 06:05:05
发布于 2025-05-21 06:05:05
19900
代码可运行
举报
文章被收录于专栏:张高兴的博客张高兴的博客
运行总次数:0
代码可运行

什么是 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 类。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from machine import Pin

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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,实际的输出功率还是取决于具体的引脚。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 时,方法为读取引脚的值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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]) 对引脚重新设置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 深睡眠状态,唤醒后类似硬重置,程序从头执行。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 设置 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 的值,从而判断开关的状态。具体的代码如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 处理完全分离,无需不断扫描引脚的值。当硬件检测到信号更改时,中断都会在信号变化后触发功能执行。具体的代码如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 存在闪烁的现象,这是为什么?是代码的错误吗?这是因为按钮并不是一个完美的开关,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,因而在闭合及断开的瞬间均伴随有一连串的“抖动”。信号从稳定状态移动,经过不稳定的过渡状态,最终到达新的稳定状态,如下图所示。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from machine import Pin
import utime

last_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_time
  new_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
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 土味儿编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
张高兴的 .NET IoT 入门指南:(二)GPIO 的使用
GPIO 是 General Purpose Input Output 的缩写,即“通用输入输出”。Raspberry Pi 有两列 GPIO 引脚, Raspberry Pi 通过这两行引脚进行一些硬件上的扩展,与传感器进行交互等等。
张高兴
2025/05/21
1330
张高兴的 .NET IoT 入门指南:(二)GPIO 的使用
树莓派pico官方网站_树莓派pico参数
Raspberry Pi Pico是具有灵活数字接口的低成本,高性能微控制器板。它集成了Raspberry Pi自己的RP2040微控制器芯片,运行速度高达133 MHz的双核Arm Cortex M0 +处理器,嵌入式264KB SRAM和2MB板载闪存以及26个多功能GPIO引脚。对于软件开发,可以使用Raspberry Pi的C / C ++ SDK或MicroPython。1
全栈程序员站长
2022/11/04
3.5K0
RoboMaster TT 无人机microPython编程.3
在方法的后面有一些我们之前看见的方法,有Tof的传感器,三个RGB的灯,控制功能,已经led的控制和小屏幕的控制
云深无际
2021/04/14
1.1K0
RoboMaster TT 无人机microPython编程.3
STM32F103GPIO-LED点灯
GPIO(General-Purpose IO ports,通用输入/输出接口),用于感知外界信号(输入模式)和控制外部设备(输出模式),如图 6.1.1 所示的STM32F103ZET6芯片四周的细引脚就是GPIO。
韦东山
2022/05/05
1K0
STM32F103GPIO-LED点灯
STM32之GPIO输出与输出
每种模式都有其特定的应用场景,选择正确的模式对于确保电路正确工作至关重要。例如,如果要使用GPIO引脚作为数字输入来读取按钮状态,可以选择输入上拉或下拉模式;如果要用作LED驱动,则输出推挽模式可能是更好的选择。对于像I2C这样的通信协议,通常会使用输出开漏或复用开漏模式,因为这些协议通常需要外部上拉电阻来确保总线处于正确的电平。
破晓的历程
2024/12/23
5050
STM32之GPIO输出与输出
【STM32】GPIO口以及EXTI外部中断
输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
s-little-monster
2024/08/09
6610
【STM32】GPIO口以及EXTI外部中断
张高兴的 MicroPython 入门指南:(三)使用串口通信
串口是串行接口的简称,这是一个非常大的概念,在嵌入式中串口通常指 UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)。使用串口进行的通信叫做串行通信,与之相对的一个概念是并行通信。串行通信是指数据一位一位的按顺序传输,而并行通信则是多位数据同时传输。如下图所示,DATA BUS 到 UART 1 之间是并行通信,UART 1 到 UART 2 之间是串行通信。
张高兴
2025/05/21
1910
张高兴的 MicroPython 入门指南:(三)使用串口通信
【嵌入式】手把手教你入门STM32的GPIO:使用GPIO输入
GPIO引脚可以配置为输入或输出模式。在输入模式下,GPIO用于读取外部信号,比如开关、传感器等。以下是关于STM32 GPIO输入的一些基本知识点:
用户10923087
2024/10/30
1.4K0
【嵌入式】手把手教你入门STM32的GPIO:使用GPIO输入
张高兴的 .NET Core IoT 入门指南:(二)GPIO 的使用
GPIO 是 General Purpose Input Output 的缩写,即“通用输入输出”。 Raspberry Pi 有两行 GPIO 引脚, Raspberry Pi 通过这两行引脚进行一些硬件上的扩展,与传感器进行交互等等。
张高兴
2019/02/26
1.7K0
GPIO基本知识
GPIO是通用输入/输出端口的简称,是STM32可控制的引脚。GPIO的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。那STM32引脚是如何分类的?GPIO内部结构是怎样的,随海翎光电的小编一起看看吧!
利又德智能感知
2023/07/07
2.7K0
GPIO基本知识
STM32 GPIO的原理、特性、选型和配置
STM32 GPIO是通用输入/输出端口的英文简称,其可实现输入、输出、驱动、通信等功能,STM32的I/O 端口有8种模式(4种输入模式和4种输出模式),每个 I/O 端口位支持3种最大翻转速度(2MHz、10MHz、50MHz),均可自由编程,但I/O 端口寄存器必须按 32 位字、半字(16位)或字节(8位)进行访问,具体模式如下所示:
不脱发的程序猿
2021/01/20
1.3K0
[攻城狮计划]|RT-Thread—详解PIN设备(基于RA2E1)
文章目录 [攻城狮计划]|RT-Thread—详解PIN设备(基于RA2E1) PIN简介 🚗输入输出模式 输出 输入 🚗中断模式 PIN 设备管理 创建和注册PIN设备 🚗创建 🚗注册 访问PIN设备 🚗获取引脚编号 使用 API 🚗设置引脚模式 🚗设置引脚电平 🚗读取引脚电平 🚗绑定引脚中断回调函数 🚗使能引脚中断 🚗脱离引脚中断回调函数 代码 [攻城狮计划]|RT-Thread—详解PIN设备(基于RA2E1) 🚀🚀开启攻城狮的成长之旅!这是我参与的由 CSDN博客专家 架构师李肯和 瑞
小点点
2023/04/01
6070
[攻城狮计划]|RT-Thread—详解PIN设备(基于RA2E1)
102-ESP32学习开发(SDK)-GPIO
控制GPIO25输出高低电平 1.原理图 2.参考官方例程 3.程序 #include <stdio.h> #include <string.h> #include <stdlib.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" #include "driver/gpio.h" #define gpio_pin 25 void app_main(void) {
杨奉武
2021/12/01
5520
102-ESP32学习开发(SDK)-GPIO
【嵌入式】手把手教你入门STM32的GPIO:初识GPIO输出
STM32是一系列基于ARM Cortex-M内核的32位微控制器。该系列微控制器广泛应用于计算机、通讯、工业自动化、消费电子、汽车电子、医疗仪器及家庭电器等领域。该系列控制器具有高性能、低功耗、智能化等特点。其中,GPIO就是STM32控制器中的一种重要的通用输入输出口。
用户10923087
2024/10/16
2K0
【嵌入式】手把手教你入门STM32的GPIO:初识GPIO输出
(三)STM32基础——GPIO介绍
        GPIO(General Purpose Input Output)叫做通用输入输出口,可配置为8种输入输出模式。
小点点
2022/12/12
1.2K0
(三)STM32基础——GPIO介绍
张高兴的 MicroPython 入门指南:(一)环境配置、Blink、部署
MicroPython 是一个基于 Python 3.4 的高效实现,它专为微控制器和嵌入式系统设计。它提供了一个小型的 Python 环境,包含了一些标准库的部分,并且能够在资源受限的设备上运行。MicroPython 支持交互式编程(REPL)、任意精度整数、列表解析、生成器、异常处理等高级功能,使开发者可以在边缘设备上编写和运行复杂的程序。
张高兴
2025/05/21
4790
张高兴的 MicroPython 入门指南:(一)环境配置、Blink、部署
stm32学习笔记之GPIO功能框图分析
  GPIO 是通用输入输出端口的简称,简单来说就是STM32 可控制的引脚,STM32 芯片的GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。STM32 芯片的GPIO被分成很多组,每组有16 个引脚,如型号为STM32F103VET6 型号的芯片有GPIOA、GPIOB、GPIOC 至GPIOE 共5 组GPIO,芯片一共100 个引脚,其中GPIO就占了一大部分,所有的GPIO引脚都有基本的输入输出功能。
用户6754675
2019/12/23
1.7K0
GPIO—按键轮询
前面控制LED灯是让GPIO输出高低电平,而获取按键则是读取GPIO电平,从而获知用户是否按下按键。
韦东山
2022/05/05
2.3K0
GPIO—按键轮询
STM点滴一
就就是你用BSRR和BRR去改变管脚状态的时候,没有被中断打断的风险。也就不需要关闭中断。
用户4645519
2020/09/07
3840
STM点滴一
嵌入式系统入门实战:探索基本概念和应用领域
嵌入式系统是一种专用的计算机系统,它是为了满足特定任务而设计的。这些系统通常具有较低的硬件资源(如处理器速度、内存容量和存储容量),但具有较高的可靠性和实时性。嵌入式系统广泛应用于各种领域,如家用电器、汽车、工业控制、医疗设备等。
一键难忘
2023/12/09
4150
相关推荐
张高兴的 .NET IoT 入门指南:(二)GPIO 的使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档