嵌入式設(shè)備有個被天生賦予的重點任務(wù),就是要成為自動控制整體方案中的一員。早期市場對自動控制的需求主要集中在單純的“機電控制”上,而具備智能計算的 Jetson 系列產(chǎn)品相對與幾十元的這類控制板來說,成本高出了一個階位。
但是隨著“智能+控制”的結(jié)合功能成為新工業(yè)主流需求之后,成本已經(jīng)不是最首要的關(guān)鍵因素,因為智能設(shè)備所帶來的價值已經(jīng)遠(yuǎn)遠(yuǎn)超過先前的成本差異。NVIDIA Jetson 設(shè)備就是在這樣的風(fēng)潮下逐漸嶄露頭角,為智能工業(yè)帶來新的生命力。
透過“擴充引腳”的方式與機電控制設(shè)備進(jìn)行對接,是絕大部分嵌入式設(shè)備所采用的方法。NVIDIA 在 2015 年的 Jetson TK1 產(chǎn)品就已經(jīng)配置了這方面的引腳,經(jīng)歷了 TX1/TX2 到 AGX Xavier 的階段,依舊保有這方面的接口(如下圖),一直到 2019 年 Jetson Nano 推出之后,采用與樹莓派兼容的 40 針引腳的設(shè)計,在戰(zhàn)略上是個非常高明的設(shè)計。
過去 10 年是創(chuàng)客(maker)興盛的年代,而樹莓派憑借“硬件開源”的風(fēng)潮吸引龐大的民間實力,開發(fā)了相當(dāng)齊全的周邊產(chǎn)品,下表是比較常用的一部分設(shè)備清單,全部都是基于樹莓派 40 針引腳定義所設(shè)計。
如今 Jetson Nano(含2GB)、Xavier NX 等開發(fā)套件的引腳也兼容于樹莓派的定義時,就表示上面列表中的周邊設(shè)備,都能直接適用于現(xiàn)在主流的 Jetson 開發(fā)套件,不僅無需依賴中間的轉(zhuǎn)換器,包括代碼也可以不需要修改,就能將原本不具備深度學(xué)習(xí)能力的樹莓派方案,立即移植到 NVIDIA 的智能 Jetson 設(shè)備上,馬上變成“智能控制”的應(yīng)用設(shè)備,實用價值瞬間就提高一個檔次。
本文屬于 Jetbot 系列中的一環(huán),不過在進(jìn)入與周邊設(shè)備(PiOLED、PCA9685 等)對接之前,有必要讓初學(xué)者對 Jetson 的 40 針引腳的細(xì)節(jié)與使用有進(jìn)一步的了解,因為 Jetbot 是一個經(jīng)典的項目,但更重要是要讓初學(xué)者可以自行搭建更多的應(yīng)用。
過去缺乏智能識別能力的創(chuàng)客項目,多屬于較為單調(diào)的固定執(zhí)行流程的應(yīng)用,但是有了 NVIDIA Jetson 的智能識別能力之后,就能讓這類項目變得非常多彩多姿,并且更加貼近生活或工作上的實用場景,例如根據(jù)垃圾分類識別后進(jìn)行處理的機械手臂、根據(jù)貓臉識別后對特定貓開啟喂食器、根據(jù)水果成熟度進(jìn)行采摘等應(yīng)用,都是實用價值非常高的,這才是真正智能設(shè)備的創(chuàng)造動力。
網(wǎng)上有不少探索 Jetson 這 40 根引腳的文章,但內(nèi)容相對籠統(tǒng)并且有些部分的混淆,對初學(xué)者來說會產(chǎn)生障礙。本文的重點就是將以下三個部分講解清楚:
40 根引腳的 SPIO 與 GPIO
Jetson-IO 工具與 Jetson.GPIO 開發(fā)庫
四種 GPIO 引腳調(diào)用模式:BOARD、BCM、CVM、TEGRA_SOC
只要將這三個關(guān)系捋清楚后,整個 40 針引腳的使用就會瞬間變得非常簡單。假如上述三個關(guān)系您都很熟悉了,就可以跳過本文的內(nèi)容;如果還沒搞清楚的,請仔細(xì)閱讀本文,能讓您很有條理地掌握這些引腳的使用要領(lǐng)。
40針引腳的SPIO與GPIO
下圖是 Jetson 的 40 幀引腳圖的說明,適用于 Nano(含2GB)、Xavier NX 與 AGX Xavier 等開發(fā)套件。雖然上面滿滿的內(nèi)容,乍看之下的確令人眼花繚亂,只要看完我們所作的分解之后,就會讓這部分的內(nèi)容變得非常簡單。
首先,雖然大家平常時候習(xí)慣將這些引腳統(tǒng)稱為 GPIO,但事實上這 40 根引腳主要分成 GPIO(General Purpose I/O)通用功能與 SFIO(Special Function I/O)特定功能兩大類,后者總共有 18 根與開發(fā)套件底板電子電力直連的腳位,這是不能重新定義的固定功能,主要分為以下三種:
1. 供電相關(guān):這個部分需要非常細(xì)心處理,如果錯用可能會造成 Jetson 設(shè)備損壞。這里也進(jìn)一步分成三種功能:
(1) 5V 直流電輸入/輸出:腳位[2, 4],在標(biāo)識上唯一使用“紅色”的地方,可以對 Jetson 開發(fā)套件作為“供電”用途,有些 Jetbot 第三方套件就是用這種方式對 Nano(含2GB)進(jìn)行供電,不過這些都是專業(yè)廠商自行設(shè)計的電路,如果不太熟悉供電原理的讀者,請勿隨意嘗試以避免對設(shè)備造成破壞。
這兩個接腳也能對 5.0V 規(guī)格的周邊設(shè)備進(jìn)行供電,但是非常不推薦這樣使用,因為 Jetson 本身的電力已經(jīng)處于吃緊狀態(tài),如果再對其他設(shè)備提供 5V 輸出,很可能影響整體穩(wěn)定性。
(2) 3.3V 直流電輸出:腳位[1, 17],可以為一些低電設(shè)備進(jìn)行供電。例如在 Jetbot 項目中使用的 PiOLED 與 PCA9685,就是由 Nano(含2GB)的 3.3V 供電口對這兩個元件進(jìn)行供電。
(3) GND 接地點:腳位[6, 9, 14, 20, 25, 30, 34, 39]共 8 個。
2. 二組 I2C:I2C1_SDA/SCL=》腳位[27, 28];I2C2_SDA/SCL =》 腳位[3, 5]
3. 一組 UART:UART2_TX/RX=》腳位[8, 10]
這樣一整理之后,是不是就變得很簡單了?撇開電源相關(guān)的 12 根腳位之外,真正需要了解的,就是兩組 I2C 與一組 UART 共 6 個腳位,這 18 根腳位的定義與樹莓派是完全一致的。在 Jetbot 項目中也就使用 1 組 3.3V/GND 電源與 1 組 I2C 的 SDA/SCL 而已,總共 4 根引腳就能完成智能車的任務(wù)。
如果原本樹莓派創(chuàng)客項目中只使用這類的 I2C 或 UART 引腳的話,幾乎不需修改代碼就能將原本的應(yīng)用移植到 Jetson Nano(含2GB)設(shè)備上,立刻升級為智能識別的應(yīng)用,所展現(xiàn)的價值就馬上提高一個臺階。
至于另外 22 根“可重新定義”腳位,才是很多網(wǎng)上所探索的“GPIO” 內(nèi)容,其實正確的說法應(yīng)該是“Jetson 的 22 根 GPIO 引腳使用”才對,不過這里就不去糾正這些小問題,重點在于讓大家更清楚剩下這 22 根引腳的用法。
事實上這些引腳也有兩種處理方式:
1.透過 Jetson-IO 工具將特定引腳設(shè)置成為 SFIO 用途,然后配合特定的開發(fā)庫;2.作為 GPIO 用途,透過 Jetson.GPIO 或其他開發(fā)庫直接調(diào)用
網(wǎng)上大部分的混淆就在這個 Jetson-IO 工具與 Jetson.GPIO 庫,前者是 Jetpack 自帶的底層系統(tǒng)引腳配置工具,后者是針對 GPIO 引腳的應(yīng)用層開發(fā)庫,二者之間是不僅完全獨立的,甚至某種角度上還有些許“互斥”的關(guān)系。
接下去帶著大家將這兩個工具認(rèn)識清楚,這樣日后的開發(fā)就會非常簡單。
Jetson-IO引腳配置工具
前面已經(jīng)清楚在 40 根引腳中有 18 根是固定好的不能重新定義,剩下的問題就是如何處理這 22 根“可重新定義”的引腳,是否有什么工具可以協(xié)助我們確認(rèn)目前所有腳位的狀態(tài)呢?這就是 Jetson-IO 的主要工作了,請執(zhí)行以下指令,看看顯示怎樣的結(jié)果?
sudo /opt/nvidia/jetson-io/config-by-pin.py
是否看到顯示從 1 到 40 的狀態(tài)?核對一下,是不是除了前面所說 18 個 SFIO 位置之外的 22 個引腳,都顯示“unused” 狀態(tài)?這些呈現(xiàn)“unused”的腳位就是 GPIO 的狀態(tài),能用 Jetson.GPIO 庫直接指派與調(diào)用。
如果要對這 22 個腳位進(jìn)行重新定義,該使用什么方法來操作?Jetson-IO 工具就是扮演“配置腳位功能”的角色,這是 NVIDIA 從 L4T 32.3 版本開始,提供可以修改引腳定義的工具,在 Jetpack 燒錄過程就編譯到開發(fā)套件的 /opt/nvidia/jetsion-io 目錄下,這是屬于系統(tǒng)底層的配置工具。
因為設(shè)備所有 I/O 的默認(rèn)配置是靜態(tài)定義的,早期要更改 40 針擴展引腳定義時置,必須使用相應(yīng)平臺的 pinmux 電子表格去更新管腳配置,然后將新配置燒回開發(fā)套件中,雖然這是更新系統(tǒng)的一種適當(dāng)方法,但在開發(fā)的階段,需要一種更方便的方法,來測試不同的管腳配置。
Jetson-IO 工具就是要簡化 40 針引腳 I/O 配置的修改任務(wù),提供一套基于 Python 的簡單代碼,最終會將修改的內(nèi)容寫入設(shè)備樹(DTB, Device Tree, Blob)固件,重啟設(shè)備就能讓新的設(shè)置生效,非常方便。
如果想要修改前面所提到的 22 根腳位定義,最輕松的方法就是執(zhí)行以下步驟:
sudo /opt/nvidia/jetson-io/jetson-io.py
進(jìn)入主菜單后,選擇下面的“Configure 40-pin expansion header”,就會出現(xiàn)以下選擇菜單視窗,透過“上下鍵”與“空鍵”選擇要設(shè)定的組:
這里是根據(jù)“功能”的提供腳位組合,所定義的腳位與前面 40 針引腳定義圖是完全對應(yīng)的,也就是說在 18 根 SFIO 以外的腳位,必須經(jīng)過 Jetson-IO 的配置之后,才會具備引腳圖中的功能,但這個步驟并未出現(xiàn)在任何說明文件或網(wǎng)上教程之中,導(dǎo)致很多初學(xué)者完全無法理會其中的奧秘,我們在這里為大家打開這個黑箱子。
現(xiàn)在試著啟動 spi1 組設(shè)置,Jetson-IO 工具會同時配置后面的 5 個腳位。設(shè)置完畢后選擇“Save and reboot to reconfigure pins”,重啟系統(tǒng)之后再執(zhí)行:
sudo /opt/nvidia/jetson-io/config-by-pin.py
是否看到腳位[19, 21, 23, 24, 26]的狀態(tài),現(xiàn)在都出現(xiàn)“spi1”的標(biāo)識了?
在 /opt/nvidia/jetson-io/ 目錄下還有 config-by-function.py、config-by-pin.py 與 config-by-hardware.py 三個工具,根據(jù)不同目的查詢與設(shè)置 GPIO 接腳屬性。詳細(xì)的內(nèi)容請至https://docs.nvidia.com/jetson/archives/l4t-archived/l4t-325/index.html里“Hardware Setup”的“Configuring the 40-Pin Expansion Header”,有完整的使用說明。
Jetson.GPIO應(yīng)用開發(fā)庫
這是屬于應(yīng)用級的開發(fā)庫,是針對“未被 Jetson-IO 設(shè)置為 SPIO”的 GPIO 引腳進(jìn)行配置與運作的應(yīng)用庫。
例如引腳 19 在前面 Jetson-IO 配置為 spi1 功能之前,就是作為 GPIO 功能,可以用 Jetson.GPIO 庫去指派與調(diào)用;但是經(jīng)過 spi1 配置并重啟之后,引腳 19 已經(jīng)屬于 SFIO 而非 GPIO,這時候如果用 Jetson.GPIO 庫去指定這個引腳,就不會產(chǎn)生作用。
前面提過“從某種角度來說 Jetson.GPIO 與 Jetson-IO 是互斥的”,道理就在這個地方,一旦被 Jetson-IO 配置并啟動的腳位,就不再屬于 GPIO 的功能了。
這個 Jetson.GPIO 開發(fā)庫并不在 Jetpack 安裝包里,因此需要手動安裝與從 github 上下載范例代碼。下面指令可以簡單安裝這個庫:
sudo pip3 install Jetson.GPIO
如果想要獲得這個開發(fā)庫的范例,就執(zhí)行以下指令:
cd ~ && git clone https://github.com/NVIDIA/jetson-gpiocd jetson-gpio/samples
這里的范例都需要結(jié)合一些很基本的電子實驗設(shè)備,例如面包板、LED 燈、杜邦線、小電阻、小電容之類的設(shè)備,實驗內(nèi)容非常簡單,請自行采購相關(guān)元件并跟著說明執(zhí)行就可以,這里不做這些范例的講解。
至于還有些環(huán)境變量配置問題,也請參考開源項目內(nèi)的說明,不過在 Jetbot 項目中都已經(jīng)調(diào)試好了。
四種GPIO引腳調(diào)用模式
這是最后一個容易造成混淆的部分,因為作為 GPIO 用途的腳位有四種調(diào)用的模式,這也是因為過去長年積累的兼容性問題所導(dǎo)致的,不過只要搞清楚之后也都不是大問題。
在代碼一開始的時候,需要使用“GPIO.setmode(GPIO_MODE)”指令進(jìn)行模式的指定,其中“GPIO_MODE”可以是以下四種:
1. GPIO.BOARD:這種模式的引腳是根據(jù)“1~40”的物理編號進(jìn)行指定,是最簡單易懂的方式,不過必須注意得避開已經(jīng)設(shè)置為 SFIO 的引腳。例如:
GPIO.setmode(GPIO.BOARD)GPIO.setup(12, GPIO.IN) # 設(shè)置12號引腳為輸入GPIO.setup(13, GPIO.OUT, initial=GPIO.HIGH) # 設(shè)置13號引腳為輸出
這是最直觀而且簡單的模式,推薦初學(xué)者使用!
2. GPIO.BCM:這種編號是因為控制芯片主要來自于博通(Broadcom)公司,而他們自定義了一組 BCM 編碼方式,在 Jetson Nano(含2GB)開發(fā)套件的針腳位背面所印刷的“Dxx”編號(如下圖),就是 BCM 的編碼。
下面是簡單的調(diào)用方法,不過指定的腳位是根據(jù) BCM 編碼原則:
GPIO.setmode(GPIO.BCM)GPIO.setup(12, GPIO.IN) # 設(shè)置D12(BOARD的32)腳位為輸入GPIO.setup(13, GPIO.OUT) # 設(shè)置D13(BOARD的33)腳位為輸出
很多傳統(tǒng)樹莓派的項目里習(xí)慣使用 BCM 編碼,仔細(xì)對照就能輕易理解。
3. GPIO.CVM與GPIO.TEGRA_SOC:這兩種模式使用各 GPIO 管腳命名的字符串,作為設(shè)置引腳的參數(shù),其中 CVM 是根據(jù) CVM/CVB 連接器信號名稱命名,TEGRA_SOC 是根據(jù) Tegra SoC 中信號名稱來命名的。例如:
GPIO.setmode(GPIO.TEGRA_SOC)GPIO.setup(‘SPI1_SCK’, GPIO.IN) # 設(shè)置BOARD的23腳位為輸出GPIO.setup(‘SPI1_MISO’, GPIO.OUT) # 設(shè)置BOARD的21腳位為輸出
結(jié)語
過去大家對于 NVIDIA Jetson 系列產(chǎn)品的深度學(xué)習(xí)能力是比較熟悉的,但是要將使用價值再擴展到工業(yè)場景的時候,也必須對這個 40 針引腳的用法有足夠的掌握。
本文將大部分困擾初學(xué)者的問題進(jìn)行較更有邏輯的梳理,日后只要大家能弄清楚 SFIO 與 GPIO 之間的差異、Jetson-IO 與 Jetson.GPIO 的不同,以及 GPIO 四種編碼模式的對應(yīng)腳位如何查找,其他的問題就是透過代碼去熟練這些調(diào)用,也不必在乎是用 Python 庫還是 C 語言庫了。
原文標(biāo)題:NVIDIA Jetson Nano 2GB 系列文章(43):Jetson的40針引腳
文章出處:【微信公眾號:NVIDIA英偉達(dá)企業(yè)解決方案】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
NVIDIA
+關(guān)注
關(guān)注
14文章
5063瀏覽量
103423 -
代碼
+關(guān)注
關(guān)注
30文章
4813瀏覽量
68840 -
GPIO
+關(guān)注
關(guān)注
16文章
1216瀏覽量
52239
原文標(biāo)題:NVIDIA Jetson Nano 2GB 系列文章(43):Jetson的40針引腳
文章出處:【微信號:NVIDIA-Enterprise,微信公眾號:NVIDIA英偉達(dá)企業(yè)解決方案】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論