樹莓派的GPIO編程

做者:Vamei 出處:http://www.cnblogs.com/vamei 嚴禁轉載。 html

 

樹莓派除了提供常見的網口和USB接口 ,還提供了一組GPIO(General Purpose Input/Output)接口。這組GPIO接口大大拓展了樹莓派的能力。GPIO不只能實現通訊,還能直接控制電子元器件,從而讓用戶體驗到硬件編程的樂趣。編程

 

GPIO簡介

在樹莓派3上,GPIO接口由40個針腳(PIN)組成。每一個針腳均可以用導線和外部設備相連。你能夠經過焊接的方式來把導線固定在PIN上,也能夠用母型的跳線套接在PIN上。bash

跳線異步

 

40個PIN中,有固定輸出的5V(二、4號PIN)、3.3V(一、17號PIN)和地線(Ground,六、九、1四、20、2五、30、3四、39)。若是一個電路兩端接在,5V和地線之間,該電路就會得到5V的電壓輸入。27和28號PIN標着ID_SD和ID_SC。它們是兩個特殊的PIN。它們屬於ID EEPROM (Electrically Erasable Programmable Read-Only Memory) 接口,用於和拓展樹莓派功能的附加電路板通訊。其餘的PIN大多編程GPIOX的編號,如GPIO14。樹莓派的操做系統中,會用GPIO的編號14來指代這個PIN,而不是位置編號的8。有一些PIN除了GPIO功能外,還提供了高級端口功能。好比說,GPIO14和GPIO15就同時能夠充當UART端口。此外,GPIO上還能找到I2C和SPI端口。spa

 

   

樹莓派3的GPIO針腳操作系統

在計算機中,一般用高、低兩個電壓來表示二進制的1和0。樹莓派也是如此。GPIO用相同的方式來表示數據。每一個GPIO的PIN都能處於輸入或輸出狀態。當處於輸出狀態時,系統能夠把1或0傳給該PIN。若是是1,那麼對應的物理PIN向外輸出3.3V的高電壓,不然輸出0V的低電壓。相應的,處於輸入狀態的PIN能夠探測物理PIN上的電壓。若是是高電壓,那麼該PIN將向系統返回1,不然返回0。就是利用上述簡單機制,GPIO實現了和物理電路的互動。3d

 

控制LED燈

咱們先來看GPIO輸出的一個例子。咱們在GPIO21和地線之間接了一個串聯電路。電路上有一個LED燈,還有一個用於防止短路的330歐電阻。當GPIO21位於高電平時,將有電流經過電路,從而點亮LED燈。code

咱們用bash命令來控制GPIO21。在Linux中,外部設備常常被表示成文件。向文件寫入或讀取字符,就至關於向設備輸出或者從設備輸入字符。樹莓派上的GPIO端口也是如此,其表明文件位於/sys/class/gpio/下。首先,激活GPIO21:htm

echo 21 > /sys/class/gpio/export 

這個命令的意思,是把字符"21"輸入到/sys/class/gpio/export。能夠看到,命令執行後,/sys/class/gpio/下面增長了表明GPIO21的一個目錄,目錄名就是gpio21。下一步,咱們把GPIO21置於輸出狀態:blog

echo out > /sys/class/gpio/gpio21/direction

文件/sys/class/gpio/gpio21/direction用於控制GPIO21的方向。咱們向裏面寫入了表明輸出的字符"out"。最後,向GPIO21寫入1,從而讓PIN處於高電壓:

echo 1 > /sys/class/gpio/gpio21/value

能夠看到,LED燈亮了起來。若是想關掉LED燈,只須要向GPIO21寫入0:

echo 0 > /sys/class/gpio/gpio21/value

使用完畢GPIO21,能夠刪除該端口:

echo 21 > /sys/class/gpio/unexport

/sys/class/gpio/gpio21隨即消失。

 

兩個樹莓派之間的GPIO

咱們能夠用GPIO的方式鏈接兩個樹莓派。一個樹莓派的GPIO輸出,將成爲另外一個樹莓派的GPIO輸入。鏈接方式很簡單,只須要2根導線。一個導線鏈接兩個樹莓派的地線,另外一根導線鏈接樹莓派的兩個PIN:

咱們用左側的樹莓派來輸出,右側樹莓派來輸入。輸出過程和上面控制LED燈的例子類似。在第一個樹莓派中的GPIO21準備輸出:

echo 21 > /sys/class/gpio/export echo out > /sys/class/gpio/gpio21/direction

在第二個樹莓派中,準備好讀取GPIO26:

echo 26 > /sys/class/gpio/export echo in > /sys/class/gpio/gpio26/direction

當咱們往/sys/class/gpio/gpio26中寫入"in"時,就把GPIO26置於輸入狀態。

 

此後,在第一個樹莓派中,就能夠更改輸出值爲1或0:

echo 1 > /sys/class/gpio/gpio21/value echo 0 > /sys/class/gpio/gpio21/value

 

在第二個樹莓派中,能夠用cat命令來讀取文件,得到輸入值:

cat /sys/class/gpio/gpio26/value

因爲cat命令讀完一次後會返回。爲了持續讀取,咱們能夠用bash中的無限循環,來反覆調用cat:

while true; do cat /sys/class/gpio/gpio26/value; done

隨着第一個樹莓派中輸出的改變,第二個樹莓派得到的輸入也隨之改變。咱們在兩個樹莓派之間實現了簡單的通訊。

最後,在使用完GPIO後,別忘了刪除端口。

 

UART編程

計算機的數據都是許多位的0和1構成的序列。儘管GPIO能夠在0和1之間切換,但並不能準確地分割出位。好比說,咱們把一個二進制序列11000111輸出到GPIO端口,那麼在輸入端看來,只是輸入了一段時間的1,而後變成0,而後又變成1。輸入端無法準確說出,一段高電平輸入究竟包好了幾位1。

一個解決方案是用多個PIN同時通訊,每一個PIN表示一位。當輸入端讀取完成後,通知輸出端,讓輸出端送來下面一批的數據。這種通訊方式被稱爲並口傳輸。和並口對應的是串口傳輸。傳輸時依然是用一個PIN,但輸入方能夠知道一位的數據持續了多長時間。GPIO上的UART、I2C、SPI都是串口通訊。

UART與其他二者的區別在於,通訊雙方經過事先約定的速率來發送或接受數據。這種通訊方式稱爲異步通訊。在I2C和SPI這樣的同步通訊方式,會用額外的連線來保證雙方速率相同。UART的連線和實現方式很簡單,成爲最流行的串口通訊方式。但UART的缺點在於,若是發送方和接收方的速率不一樣,那麼通訊就會發生錯誤。通訊速率就稱爲「波特率」(baudrate),單位是每秒通訊的位數(bps)。

 

UART的端口至少有RX、TX和地線三個針腳。RX負責讀取,TX負責輸出。若是有兩個UART端口,它們的鏈接方式以下:

 

在樹莓派3的狀況下,TX和RX就是GPIO14和GPIO15針腳。所以,咱們能夠把兩個樹莓派之間按照上圖的方式鏈接起來,而後在兩個樹莓派之間實現UART通訊。

 

在這裏,咱們要注意樹莓派3發生的一點變化。樹莓派1和2中都使用了標準的UART,在操做系統中的對應文件是/dev/ttyAMA0。在樹莓派3中,新增的藍牙模塊佔用了標準UART端口和樹莓派溝通,外部的UART通訊採用了簡單的Mini UART,在操做系統中的對應文件是/dev/ttyS0。因爲mini UART的波特率依賴於CPU時鐘頻率,而CPU頻率可能在運行過程當中浮動,所以mini UART常常會帶來意向不到的錯誤。通常有兩種解決方案有。一種是關閉藍牙模塊,讓外部鏈接從新使用標準UART端口。另外一種是固定CPU時鐘頻率,以便mini UART能以準確的波特率進行通訊。

 

關閉藍牙模塊,須要修改/boot/config.txt,在文件末尾增長:

dtoverlay=pi3-disable-bt

修改後重啓。此後的UART通訊,就能夠經過/dev/ttyAMA0進行。

 

若是是採起第二種解決方案,仍是要修改/boot/config.txt,上面的修改變成:

core_freq=250
dtoverlay=pi3-miniuart-bt

修改後重啓。此後的UART通訊,就能夠經過/dev/ttyS0進行。

 

咱們以第一種解決方案爲例,進行UART通訊。設定波特率:

stty -F /dev/ttyAMA0 9600

 

輸出文本:

echo "hello" > /dev/ttyAMA0

 

讀取文本:

cat /dev/ttyAMA0

若是使用第二種解決方案,那麼只須要把上面的/dev/ttyAMA0改成/dev/ttyS0。

 

能夠看到,UART能夠實現更加複雜的文本通訊。

 

用UART鏈接PC

通常的PC都沒有暴露在外的UART針腳。爲了經過UART來鏈接PC和樹莓派,咱們須要一個USB和UART的轉換器。這個轉換器的一端是USB接口,另外一端是UART的針腳。咱們把USB一端插入到PC。另外一端按照UART到UART的方式,鏈接到樹莓派的UART針腳。

鏈接好以後,就能夠在PC上,利用串口操做軟件來和樹莓派通訊。在Linux下,USB鏈接表示爲/dev/ttyUSB0。固然,當計算機上只有1個USB設備時,最後的編號纔會是0。而在個人Mac OSX上,該USB鏈接被表示成/dev/cu.SLAB_USBtoUART。此後,就能夠經過操做USB文件來進行UART通訊。在Windows下,也有現成的進行串口通訊的圖形化軟件。

 

用UART登錄樹莓派

咱們還能夠用UART的方式鏈接並登錄樹莓派。進入樹莓派設置:

sudo raspi-config

在Interfacing Options->Serial中,容許開機時經過串口登錄。

 

重啓後,樹莓派啓動時會自動把開機信息已115200的波特率推到UART端口。在UART另外一端的PC上,若是你使用Mac OSX,那麼你能夠用下面命令鏈接:

screen /dev/cu.SLAB_USBtoUART 115200

若是PC是Linux系統,只須要把USB設備文件改成對應的設備文件便可。若是是Windows系統,還能夠用圖形化軟件。這裏再也不贅述。

 

歡迎閱讀「騎着企鵝採樹莓」系列文章 

相關文章
相關標籤/搜索