用树莓派点亮一个LED灯是非常简单的事情,但却非常重要,是利用GPIO控制外部硬件设备的基础,机器人的大部分功能都可以通过操纵GPIO来实现的。换句话说,能控制一个LED灯,就能让机器人动起来。本章将的主要内容如下。
- 搭建一个树莓派多功能实验平台的材料及其功能用途。
- 树莓派的GPIO引脚功能和基本用法。
- 点亮一个LED灯的电路、程序设计思路和代码。
5.1 搭建实验平台
为便于后续的实验,我们首先需要搭建一个多功能实验平台(见图5.1,含本章所需材料),各部件的功能用途如下。
1:树莓派3B+型主板(含电源)
一块树莓派3B+型主板(含电源),该主板应配备有一张已经安装好Raspbian系统的MicroSD卡。2:面包板
实验过程中,面包板非常适用于电子电路的组装和调试,各种电子元器件可以根据需要随意插入或拔出,而无需焊接,节省了电路的组装时间,而且元件可以重复使用。3:T型GPIO扩展版
GPIO扩展版上标有GPIO引脚的功能,与面包板配合使用非常便于对GPIO进行外接。4:40P排线
用于连接树莓派与T型GPIO扩展版,长度适中即可。5:实验平台底座
使用一块亚克力板作为实验平台的底座,用于固定树莓派主板和面包板,以便于实验操作,同时对树莓派主板形成一定的保护。6:万用表
在进行GPIO硬件控制调试的时候,如果实验结果不是事先所预计的,那么我们可以使用万用表对电路进行简单的测试,排查问题。7:LED灯
发光二极管LED是一种廉价和高效的光源,常在电路及仪器中作为指示灯,或者组成文字或数字显示。LED灯非常便于显示GPIO引脚的输出状态,在开发树莓派外部硬件控制程序时,可以先使用LED灯确定GPIO引脚输出正确后再连接要控制的硬件,避免由于GPIO输出错误而导致外部硬件损坏。本章我们需要用到到一个红色的LED灯,需要注意的是LED较长的引脚为正极,较短的引脚为负极。8:电阻
实验过程中,请根据实际选择必要的电阻,本章需要用到一个470Ω或1kΩ的电阻。9:杜邦线
用于连接各电子元件,无需焊接,本章仅需要用到两根公对公的杜邦线。为便于识别,建议遵循有关规范,连接电源(GPIO引脚)的线采用红色线连接,接地端使用黑色线连接。
5.2 GPIO引脚
前面我们讲过,树莓派与普通计算机最大的区别就在于它拥有若干个可编程的GPIO,可以用来控制外部设备、从外部设备获取信息或是和硬件进行数据交互等,因此了解各个GPIO引脚的功能和使用方法是非常重要的。树莓派GPIO接口已发布了3个版本,原始的两个版本仅有26个引脚,“+”型树莓派版本有40个引脚,本章及后续章节我们将主要介绍“+”型树莓派版本的GPIO。
树莓派GPIO接口有BOARD、BCM和wiringPi三种编号方式,三种编码方式的对应关系如表5.1所示。
BOARD
BOARD编号方式是树莓派主板上P1接头上的的引脚号,从左到右,从上到下进行编号,左边为奇数,右边为偶数,支持BOARD编号方式的库主要有RPi.GPIO、WiringPi-Go。BCM
BCM编号侧重于CPU寄存器,是根据Broadcom SOC的GPIO寄存器编号的,支持的库比较多,用的也比较多,是后续章节主要使用的编号方式。为便于使用BCM编号方式,建议采用类似“T型GPIO扩展版”或“GPIO参考卡片”等配件,让引脚功能一目了然。wiringPi
wiringPi编号侧重于实现逻辑,GPIO端口从0开始编号,WiringPi库是支持wiringPi编号方式的最主要GPIO库。
B+型树莓派主板的40个引脚提供了17个GPIO专用接口,1个UART总线接口、1个SPI总线接口、1个I2C总线接口、2个5V电源接口、2个3.3V电源接口、8个地接口,使用的时候一定先要清楚选择了那套编号方式,相应的库是否支持。
提示:
- 通电后不要使用金属物体(如螺丝刀等)接触GPIO接口,或短接GPIO引脚。
- 外接输入输出设备时,要先仔细了解设备的额定功率(含电压和电流),不要直接连接高功耗元件(如直流电机等),或输出电压超3.3V的设备。当使用低功率LED时,最好在LED的正极串联一个限流电阻。
- GPIO工作在3.3V逻辑电平上,0V表示逻辑0,3.3V则表示逻辑1。调试GPIO程序时,可以使用万用表测试GPIO引脚电压,判断输出是否正确。
- GPIO接口仅提供数字的输入和输出,当需要用到模拟输入时,可以使用ADC芯片或采用电阻式传感器来实现。
5.3 点亮LED灯
在前面的章节中,我们已经介绍了大量的基础理论,接下来我们将进入实战,开始有趣的实验。本节将介绍如何使用树莓派控制一个LED灯,您将看到一个LED灯在树莓派的控制下不停的闪烁。
5.3.1 实验电路
本实验的电路原理图如图5.2所示,一个红色发光二极管正极通过一个限流电阻串连到树莓派的GPIO19上,负极则连接到树莓派的GND上,从而形成一个完整的回路。
GPIO引脚的输出电压约为3.3V,高于LED上约1.7V的压降,如果直接串联,会有一个非常大的电流通过LED,这个电流通常大到可以损坏LED,甚至供电设备。因此,需要在LED和电源(GPIO引脚)间串联一个电阻限制电流,从而对LED和为其供电的GPIO引脚提供保护。不同厂家,不同颜色压降略有区别,我们假设所用LED的压降为1.8V,GPIO引脚的电流为3mA,限流电阻大小的计算方法如下:
R = ( 3.3V - 1.8V ) / 3mA = 500Ω
因此,我们选择使用一个1kΩ的电阻。该电路的最终实物连线图如图5.3所示。
提示:
- 除了使用以上的方法计算限流电阻的值,您还可以访问类似实用工具大全http://tool.520101.com/网站,使用网站提供的LED限流电阻计算器进行计算。实际上,这个网站还提供了不少实用的电子电路计算工具,非常有助于我们后续章节的学习。
- 限流电阻的阻值不应太小,也不能太大。太小,则起不到限流的作用;太大,则LED的亮度会比较暗。
- 为保障树莓派主板和电子元件的安全,连线工作应在为断电的情况下进行,并在确定线路连接无误后再通电。
5.3.2 程序思路
程序的基本设计思路如下:
BEGIN
引入GPIO库
引入time库
将GPIO19设置为输出模式
DO FOREVER
点亮LED
等待1秒钟
熄灭LED
等待1秒钟
ENDO
清理释放GPIO资源
END
5.3.3 程序代码
Python操作GPIO需要用到RPi.GPIO库,Raspbian系统默认未安装这个库,所以请先使用XShell远程登录树莓派运行以下命令安装RPi.GPIO库。
sudo apt install python3-rpi.gpio
RPi.GPIO库安装完毕后,按照第4章介绍的方法新建一个项目,然后输入以下代码并运行,运行效果如图5.4所示。程序的详细说明见注释,这里我们使用了try: Finally: 结构捕捉异常,确保当我们中断程序时(如使用Ctrl+C或者操作系统提供的方法),GPIO.cleanup()函数能被执行,以清理释放GPIO资源。在Pycharm下运行程序时,点击工具栏上的Stop按钮也可以中断程序。
import RPi.GPIO as GPIO # 引入GPIO模块
import time # 引入time模块
GPIO.setmode(GPIO.BCM) # 使用BCM编号方式
GPIO.setup(19, GPIO.OUT) # 将GPIO19设置为输出模式
if __name__ == '__main__':
try:
while True: # 无限循环
GPIO.output(19, True) # 将GPIO19设置为高电平,点亮LED
time.sleep(1) # 等待1秒钟
GPIO.output(19, False) # 将GPIO19设置为低电平,熄灭LED
time.sleep(1) # 等待1秒钟
finally:
GPIO.cleanup() # 清理释放GPIO资源,将GPIO复位
5.4 本章小结
本章首先介绍搭建一个树莓派多功能实验平台所需的材料及其功能用途,然后详细介绍了树莓派GPIO引脚的三种编号方式、功能和使用注意事项,最后介绍用树莓派点亮一个LED灯的电路、程序设计思路和代码。