树莓派内含一个GPIO接口,可以连接各种各样的硬件,为我们提供了很多方便的接口来扩展树莓派的功能。
那么,什么是GPIO接口?
GPIO的定义
GPIO是(Input)的缩写,意为通用输入输出,是一种用来表示开关量的通用硬件接口。
下图列出了 Pi整个系列的图片,引脚为GPIO接口:
树莓派GPIO引脚定义
Pi 接口常见的有 26 针和 40 针两种,大家可以根据自己手上的 Pi 选择,我手上是第三代 Model B+,引脚定义如下:
GND 代表接地
V表示电源
绿色 GPIO.* 是我们可以用于编程的引脚。
其他接口:TxD/RxD是一组,用于串口通信,连接另外一台树莓派(或者其他支持串口通信的模块)(TxD接对方的RxD,Rxd接对方的TxD)设置相同的波特率,即可实现串口通信。SDA/SCL是一组,用于IIC协议通信,连接另外一台树莓派(或者,支持IIC的模块等),支持IIC协议,通过IIC协议进行通信 MOSI、MISO、SCLK、CE0、CE1用于SPI通信协议,连接使用SPI通信的模块看情况 来源知乎
无论如何,如果您对硬件不太了解并且不打算 root 硬件,那么就忽略它们吧。
连接到树莓派后,可以通过命令打印出引脚定义:
1GPIO接口
不知道是不是因为我的系统太旧,还是我的外接扩展板不支持,这里没有pin码输出,只是说不是支持的型号:
至 。我明白了: :
- 或者 。
如果这是 Pi,那么这个
到。如果这不是 Pi,那么你
是你自己
仅限 Pi。
不过这没关系,并不影响我们的测试。
Pi 扩展板
这里使用了集成扩展板,因此无需连接额外的电线。
扩展板引脚图:
通用输入输出
这个库更准确的名字是 -gpio-,这是 Pi 官方文档中推荐的,使用起来也很简单。GPIO 是一个小库,可以帮助用户完成相关的 IO 端口操作。不过,GPIO 库还不支持 SPI、I2C 或 1-wire 等总线接口。除了 GPIO 之外,还有很多扩展库(例如),这些扩展库无疑非常适合 Pi, Pi 也非常适合。
两个密码
董事会编号
这对应于 Pi 板上的物理引脚编号。使用此编号的好处是,无论 Pi 版本如何,您的硬件始终都能正常工作。因此,升级主板后,您无需重写连接器或代码。
BCM 规则
是比较底层的工作方式,对应片上系统中的通道号,使用引脚时需要找到通道号和物理引脚号的对应关系,针对不同的树莓派版本,编写的脚本文件可能不通用。
您可以使用以下代码指定编号方案(强制):
1GPIO.(GPIO.板)#.(GPIO.BCM)
以下代码将返回设置的编号序列
1模式 = GPIO.()
警告
如果 RPi.GRIO 检测到引脚已设置为非默认值,您将看到一条警告消息。您可以使用以下代码禁用警告:
1GPIO.(假)
引脚设置
在使用引脚之前,需要先将其设置为输入或输出。配置引脚的代码如下:
将引脚设置为输入模式 1GPIO.setup(, GPIO.IN)
将引脚设置为输出模式 1GPIO.setup(, GPIO.OUT)
为输出引脚设置默认值1 GPIO.setup(, GPIO.OUT, =GPIO.HIGH)
发布
一般来说,需要在程序结束时释放资源。这个好习惯可以避免意外损坏树莓派。释放脚本中使用的引脚:
1GPIO.()
注意,GPIO.() 只会释放脚本中使用的 GPIO 引脚,并清除设置的引脚编号规则。
实验一:控制LED灯闪烁
要点亮LED或者驱动某个设备,需要给它们提供电流和电压。这一步也很简单,只要设置一下引脚的输出状态即可。代码如下:
1> GPIO.(,状态)
状态可以设置为:
0 / GPIO.低 / 假
1 / GPIO.高 / 真
如果编码规则是GPIO.BOARD,那么它就是对应引脚的编号。
如果想一次性设置多个引脚,可以使用如下代码:
= [11,12]
GPIO.(,GPIO.LOW)GPIO.(,(GPIO.HIGH,GPIO.LOW))
您还可以使用 Input() 函数读取输出引脚的状态并将其用作输出值,例如:
1GPIO.(12,不是GPIO.input(12))
我们还经常需要读取引脚的输入状态,获取引脚输入状态的代码如下:
1GPIO.输入()
低水平回报
0 / GPIO.低 / 假
高水平回报
1 / GPIO.高 / 真
如果输入引脚悬空,则该引脚的值将悬空。换句话说,读取的值是未知的,因为它在按下按钮或开关之前未连接到任何信号。由于干扰,输入值可能会反复变化。使用以下代码可以解决问题:
2GPIO.设置(,GPIO.IN,=GPIO。)
GPIO.设置(,GPIO.IN,=GPIO。)
需要注意的是,上述读取代码只是获取当前时刻的引脚输入信号。
如果你需要实时监控引脚的状态变化,有两种方法。最简单、最原始的方法是每隔一段时间检查输入信号值,这称为轮询。如果你的程序在错误的时间读取,则很可能丢失输入信号。轮询以循环方式进行,这会占用更多处理器资源。响应 GPIO 输入的另一种方法是使用中断(边沿检测),其中边沿指的是信号从高到低(下降沿)或从低到高(上升沿)的变化。
轮询方法 1
GPIO.输入()==GPIO.低:
经过
边缘检测
边沿是信号状态的变化,从低到高(上升沿)或从高到低(下降沿)。通常,我们更关心输入状态的边沿,而不是输入信号的值。这个状态的边沿称为事件。首先,我们介绍两个函数:
() 功能
() 用于阻止程序继续执行,直到检测到边缘。换句话说,上面等待按钮按下的示例可以重写为:
= GPIO。(,,=5000)
如果为无:
打印(' ')
别的:
打印('边缘开启',)
() 功能
该函数监控一个引脚,一旦引脚输入状态发生变化,call()函数就会返回true,如下代码所示:
4GPIO.(, GPIO.) # 在()上添加边
# 下面的代码放在线程循环中执行。
如果是GPIO.():
打印(' ')
上述代码需要你新建一个线程来循环遍历()的值,比较麻烦。
不过还有另外一种方式可以轻松检测状态,那就是直接传递回调函数:
6def():
print('这是一个边缘事件!')
打印('边缘在 %s'%)
print('这是在你的主程序中运行的')
GPIO.(,GPIO.,=)
如果要设置多个回调函数,可以这样做:
9def():
打印(‘一’)
定义():
打印(‘二’)
GPIO。(,GPIO。)
GPIO.(,)
GPIO.(,)
注意:触发回调时,各个回调函数并不会同时执行,而是按照设置的顺序依次调用。
说了这么多,下面我们开始点亮我们的LED灯吧:
编写脚本:
10
11
12
十三
14
15
16
17
18
19
20
21
22
23
24#:utf-8
RPi.GPIO 作为 GPIO
时间
GPIO.(GPIO.BCM)
GPIO。(假)
# 控制 LED 闪烁
发光二极管 = 12
GPIO.设置(led,GPIO.OUT)
尝试:
while(真):
打印“明亮”
GPIO.(LED,1)
时间.睡眠(1)
打印‘熄灭’
GPIO.(LED,0)
时间.睡眠(1)
例如:
打印(e)
:
GPIO.()
将其上传到 Pi 并运行:
实验二:获取开关信号
实验1采用轮询方式实现。在本实验中,我们将使用边缘检测来获取开关信号的变化。
从扩展板的电路图我们可以看到这里有3个按钮,对应的BCM代码分别是17、18、27。
我们在这里使用 17 作为开关。
轮询方法
先给出轮询的方法,代码:
10
11
12
十三
14
15
16
17
18
19
20
21
22# :utf-8
RPi.GPIO 作为 GPIO
时间
GPIO.(GPIO.BCM)
GPIO。(假)
# 检测开关
# 3个集成开关17、18、27的位置默认为1,按下后信号为0
= 17
GPIO.设置(,GPIO.IN,GPIO。)
尝试:
while(真):
如果 GPIO.input() == True:
print'获取开关 1 信号:%s'% GPIO.input()
时间.睡眠(1)
例如:
打印(e)
:
GPIO.()
输出:
10 获取开关1信号:1
获取开关1信号:1
获取开关1信号:1
获取开关1信号:1
获取开关1信号:1
获取开关1信号:0
获取开关1信号:0
获取开关1信号:0
获取开关1信号:1
获取开关1信号:1
当信号为 0 时,就是我们按下按钮的时候。但是,因为这里是轮询,所以有可能取不到任何值。也就是说,当我们按下按钮的那一刻, Pi 并没有获得这个变化。
边缘检测方法
通过边缘检测可以轻松检测到开关的变化:
10
11
12
十三
14
15
16
17
18
19
20
21
22
23
24
25# :utf-8
RPi.GPIO 作为 GPIO
时间
GPIO.(GPIO.BCM)
GPIO。(假)
# 检测开关
# 3个集成开关17、18、27的位置默认为1,按下后信号为0
= 17
GPIO.设置(,GPIO.IN,GPIO。)
定义():
打印('按下按钮...')
GPIO.(,GPIO.,=)
尝试:
while(真):
时间.睡眠(1)
例如:
打印(e)
:
GPIO.()
输出:
7 按下按钮...
按下按钮...
按下按钮...
按下按钮...
按下按钮...
按下按钮...
按下按钮...
好了,希望对看到这篇文章的你们有帮助(^_^)
扫一扫在手机端查看
-
Tags : gpio.setwarnings(false)
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。