Python面向树莓派使用RPi.GPIO库

Posted 以梦为马&不负韶华

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python面向树莓派使用RPi.GPIO库相关的知识,希望对你有一定的参考价值。

文章目录


前言

树莓派中有40个引脚,就是GPIO,意思就是通用型输入输出。使用Python对其进行控制,就要使用第三方库 RPi.GPIO,这里简单介绍一下


一、代码实例

以下是双色LED灯实验,将中间引脚接入物理引脚编号为11的,将S接入物理引脚编号为12,G接入管脚为GND。

import time
try:
    import RPi.GPIO as GPIO  # 导入GPIO模块
except RuntimeError:
    print("Error importing RPi.GPIO!这可能是因为你需要超级用户权限。你可以通过使用'sudo'来运行你的脚本来实现这一点")

colors = [0xFF00, 0x00FF, 0x0FF0, 0xF00F]
makerobo_pins = [11, 12]  # PIN管脚字典  GPIO.BOARD对应实际物理管脚  GPIO.BCM对应BCM编码

GPIO.setmode(GPIO.BOARD)  # 采用实际的物理管脚给GPIO口
GPIO.setwarnings(False)  # 去除GPIO口警告
GPIO.setup(makerobo_pins, GPIO.OUT)  # 设置Pin模式为输出模式
GPIO.output(makerobo_pins, GPIO.LOW)  # 设置Pin管脚为低电平(0V)关闭LED

p_R = GPIO.PWM(makerobo_pins[0], 1000)  # 设置频率为1KHz
p_G = GPIO.PWM(makerobo_pins[1], 1000)  # 设置频率为1KHz

# 初始化占空比为0(led关闭)
p_R.start(0)
p_G.start(0)


# 按比例缩放函数
def makerobo_pwm_map(x, in_min, in_max, out_min, out_max):
    return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min


# 设置颜色
def makerobo_set_Color(col):  # 例如:col = 0x1122
    # 第一个col=0xFF00 转为2进制 为16位1111 1111 0000 0000
    R_val = col >> 8  # 前8位给红色
    G_val = col & 0x00FF  # 后8位给红色
    # 把0-255的范围同比例缩小到0-100之间
    R_val = makerobo_pwm_map(R_val, 0, 255, 0, 100)
    G_val = makerobo_pwm_map(G_val, 0, 255, 0, 100)

    p_R.ChangeDutyCycle(R_val)  # 改变占空比
    p_G.ChangeDutyCycle(G_val)  # 改变占空比


# 调用循环函数
def makerobo_loop():
    while True:
        for col in colors:
            makerobo_set_Color(col)
            time.sleep(0.5)


# 释放资源
def makerobo_destroy():
    p_G.stop()
    p_R.stop()
    GPIO.output(makerobo_pins, GPIO.LOW)  # 关闭所有LED
    GPIO.cleanup()  # 释放资源


# 程序入口
if __name__ == "__main__":
    try:
        makerobo_loop()  # 调用循环函数
    except KeyboardInterrupt:  # 当按下Ctrl+C时,将执行destroy()子程序。
        makerobo_destroy()  # 释放资源

二、基础用法

1.GPIO.setmode–设置引脚编号

使用Python操作树莓派引脚时,有两种编码方式:

  • 一种是 BOARD编号,即树莓派上实际物理引脚编号
GPIO.setmode(GPIO.BOARD)  # BOARD编号,采用实际的物理管脚给GPIO口
  • 另一种是BCM 编号,指的是 Broadcom SOC 上的频道编号,可以对应图表来说明哪个通道编号连接到 RPi 板上的哪个引脚。
GPIO.setmode(GPIO.BCM)  # BCM编号

建议使用 BOARD 编号,这种实际物理管脚的优势在于,无论 RPi 的电路板版本如何,您的硬件始终可以工作。您无需重新连接连接器或更改代码。而 BCM 编号,可能会在 Raspberry Pi 板的修订版之间中断。

  • 以下为树莓派管脚图:可参考

2.GPIO.setwarnings(False)–GPIO口警告

你的树莓派的GPIO上可能有多个脚本/电路,因此,如果 RPi.GPIO 检测到某个引脚已配置为默认值(输入)以外的其他内容,则在尝试配置脚本时会收到警告,其实没有影响。要禁用这些警告:

GPIO.setwarnings(False) # 去除GPIO口警告

3.设置channel多通道方法

设置多个通道可以一起设置,可以使用列表或元组把他们作为一个整体

  • 列表方式
makerobo_pins = [11, 12]  # PIN管脚字典  GPIO.BOARD对应实际物理管脚  GPIO.BCM对应BCM编码
  • 元组
makerobo_pins = (11, 12)  # PIN管脚字典  GPIO.BOARD对应实际物理管脚  GPIO.BCM对应BCM编码

4.GPIO.setup–设置通道

4.1 GPIO.setup(channel, GPIO.IN)

  • 将通道配置为输入, makerobo_pins为设置多通道的列表方式
GPIO.setup(makerobo_pins, GPIO.IN)  # 设置Pin模式为输入模式

4.2 GPIO.setup(channel, GPIO.OUT)
示例代码中:

  • 将通道配置为输出, makerobo_pins为设置多通道的列表方式
GPIO.setup(makerobo_pins, GPIO.OUT))  # 设置Pin模式为输出模式

4.3 GPIO.setup(channel, GPIO.OUT, initial=GPIO.HIGH)

  • 还可以为输出通道指定初始值:

5.GPIO.input(channel)–读取 GPIO 引脚的值

这将返回 0 / GPIO.LOW / False 或 1 / GPIO.HIGH / True。

6.GPIO.output(channel, state)–设置 GPIO 引脚的输出状态

状态可以是 0 / GPIO.LOW / False 或 1 / GPIO.HIGH / True。

7.同一个调用中输出到多通道

chan_list = [11,12]                            # 适用于列表或元组
GPIO.output(chan_list, GPIO.LOW)                # 设置所有GPIO.LOW 
GPIO.output(chan_list, (GPIO.HIGH, GPIO.LOW))   # 设置第一个高和第二个低

示例代码中:

GPIO.output(makerobo_pins, GPIO.LOW)  # 设置Pin管脚为低电平(0V)关闭LED

8.GPIO.cleanup()–清理释放

8.1 要在脚本结束时进行清理:

GPIO.cleanup()

8.2 程序退出时,可能不想清理每个频道而留下一些设置。可以清理单个频道、频道列表或元组:

GPIO.cleanup(channel)
GPIO.cleanup( (channel1, channel2) )
GPIO.cleanup( [channel1, channel2] )

三、RPi.GPIO 中使用 PWM

简单说一下频率和占空比,不是专业的,望补充:

  • 频率:每秒钟信号从高电平到低电平再回到高电平的次数。PWM是间接的,高电平是亮,低电平不亮,即高低电平交替,频率很快,所以人眼基本分辨不出来是一亮一暗的,而且高电平亮的时候会激活LED,低电平的时候LED不会瞬间暗,而是有一个由明到暗的一个过程。或许有疑问,为什么不一直高电平就常亮,因为高低电平的信号才方便我们进行控制。这里感谢我的嵌入式开发同事讲解
  • 占空比:高电平持续时间和低电平持续时间之间的比例。占空比越大,那个信号强度就越高,比如这里双色LED灯中,红色信号占空比大,就先显红色。

1.创建 PWM 实例:

p = GPIO.PWM(channel, frequency) #(通道、 频率)
示例代码中:

makerobo_pins = [11, 12]  # PIN管脚字典  
...
p_R = GPIO.PWM(makerobo_pins[0], 1000)  # 设置频率为1KHz
p_G = GPIO.PWM(makerobo_pins[1], 1000)  # 设置频率为1KHz

2.启动 PWM:

p.start(dc) # 其中 dc 是占空比 (0.0 <= dc <= 100.0)
示例代码中:

# 初始化占空比为0(led关闭)
p_R.start(0)
p_G.start(0)

3.改变频率:

p.ChangeFrequency(freq) # 其中 freq 是以赫兹为单位的新频率

4.更改占空比:

p.ChangeDutyCycle(dc) # 其中 0.0 <= dc <= 100.0
示例代码中:

# 设置颜色
def makerobo_set_Color(col):  # 例如:col = 0x1122
	...
    p_R.ChangeDutyCycle(R_val)  # 改变占空比
    p_G.ChangeDutyCycle(G_val)  # 改变占空比

5.要停止 PWM:

p.stop()
示例代码中:

# 释放资源
def makerobo_destroy():
    p_G.stop()
    p_R.stop()
	...

四、总结

还有一些高级用法,比如线程回调,后面有时间再写吧。
欢迎各位交流。您的点赞是我坚持的动力。

以上是关于Python面向树莓派使用RPi.GPIO库的主要内容,如果未能解决你的问题,请参考以下文章

Python面向树莓派使用RPi.GPIO库

在树莓派上用Python控制LED

树莓派瞎玩~7~RPi.GPIOのWIKI文档

树莓派瞎玩~7~RPi.GPIOのWIKI文档

树莓派瞎玩~7~RPi.GPIOのWIKI文档

python怎么编程控制树莓派led