雙色LED燈實驗是入門樹莓派GPIO外設編程的最簡單的實驗項目,咱們也以其投石問路,來進入樹莓派的編程世界。python
GPIO全稱General-purpose input/output,即通用型輸入輸出,其引腳可以供使用者自由的進行使用,能夠對其進行輸入,也能夠讀取其數據進行數據輸出,這些引腳的輸入或輸出都會關聯到某個寄存器,寄存器的值控制引腳的電平高低。編程
以筆者使用樹莓派3B+爲例,其有40個GPIO引腳,在開始編程以前,咱們首先要搞清楚每一個引腳的功能意義,從樹莓派官網的文檔中能夠找到GPIO引腳的功能介紹,以下圖所示:markdown
咱們並不須要對樹莓派的GPIO引腳作深刻的記憶,只須要記住當正面擺放樹莓派時,其最左上角的一個引腳對應的是5V電壓的功能,以後對照此圖便可肯定每個引腳的功能。後面咱們會經過GPIO擴展板加麪包板的方式來使用這些引腳,擴展板上默認會標註一些引腳功能,咱們使用起來會更加方便。框架
筆者使用的擴展板引腳標註示以下:ide
使用排線將其與樹莓派正向鏈接,以下圖所示:oop
能夠看到擴展板上的引腳標註與樹莓派自己的引腳排布並不一致,下面我會給你們介紹如何定位到要使用的引腳。佈局
經常使用的GPIO引腳編碼有3種。編碼
咱們也能夠在樹莓派的終端輸入以下指令查看GPIO引腳功能:3d
pinout
輸出效果以下圖所示:code
須要注意,上圖中的GPIO使用的是邏輯編碼,從1開始,實際上BCM編碼並非從1開始的。
物理編碼比較好理解,也很直觀,其就是根據樹莓派上40個引腳的位置進行排序編碼,如博客中第一張圖所示,正向放置樹莓派時,第2排的第1個引腳編號爲1,第1排第1個引腳編號爲2,依次類推。後面在編寫代碼時,咱們使用的編碼方式也是這種。
BCM編碼是一種更底層的編碼方式,與系統中信道編號相對應。在使用一個引腳時,若是使用BCM編碼,首先須要查找信道號和物理引腳編號之間的對應規則。對於不一樣的樹莓派版本,可能沒法兼容。下圖很好的描述了幾種編碼的信息:
上面咱們擴展板上GPIO引腳的標註,實際上使用的就是BCM編碼,這也就是說,若是咱們要使用樹莓派GPIO2和GPIO3兩個功能引腳,指定的是物理引腳須要是13和15。直接將線鏈接到擴展板的G22和G27一行便可,很是直觀。
WiringPi編碼對應的引腳號是在wiringPI庫中所使用的,網上很容易找到其編碼的相關資料,本系列博客咱們不會使用到這個編碼,這裏再也不贅述。
如今,咱們總結一下如何使用GPIO引腳。
雙色LED燈構造很是簡單,顧名思義,其能夠發出兩種顏色的光,其內部封裝了兩個發光二極管。雙色LED分爲共陰型和共陽型,兩個發光二極管共有3個引腳,所以其中一個引腳是共用的。對於共陰型的,兩個發光二極管的陰極連在一塊兒。對於共陽型的,兩個二極管的陽極連在一塊兒。咱們此次使用的將是共陰極的雙色LED燈,以下圖所示:
其內部工做原理電路圖以下,也很是好理解:
如上圖所示,能夠看到兩個二極管的陰極是共用,咱們將其公共引腳接地便可,兩個陽極是由兩個開關控制,即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)
好了,第一個簡單的樹莓派實踐到此要告一段落了,我相信你必定有些收穫,發揮你的創新與動手能力,嘗試用樹莓派作更多有趣的事情吧。
專一技術,懂的熱愛,願意分享,作個朋友
QQ:316045346