简介

树莓派除了有 USB、网口、HDMI 等常见的接口外,还提供了 GPIO(General Purpose Input/Output)接口,通过这个引脚上的输入和输出,以及高低点位的变化,我们可以很方便的控制电子元器件。

image.png

注意,该模块不适合应用到追求实时性或计数周期的应用中。这是由于您无法预测 Ptyhon 何时繁忙,以及资源回收的时间。而且它是运行在基于 Linux 核心的系统中,也不合适用于实时应用 – 原因在于其它进程可能获得更高的 CPU 优先级。如果您一定要追求实时操作的性能,可以考虑 Arduino 主板

GPIO

GPIO (General Purpose Input/Output) 的意思就是 通用型输入输出,可以使用 python 的第三方库 RPi.GPIO 进行控制。下面是 40个引脚的定义图,编号顺序是乱的,我们可以通过颜色和用途来了解下。

image.png image.png

  • 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

  1. import RPi.GPIO as GPIO

GPIO.setmode

树莓派引脚有BOARD和BCM两种编号方式 , BOARD具有很好的适用性,不用看接口图,数引脚 1~40 就可以接线, 不论树莓派 1 2 3, 都不用修改代码。BCM编号方式换个版本再接线时数引脚是不行的。

image.png


图中的GPIOxx的方框即是BCM编码方式, 直接写数字的深灰框是BOARD编码方式, 如BCM编码方式的 GPIO02 对应BOARD编码方式的 3,推荐用BOARD编号方式。

终端查看BCM编号的方式:

  1. gpio readall

image.png

确认使用的引脚编号方式:

  1. GPIO.setmode(GPIO.BOARD)
  2. # or
  3. GPIO.setmode(GPIO.BCM)

检测使用的是哪种编号方式:

  1. #The mode will be GPIO.BOARD, GPIO.BCM or None
  2. mode = GPIO.getmode()

GPIO.setwarnings

树莓派可能不止有一个脚本/电路在操纵GPIO, 如果树莓派检测到引脚不是默认的输入状态, 会给出警告, 可以用一行代码避免警告:

  1. GPIO.setwarnings(False)

GPIO.setup

当我们在使用某个 GIPO 的时候,我们需要设置这一个通道( 输入或者输出),表明使用它,同时还可以初始化其状态( 高低电平等)。通道编号是基于您所使用的编号系统所指定的(BOARD 或 BCM)。

  1. # 配置为输入、输出的通道
  2. GPIO.setup(channel, GPIO.IN)
  3. GPIO.setup(channel, GPIO.OUT)
  4. # 指定输出通道的初始值为高电平、低电平
  5. GPIO.setup(channel, GPIO.OUT, initial=GPIO.HIGH)
  6. GPIO.setup(channel, GPIO.OUT, initial=GPIO.LOW)
  7. # 还可以设置多个通道
  8. han_list = [11,12]
  9. GPIO.setup(chan_list, GPIO.OUT)
  10. # 还可以初始化为上拉或者下拉电阻
  11. GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_UP)
  12. GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

GPIO.input

读取一个GPIO口的值

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

GPIO.output

设置 GPIO 针脚的输出值,高电平 or 低电平:

  1. # channel 脚针,state 状态
  2. # 高电平 state 可以是 0 / GPIO.LOW / False
  3. # 低电平 state 可以是 1 / GPIO.HIGH / True
  4. GPIO.output(channel, state)
  5. # 设置输出到多个通道
  6. chan_list = [11,12]
  7. GPIO.output(chan_list, GPIO.LOW)
  8. GPIO.output(chan_list, (GPIO.HIGH, GPIO.LOW)

GPIO.cleanup

在任何程序结束后,请养成清理用过的资源的好习惯。使用 RPi.GPIO 也同样需要这样。恢复所有使用过的通道状态为输入,您可以避免由于短路意外损坏您的 Raspberry Pi 针脚。

  1. # 脚本结束后进行清理
  2. # 该操作仅会清理您的脚本使用过的 GPIO 通道
  3. GPIO.cleanup()
  4. # 使用列表或元组,清理特定的通道
  5. GPIO.cleanup(channel)
  6. GPIO.cleanup( (channel1, channel2) )
  7. GPIO.cleanup( [channel1, channel2] )

GPIO.PWM

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

  1. # 创建 PWM 实例
  2. p = GPIO.PWM(channel, frequency)
  3. # 启用 PWM
  4. p.start(dc)
  5. # 更改频率
  6. p.ChangeFrequency(freq)
  7. # 更改占空比
  8. p.ChangeDutyCycle(dc)
  9. # 停止 PWM
  10. p.stop()

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