目录[-]
1、GPIO是什么
GPIO即通用输入/输出端口,是在嵌入式设备以及人机交互设备中很重要的概念,用户可以通过GPIO与其他设备进行数据交换,比如串口,spi,i2c等;用户也可以通过GPIO与程序进行交互,比如按钮,指示灯,继电器等。
本节主要目标是在64位Ubuntu 20.04系统下实现树莓派的GPIO的控制。
2、通过文件操作linux系统的GPIO(在shell中测试)
Linux 系统下,所有的设备都是文件,想要控制gpio可以采用类库,也可以直接采用文件对gpio设备进行操作。
• GPIO文件路径:
/sys/class/gpio
• 将指定GPIO端口从内核空间引入到用户空间
向 expert 文件中写入GPIO编号。
• 将指定GPIO端口从用户空间注销
向 unexpert 文件中写入GPIO编号。
• GPIO文件夹目录
direction | in / out |
value | 0 / 1 |
• 引入GPIO后,默认为输入模式,直接读取 value 文件中的值即可得到针脚状态
while true : do cat value ; done
• 引入GPIO后,通过将文件 direction 中的值改为 out,则将对应接口配置为输出模式,此时可直接修改 value 文件的值,修改后即可改变输出阵脚的状态。
3、常用树莓派GPIO库
• wringpi 原生wiringpi实际测试并不支持PI4B以及 ubuntu20.04 64 系统,在此不再使用。(2020-10-25)
• gpiozero 在ubuntu20.04 下可以使用,但是针对GPIO的电阻上拉与下拉设置不起作用,具体原因还没有分析到,暂时未使用(2020-10-25)
• pigpio 在ubuntu20.04下可正常使用。(http://abyz.me.uk/rpi/pigpio/faq.html)
4、pigpio 类库的安装
# 下载最新版本 pigpio 源码
wget [https://github.com/joan2937/pigpio]
Unzip pigpio-master
Cd pigpio-master
# 安装编译自动配置以及gcc编译环境
Sudo apt install autoconf
Sudo apt install make
Sudo apt install gcc
# 编译安装 pigpio
Make
Sudo make install
Sudo pigpiod
5、pigpio 使用注意事项
注意事项:
• 在使用 pigpio 类库时,需要首先启动守护线程,直接在shell 中启动 pigpio即可。
• 如果需要在多个文件中使用gpio,打开一个 守护线程即可。
sudo pigpiod
6、pigpio 输入测试
GPIO对应端口外接按钮时,可通过pigpio直接读取对应针脚状态
#!/usr/bin/env python
# encoding = utf-8
import pigpio
pi = pigpio.pi()
pi.set_mode(25,pigpio.INPUT) # 设置GPIO25(BCM)为输入模式
pi.set_pull_up_down(25,PUD_UP) # 设置GPIO25(BCM)为电阻上拉
print(pi.read(25) # 读取GPIO25(BCM)对应阵脚的输入状态
详细使用参考pigpio使用文档:http://abyz.me.uk/rpi/pigpio/python.html
7、pigpio 输出测试
#!/usr/bin/env python
# encoding = utf-8
import pigpio
pi = pigpio.pi()
pi.set_mode(23,pigpio.OUTPUT) # 设置GPIO23(BCM)为输出模式
pi.write(23,1)# 设置GPIO23(BCM)对应阵脚的输出状态为 1
8、树莓派 GPIO 作为输入模式下的 电阻 上拉与下拉
当树莓派阵脚悬空时,其默认的电平是不确定的,因此作为输入时,需要设置一个默认电平。树莓派内部电路已经支持通过软件设置选择高低电平,即电阻的上拉与下拉。
上拉电阻:输入针脚经过一个电阻接到 VCC,则是上拉模式;此时外接的按钮当连接GND。
下拉电阻:输入针脚经过一个电阻接到GND,则是下拉模式;此时外接的按钮当连接VCC。
9、作为输入时可以用 中断触发 一些事件
#!/usr/bin/env python
# encoding = utf-8
import pigpio
def gpio25_callback(gpio,level,tick):
pass
pi = pigpio.pi()
pi.set_mode(25,pigpio.INPUT) # 设置GPIO25(BCM)为输入模式
pi.set_pull_up_down(25,PUD_UP) # 设置GPIO25(BCM)为电阻上拉
__callback = pi.callback(25,pigpio.RISING_EDGE,gpio25_callback)
print(pi.read(25) # 读取GPIO25(BCM)对应阵脚的输入状态
10、树莓派 GPIO
11、问题处理
• 2020-10-23 23:28:20 initInitialise: Can't lock /var/run/pigpio.pid Can't initialise pigpio library
删除 目录下的 pigpiod 的守护进程。即:Can't lock /var/run/pigpio.pid
• 2020-10-23 23:31:59 initInitialise: bind to port 8888 failed (Address already in use) Can't initialise pigpio library
因为诸多公式编辑的原因,教程类文章将逐步移至blog内: www.exuehao.com;直接可以显示markdown文件。
sudo killall pigpiod