Python对GPIO的操作

773 阅读3分钟

python读取gpio数据

如果要使用Python来使用GPIO信号,需要使用RPi.GPIO模块。

如果你使用的是Python2版本,树莓派默认安装了RPi.GPIO模块(python-rpi.gpio)。 目前大多数的人都是使用Python3了,所以我们要手动安装Python v3版本的模块。

安装RPi.GPIO模块
sudo apt-get update
sudo apt-get install python3-rpi.gpio

image.png 测试是否安装成功,可以通过以下例子测试

在命令行中先输入python3

再导入RPi.GPIO模块。 image.png

使用与访问GPIO引脚

在占位符中有两种方法来进行引用GPIO的信号,所以我们需要使用setmode()方法来进行设置使用哪一种方法。

GPIO接口的引脚号   GPIO.setmode(GPIO.BOARD)

Broadcom芯片的GPIO信号数  GPIO.setmode(GPIO.BCM)

image.png

GPIO接口的12号引脚(物理引脚BOARD编码)和GPIO信号18(BCM编码)。

如果我们使用的是GPIO.BCM模式,我们使用18来进行使用这个引脚。

如果我们使用的是GPIO.BOARD模式,我们使用12进行使用这个引脚。

设置为GPIO.BCM模式,设置18脚为输出,设置为输出高。
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(18,GPIO.OUT)
GPIO.output(18,GPIO.HIGH)

设置40号引脚为输入方向
pin = 40
GPIO.setup(pin,GPIO.IN)


输出还可以加初始电平: 
GPIO.setup(pin,GPIO.OUT,initial=GPIO.HIGH) 

如果要同时设置多个引脚: 
list=[11,12] 
GPIO.setup(list,GPIO.OUT)

一般来说,程序到达最后都需要释放资源,这个好习惯可以避免偶然损坏树莓派。释放脚本中的使用的引脚:

GPIO.cleanup()   注意,GPIO.cleanup()只会释放掉脚本中使用的GPIO引脚,并会清除设置的引脚编号规则。

如果RPi.GRIO检测到一个引脚已经被设置成了非默认值,那么你将看到一个警告信息。你可以通过下列代码禁用警告:

GPIO.setwarnings(False)

我们也常常需要读取引脚的输入状态,获取引脚输入状态如下代码:

GPIO.input(channel)
#低电平返回0 / GPIO.LOW / False,高电平返回1 / GPIO.HIGH / True。

如果输入引脚处于悬空状态,引脚的值将是漂动的。
换句话说,读取到的值是未知的,因为它并没有被连接到任何的信号上,直到按下一个按钮或开关。
由于干扰的影响,输入的值可能会反复的变化。
使用如下代码可以解决问题:

GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_UP)  
# or
GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
#需要注意的是,上面的读取代码只是获取当前一瞬间的引脚输入信号。

如果需要实时监控引脚的状态变化,可以有两种办法。
最简单原始的方式是每隔一段时间检查输入的信号值,这种方式被称为轮询。
如果你的程序读取的时机错误,则很可能会丢失输入信号。
轮询是在循环中执行的,这种方式比较占用处理器资源。

while GPIO.input(channel) == GPIO.LOW:
    time.sleep(0.01)  # wait 10 ms to give CPU chance to do other things

另一种响应GPIO输入的方式是使用中断(边缘检测),这里的边缘是指信号从高到低的变换(下降沿)或从低到高的变换(上升沿)。

边缘检测 边缘是指信号状态的改变,从低到高(上升沿)或从高到低(下降沿)。通常情况下,我们更关心于输入状态的该边而不是输入信号的值。这种状态的改变被称为事件。

wait_for_edge() 函数

wait_for_edge()被用于阻止程序的继续执行,直到检测到一个边缘。

channel = GPIO.wait_for_edge(channel, GPIO_RISING, timeout=5000)

add_event_detect() 函数

该函数对一个引脚进行监听,一旦引脚输入状态发生了改变,调用event_detected()函数会返回true

GPIO.add_event_detect(channel, GPIO.RISING)
if GPIO.event_detected(channel):
	print('Button pressed')

RPI.GPIO 模块的脉宽调制(PWM)功能
脉宽调制(PWM)是指用微处理器的数字输出来对模拟电路进行控制,是一种对模拟信号电平进行数字编码的方法。在树莓派上,可以通过对GPIO的编程来实现PWM。

创建一个 PWM 实例:
p = GPIO.PWM(channel, frequency) 

启用 PWM:
p.start(dc) # dc 代表占空比(范围:0.0 <= dc <= 100.0)

更改频率:
p.ChangeFrequency(freq) # freq 为设置的新频率,单位为 Hz 

更改占空比:
p.ChangeDutyCycle(dc) # 范围:0.0 <= dc >= 100.0 

停止 PWM:
p.stop() #注意,如果实例中的变量“p”超出范围,也会导致 PWM 停止。