本文部分资料及图片来自网络
树莓派4B、LED灯、面包板、杜邦线、电阻、Python程序
这里介绍下LED灯、面包板、杜邦线、电阻
LED灯:LED灯引脚长的一端为正极,短的一端为负极。也可以仔细观察灯珠内部的电极,较小的是正极,大的一端的是负极。
面包板:方便插线,不用手动接线,其特点是中间的插孔竖向是相通的,边缘的插孔横向是相通的。
杜邦线:杜邦线可实现插针式的连接,不用焊接,方便实验连通电路。杜邦线是分公母头的,本实验使用两根公-母杜邦线,用于连接树莓派的正负极
电阻:电阻没啥介绍的,就是增加阻值,防止电源直接接到LED灯给烧了。但这里要说下电阻的识别方法,没错,电阻是可以通过上面画的线条来识别是多大电阻的,如下图所示。
电阻大小=第一段第二段第三段*乘数
注意:第一段第二段第三段,是放在一起组成一个三位数然后和乘数相乘
本次实验使用的树莓派为4B,因此这里只介绍4B的GPIO引脚结构,其他版本和4B的引脚定义略有不同,请自行查阅。
说到GPIO,首先了解下什么是GPIO,GPIO英语为General-purpose Input/Output,是通用型输入输出的简称。GPIO的输入输出是可以用过读取寄存器来确定引脚高低点位的,那么解释下什么是输入输出,输出就是控制引脚为高电平或低电平,为我们连接的设备进行供电或不供电,比如连接LED灯,可以设置引脚为高电平为其供电,灯就亮了;输入就是获取引脚的高低电平,判断传感器是否检测到,比如红外人体感应器,当感性到人体后会输出高电平,我们读到高电平则表示有人体。当然还有一些其他引脚,比如作为串口的TX,RX等。
4B的GPIO是40针脚的,引脚定义如下图所示。
树莓派的GPIO在实际使用中,会看到3中命名方案,wiringPi、BOARD和BCM三种方式,使用时选择其中一种即可,只要将针脚对应正确即可生效。其中wiringPi主要是用于C语言中wiringPi模块的编码,BOARD是树莓派板子上的物理引脚的编码,BCM就是BCM自己的编码规则。注意在Python中不支持wiringPi的编码规则,只能使用BOARD和BCM编码方式。
没看错,这一步是点亮LED,但这里所说的直接点亮是直接给LED供电让其亮起来,因此连接的电路很简单,将GPIO的3.3V引脚使用公母杜邦线连接到面包板,在面包板相通的一个孔插入电阻一端,电阻另一端查到面包板的另一竖列的孔中,然后在该数列的其他孔位插入LED灯的正极,负极插入傍边的空位,然后在该竖列的其他孔位使用公母杜邦线连接负极,LED灯即可点亮。
接线说明
树莓派GPIO3.3v引脚→电阻→LED灯→负极(0v或GND)
成功点亮
Python要控制GPIO需要使用RPI.GPIO模块,如果安装的是树莓派官方完整的img系统,是自带RPI.GPIO模块的。要想验证是否已安装RPI.GPIO模块,可进入python交互界面,导入该模块,如果不报错即为已安装。
那么在进Python交互界面之前,是可以通过命令查看树莓派输出定义的,在终端使用“pinout”命令可查看当先树莓派的硬件结构,如下图所示。
当然这个不是重点,只是为了方便大家在忘记GPIO对应时可以用该命令查看,这里的中间两列就是BOARD编码,两边的就是BCM编码。
下面言归正传,使用Python控制GPIO,在终端输入“python3”进入Python交互界面(这里不介绍Python如何安装了,如果是树莓派官方系统是自带Python2和Python3的,如果没有安装请自行寻找Python的安装方法),然后输入“import RPI.GPIO as GPIO”,回车后如果没有报错,则表示RPI.GPIO是已安装的,如果报错,则可能是没有安装RPI.GPIO或RPI.GPIO无法正常工作,这是需要重新安装RPI.GPIO模块,命令如下
# 安装rpi.gpio,我这里使用的是python3,Python2的去掉pip后的3即可
# sudo pip3 install rpi.gpio
# 卸载rpi.gpio,这里提卸载是为了RPI.GPIO无法正常工作时,先卸载再安装
# sudo pip3 uninstall rpi.gpio
使用Python控制GPIO的几个主要操作:
六、使用Python控制LED灯
现在要是用Python控制LED灯的话,要将引脚的连接位置改动下才能使用,硬件连接要按以下方式连接
树莓派GPIO引脚→电阻→LED灯→负极(0v或GND)
连接好后,可以直接打开终端程序,按以下命令一行行输入,即可看到效果
$python3
>>> import RPi.GPIO as GPIO
>>> GPIO.setmode(GPIO.BOARD) # 设置编码模式
>>> GPIO.setup(3,GPIO.OUT) # 将通道(即引脚)3设置为输出模式,此时LED灯为熄灭状态
>>> GPIO.output(3,GPIO.HIGH) # 将通道3操作为高电平,此时LED灯为点亮状态
>>> GPIO.output(3,GPIO.LOW) # 将通道3操作为低电平,此时LED灯为熄灭状态
>>> GPIO.cleanup() # 重置所有通道的模式,传入通道的话,只重置输入的通道
七、控制LED灯闪烁
之前只是简单的将灯点亮,如果我们要想让灯闪烁怎么做呢,可以通过高低电平来控制,当然肯定不能在交互界面实现了,手动输入太慢了,我们要建立一个led.py文件,在文件中实现控制LED灯的闪烁,文件内容如下:
# coding:utf-8
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(10, GPIO.OUT) # 这里使用的是10引脚,请根据自己使用的引脚编号修改
n = 0 # 用于控制闪烁次数
while n < 30:
GPIO.output(10, GPIO.HIGH)
GPIO.output(10, GPIO.LOW)
n += 1
print('end')
在终端使用下面命令可以执行该文件
>>>python3 led.py
也许你会发现,当文件执行完后,灯不仅没亮,还报了个警告,如下图
没事不要着急,这个警告是因为咱们控制通道的频率太高了,该通道响应不过来了,因此,我们需要在每次操作高低电平的语句后面加上延时,这个需要导入time模块,这个是Python自带的,下面将上面led.py文件代码进行下修改
# coding:utf-8
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setup(10, GPIO.OUT) # 这里使用的是10引脚,请根据自己使用的引脚编号修改
n = 0 # 用于控制闪烁次数
while n < 30:
GPIO.output(10, GPIO.HIGH)
time.sleep(0.05)
GPIO.output(10, GPIO.LOW)
time.sleep(0.05)
n += 1
print('end')
这是再执行文件,发现灯可以闪烁了,其实我们目的就已经达到了,但是同时发现那个警告还是存在的,有强迫症的人看到这个警告就会不爽了,总以为是报错。其实仔细读下那个警告,就会发现,其实警告中已经提示我们如何关闭它了,就是用GPIO.setwarnings(False)来禁止其输出,下面在修改下led.py的代码,如下
# coding:utf-8
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(10, GPIO.OUT) # 这里使用的是10引脚,请根据自己使用的引脚编号修改
n = 0 # 用于控制闪烁次数
while n < 30:
GPIO.output(10, GPIO.HIGH)
time.sleep(0.05)
GPIO.output(10, GPIO.LOW)
time.sleep(0.05)
n += 1
print('end')
这时我们在运行,发现警告已经没有了,灯也开始闪烁了。