简介
树莓派除了有 USB、网口、HDMI 等常见的接口外,还提供了 GPIO(General Purpose Input/Output)接口,通过这个引脚上的输入和输出,以及高低点位的变化,我们可以很方便的控制电子元器件。
注意,该模块不适合应用到追求实时性或计数周期的应用中。这是由于您无法预测 Ptyhon 何时繁忙,以及资源回收的时间。而且它是运行在基于 Linux 核心的系统中,也不合适用于实时应用 – 原因在于其它进程可能获得更高的 CPU 优先级。如果您一定要追求实时操作的性能,可以考虑 Arduino 主板
GPIO
GPIO (General Purpose Input/Output) 的意思就是 通用型输入输出,可以使用 python 的第三方库 RPi.GPIO 进行控制。下面是 40个引脚的定义图,编号顺序是乱的,我们可以通过颜色和用途来了解下。
- DC Power 5.0v,以及 DC Power 3.3v,它们指的是直流电电压 5.0 或 3.3 伏特,可以简单理解成电池的正极。分别对应 PIN01 和 PIN17 两个引脚输出的是 3.3v 电压,PIN02 和 PIN04 输出的是 5.0v 电压。
- Ground 引脚,它们直接接地,可以理解成电池的负极。
- GPIOX 引脚用于软件编程使用,控制输入输出及电平高低来控制元件。
RPi.GPIO
RPi.GPIO是 Python 操作树莓派GPIO 的一个类,允许用户从代码中控制 GPIO 引脚。在树莓派系统中,已经实现了文件到 GPIO 引脚的对应,也就是说,我们可以通过 RPi.GPIO 来修改指定 GPIO 引脚的电位状态。
文档:https://sourceforge.net/p/raspberry-gpio-python/wiki/Home/
引入 RPi.GPIO
import RPi.GPIO as GPIO
GPIO.setmode
树莓派引脚有BOARD和BCM两种编号方式 , BOARD具有很好的适用性,不用看接口图,数引脚 1~40 就可以接线, 不论树莓派 1 2 3, 都不用修改代码。BCM编号方式换个版本再接线时数引脚是不行的。
图中的GPIOxx的方框即是BCM编码方式, 直接写数字的深灰框是BOARD编码方式, 如BCM编码方式的 GPIO02 对应BOARD编码方式的 3,推荐用BOARD编号方式。
终端查看BCM编号的方式:
gpio readall
确认使用的引脚编号方式:
GPIO.setmode(GPIO.BOARD)
# or
GPIO.setmode(GPIO.BCM)
检测使用的是哪种编号方式:
#The mode will be GPIO.BOARD, GPIO.BCM or None
mode = GPIO.getmode()
GPIO.setwarnings
树莓派可能不止有一个脚本/电路在操纵GPIO, 如果树莓派检测到引脚不是默认的输入状态, 会给出警告, 可以用一行代码避免警告:
GPIO.setwarnings(False)
GPIO.setup
当我们在使用某个 GIPO 的时候,我们需要设置这一个通道( 输入或者输出),表明使用它,同时还可以初始化其状态( 高低电平等)。通道编号是基于您所使用的编号系统所指定的(BOARD 或 BCM)。
# 配置为输入、输出的通道
GPIO.setup(channel, GPIO.IN)
GPIO.setup(channel, GPIO.OUT)
# 指定输出通道的初始值为高电平、低电平
GPIO.setup(channel, GPIO.OUT, initial=GPIO.HIGH)
GPIO.setup(channel, GPIO.OUT, initial=GPIO.LOW)
# 还可以设置多个通道
han_list = [11,12]
GPIO.setup(chan_list, GPIO.OUT)
# 还可以初始化为上拉或者下拉电阻
GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.input
读取一个GPIO口的值
GPIO.input(channel)
# 低电平返回 0 / GPIO.LOW / False
# 高电平返回 1 / GPIO.HIGH / True。
GPIO.output
设置 GPIO 针脚的输出值,高电平 or 低电平:
# channel 脚针,state 状态
# 高电平 state 可以是 0 / GPIO.LOW / False
# 低电平 state 可以是 1 / GPIO.HIGH / True
GPIO.output(channel, state)
# 设置输出到多个通道
chan_list = [11,12]
GPIO.output(chan_list, GPIO.LOW)
GPIO.output(chan_list, (GPIO.HIGH, GPIO.LOW)
GPIO.cleanup
在任何程序结束后,请养成清理用过的资源的好习惯。使用 RPi.GPIO 也同样需要这样。恢复所有使用过的通道状态为输入,您可以避免由于短路意外损坏您的 Raspberry Pi 针脚。
# 脚本结束后进行清理
# 该操作仅会清理您的脚本使用过的 GPIO 通道
GPIO.cleanup()
# 使用列表或元组,清理特定的通道
GPIO.cleanup(channel)
GPIO.cleanup( (channel1, channel2) )
GPIO.cleanup( [channel1, channel2] )
GPIO.PWM
脉宽调制(PWM)是指用微处理器的数字输出来对模拟电路进行控制,是一种对模拟信号电平进行数字编码的方法。在树莓派上,可以通过对GPIO的编程来实现PWM。
# 创建 PWM 实例
p = GPIO.PWM(channel, frequency)
# 启用 PWM
p.start(dc)
# 更改频率
p.ChangeFrequency(freq)
# 更改占空比
p.ChangeDutyCycle(dc)
# 停止 PWM
p.stop()
注意,如果实例中的变量“p”超出范围,也会导致 PWM 停止。