上一篇,運用 Linux 的 sysfs,控制本機上的 LED 燈,usr0 至 usr3,這次用 GPIO 控制外部的電路,點亮 LED 燈。 這次的全部材料: BBB 一臺 購買 BBB 自帶的 USB 數據線 麵包板一塊 470Ω 三枚(至少一枚) 白、紅、黃、綠 LED 燈各一個(至少一個)...
上一篇,運用 Linux 的 sysfs,控制本機上的 LED 燈,usr0 至 usr3,這次用 GPIO 控制外部的電路,點亮 LED 燈。
這次的全部材料:
- BBB 一臺
- 購買 BBB 自帶的 USB 數據線
- 麵包板一塊
- 470Ω 三枚(至少一枚)
- 白、紅、黃、綠 LED 燈各一個(至少一個)
- 公對公杜邦線 4 條(至少兩條)
- 麵包板供電模塊 3.3v (可選)
- 紙卡一張(可選)
- 萬用表(可選)
點亮白燈
首先,據書上以及其他師兄建議,用麵包板測試成功才拿 BBB 開刀。這次也不是什麼複雜電路。但完全沒有接觸過面板包的話,試試吧:
麵包板裝上電源模塊,註意正負極,紅線正極,搞反了麵包板紅色和藍色反過來的話,就考驗你記憶力了。
供電模塊如果能調電壓,就調到 3.3V,然後接線。如果不知道麵包板線路方向的話,這樣的:
右圖紅線大概表示,板內線路相連的情況,圖中兩側正負極(板上原有的紅線和藍線)是縱向全部相連,板中間分開左右兩組,兩組互不相連,但每組每行內五個孔相連。 |
我不記得電阻上面的色環代表多少的,而且淘寶貨,用萬用表檢查一下:
不會用萬用表的話請自行百度。
LED 燈長腳是正極,兩條杜邦線分別接正負極,中間是 470歐電阻,小心元件的金屬腳不要互相碰到即可。連接後如下圖:
上電,亮了,這不應該會搞錯吧:
比較暗請無視。用 470歐 是因為,歐姆定律 + 官方說明, BBB GPIO 頂多給 5mA 電流,拉多了發生了什麼事的話,後果自負。
幾個 mA 我還以為不亮了…。繼續,插進去 BBB。
首先要知道引腳功能:
個引腳詳細說明,預設功能,系統是否已占用等等,P8 高清版請看這裡,P9 高清版請看這裡。打不開請自行FQ。
最左側 PIN 是 pin 名,把 BBB 擺正V5電源和網線插頭在上方的話,右排就是 P8,左排 P9,每排左上角是一號腳,右上角是二號腳,如此類推。詳細說明請自己看說明書。
紅色底色代表預設被占用。比如 HDMI, eMMC。它是通過 cape manager 來管理,調用引腳的。題外話,我見過有人為了這個把 cape manager 卸載掉… 。開機檔可以禁用該 cape 的,到我需要時候再試試看吧。
上圖 mode 0 至 7 可以調的,後話。現在只需要關心是有否被占用,實際是哪個引腳要插線,還有它的 GPIO 號是多少(第四欄)。
現在把麵包板的電源模塊拔掉,BBB 關機情況下,把原來的負極接 BBB 的 P9_1 GND,正極接 P9_23 :
BBB 開機,然後進去文件夾 /etc/class/gpio/,裡面有個 export 和 unexport 文件:
看之前的圖查到,P9_23 的 gpio 號是 49,需要用的話,echo 49 > export。用完不要了就 echo 49 > unexport。首先我們 export 一下:
目錄多了一個 link,cd 進去看看,能做的都在裡面:
要點燈,我們現在只需要關心 direction (方向,輸入還是輸出),和 value (1,高電平 ,0,低電平)。可以 cat 一下看看當前值:
首先把 direction 改為 out,做法:echo out > direction。然後把輸出值改為高電平,echo 1 > value。
如無意外,LED 是亮著的了。關掉它的話,改為低電平,echo 0 > value。就是說,要它閃動,就 0 和 1 之間迴圈賦值。
講完了,只不過是這樣而已。還有幾個 LED 還沒用呢?
點亮三色燈
全部負極麵包板上減號、藍線那列,盡頭接 BBB 的 GND。正極接 BBB 的 GPIO,我用了 P8_12、P8_11、P8_16, GPIO 號為 44、45、46,即可。各個語言都差不多,以下是 Python 代碼:
import time
import os
class TrafficLight:
def __init__(self,color):
self.color = color
if self.color == "green":
self.gpio_no = 44
if self.color == "yellow":
self.gpio_no = 45
if self.color == "red":
self.gpio_no = 46
os.system("echo %s > /sys/class/gpio/export" % self.gpio_no)
self.path = "/sys/class/gpio/gpio%s/" % self.gpio_no
os.system("echo out > %sdirection" % self.path)
os.system("echo 0 > %svalue" % self.path)
self.state = "off"
def On(self):
if self.state != "on":
os.system("echo 1 > %svalue" % self.path)
self.state = "on"
def Off(self):
if self.state != "off":
os.system("echo 0 > %svalue" % self.path)
self.state = "off"
TrafficLights = [TrafficLight("green"), TrafficLight("yellow"), TrafficLight("red")]
while True:
TrafficLights[0].On()
time.sleep(3)
TrafficLights[0].Off()
TrafficLights[1].On()
time.sleep(1)
TrafficLights[1].Off()
time.sleep(0.5)
TrafficLights[1].On()
time.sleep(0.5)
TrafficLights[1].Off()
time.sleep(0.5)
TrafficLights[1].On()
time.sleep(1)
TrafficLights[2].On()
TrafficLights[1].Off()
time.sleep(4)
TrafficLights[2].Off()
請原諒我 while 裡面那醜陋的代碼。創建 TrafficLight 實例時候,export,調 direction,On 就給 value 1,Off 就 0。由於是 While True,沒有 unexport 了。
最後是這些製作過程,我承認這比較無聊…