这节课开始,进入树莓派硬件控制传感器的世界,感受软件和硬件结合带来的无穷魅力。 硬件入手 根据后续课程的安排,需要入手的硬件零件如下: 面包板,杜邦线,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次结束