目录[-]


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

sudo killall pigpiod