溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么理解樹莓派的GPIO編程

發(fā)布時間:2021-11-06 17:04:27 來源:億速云 閱讀:183 作者:柒染 欄目:建站服務(wù)器

本篇文章為大家展示了怎么理解樹莓派的GPIO編程,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

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

在樹莓派3上,GPIO接口由40個針腳(PIN)組成。每個針腳都可以用導(dǎo)線和外部設(shè)備相連。你可以通過焊接的方式來把導(dǎo)線固定在PIN上,也可以用母型的跳線套接在PIN上。

跳線

40個PIN中,有固定輸出的5V(2、4號PIN)、3.3V(1、17號PIN)和地線(Ground,6、9、14、20、25、30、34、39)。如果一個電路兩端接在,5V和地線之間,該電路就會獲得5V的電壓輸入。27和28號PIN標著ID_SD和ID_SC。它們是兩個特殊的PIN。它們屬于ID EEPROM (Electrically Erasable Programmable Read-Only Memory) 接口,用于和拓展樹莓派功能的附加電路板通信。其他的PIN大多編程GPIOX的編號,如GPIO14。樹莓派的操作系統(tǒng)中,會用GPIO的編號14來指代這個PIN,而不是位置編號的8。有一些PIN除了GPIO功能外,還提供了高級端口功能。比如說,GPIO14和GPIO15就同時可以充當UART端口。此外,GPIO上還能找到I2C和SPI端口。

 

   

樹莓派3的GPIO針腳

在計算機中,通常用高、低兩個電壓來表示二進制的1和0。樹莓派也是如此。GPIO用相同的方式來表示數(shù)據(jù)。每個GPIO的PIN都能處于輸入或輸出狀態(tài)。當處于輸出狀態(tài)時,系統(tǒng)可以把1或0傳給該PIN。如果是1,那么對應(yīng)的物理PIN向外輸出3.3V的高電壓,否則輸出0V的低電壓。相應(yīng)的,處于輸入狀態(tài)的PIN可以探測物理PIN上的電壓。如果是高電壓,那么該PIN將向系統(tǒng)返回1,否則返回0。就是利用上述簡單機制,GPIO實現(xiàn)了和物理電路的互動。

 
控制LED燈

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

我們用bash命令來控制GPIO21。在Linux中,外部設(shè)備經(jīng)常被表示成文件。向文件寫入或讀取字符,就相當于向設(shè)備輸出或者從設(shè)備輸入字符。樹莓派上的GPIO端口也是如此,其代表文件位于/sys/class/gpio/下。首先,激活GPIO21:

echo 21 > /sys/class/gpio/export

這個命令的意思,是把字符"21"輸入到/sys/class/gpio/export??梢钥吹?,命令執(zhí)行后,/sys/class/gpio/下面增加了代表GPIO21的一個目錄,目錄名就是gpio21。下一步,我們把GPIO21置于輸出狀態(tài):

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燈亮了起來。如果想關(guān)掉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根導(dǎo)線。一個導(dǎo)線連接兩個樹莓派的地線,另一根導(dǎo)線連接樹莓派的兩個PIN:

我們用左側(cè)的樹莓派來輸出,右側(cè)樹莓派來輸入。輸出過程和上面控制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置于輸入狀態(tài)。

 

此后,在第一個樹莓派中,就可以更改輸出值為1或0:

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

 

在第二個樹莓派中,可以用cat命令來讀取文件,獲得輸入值:

cat /sys/class/gpio/gpio26/value

由于cat命令讀完一次后會返回。為了持續(xù)讀取,我們可以用bash中的無限循環(huán),來反復(fù)調(diào)用cat:

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

隨著第一個樹莓派中輸出的改變,第二個樹莓派獲得的輸入也隨之改變。我們在兩個樹莓派之間實現(xiàn)了簡單的通信。

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

 
UART編程

計算機的數(shù)據(jù)都是許多位的0和1構(gòu)成的序列。盡管GPIO可以在0和1之間切換,但并不能準確地分割出位。比如說,我們把一個二進制序列11000111輸出到GPIO端口,那么在輸入端看來,只是輸入了一段時間的1,然后變成0,然后又變成1。輸入端沒法準確說出,一段高電平輸入究竟包好了幾位1。

一個解決方案是用多個PIN同時通信,每個PIN表示一位。當輸入端讀取完成后,通知輸出端,讓輸出端送來下面一批的數(shù)據(jù)。這種通信方式被稱為并口傳輸。和并口對應(yīng)的是串口傳輸。傳輸時依然是用一個PIN,但輸入方可以知道一位的數(shù)據(jù)持續(xù)了多長時間。GPIO上的UART、I2C、SPI都是串口通信。

UART與其余兩者的區(qū)別在于,通信雙方通過事先約定的速率來發(fā)送或接受數(shù)據(jù)。這種通信方式稱為異步通信。在I2C和SPI這樣的同步通信方式,會用額外的連線來保證雙方速率相同。UART的連線和實現(xiàn)方式很簡單,成為最流行的串口通信方式。但UART的缺點在于,如果發(fā)送方和接收方的速率不同,那么通信就會發(fā)生錯誤。通信速率就稱為“波特率”(baudrate),單位是每秒通信的位數(shù)(bps)。

 

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

 

在樹莓派3的情況下,TX和RX就是GPIO14和GPIO15針腳。因此,我們可以把兩個樹莓派之間按照上圖的方式連接起來,然后在兩個樹莓派之間實現(xiàn)UART通信。

 

在這里,我們要注意樹莓派3發(fā)生的一點變化。樹莓派1和2中都使用了標準的UART,在操作系統(tǒng)中的對應(yīng)文件是/dev/ttyAMA0。在樹莓派3中,新增的藍牙模塊占用了標準UART端口和樹莓派溝通,外部的UART通信采用了簡單的Mini UART,在操作系統(tǒng)中的對應(yīng)文件是/dev/ttyS0。由于mini UART的波特率依賴于CPU時鐘頻率,而CPU頻率可能在運行過程中浮動,因此mini UART經(jīng)常會帶來意向不到的錯誤。一般有兩種解決方案有。一種是關(guān)閉藍牙模塊,讓外部連接重新使用標準UART端口。另一種是固定CPU時鐘頻率,以便mini UART能以準確的波特率進行通信。

 

關(guān)閉藍牙模塊,需要修改/boot/config.txt,在文件末尾增加:

dtoverlay=pi3-disable-bt

修改后重啟。此后的UART通信,就可以通過/dev/ttyAMA0進行。

 

如果是采取第二種解決方案,還是要修改/boot/config.txt,上面的修改變成:

core_freq=250
dtoverlay=pi3-miniuart-bt

修改后重啟。此后的UART通信,就可以通過/dev/ttyS0進行。

 

我們以第一種解決方案為例,進行UART通信。設(shè)定波特率:

stty -F /dev/ttyAMA0 9600

 

輸出文本:

echo "hello" > /dev/ttyAMA0

 

讀取文本:

cat /dev/ttyAMA0

如果使用第二種解決方案,那么只需要把上面的/dev/ttyAMA0改為/dev/ttyS0。

 

可以看到,UART可以實現(xiàn)更加復(fù)雜的文本通信。

 
用UART連接PC

一般的PC都沒有暴露在外的UART針腳。為了通過UART來連接PC和樹莓派,我們需要一個USB和UART的轉(zhuǎn)換器。這個轉(zhuǎn)換器的一端是USB接口,另一端是UART的針腳。我們把USB一端插入到PC。另一端按照UART到UART的方式,連接到樹莓派的UART針腳。

連接好之后,就可以在PC上,利用串口操作軟件來和樹莓派通信。在Linux下,USB連接表示為/dev/ttyUSB0。當然,當計算機上只有1個USB設(shè)備時,最后的編號才會是0。而在我的Mac OSX上,該USB連接被表示成/dev/cu.SLAB_USBtoUART。此后,就可以通過操作USB文件來進行UART通信。在Windows下,也有現(xiàn)成的進行串口通信的圖形化軟件。

 
用UART登陸樹莓派

我們還可以用UART的方式連接并登陸樹莓派。進入樹莓派設(shè)置:

sudo raspi-config

在Interfacing Options->Serial中,允許開機時通過串口登陸。
 

重啟后,樹莓派啟動時會自動把開機信息已115200的波特率推到UART端口。在UART另一端的PC上,如果你使用Mac OSX,那么你可以用下面命令連接:

screen /dev/cu.SLAB_USBtoUART 115200

如果PC是Linux系統(tǒng),只需要把USB設(shè)備文件改為對應(yīng)的設(shè)備文件即可。如果是Windows系統(tǒng),還可以用圖形化軟件。這里不再贅述。

上述內(nèi)容就是怎么理解樹莓派的GPIO編程,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI