上次我们进行了系统的安装和环境的配置,实现了树莓派的第一次唤醒,以及更改唤醒词的演示,详细见人工智能之我与树莓派(1)
今天,我们进行进阶操作,研究如何通过语音,来控制GPIO端口,进而控制LED灯和小车。首先介绍GPIO接口和LED灯的使用。
GPIO接口介绍
树莓派与其他的开发板不同的是他有着40个GPIO口可以用来外部扩展,GPIO指的是General Purpose Input Output (通用输入/输出),是树莓派与其他硬件连接起来的桥梁。
那么如何使用这些接口?开源领域具有良好的分享精神,树莓派同样也集成了各种库,最常用的有三个:
【开发语言】——python
【简单介绍】——该库更确切的名称为raspberry-gpio-python,树莓派官方资料中推荐且容易上手。python GPIO是一个小型的python库,可以帮助用户完成raspberry相关IO口操作。但是python GPIO库还没有支持SPI、I2C或者1-wire等总线接口。除了python GPIO之外,还有众多的python扩展库(例如webiopi),毫无疑问的说python非常适合树莓派,树莓派也非常适合python。
【wiringPi】
【开发语言】——C语言
【简单介绍】——wiringPi适合那些具有C语言基础,在接触树莓派之前已经接触过单片机或者嵌入式开发的人群。wiringPi的API函数和arduino非常相似,这也使得它广受欢迎。作者给出了大量的说明和示例代码,这些示例代码也包括UART设备,I2C设备和SPI设备等,毫无疑问地说wiringPi功能非常强大。
【开发语言】——C语言
【简单介绍】BCM2835 C Library可以理解为使用C语言实现的相关底层驱动,它给我的感觉更像STM32的库函数,BCM2835 C Library的驱动库包括GPIO、SPI和UART等,可以通过学习BCM2835 C Library熟悉BCM2835相关的寄存器操作。如果有机会开发树莓派上的linux驱动,或自主开发python或PHP扩展驱动,可以从BCM2835 C Library找到不少的“灵感”。
在这里,基于Python是最简单易用的编程语言之一以及其 丰富的扩展能力,我当然选择的是Python的RPI.GPIO库,下面简单介绍一下它的用法:
RPI.GPIO
引脚编号方式
目前有两种方式可以通过 RPi.GPIO 对 Raspberry Pi 上的 IO 针脚进行编号。
- 第一种方式是使用BOARD编号系统。该方式参考 Raspberry Pi 主板上 P1 接线柱的针脚编号。
- 第二种方式是使用BCM编号。这是一种较底层的工作方式 – 该方式参考 Broadcom SOC 的通道编号。
所有的这两种编码方式所对应的位置,你都可以在上面的图中找到对应的位置。
在使用之前必须指定所使用的方式:
GPIO.setmode(GPIO.BOARD)
GPIO.setmode(GPIO.BCM)
配置通道
在使用某个接口之前,还需要为每个用于输入或输出的针脚配置通道。通道有两种,一种是IN,一种是OUT。
GPIO.setup(channel, GPIO.IN)
GPIO.setup(channel, GPIO.OUT)
通道编号是基于您所使用的编号系统所指定的(BOARD 或 BCM)。
GPIO.setup(channel, GPIO.OUT, initial = GPIO.HIGH)
当GPIO的状态是OUT时,还可以指定端口的初始状态,同样是两种HIGH和LOW,对应着输出高电平和低电平。
输入
读取 GPIO 针脚的值:
GPIO.input(channel)
状态可以为 0 / GPIO.LOW / False 或者 1 / GPIO.HIGH / True
输出
设置 GPIO 针脚的输出状态:
GPIO.output(channel, state)
状态可以为 0 / GPIO.LOW / False 或者 1 / GPIO.HIGH / True。
清理
在任何程序结束后,养成清理用过的资源的好习惯。使用 RPi.GPIO 也同样需要这样。恢复所有使用过的通道状态为输入,可以避免由于短路意外损坏您的 Raspberry Pi 针脚。仅会清理使用过的 GPIO 通道。
GPIO.cleanup()
警告
可能树莓派的 GPIO 上同时有多个脚本/循环。因此,如果 RPi.GPIO 检测到某个针脚被设置为其它用途而非默认的状态(默认为输入),会在运行某脚本时得到警告消息。
禁用该警告消息(不会产生副作用,仅会覆盖原来的端口电平信息):
GPIO.setwarnings(False)
通过GPIO口控制LED灯
安装RPI.GPIO库
# 下载
$ wget https://pypi.python.org/packages/e2/58/6e1b775606da6439fa3fd1550e7f714ac62aa75e162eed29dbec684ecb3e/RPi.GPIO-0.6.3.tar.gz
# 解压缩
$ tar xvzf RPi.GPIO-0.6.3a.tar.gz
# 进入解压之后的目录
$ cd RPi.GPIO-0.6.3a
# 启动安装
$ sudo python setup.py install
主代码
#!/usr/bin/env python
# encoding: utf-8
import RPi.GPIO
import time
# 指定GPIO口的选定模式为GPIO引脚编号模式
RPi.GPIO.setmode(RPi.GPIO.BCM)
# 指定GPIO14的模式为输出模式,且初始状态为低电平。
# 如果上面GPIO口的选定模式指定为主板模式的话,这里就应该指定8号而不是14号。
RPi.GPIO.setup(14, RPi.GPIO.OUT,initial = GPIO.LOW)
# 循环10次
for i in range(0, 10):
# 让GPIO14输出高电平(LED灯亮)
RPi.GPIO.output(14, True)
# 持续一段时间
time.sleep(0.5)
# 让GPIO14输出低电平(LED灯灭)
RPi.GPIO.output(14, False)
# 持续一段时间
time.sleep(0.5)
RPi.GPIO.cleanup()
# 清理GPIO口
系列教程
人工智能-树莓派小车(1)——DuerOS语音唤醒
人工智能-树莓派小车(2)——GPIO接口介绍
人工智能-树莓派小车(3)——GPIO控制小车
人工智能-树莓派小车(4)——通过语音玩转智能小车
人工智能-树莓派小车(5)——用微信控制智能小车