一塊兒玩轉樹莓派(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

相關文章
相關標籤/搜索