General-Purpose input/output(gpio)
(他是什麼)簡介:楓葉板是一個強大的單板電腦採用ARM Cortex-A7 高效能處理器更有著許多得擴充槽,支援相機頭,感測,
音效,通訊,控制等多樣化的擴充,提供使用者不論是學生,研究者或者是有志投入相關領域的人開發與測試嵌入式系統的世界。
本次教學涵蓋的內容在利用楓葉板控制Led燈開關與閃爍組合的行為。
1.你會需要:1)楓葉板一片 2)萬用板一片 3)不同顏色發光二極體(Led燈)*4 4)電阻*4 5)小電線*4 6)焊槍與錫條
以上材料皆可於購買楓葉板的網站統一採購。若要自行採購,請注意一下購買電阻的規格(220 Ohm)
(小知識: 一般 I/O pin 輸出3v的電壓, 而一般Led的順向電壓為2v左右,順向電流5為mA左右,因此要串連一顆(3-2)/0.005=200以上的電阻)
2.GPIO 針腳介紹:
我們一共有四十隻針腳。為了最有效率的運用每個針腳我們設計每一隻針腳會有不同的功能。而下圖針腳編號(Pin#)旁有有顏色的框框就是我們預設這隻針腳的功能。因此既然我們的主題為GPIO因此我們會用到的部份只有預 設功能是GPIO的針腳。這邊就是編號為11,13,24,26,28,30,32,34的針腳。

(如何用)硬體配置:
這次的示範我選擇使用編號為24,26,28,30的針腳
依照圖示將LED,電阻與電線焊好後,將背面右上40pin的排針與楓葉板右上方40pin孔的排母結合就完成硬體的配置

正面

反面

楓葉板

結合圖

(範例簡介)python範例:
以下例子為讓所有LED一起亮一起暗(如果要停止程序請按鍵盤上的任意鍵)
1.首先我要讓程式知道這是一個python script,在開頭要加上
#!/usr/bin/python
2.我們要取得那四支pin腳的控制,並設定它們輸出訊號,因此先來了解一下要從哪裡控制,而它們的編號又是什麼。
以24號pin腳為例:
首先我們看到 24號pin腳它GPIO那欄的編號有一個數字6(詳細算法請看頁尾*****)那就是我們到時候要選擇這支pin腳時它的編號
我們在 /sys/class/gpio/ 路徑下的export服務輸入要選用的pin腳編號6,系統就會那隻腳被啟用了
然後在 /sys/class/gpio6/direction 中輸入 out,就設定完輸出訊號了
自定義函式
#exports the pin that we choose to use
def export_pins(pins):
try:
f = open("/sys/class/gpio/export","w")
f.write(str(pins), )
f.close()
except IOError:
print "GPIO %s already Exists, so skipping export gpio" % (str(pins), )
#set the direction of selected pin
def setpindirection(pin_no, pin_direction):
gpiopin = "gpio%s" % (str(pin_no), )
pin = open("/sys/class/gpio/"+gpiopin+"/direction","w")
pin.write(pin_direction)
pin.close()
主程式中
export_pins(6)
setpindirection(6, "out")
(告訴系統我們要控制24號pin腳並將它設為訊號輸出)
3.至於如何使LED暗與亮,我們亦以 24號pin腳的LED為例
在 /sys/class/gpio6/value 中輸入 1就會亮 0就熄滅
自定義函式
def writepins(pin_no, pin_value):
gpiopin = "gpio%s" % (str(pin_no), )
pin = open("/sys/class/gpio/"+gpiopin+"/value","w")
if pin_value == "led_on":
pin.write("1")
else:
pin.write("0")
pin.close()
主程式中
開
writepins(gpio_pa6, "led_on")
關
writepins(gpio_pa6, "led_off")
我們可以透過編輯不同的LED燈開與關的組合達到自己想要的閃爍模式
4.最後最重要的一點是我們在結束這個程序後要,要告訴系統我們已經使用完這支pin腳,要將使用權還回去
自定義函式
def unexport_pins(pins):
try:
f = open("/sys/class/gpio/unexport","w")
f.write(str(pins), )
f.close()
except IOError:
print "GPIO %s doesn't Exists, so skipping unexport gpio" % (str(pins), )
主程式中
unexport_pins(6)
完整程式碼:
#!/usr/bin/python
# coding=utf8
########################################################################################
#
# GPIO LED Demo program
# Copyright (C) Tony Chen <tony@ces.com.tw>
# MapleBoard.org
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
########################################################################################
import random
gpio_pa6 = 6
gpio_pa7 = 7
gpio_pa8 = 8
gpio_pa9 = 9
#exports the pin that we choose to use
def export_pins(pins):
try:
f = open("/sys/class/gpio/export","w")
f.write(str(pins), )
f.close()
except IOError:
print "GPIO %s already Exists, so skipping export gpio" % (str(pins), )
#unexports the pin that we choose to use
def unexport_pins(pins):
try:
f = open("/sys/class/gpio/unexport","w")
f.write(str(pins), )
f.close()
except IOError:
print "GPIO %s doesn't Exists, so skipping unexport gpio" % (str(pins), )
#set the direction of selected pin
def setpindirection(pin_no, pin_direction):
gpiopin = "gpio%s" % (str(pin_no), )
pin = open("/sys/class/gpio/"+gpiopin+"/direction","w")
pin.write(pin_direction)
pin.close()
#turn on or off the LED of selected pin
def writepins(pin_no, pin_value):
gpiopin = "gpio%s" % (str(pin_no), )
pin = open("/sys/class/gpio/"+gpiopin+"/value","w")
if pin_value == "led_on":
pin.write("1")
else:
pin.write("0")
pin.close()
#random choose LED
def random_LED():
randnumber = random.randint(1,4)
return transfer(randnumber)
#random choose on or off
def random_onoff():
randnumber = random.randint(5,6)
return transfer(randnumber)
def transfer(number_chosen):
pick={
1: "6",
2: "7",
3: "8",
4: "9",
5: "led_on",
6: "led_off"
}
return pick.get(number_chosen)
#home
if __name__ == '__main__':
from time import sleep
unexport_pins(gpio_pa6)
unexport_pins(gpio_pa7)
unexport_pins(gpio_pa8)
unexport_pins(gpio_pa9)
export_pins(gpio_pa6)
export_pins(gpio_pa7)
export_pins(gpio_pa8)
export_pins(gpio_pa9)
setpindirection(gpio_pa6, "out")
setpindirection(gpio_pa7, "out")
setpindirection(gpio_pa8, "out")
setpindirection(gpio_pa9, "out")
print "press crtl+c to exit"
while(1):
counter=0
#random1
while(counter<8):
a=random_LED()
writepins(a, "led_on")
sleep(0.5)
writepins(a, "led_off")
sleep(0.5)
counter=counter+1
#random2
while(counter<16):
a=random_LED()
b=random_onoff()
writepins(a, b)
sleep(0.5)
counter=counter+1
#sequential
while(counter<24):
writepins(gpio_pa6, "led_on")
sleep(0.5)
writepins(gpio_pa6, "led_off")
sleep(0.5)
writepins(gpio_pa7, "led_on")
sleep(0.5)
writepins(gpio_pa7, "led_off")
sleep(0.5)
writepins(gpio_pa8, "led_on")
sleep(0.5)
writepins(gpio_pa8, "led_off")
sleep(0.5)
writepins(gpio_pa9, "led_on")
sleep(0.5)
writepins(gpio_pa9, "led_off")
sleep(0.5)
counter=counter+1
#two_by_two
while(counter<32):
writepins(gpio_pa6, "led_on")
writepins(gpio_pa7, "led_on")
sleep(0.5)
writepins(gpio_pa6, "led_off")
writepins(gpio_pa7, "led_off")
sleep(0.5)
writepins(gpio_pa8, "led_on")
writepins(gpio_pa9, "led_on")
sleep(0.5)
writepins(gpio_pa8, "led_off")
writepins(gpio_pa9, "led_off")
sleep(0.5)
counter=counter+1
#all
while(counter<40):
writepins(gpio_pa6, "led_on")
writepins(gpio_pa7, "led_on")
writepins(gpio_pa8, "led_on")
writepins(gpio_pa9, "led_on")
sleep(0.5)
writepins(gpio_pa6, "led_off")
writepins(gpio_pa7, "led_off")
writepins(gpio_pa8, "led_off")
writepins(gpio_pa9, "led_off")
sleep(0.5)
counter=counter+1
請直接將程式碼複製下來存在製作一個demo.py檔案
將demo.py丟到 楓葉板的目錄中:
開啟terminal 連到楓葉板
$ssh mpl1@your_mapleboards_ID
執行demo.py
$sudo python /home/mpl1/demo.py
個別範例
隨機1
#!/usr/bin/python
# coding=utf8
import random
gpio_pa6 = 6
gpio_pa7 = 7
gpio_pa8 = 8
gpio_pa9 = 9
#exports the pin that we choose to use
def export_pins(pins):
try:
f = open("/sys/class/gpio/export","w")
f.write(str(pins), )
f.close()
except IOError:
print "GPIO %s already Exists, so skipping export gpio" % (str(pins), )
#unexports the pin that we choose to use
def unexport_pins(pins):
try:
f = open("/sys/class/gpio/unexport","w")
f.write(str(pins), )
f.close()
except IOError:
print "GPIO %s doesn't Exists, so skipping unexport gpio" % (str(pins), )
#set the direction of selected pin
def setpindirection(pin_no, pin_direction):
gpiopin = "gpio%s" % (str(pin_no), )
pin = open("/sys/class/gpio/"+gpiopin+"/direction","w")
pin.write(pin_direction)
pin.close()
#turn on or off the LED of selected pin
def writepins(pin_no, pin_value):
gpiopin = "gpio%s" % (str(pin_no), )
pin = open("/sys/class/gpio/"+gpiopin+"/value","w")
if pin_value == "led_on":
pin.write("1")
else:
pin.write("0")
pin.close()
#choose random LED
def random_LED():
randnumber = random.randint(1,4)
return transfer(randnumber)
def transfer(number_chosen):
pick={
1: "6",
2: "7",
3: "8",
4: "9"
}
return pick.get(number_chosen)
#main
if __name__ == '__main__':
from time import sleep
unexport_pins(gpio_pa6)
unexport_pins(gpio_pa7)
unexport_pins(gpio_pa8)
unexport_pins(gpio_pa9)
export_pins(gpio_pa6)
export_pins(gpio_pa7)
export_pins(gpio_pa8)
export_pins(gpio_pa9)
setpindirection(gpio_pa6, "out")
setpindirection(gpio_pa7, "out")
setpindirection(gpio_pa8, "out")
setpindirection(gpio_pa9, "out")
print "press crtl+c to exit"
while(1):
a=random_LED()
writepins(a, "led_on")
sleep(1)
writepins(a, "led_off")
sleep(1)
隨機2
#!/usr/bin/python
# coding=utf8
import random
gpio_pa6 = 6
gpio_pa7 = 7
gpio_pa8 = 8
gpio_pa9 = 9
#exports the pin that we choose to use
def export_pins(pins):
try:
f = open("/sys/class/gpio/export","w")
f.write(str(pins), )
f.close()
except IOError:
print "GPIO %s already Exists, so skipping export gpio" % (str(pins), )
#unexports the pin that we choose to use
def unexport_pins(pins):
try:
f = open("/sys/class/gpio/unexport","w")
f.write(str(pins), )
f.close()
except IOError:
print "GPIO %s doesn't Exists, so skipping unexport gpio" % (str(pins), )
#set the direction of selected pin
def setpindirection(pin_no, pin_direction):
gpiopin = "gpio%s" % (str(pin_no), )
pin = open("/sys/class/gpio/"+gpiopin+"/direction","w")
pin.write(pin_direction)
pin.close()
#turn on or off the LED of selected pin
def writepins(pin_no, pin_value):
gpiopin = "gpio%s" % (str(pin_no), )
pin = open("/sys/class/gpio/"+gpiopin+"/value","w")
if pin_value == "led_on":
pin.write("1")
else:
pin.write("0")
pin.close()
#random choose LED
def random_LED():
randnumber = random.randint(1,4)
return transfer(randnumber)
#random choose on or off
def random_onoff():
randnumber = random.randint(5,6)
return transfer(randnumber)
def transfer(number_chosen):
pick={
1: "6",
2: "7",
3: "8",
4: "9",
5: "led_on",
6: "led_off"
}
return pick.get(number_chosen)
#main
if __name__ == '__main__':
from time import sleep
unexport_pins(gpio_pa6)
unexport_pins(gpio_pa7)
unexport_pins(gpio_pa8)
unexport_pins(gpio_pa9)
export_pins(gpio_pa6)
export_pins(gpio_pa7)
export_pins(gpio_pa8)
export_pins(gpio_pa9)
setpindirection(gpio_pa6, "out")
setpindirection(gpio_pa7, "out")
setpindirection(gpio_pa8, "out")
setpindirection(gpio_pa9, "out")
print "press crtl+c to exit"
while(1):
a=random_LED()
b=random_onoff()
writepins(a, b)
sleep(0.5)
依序
#!/usr/bin/python
# coding=utf8
gpio_pa6 = 6
gpio_pa7 = 7
gpio_pa8 = 8
gpio_pa9 = 9
#exports the pin that we choose to use
def export_pins(pins):
try:
f = open("/sys/class/gpio/export","w")
f.write(str(pins), )
f.close()
except IOError:
print "GPIO %s already Exists, so skipping export gpio" % (str(pins), )
#unexports the pin that we choose to use
def unexport_pins(pins):
try:
f = open("/sys/class/gpio/unexport","w")
f.write(str(pins), )
f.close()
except IOError:
print "GPIO %s doesn't Exists, so skipping unexport gpio" % (str(pins), )
#set the direction of selected pin
def setpindirection(pin_no, pin_direction):
gpiopin = "gpio%s" % (str(pin_no), )
pin = open("/sys/class/gpio/"+gpiopin+"/direction","w")
pin.write(pin_direction)
pin.close()
#turn on or off the LED of selected pin
def writepins(pin_no, pin_value):
gpiopin = "gpio%s" % (str(pin_no), )
pin = open("/sys/class/gpio/"+gpiopin+"/value","w")
if pin_value == "led_on":
pin.write("1")
else:
pin.write("0")
pin.close()
#main
if __name__ == '__main__':
from time import sleep
unexport_pins(gpio_pa6)
unexport_pins(gpio_pa7)
unexport_pins(gpio_pa8)
unexport_pins(gpio_pa9)
export_pins(gpio_pa6)
export_pins(gpio_pa7)
export_pins(gpio_pa8)
export_pins(gpio_pa9)
setpindirection(gpio_pa6, "out")
setpindirection(gpio_pa7, "out")
setpindirection(gpio_pa8, "out")
setpindirection(gpio_pa9, "out")
print "press crtl+c to exit"
while(1):
writepins(gpio_pa6, "led_on")
sleep(1)
writepins(gpio_pa6, "led_off")
sleep(1)
writepins(gpio_pa7, "led_on")
sleep(1)
writepins(gpio_pa7, "led_off")
sleep(1)
writepins(gpio_pa8, "led_on")
sleep(1)
writepins(gpio_pa8, "led_off")
sleep(1)
writepins(gpio_pa9, "led_on")
sleep(1)
writepins(gpio_pa9, "led_off")
sleep(1)
兩個兩個
#!/usr/bin/python
# coding=utf8
gpio_pa6 = 6
gpio_pa7 = 7
gpio_pa8 = 8
gpio_pa9 = 9
#exports the pin that we choose to use
def export_pins(pins):
try:
f = open("/sys/class/gpio/export","w")
f.write(str(pins), )
f.close()
except IOError:
print "GPIO %s already Exists, so skipping export gpio" % (str(pins), )
#unexports the pin that we choose to use
def unexport_pins(pins):
try:
f = open("/sys/class/gpio/unexport","w")
f.write(str(pins), )
f.close()
except IOError:
print "GPIO %s doesn't Exists, so skipping unexport gpio" % (str(pins), )
#set the direction of selected pin
def setpindirection(pin_no, pin_direction):
gpiopin = "gpio%s" % (str(pin_no), )
pin = open("/sys/class/gpio/"+gpiopin+"/direction","w")
pin.write(pin_direction)
pin.close()
#turn on or off the LED of selected pin
def writepins(pin_no, pin_value):
gpiopin = "gpio%s" % (str(pin_no), )
pin = open("/sys/class/gpio/"+gpiopin+"/value","w")
if pin_value == "led_on":
pin.write("1")
else:
pin.write("0")
pin.close()
#main
if __name__ == '__main__':
from time import sleep
unexport_pins(gpio_pa6)
unexport_pins(gpio_pa7)
unexport_pins(gpio_pa8)
unexport_pins(gpio_pa9)
export_pins(gpio_pa6)
export_pins(gpio_pa7)
export_pins(gpio_pa8)
export_pins(gpio_pa9)
setpindirection(gpio_pa6, "out")
setpindirection(gpio_pa7, "out")
setpindirection(gpio_pa8, "out")
setpindirection(gpio_pa9, "out")
print "press crtl+c to exit"
while(1):
writepins(gpio_pa6, "led_on")
writepins(gpio_pa7, "led_on")
sleep(1)
writepins(gpio_pa6, "led_off")
writepins(gpio_pa7, "led_off")
sleep(1)
writepins(gpio_pa8, "led_on")
writepins(gpio_pa9, "led_on")
sleep(1)
writepins(gpio_pa8, "led_off")
writepins(gpio_pa9, "led_off")
sleep(1)
全部
#!/usr/bin/python
# coding=utf8
gpio_pa6 = 6
gpio_pa7 = 7
gpio_pa8 = 8
gpio_pa9 = 9
#exports the pin that we choose to use
def export_pins(pins):
try:
f = open("/sys/class/gpio/export","w")
f.write(str(pins), )
f.close()
except IOError:
print "GPIO %s already Exists, so skipping export gpio" % (str(pins), )
#unexports the pin that we choose to use
def unexport_pins(pins):
try:
f = open("/sys/class/gpio/unexport","w")
f.write(str(pins), )
f.close()
except IOError:
print "GPIO %s doesn't Exists, so skipping unexport gpio" % (str(pins), )
#set the direction of selected pin
def setpindirection(pin_no, pin_direction):
gpiopin = "gpio%s" % (str(pin_no), )
pin = open("/sys/class/gpio/"+gpiopin+"/direction","w")
pin.write(pin_direction)
pin.close()
#turn on or off the LED of selected pin
def writepins(pin_no, pin_value):
gpiopin = "gpio%s" % (str(pin_no), )
pin = open("/sys/class/gpio/"+gpiopin+"/value","w")
if pin_value == "led_on":
pin.write("1")
else:
pin.write("0")
pin.close()
#main
if __name__ == '__main__':
from time import sleep
unexport_pins(gpio_pa6)
unexport_pins(gpio_pa7)
unexport_pins(gpio_pa8)
unexport_pins(gpio_pa9)
export_pins(gpio_pa6)
export_pins(gpio_pa7)
export_pins(gpio_pa8)
export_pins(gpio_pa9)
setpindirection(gpio_pa6, "out")
setpindirection(gpio_pa7, "out")
setpindirection(gpio_pa8, "out")
setpindirection(gpio_pa9, "out")
print "press crtl+c to exit"
while(1):
writepins(gpio_pa6, "led_on")
writepins(gpio_pa7, "led_on")
writepins(gpio_pa8, "led_on")
writepins(gpio_pa9, "led_on")
sleep(1)
writepins(gpio_pa6, "led_off")
writepins(gpio_pa7, "led_off")
writepins(gpio_pa8, "led_off")
writepins(gpio_pa9, "led_off")
sleep(1)
——————————————————————————————————————————————————————————————————————
*****實際上它們編號的算法是數字前面的英文字(A代表1 B代表2 以此類推)-1,乘與32,最後再加上那個數字
以24號pin腳為例(GPIO-PA6) : (A-1)*32+6=6;
以34號pin腳為例(GPIO-PE15): (E-1)*32+15=133