智者不为愚者谋,勇者不为怯者死。这篇文章主要讲述一起玩转树莓派——从双色LED灯开始相关的知识,希望能为你提供帮助。
一起玩转树莓派(2)——从双色LED灯开始双色LED灯实验是入门树莓派GPIO外设编程的最简单的实验项目,我们也以其投石问路,来进入树莓派的编程世界。
一、从了解GPIO开始GPIO全称General-purpose input/output,即通用型输入输出,其引脚能够供使用者自由的进行使用,可以对其进行输入,也可以读取其数据进行数据输出,这些引脚的输入或输出都会关联到某个寄存器,寄存器的值控制引脚的电平高低。
以笔者使用树莓派3B+为例,其有40个GPIO引脚,在开始编程之前,我们首先要搞清楚每个引脚的功能意义,从树莓派官网的文档中可以找到GPIO引脚的功能介绍,如下图所示:
文章图片
我们并不需要对树莓派的GPIO引脚做深入的记忆,只需要记住当正面摆放树莓派时,其最左上角的一个引脚对应的是5V电压的功能,之后对照此图即可确定每一个引脚的功能。后面我们会通过GPIO扩展板加面包板的方式来使用这些引脚,扩展板上默认会标注一些引脚功能,我们使用起来会更加方便。
笔者使用的扩展板引脚标注示如下:
文章图片
使用排线将其与树莓派正向连接,如下图所示:
文章图片
可以看到扩展板上的引脚标注与树莓派本身的引脚排布并不一致,下面我会给大家介绍如何定位到要使用的引脚。
二、关于GPIO引脚编码常用的GPIO引脚编码有3种。
我们也可以在树莓派的终端输入如下指令查看GPIO引脚功能:
pinout
输出效果如下图所示:
文章图片
需要注意,上图中的GPIO使用的是逻辑编码,从1开始,实际上BCM编码并不是从1开始的。
第1种:BOARD物理编码
物理编码比较好理解,也很直观,其就是根据树莓派上40个引脚的位置进行排序编码,如博客中第一张图所示,正向放置树莓派时,第2排的第1个引脚编号为1,第1排第1个引脚编号为2,依次类推。后面在编写代码时,我们使用的编码方式也是这种。
第2种:BCM编码
BCM编码是一种更底层的编码方式,与系统中信道编号相对应。在使用一个引脚时,如果使用BCM编码,首先需要查找信道号和物理引脚编号之间的对应规则。对于不同的树莓派版本,可能无法兼容。下图很好的描述了几种编码的信息:
文章图片
上面我们扩展板上GPIO引脚的标注,实际上使用的就是BCM编码,这也就是说,如果我们要使用树莓派GPIO2和GPIO3两个功能引脚,指定的是物理引脚需要是13和15。直接将线连接到扩展板的G22和G27一行即可,非常直观。
第3种:WiringPi编码
WiringPi编码对应的引脚号是在wiringPI库中所使用的,网上很容易找到其编码的相关资料,本系列博客我们不会使用到这个编码,这里不再赘述。
现在,我们总结一下如何使用GPIO引脚。
- 首先在上图中找到自己要使用的功能引脚,如GOIP.2和GPIO.3两个功能引脚。
- 之后找到其对应的物理引脚,即13和15。
- 如果不使用扩展板,则直接接线物理引脚,如果要使用,则找到其对应的BCM编码,27和22。
- 使用扩展板上的G27和G22引脚插槽。
文章图片
其内部工作原理电路图如下,也非常好理解:
文章图片
如上图所示,可以看到两个二极管的阴极是共用,我们将其公共引脚接地即可,两个阳极是由两个开关控制,即LED等芯片上的另外两个引脚,我们只需要通过GPIO控制将对应的引脚加高电平,即可将二极管点亮。
开始接线
我们已经了解了双色LED等的工作原理,其有3个引脚,我们将引脚“-”接地,S端的引脚接扩展板G22用来控制红灯,中间的引脚接G27用来控制绿灯。接线情况如下图所示:
文章图片
现在,准备工作大功告成,开始我们的编码工作吧。
四、编写红绿灯控制程序目前为止,我们已经做了足够多的准备工作,你一定已经迫不及待的想要开始编码了,我们先把完整的代码奉上:
#coding:utf-8# 导入UI模块
import tkinter as Tkinter
# 导入GPIO控制薄块
import RPi.GPIO as GPIO
# 定时器模块
import threading# 主页面设置
top = Tkinter.Tk()
top.geometry(\'500x300\')
top.title("双色LED灯控制器")
l = Tkinter.Label(top, text=\'欢迎使用双色LED灯控制器\', bg=\'green\', font=(\'Arial\', 18), width=30, height=2)
l.pack()# 定义引脚
pins = {0:13,1:15}
# 设置使用的引脚编码模式
GPIO.setmode(GPIO.BOARD)
# 设置隐藏警告
GPIO.setwarnings(False)
# 初始化物理引脚 13 和 15
GPIO.setup(pins[0],GPIO.OUT)
GPIO.setup(pins[1],GPIO.OUT)# 定义全局字段 用来处理闪烁功能
# f:是否闪烁l:下次点亮红灯或绿灯
f = False
l = False# 控制红灯亮
def redClick():
global f
f = False
GPIO.output(pins[0],GPIO.HIGH)
GPIO.output(pins[1],GPIO.LOW)# 控制绿灯亮
def greenClick():
global f
f = False
GPIO.output(pins[0],GPIO.LOW)
GPIO.output(pins[1],GPIO.HIGH)# 退出程序
def stopClick():
global f
f = False
GPIO.output(pins[0],GPIO.LOW)
GPIO.output(pins[1],GPIO.LOW)
GPIO.cleanup()
exit()# 循环闪烁
def loop():
global f
global timer
global l
if f == False:
return
timer = threading.Timer(2,loop)
timer.start()
if l:
GPIO.output(pins[0],GPIO.HIGH)
GPIO.output(pins[1],GPIO.LOW)
else:
GPIO.output(pins[0],GPIO.LOW)
GPIO.output(pins[1],GPIO.HIGH)
# 转换下次闪烁的颜色
l = not l# 定义全局定时器
timer = threading.Timer(2, loop)# 开始进行闪烁
def flckerClick():
global f
global timer
f = True
timer = threading.Timer(2,loop)
timer.start()# UI上的按钮布局
redButton = Tkinter.Button(top, text="红灯停", height=\'3\', command=redClick)
redButton.pack()greenButton = Tkinter.Button(top, text="绿灯行", height=\'3\', command=greenClick)
greenButton.pack()flckerButton = Tkinter.Button(top, text="闪烁请注意", height=\'3\', command=flckerClick)
flckerButton.pack()stopButton = Tkinter.Button(top, text="关闭", height=\'3\', command=stopClick)
stopButton.pack()
# 进入消息循环
top.mainloop()
在树莓派上运行上面的代码,你现在应该已经可以灵活的控制双色LED灯的开关和闪烁了,如下图所示:
文章图片
温馨提示:如果你使用的是python3.x版本,可能需要用如下的方式引入tkinter:
import Tkinter as Tkinter
Tkinter是Python内置的一个UI框架,我们这里不做过多介绍,我们将重点放在RPi.GPIO模块的使用。
RPi.GPIO能够帮助我们方便的控制树莓派的GPIO引脚。在进行树莓派编程时,如果使用GPIO库,首先需要设置要使用的编码方式:
GPIO.setmode(GPIO.BOARD)
GPIO.BOARD将设置使用物理编码模式,GPIO.BCM将设置使用BCM编码模式。
在使用某个引脚之前,我们需要对其进行初始化,初始化时,可以将引脚设置成GPIO.OUT也可以设置为GPIO.IN,OUT表示我们要将其作为输出引脚使用,IN表示我们要将其作为输入引脚使用。
最后,当我们停止使用时,要记得调用如下方法进行资源清理:
GPIO.cleanup(channel)
五、休息一下【一起玩转树莓派——从双色LED灯开始】好了,第一个简单的树莓派实践到此要告一段落了,我相信你一定有些收获,发挥你的创新与动手能力,尝试用树莓派做更多有趣的事情吧。
推荐阅读
- cocos2d-x从c++到js19(CoffeeScript开发环境搭建续)
- cocos2d-x从c++到js20(脚本语言风格的JS代码)
- cocos2d-x从c++到js21(使用CocosCode调试JSB)
- 一起玩转树莓派——树莓派模数/数模转换实践
- cocos2d-x从c++到js22(使用非侵入方式扩展UI系统接口的举例)
- 一起玩转树莓派——DS18B20测温模块应用
- Cocos2d-x 3.0正式版及android环境搭建详细教程
- [Unity3D]上海某大型游戏公司的基础面试题
- UNITY3D 游戏开发之二高级组件(GUI:LABELSCROLLVIEWTEXTFIELD…等)入门篇