人工智能-树莓派小车(2)——GPIO接口介绍

上次我们进行了系统的安装和环境的配置,实现了树莓派的第一次唤醒,以及更改唤醒词的演示,详细见人工智能之我与树莓派(1)

今天,我们进行进阶操作,研究如何通过语音,来控制GPIO端口,进而控制LED灯和小车。首先介绍GPIO接口和LED灯的使用。

GPIO接口介绍

树莓派与其他的开发板不同的是他有着40个GPIO口可以用来外部扩展,GPIO指的是General Purpose Input Output (通用输入/输出),是树莓派与其他硬件连接起来的桥梁。

树莓派GPIO接口实物图
树莓派 40PIN 引脚图
那么如何使用这些接口?开源领域具有良好的分享精神,树莓派同样也集成了各种库,最常用的有三个:

python GPIO

【开发语言】——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功能非常强大。

BCM2835 C Library

【开发语言】——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.5.3a.tar.gz
# 进入解压之后的目录 
$ cd RPi.GPIO-0.5.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口

系列教程

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值