一块儿玩转树莓派(2)——从双色LED灯开始

一块儿玩转树莓派(2)——从双色LED灯开始

双色LED灯实验是入门树莓派GPIO外设编程的最简单的实验项目,咱们也以其投石问路,来进入树莓派的编程世界。python

1、从了解GPIO开始

GPIO全称General-purpose input/output,即通用型输入输出,其引脚可以供使用者自由的进行使用,能够对其进行输入,也能够读取其数据进行数据输出,这些引脚的输入或输出都会关联到某个寄存器,寄存器的值控制引脚的电平高低。编程

以笔者使用树莓派3B+为例,其有40个GPIO引脚,在开始编程以前,咱们首先要搞清楚每一个引脚的功能意义,从树莓派官网的文档中能够找到GPIO引脚的功能介绍,以下图所示:markdown

一块儿玩转树莓派(2)——从双色LED灯开始

咱们并不须要对树莓派的GPIO引脚作深刻的记忆,只须要记住当正面摆放树莓派时,其最左上角的一个引脚对应的是5V电压的功能,以后对照此图便可肯定每个引脚的功能。后面咱们会经过GPIO扩展板加面包板的方式来使用这些引脚,扩展板上默认会标注一些引脚功能,咱们使用起来会更加方便。框架

笔者使用的扩展板引脚标注示以下:ide

一块儿玩转树莓派(2)——从双色LED灯开始

使用排线将其与树莓派正向链接,以下图所示:oop

一块儿玩转树莓派(2)——从双色LED灯开始

能够看到扩展板上的引脚标注与树莓派自己的引脚排布并不一致,下面我会给你们介绍如何定位到要使用的引脚。布局

2、关于GPIO引脚编码

经常使用的GPIO引脚编码有3种。编码

咱们也能够在树莓派的终端输入以下指令查看GPIO引脚功能:3d

pinout

输出效果以下图所示:code

一块儿玩转树莓派(2)——从双色LED灯开始

须要注意,上图中的GPIO使用的是逻辑编码,从1开始,实际上BCM编码并非从1开始的。

第1种:BOARD物理编码

物理编码比较好理解,也很直观,其就是根据树莓派上40个引脚的位置进行排序编码,如博客中第一张图所示,正向放置树莓派时,第2排的第1个引脚编号为1,第1排第1个引脚编号为2,依次类推。后面在编写代码时,咱们使用的编码方式也是这种。

第2种:BCM编码

BCM编码是一种更底层的编码方式,与系统中信道编号相对应。在使用一个引脚时,若是使用BCM编码,首先须要查找信道号和物理引脚编号之间的对应规则。对于不一样的树莓派版本,可能没法兼容。下图很好的描述了几种编码的信息:

一块儿玩转树莓派(2)——从双色LED灯开始

上面咱们扩展板上GPIO引脚的标注,实际上使用的就是BCM编码,这也就是说,若是咱们要使用树莓派GPIO2和GPIO3两个功能引脚,指定的是物理引脚须要是13和15。直接将线链接到扩展板的G22和G27一行便可,很是直观。

第3种:WiringPi编码

WiringPi编码对应的引脚号是在wiringPI库中所使用的,网上很容易找到其编码的相关资料,本系列博客咱们不会使用到这个编码,这里再也不赘述。

如今,咱们总结一下如何使用GPIO引脚。

  • 首先在上图中找到本身要使用的功能引脚,如GOIP.2和GPIO.3两个功能引脚。
  • 以后找到其对应的物理引脚,即13和15。
  • 若是不使用扩展板,则直接接线物理引脚,若是要使用,则找到其对应的BCM编码,27和22。
  • 使用扩展板上的G27和G22引脚插槽。

3、了解双色LED灯并接线

双色LED灯构造很是简单,顾名思义,其能够发出两种颜色的光,其内部封装了两个发光二极管。双色LED分为共阴型和共阳型,两个发光二极管共有3个引脚,所以其中一个引脚是共用的。对于共阴型的,两个发光二极管的阴极连在一块儿。对于共阳型的,两个二极管的阳极连在一块儿。咱们此次使用的将是共阴极的双色LED灯,以下图所示:

一块儿玩转树莓派(2)——从双色LED灯开始

其内部工做原理电路图以下,也很是好理解:

一块儿玩转树莓派(2)——从双色LED灯开始

如上图所示,能够看到两个二极管的阴极是共用,咱们将其公共引脚接地便可,两个阳极是由两个开关控制,即LED等芯片上的另外两个引脚,咱们只须要经过GPIO控制将对应的引脚加高电平,便可将二极管点亮。

开始接线

咱们已经了解了双色LED等的工做原理,其有3个引脚,咱们将引脚“-”接地,S端的引脚接扩展板G22用来控制红灯,中间的引脚接G27用来控制绿灯。接线状况以下图所示:

一块儿玩转树莓派(2)——从双色LED灯开始

如今,准备工做大功告成,开始咱们的编码工做吧。

4、编写红绿灯控制程序

目前为止,咱们已经作了足够多的准备工做,你必定已经火烧眉毛的想要开始编码了,咱们先把完整的代码奉上:

#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灯的开关和闪烁了,以下图所示:

一块儿玩转树莓派(2)——从双色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)

5、休息一下

好了,第一个简单的树莓派实践到此要告一段落了,我相信你必定有些收获,发挥你的创新与动手能力,尝试用树莓派作更多有趣的事情吧。

专一技术,懂的热爱,愿意分享,作个朋友

QQ:316045346

相关文章
相关标签/搜索