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