我之前写过两篇树莓派入门攻略,分别是:树莓派菜鸟入门攻略使用树莓派打造一台提醒机,然而之前的攻略都并未涉及到对物理世界的联系。

而现在,事情终于变的有意思起来,我在这篇教程中会教给大家使用GPIO的方法和一些技巧。使用GPIO的意义在于,它让你的树莓派和物理世界联通——这带来无限的可能性,你可以控制开关,电器,电路,机械,设备,这是一个崭新的世界。

我假设你已经学习了我的前两篇教程,那意味着你手上把玩的那块电路板已经有一个系统,并且你在里面写的python程序跑的很溜。在这个基础上,我们来了解下GPIO。

GPIO的全称是“General Purpose Input Output ”,意思是通用输入/输出,对应着树莓派,是一个针脚阵列,它大概是这个样子的:

这些针脚可以输出不同的电信号,通过这些电信号,我们可以控制和感知所连接的电路情况,比如说让15脚变成高电平,那么连到15脚的二极管就能感知到这个变化,并以此去控制诸如灯泡啦,开关啦,门禁啦,饮水机啦,这些东西。

另一种情况是,把15脚作为输入端,树莓派可以感知15脚的情况,这样一来,我们可以接上一个光敏电阻,然后天亮的时候光敏电阻阻值降低,电压升高,而这个变化可以被15脚感知,然后传入树莓派的处理系统,进行诸如拉窗帘等行为。

当然,以上只是我举的例子,还有无限种可能且好玩的主意,都可以去尝试。但我们首先来看看,如何操作GPIO。

首先,在树莓派的系统里面,你要安装一个python库,这个库可以方便的让你操作GPIO,安装的命令如下:

# 下载
$ wget http://raspberry-gpio-python.googlecode.com/files/RPi.GPIO-0.5.3a.tar.gz
# 解压缩
$ tar xvzf RPi.GPIO-0.5.3a.tar.gz
# 进入解压之后的目录
$ cd RPi.GPIO-0.5.3a
# 启动安装
$ sudo python setup.py install

其实树莓派的系统一般是内置了GPIO的,但是由于GPIO随时可能升级,所以建议升级到最新版,如果你的安装不能顺利进行,那可能是你缺乏模块支持导致的,可以尝试以下命令:

sudo apt-get install python-dev

总之,我们的GPIO总算是安装好了,但和写代码不同,GPIO涉及的可是真家伙,我们要测试的话,需要用到比一台电脑或一台手机更多的设备:面包板,杜邦线,常见电阻,发光二极管,万用表等等。

我们的第一个目标是使用GPIO控制一个发光二极管的开和关,我画了一下大概的电路图:

我们使用杜邦线和面包板连出电路:

关于树莓派针脚的文档和说明,大家可以根据自己的树莓派型号去网上搜索,但这都大同小异。

接下来我们开始写代码控制GPIO点亮LED,python代码如下

# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO

# BOARD编号方式,基于插座引脚编号

GPIO.setmode(GPIO.BOARD)

# 输出模式

GPIO.setup(11, GPIO.OUT)

print(“LED已经点亮”)

GPIO.output(11, GPIO.LOW)

exit()

这段代码清新脱俗,异常简单,我相信稍有python基础的同学可以毫不费力的读懂并且理解。值得注意的一点是,你必须用root权限运行这个python文件,因为GPIO对权限的要求很高。

把你的电路连好,然后运行这个文件,顺利的话,你就可以看到你的发光二极管发出了美妙的光芒。当然, 你要找到第11管脚可能有些费力,但这事并不算太困难。

如果要使这个二极管熄灭,我们只需要把上面代码的GPIO.output(11, GPIO.LOW)改成GPIO.output(11, GPIO.HIGH)即可,不明真相的同学可能会好奇,为啥HIGH会不亮而LOW会亮呢,这是因为二极管的另一端连接着树莓派的电源管脚,当11管脚是高电平也就是HIGH的时候,两边都是HIGH,没有电压,自然就不会有电流,二极管也就不会亮。反之,电流会从树莓派的电源管脚流向我们设定的11管脚,这就会让二极管亮起来了~

下面我们写一个闪光的代码试试:

# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO

import time

# BOARD编号方式,基于插座引脚编号

GPIO.setmode(GPIO.BOARD)

# 输出模式

i = 0

while i<6:

GPIO.setup(11, GPIO.OUT)

GPIO.setup(13, GPIO.OUT)

print(“LED1已经点亮”)

GPIO.output(11, GPIO.LOW)

time.sleep(0.1)

print(“LED1已经熄灭”)

GPIO.output(11, GPIO.HIGH)

time.sleep(0.1)

print(“LED2已经点亮”)

GPIO.output(13, GPIO.LOW)

time.sleep(0.1)

print(“LED2已经点亮”)

GPIO.output(13, GPIO.HIGH)

time.sleep(0.1)

i = i + 1

这段代码控制了两个发光二极管交替闪亮6次。这段代码也非常简洁明了,你可以自己试试~

如果我们能够控制一个二极管,那么我们就可以控制一座水电站,当二极管的灯光亮起的时候,连接物理世界的GPIO就已经为你准备好了,现在,你的征途是星辰大海。

恭祝好运

 


我的微信公众号~