这节课开始,进入树莓派硬件控制传感器的世界,感受软件和硬件结合带来的无穷魅力。
硬件入手
根据后续课程的安排,需要入手的硬件零件如下:
面包板,杜邦线,led灯,蜂鸣器,温湿度传感器,单位数码管,双位数码管
渠道推荐如下:
或者是这个:
以前面一个为例,进入之后,查找以下关键字和对应的型号:
面包板:
杜邦线:
选择“20CM公对母”
led灯:
蜂鸣器:
可以买2个备用。
温湿度传感器:
单位数码管:
双位数码管:
GPIO介绍
先来看一下树莓派主板的一些对外的接口,这是反面的情况:
这是正面的情况:
重点关注上面有40根排针,这就是树莓派用于控制外部传感器的接口,称之为GPIO
40根引脚如何进行编号呢,如果按照物理位置来编号,只要掌握一个规则就容易记住:
最靠近角上的那一根引脚为2号引脚。旁边的就是1号引脚,具体请看上图示意图。
那么这40根引脚具体的用途和定义是什么呢,请看下面的图:
这个图是一个比较全面的一个定义,主要是因为对于这40根引脚有不同的编号规则来定义
虽然不同的规则叫的名字不一样,但实际的用途是一致的
这里只学习一种编号规则,也就是物理位置编号,这样更容易进行物理连接。
请看下面这张简图:
比如:1号引脚,是输出1个3.3伏的电压,也就是如果你拿一个数字万用表去测量这根引脚的电压,会一直测出来是3.3伏。
比如:2号引脚,是输出1个5伏的电压,也就是如果你拿一个数字万用表去测量这根引脚的电压,会一直测出来是5伏。
比如:6号引脚,是一个GND,也就是接地,如果测量电压的话,就是0伏。
比如:11号引脚,是绿色图标,旁边写着GPIO17,其实这个接口就是普通的接口,可以输入也可以输出,如果设置为输出,则可以输出高电压或者低电压。输出高电压就是3.3伏,输出低电压就是0伏。可以通过程序来控制。GPIO17是另外一种编号方式而已,这里我们可以忽略。
假如需要一个恒定的电压输出到某个电路,则可以选择3.3v或者5v的相应接口。
假如需要一个变化的电压输出到某个电路,则可以选择绿色的GPIO接口,例如11号,12号,13号,15号等等。
led灯电路原理
学过物理的话,应该可以看懂下面的最简单的电路图:
要让led灯亮起来,需要在led灯的正极输入一个正的电压,led灯的负极接地,这样led灯就可以亮起来了。
根据前面的GPIO接口的定义,选择6号口GND连接到led灯的负极,然后选择11号口连接到led灯的正极
这样,通过程序控制11号口,输出一个3.3伏的电压,led灯就亮了,输出一个0伏电压,led灯就灭了。
硬件连接
在开始连接硬件电路之前,首先要做的事是将树莓派电脑关机,并断开电源。
因为如果树莓派主板带电的时候,进行插接电路可能会导致电子元器件的烧毁,所以一定要记住这个原则:
连接电路的时候主板必须断电。
取出面包板,2根20cm的公对母杜邦线,1个led灯。
将杜邦线的母头插到树莓派主板的GPIO接口的6号口和11号口:
将杜邦线另外一头的公头插入面包板上:
将led灯的长脚插入11号口线的同一纵排,将led灯的短脚插入6号口线的同一纵排:
插好之后的样子:
这样插好之后,全部的电路就连接好了。
这里大家可以自行去网上搜索一下关于面包板的电路图,看看为何这样就可以把线和led灯连接起来了。
看看整体连接的效果:
然后,检查一下电路的接口是否有错误,正确无误之后就可以启动树莓派电脑的电源了:
程序编写
电脑启动之后,可以编写程序了:
启动文本编辑器,输入以下代码,文件保存为led.py
程序执行
保存文件之后,运行sudo python led.py看看led灯是否亮了3秒钟之后熄灭。
如果灯不亮,则按照以下次序进行检查判断:
1.首先查看树莓派主板上的引脚口的编号
是否是11号口,接到面包板上的是对着led灯的长脚
是否是6号口,接到面包板上的是对着led灯的短脚
2.如果接线没有错误,则有可能是led灯坏了
可以采取换一个led灯试试看
或者将11号口的杜邦线的母头拔出来,插入到1号口,看看led灯是否亮,如果亮了则说明灯和线没有问题。
3.如果电路都没有问题,则可能是程序错误
逐行检查代码,看看是否有遗漏或者错误。
4.如果以上都不能让灯亮起来,那只能去qq群里直接提问了。
看看程序执行结果:
程序每行说明
import RPi.GPIO as GPIO
导入模块RPI.GPIO,命名为别名为GPIO
如果只写import RPi.GPIO也是可以的,但是后面用的地方就必须用RPi.GPIO.setmode(RPi.GPIO.BOARD)这样写齐全
用别名的方式可以简化代码
import time
导入time模块
GPIO.setmode(GPIO.BOARD)
声明GPIO使用物理编号方式,也就是11号口就是物理编号11号口
GPIO.setup(11,GPIO.OUT)
声明11号口是用于输出模式
为何6号口不用声明呢,因为它是GND,不可能变化,也就不可能输入和输出
GPIO.output(11,True)
设置11号口为高电压,也就是11号口变为3.3伏
这行代码执行之后,11号口变为高电压,那么根据电路原理,led灯就会亮起来
如果后面没有代码了,则led灯会一直亮下去,直到程序修改了输出或者电脑接口断电
time.sleep(3)
程序休眠3秒钟
程序休眠期间,led灯会一直亮着
GPIO.output(11,False)
设置11号口为低电压,也就是11号口变为0伏,和GND一样
这行代码执行之后,11号口变为低电压,那么根据电路原理,led灯就会熄灭
GPIO.cleanup()
将所有的GPIO口状态恢复为初始化,一般代码结束都执行此代码,方便后续代码运行都是从初始状态开始。
程序整体的功能很简单:
导入必须的模块
设置GPIO的编号模式
设置需要用到的GPIO接口的模式
控制GPIO口的电压状态
结合时间模块运行出自己想要的结果
大家要根据以上基本的代码以及说明,思考如何修改程序,改变运行功能
课后作业
1.将休眠时间修改为10秒
2.增加8根线和4个led灯,5个led灯依次亮3秒,循环10次结束
往期教程
因为教程是系列教程,前后关联性非常强,请大家按照_|_微_|_信_|_公_|_众_|_号_|_【零基础学编程】的历史消息发布时间先后次序进行阅读。
Q_Q_群简介
欢迎大家加入Q_Q_群 603559164 零基础学编程,交流学习,共同进步。