在上文中,我們已經(jīng)將SFIO與GPIO之間的關(guān)系分析清楚了,接下來(lái)我們就帶大家更深入地了解一下I2C引腳與開(kāi)發(fā)庫(kù)的使用,以及調(diào)整PiOLED顯示內(nèi)容的方法。這兩個(gè)部分都是 Jetbot 智能小車(chē)項(xiàng)目中非常關(guān)鍵的一環(huán),但我們更希望讀者能將執(zhí)行技術(shù)使用在更廣泛的場(chǎng)景中。
I2C總線(xiàn)的特性
前面提到過(guò),在 Jetson 的 40 根引腳中有 18 根 SFIO 類(lèi)的引腳與電路板直連,這是不能改變功能的引腳,其中就有兩組 I2C 的[3, 5]與[27,28]引腳,是不需要透過(guò) Jetson-IO 指定就能使用的。
全名為“集成電路總線(xiàn)(Inter-Integrated Circuit)”的 I2C 是由飛利浦公司在 1980 年代初所設(shè)計(jì)的,是一種“多主從(master/slave)架構(gòu)的串行通信總線(xiàn)”,由于結(jié)構(gòu)設(shè)計(jì)得非常簡(jiǎn)單并且有很大的彈性空間,使得這個(gè)總線(xiàn)的普及度相當(dāng)高,廣泛用于微控制器與傳感器陣列,顯示器,IoT 設(shè)備,EEPROM 等之間的通信。
這里并不講解 I2C 的工作原理與電子電路圖,這些太過(guò)底層的知識(shí)對(duì)于應(yīng)用工程師來(lái)說(shuō)意義并不大,就算不懂也不會(huì)影響代碼的操作。不過(guò) I2C 總線(xiàn)的特性,倒是需要了解一下,這對(duì)于應(yīng)用開(kāi)發(fā)是有幫助的。以下簡(jiǎn)單列出 I2C 總線(xiàn)的一些特性:
只需要 SDA 數(shù)據(jù)線(xiàn)和 SCL 時(shí)鐘線(xiàn)就能完成所有工作,總線(xiàn)界面已經(jīng)集成在芯片內(nèi)部,不需要特殊的界面電路。
是一個(gè)真正的多主機(jī)總線(xiàn):
(1)如果兩個(gè)或多個(gè)主機(jī)同時(shí)初始化數(shù)據(jù)傳輸,可以通過(guò)沖突檢測(cè)和仲裁防止數(shù)據(jù)破壞,每個(gè)連接到總線(xiàn)上的器件都有唯一的地址,任何器件既可以作為主機(jī)也可以作為從機(jī),但同一時(shí)刻只允許有一個(gè)主機(jī)。
(2)數(shù)據(jù)傳輸和地址設(shè)定由軟件設(shè)定,非常靈活。總線(xiàn)上的器件增加和刪除不影響其他器件正常工作。
(3)最大主(master)設(shè)備數(shù)量:無(wú)限制;最大從(slave)機(jī)數(shù)量:127。
可以通過(guò)外部連線(xiàn)進(jìn)行在線(xiàn)檢測(cè),便于系統(tǒng)故障診斷和調(diào)試,故障可以立即被尋址,軟件也利于標(biāo)準(zhǔn)化和模塊化,縮短開(kāi)發(fā)時(shí)間。
連接到相同總線(xiàn)上的 IC 數(shù)量只受總線(xiàn)最大電容的限制,串行的 8 位雙向數(shù)據(jù)傳輸位速率在標(biāo)準(zhǔn)模式下可達(dá)每秒 100 Kbit、快速模式下可達(dá)每秒 400 Kbit、高速模式下可達(dá)每秒 3.4 Mbit、超高速模式下可達(dá)每秒 5 Mbit 性能。
總線(xiàn)具有極低的電流消耗、抗高噪聲干擾,增加總線(xiàn)驅(qū)動(dòng)器可以使總線(xiàn)電容擴(kuò)大 10 倍,傳輸距離達(dá)到 15 米,兼容不同電壓等級(jí)的器件與工作溫度范圍寬。
看完以上這些特性之后,就能很清楚地了解為何 I2C 總線(xiàn)協(xié)議會(huì)受到廣泛的青睞,不僅擴(kuò)充性強(qiáng)而且穩(wěn)定性高,并且成本還比較低,接下去就來(lái)看看如何使用代碼來(lái)透過(guò)這個(gè)總線(xiàn)去控制周邊設(shè)備。
I2C總線(xiàn)的檢測(cè)工具- i2c-tools
首先要捋清楚 I2C 的歸類(lèi)是 SFIO 而不是 GPIO 類(lèi)型,不能使用前一篇文章最后所提到的 Jetson.GPIO 庫(kù)進(jìn)行開(kāi)發(fā)。
I2C 有自己專(zhuān)屬的 i2c-tools 檢測(cè)工具,可以用指令檢測(cè)設(shè)備上 I2C 的狀態(tài),并使用 SMBUS 總線(xiàn)開(kāi)發(fā)庫(kù)來(lái)進(jìn)行開(kāi)發(fā),Jetbot 系統(tǒng)的機(jī)電操控指令也是基于這個(gè)庫(kù)進(jìn)行高階封裝的。雖然在 Jetbot 系統(tǒng)里已經(jīng)將這些工具與庫(kù)都安裝調(diào)試好,不過(guò)這里還是提供這個(gè)工具與開(kāi)發(fā)庫(kù)的安裝與調(diào)試步驟,這樣就能在其他 Jetson 系列設(shè)備上調(diào)用。
安裝 i2c-tools 與 smbus 庫(kù)的步驟很簡(jiǎn)單,請(qǐng)執(zhí)行以下指令:
sudo apt update && sudo apt install -y i2c-tools
不過(guò)這些牽涉到底層的調(diào)用,因此需要配置使用的權(quán)限,如下步驟:
sudo usermod -aG i2c $USER
現(xiàn)在就可以執(zhí)行以下指令,檢查看看設(shè)備里有幾個(gè) i2c 總線(xiàn):
i2cdetect -l
從下圖可以看到在 Jetson Nano 2GB 里有 7 組 I2C 總線(xiàn):
如果您手邊還有 Jetson Nano、AGX Xavier 或 Xavier NX 開(kāi)發(fā)套件,可以執(zhí)行這個(gè)指令看看不同設(shè)備的 I2C 總線(xiàn)數(shù)量,可以發(fā)現(xiàn) Jetson Nano 與 AGX Xavier 各有 9 組,而 Xavier NX 有 11 組。
不過(guò)不管芯片提供有多少組總線(xiàn),目前在 40 針引腳上只用到兩組,那到底用到那兩組?請(qǐng)使用前一篇文章里面提到的“sudo /opt/nvidia/jetson-io/jetson-io.py”這個(gè)工具,進(jìn)去就能看到現(xiàn)在使用 I2C 總線(xiàn)編號(hào),其他可能用在與一些內(nèi)部設(shè)備相連接的總線(xiàn),在這里就不做探索。
接下來(lái)就可以檢查個(gè)別總線(xiàn)上所連接的設(shè)備,例如將 Jetbot 用到的 PiOLED 顯示屏,按照要求連接在 Jetson Nano 2GB 的第 3 引腳與第 5 引腳上,對(duì)照 40 針引腳說(shuō)明,可以知道這兩根引腳屬于I2C_2這一組總線(xiàn),于是要檢查這組所接設(shè)備時(shí),需要執(zhí)行以下指令:
i2cdetect -y -r 1
注意,這個(gè)指令最後面所選的編號(hào)是從“0”開(kāi)始,因此對(duì)應(yīng)到 I2C 總線(xiàn)編號(hào)時(shí),需要經(jīng)過(guò)“減1”的處理。執(zhí)行之后會(huì)看到如下圖的結(jié)果,有個(gè) 16 進(jìn)制編號(hào)為“0x3c”的設(shè)備正連接在 I2C_2 總線(xiàn)上面。
網(wǎng)上大部分的說(shuō)明就是告訴我們“找到設(shè)備”了,但我們?nèi)绾巫R(shí)別這個(gè)設(shè)備是什么?卻沒(méi)有人說(shuō)個(gè)明白。經(jīng)過(guò)幾番搜索之后,才在https://i2cdevices.org/addresses里面找到這些編號(hào)的對(duì)應(yīng)設(shè)備,例如“0x3c”的設(shè)備總共有 6 種(如下圖),每一種都有可能。
經(jīng)過(guò)一一查看之后,發(fā)現(xiàn)這 6 個(gè)全部都屬于“顯示類(lèi)”的設(shè)備,而SSD1306的規(guī)格符合我們連接的 PiOLED 顯示器規(guī)格,如下圖:
這一番摸索之后,大概就能明確如何透過(guò)指令來(lái)確認(rèn)所連接的設(shè)備,大家只要依循這樣的邏輯與資源,就能非常容易地捋順這個(gè) I2C 總線(xiàn)的使用。現(xiàn)在已經(jīng)能使用 i2c-tools 工具來(lái)檢測(cè) I2C 總線(xiàn)所連接的設(shè)備,接著就來(lái)看看在代碼層面該如何對(duì) I2C 設(shè)備執(zhí)行控制!
PiOLED顯示板
這是創(chuàng)客樹(shù)莓派極為常用的顯示設(shè)備,在網(wǎng)上可以找到以下三種:
Adafruit原版(下圖最左邊):約150人民幣
國(guó)產(chǎn)樹(shù)莓派PiOLED屏(下圖中間):約30人民幣
0.91寸OLED顯示屏(下圖右邊):約10人民幣
其實(shí)三種的關(guān)鍵元件都一樣,就是右邊那個(gè)最便宜的“0.91 寸 OLED 顯示屏”,左邊兩個(gè)只是再添加一個(gè)很簡(jiǎn)單很便宜的電路轉(zhuǎn)接板,然后再加以焊接加工而已。如果您打算按照 Jetbot 提供的自行組裝方式,包括 3D 打印車(chē)體、單獨(dú)采購(gòu) PCA9685+TB6612 控制板,那么“自行焊接加工”的步驟是跳不過(guò)去的。
對(duì)初學(xué)者來(lái)說(shuō),推薦使用中間的“樹(shù)莓派 PiOLED 屏”會(huì)比較方便,現(xiàn)在以這個(gè)為例子,按照前面的下圖接到 Jetson Nano 2GB 上,就能在前面的 “i2cdetect -y -r 1”指令下看到 “0x3c” 設(shè)備。
如果你在 Jetbot 系統(tǒng)上,并且正常開(kāi)機(jī)的狀況下,應(yīng)該就能看到顯示器上出現(xiàn)如下圖的信息,這個(gè)信息是由 ~/jetbot/jetbot/apps/stats.py 所控制,現(xiàn)在就來(lái)看一下這只代碼的內(nèi)容,下面將一些比較關(guān)鍵的代碼列出來(lái)說(shuō)明:
以下是正 OLED 屏的調(diào)用細(xì)節(jié):
這個(gè)屏的尺寸是 128x32 像素,與 SSD1306 規(guī)格相同,因此直接使用 Adafruit 所提供的Adafruit_SSD1306庫(kù)。
接下來(lái)用 Adafruit_SSD1306.SSD1306_128_32 創(chuàng)建 disp 對(duì)象,里面的參數(shù)。
(1)rst 是 Raspberry Pi pin configuration 的引腳定義,在這里并不使用(none);
(2)i2c_bus 指定所使用的總線(xiàn)編號(hào),前面說(shuō)過(guò)這里使用的是第二組(i2c_2),但在代碼里的編號(hào)是“1”,如果用的是第一組則編號(hào)為“0”;
(3)gpio 表示這個(gè)腳位是否被占用?設(shè)置為“1”就表示已占用。
顯示屏是以“圖像”方式來(lái)處理,第 60 行“draw.rectangle”是先將顯示屏涂黑。
從 80~85 行利用 Linux 針對(duì) CPU、內(nèi)存、存儲(chǔ)空間的檢測(cè)指令,獲取顯示的數(shù)據(jù),并抽取所需要的內(nèi)容,分別存入 CPU、MemUsage 與 Disk 三個(gè)變量里。
第 89~92 行就是顯示 4 組數(shù)據(jù),因?yàn)轱@示屏的高度為 32 像素,而每個(gè)字符的高度為 8 像素,因此只能顯示 4 組數(shù)據(jù),這里的字符并不支持中文。在代碼里面顯示的內(nèi)容是有線(xiàn)網(wǎng) IP、無(wú)線(xiàn)網(wǎng) IP、內(nèi)存使用狀況與存儲(chǔ)空間的信息。
第 95~97 行則是將前面四行寫(xiě)入的信息,以圖像為單位來(lái)現(xiàn)實(shí),每一秒更新一次。
下圖是這個(gè) OLED 所顯示的內(nèi)容,與 89~92 行的輸出是一致的。
我們可以嘗試修改一下顯示的內(nèi)容,例如有線(xiàn)網(wǎng) IP 對(duì) Jetbot 來(lái)說(shuō)并不重要,但是 CPU 使用狀態(tài)是挺有價(jià)值的,因此我們可以稍作修改,包含要顯示的順序,例如無(wú)線(xiàn)網(wǎng) IP 其實(shí)只要知道一次就行,可以放到最下面,而內(nèi)存與 CPU 的使用狀態(tài)是相對(duì)敏感的,可以將順位往上調(diào)。下面就是修改后的內(nèi)容:
如果您使用鏡像版或者腳本(create-sdcard-image-from-scratch.sh)安裝 Jetbot,應(yīng)該修改完存檔之后,就會(huì)看到 OLED 屏的顯示發(fā)生變化。
如果使用容器安裝 Jetbot 的話(huà),這部分需要重建 base 與 display 兩個(gè)容器,需要執(zhí)行以下步驟讓這個(gè)改變生效。
重新啟動(dòng) Jetbot 容器之后,就會(huì)看到顯示屏上的內(nèi)容已經(jīng)改變(如下圖),這樣就能輕松改變 OLED 的顯示內(nèi)容。
事實(shí)上還有很多方式可以操作 I2C 對(duì) OLED 的顯示處理,在 Adafruit 所提供的開(kāi)源項(xiàng)目https://github.com/adafruit/Adafruit_Python_SSD1306下面有些范例代碼可以嘗試,不過(guò)操作前先把 Jetbot 容器關(guān)閉,否則 I2C 會(huì)被占用。
現(xiàn)在對(duì) Jetson Nano(含2GB)的 I2C 檢測(cè)與操作應(yīng)該有更進(jìn)一步的了解,這些內(nèi)容也適用于 Jetson 系列其他開(kāi)發(fā)套件,主要差別就是得確認(rèn)所要使用的 I2C 編號(hào),例如在 Xavier AGX 上相同位置的 I2C 是第 9 組,因此得在代碼中修改 “i2c_bus=8”,其他部分則完全一樣。
原文標(biāo)題:NVIDIA Jetson Nano 2GB 系列文章(45):I2C總線(xiàn)與PiOLED
文章出處:【微信公眾號(hào):NVIDIA英偉達(dá)企業(yè)解決方案】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
審核編輯:湯梓紅
-
電路板
+關(guān)注
關(guān)注
140文章
5103瀏覽量
101758 -
設(shè)備
+關(guān)注
關(guān)注
2文章
4639瀏覽量
71502 -
總線(xiàn)
+關(guān)注
關(guān)注
10文章
2953瀏覽量
89405
原文標(biāo)題:NVIDIA Jetson Nano 2GB 系列文章(45):I2C總線(xiàn)與PiOLED
文章出處:【微信號(hào):NVIDIA-Enterprise,微信公眾號(hào):NVIDIA英偉達(dá)企業(yè)解決方案】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
I2C總線(xiàn)通信原理 如何設(shè)計(jì)I2C總線(xiàn)電路
I2C總線(xiàn)的優(yōu)缺點(diǎn)分析
如何選擇I2C總線(xiàn)拉電阻
I2C總線(xiàn)與Arduino的接口示例
I2C總線(xiàn)的工作模式介紹
I2C總線(xiàn)協(xié)議詳細(xì)解析
I2C總線(xiàn)故障排除技巧
I2C總線(xiàn)與單片機(jī)的連接
I2C總線(xiàn)應(yīng)用實(shí)例分析
I2C總線(xiàn)與SPI總線(xiàn)的比較
I2C總線(xiàn)上拉電阻阻值如何確定?

詳解I2C總線(xiàn)與SPI總線(xiàn)的區(qū)別


評(píng)論