树莓派 GPIO基础 输入input

举报
一颗小树x 发表于 2020/12/18 23:26:47 2020/12/18
【摘要】 RPi.GPIO 模块程序包提供了一个在 Raspberry Pi 中控制 GPIO 的类。 使用步骤:1. 导入模块   import RPi.GPIO as GPIO通过该操作,您可以将模块名称映射为 GPIO,以便接下来您其它脚本进行使用。 2. 针脚编号目前有两种方式可以通过 RPi.GPIO 对 Raspberry Pi 上的 IO 针脚进行编号。  第一种方式   是使用 BOA...

RPi.GPIO 模块程序包提供了一个在 Raspberry Pi 中控制 GPIO 的类。 

使用步骤:

1. 导入模块   

import RPi.GPIO as GPIO

通过该操作,您可以将模块名称映射为 GPIO,以便接下来您其它脚本进行使用。

 

2. 针脚编号

目前有两种方式可以通过 RPi.GPIO 对 Raspberry Pi 上的 IO 针脚进行编号

  第一种方式   是使用 BOARD 编号系统。该方式参考 Raspberry Pi 主板上 P1 接线柱的针脚编号。使用该方式的优点是无需考虑主板的修订版本,您硬件始终都是可用的状态。您将无需从新连接线路和更改您的代码。

 GPIO.setmode(GPIO.BOARD)

 

  第二种方式   是使用 BCM 编号。这是一种较低层的工作方式 – 该方式参考 Broadcom SOC 的通道编号。使用过程中,您始终要保证主板上的针脚与图表上标注的通道编号相对应。您的脚本可能在 Raspberry Pi 主板进行修订版本更新时无法工作。 

GPIO.setmode(GPIO.BCM)

 注意:两种方式中,必须指定其中一种。 

3.禁用该警告消息:

GPIO.setwarnings(False)

   可能您的 Raspberry Pi 的 GPIO 上同时有多个脚本/循环。因此,如果 RPi.GPIO 检测到某个针脚被设置为其它用途而非默认的状态(默认为输入),您会在尝试配置某脚本时得到警告消息

 

4.配置通道

您需要为每个用于输入或输出的针脚配置通道

GPIO.setup(channel, GPIO.IN)

(通道编号是基于您所使用的编号系统所指定的(BOARD 或 BCM)。)

 

5.清理

    在任何程序结束后,请养成清理用过的资源的好习惯。使用 RPi.GPIO 也同样需要这样。恢复所有使用过的通道状态为输入,您可以避免由于短路意外损坏您的 Raspberry Pi 针脚。注意,该操作仅会清理您的脚本使用过的 GPIO 通道。

GPIO.cleanup()  //程序最后结束后,可以全部设置为输入

 

补充说明:

上拉/下拉电阻

   如果您在输入针脚上没有连接任何元件,那么它将是“浮动(float)”的。换句话说,因为您没有连接任何元件,在按下按钮或开关之前,读取的值是没有意义的。由于电源的波动,获取到的值可能会有很大的变化,

   在这里,可以使用硬件或软件对电阻进行上拉/下拉。使用硬件方式,将一个 10K 的电阻连接在输入通道与 3.3V(上拉)或 0V(下拉)之间是常用的做法。而 RPi.GPIO 也允许您通过软件的方式对配置 Broadcom SOC 来达到目的:

GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_UP)

或者

GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

 

输入测试(轮询(polling))

您可以在某个时间点获得一次输入的快照

if GPIO.input(channel):   
    print('Input was HIGH')
else:
    print('Input was LOW')

在循环中等待按钮被按下后进行轮询:

while GPIO.input(channel) == GPIO.LOW:
    time.sleep(0.01)  # 为 CPU 留出 10 毫秒,供其处理其它事物


中断和边检检测

   边缘的定义为电信号从 LOW 到 HIGH(上升临界值)或从 HIGH 到 LOW(下降临界值)状态的改变。正常情况下,对于输入的值来说,我们更关心的是输入的状态是否发生了改变。这种状态上的改变是很重要的。  

为了避免您的程序在忙于处理其它的事物时而错过了您按下按钮的操作,这里有两种方法可以解决:

wait_for_edge() 函数

wait_for_edge() 函数被设计用于在检测到边缘之前阻止程序的运行。换句话说,上面的示例中,等待按钮被按下的语句可以改写为:

GPIO.wait_for_edge(channel, GPIO.RISING)

注意,您可以输入 GPIO.RISING、GPIO.FALLING、GPIO.BOTH 对边缘进行检测。这种方式的优点是占用 CPU 资源很少,因此系统可以有充裕的资源处理其它事物。

GPIO.RISING 上升沿  GPIO.FALLING下降沿   GPIO.BOTH两者都是

 

event_detected() 函数

event_detected() 函数被设计用于循环中有其它东西时使用,但不同于轮询的是,它不会错过当 CPU 忙于处理其它事物时输入状态的改变。这在类似使用 Pygame 或 PyQt 时主循环实时监听和响应 GUI 的事件很有用的

GPIO.add_event_detect(channel, GPIO.RISING)  # 在通道上添加上升临界值检测
do_something()
if GPIO.event_detected(channel):
    print('Button pressed')

注意,您可以输入 GPIO.RISING、GPIO.FALLING、GPIO.BOTH 对边缘进行检测。

这两种方法在检测到边缘时执行线程回调函数。

  注意,该模块(RPi.GPIO 树莓派 )不适合应用到追求实时性计数周期的应用中。这是由于您无法预测 Ptyhon 何时繁忙,以及资源回收的时间。而且它是运行在基于 Linux 核心的系统中,也不合适用于实时应用 – 原因在于其它进程可能获得更高的 CPU 优先级。 

希望对你有帮助。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。