本文翻譯自Jetsonhacks,因時間關係我們還沒有實測,請知悉。
點擊閱讀原文,觀看英文版本。
我們使用GPIO與NVIDIA Jetson Nano上的外部設備進行通信.
介紹
關於Jetson Nano的一個好處是有一個擴展頭,它對通用輸入輸出(GPIO)非常有用。您可能已經考慮過打開或關閉燈光作為程序的輸出,或者想要從外部按鈕讀取按下。這就是GPIO有用的地方!
在本文中,我們將介紹如何通過打開和關閉發光二極體(LED)來控制GPIO輸出。這可能是如何使用GPIO的最基本的例子之一。
您可能已經聽說過,Jetson Nano上的GPIO引腳布局與Raspberry Pi(RPi)的40引腳布局兼容。此外,還有一個Jetson GPIO python庫,它主要與RPi.GPIO兼容。 Jetson.GPIO預裝在標準的Jetson Nano鏡像包裡了。
話雖如此,請注意Jetson Nano上GPIO擴展接頭的電氣特性與Raspberry Pi不同。特別是,Jetson Nano在GPIO引腳上的流動電流遠低於RPi。
例如,RPi可以直接從GPIO引腳驅動LED,而Jetson則因為電流不足而使LED燈光昏暗。 Jetson需要一些幫助。正如您將看到的,開關電晶體正在拯救!
LED電路
零件清單
以下是我們將在此電路中使用的部分:
一個5毫米紅色LED
一個P2N2222電晶體
一個330Ω電阻
一個10kΩ電阻
若干電線
一塊麵包板將所有東西連接在一起
關於LED
led是這樣的。它們不線性地使用電流。如果任其自生自滅,它們會在一股神奇的煙霧中毀滅自己(就是燒掉啦)。但我們可以確保這不會發生。通過添加一個電阻(在這個應用程式中稱為限流電阻),我們將限制LED能夠繪製的電流量。我們根據歐姆定律選擇電阻。
天啊! 數學 …
電子學的基本規則之一是歐姆定律。 你可能聽說過它。
歐姆定律的簡述是:在同一電路中,通過某段導體的電流跟這段導體兩端的電壓成正比,跟這段導體的電阻成反比。
「這對我們意味著什麼?」簡而言之,我們可以通過巧妙地選擇一個合適的電阻,來設定LED實際可吸收電流的上限。這是因為電阻的電流值與所施加的電壓成正比。我們只需要知道一些關於LED的事情就可以計算出合適的電阻值。
首先,LED有所謂的正向電壓,這基本上是陰極和陽極之間的最小電壓差,你需要供應給LED。我們需要計算的另一件事是正向電流這是LED能夠連續處理的最大電流量。
本例中的LED正向電流為20mA,正向電壓為2.0V。我們將使用Jetson Nano 5V引腳驅動LED,所以我們從5V中減去正向電壓,然後除以20mA (0.020A),就像歐姆定律告訴我們的那樣:
我們得到150Ω的結果,這是流過這個特定LED安全的最大電流量的值。 這裡有幾點需要注意。 首先,電阻沒有150Ω。 即使有做,它們也有一些內在的公差,這表明它們可能與實際規定的阻力有一些差異。 這通常是一小部分,但較小的廉價電阻可能約為20%! 這意味著對於額定值為150Ω的電阻,電阻可以在120-180Ω的範圍內。
但以最大電流運行LED會影響其壽命。 通常,人們最終會使用220和470Ω之間的電阻來實現此應用。 我們將使用通用的330Ω。
關於這個電晶體
這樣就能保護我們的LED小朋友了。但是正如我們所說的,由於Jetson Nano GPIO引腳不夠強大,不足以單獨驅動LED,所以需要一些幫助。我們將使用電晶體作為開關,為LED提供電流。
電晶體放大能力。我們將使用雙極結電晶體(BJT)。BJTs有兩種:PNP和NPN。我們將使用NPN電晶體,這是大多數低功耗開關電路所使用的。
我們正在製造最基本的電晶體開關電路。一個普通的開關需要一個機械裝置來物理地啟動電路。我們這裡的開關將由電流控制從Jetson GPIO引腳發送到電晶體。來自Jetson的控制信號流入電晶體基座,發射極與地面連接,輸出端與集電極相連。
電路
這是我們將使用的電路示意圖:
L1是我們的5V LED
R1是LED的限流電阻
Q1是我們一直在討論的電晶體,P2N2222
R2是基準電阻,它可以告知電路中有多少電流流過。
對於該電路,請使用NPN BJT電晶體
計算電晶體位
還有一點神秘感。當Jetson GPIO為低電平(0V)時,電晶體處於截止模式。它看起來像集電極和發射極之間的開路。
然而,有大量的電流施加到基極,此時電晶體開始「飽和」。這就像集電極和發射極之間的短路一樣。那時,電流流動,我們的LED亮起來,一切都很美好和快樂。
在我們的示例中,基極電流由位於Jetson GPIO引腳和電晶體基極之間的基極電阻決定。基極電阻的功能與LED上的限流電阻大致相同。注意,電晶體的飽和度由電流決定,而不是由BJT中的電壓決定。
需要更多的數學來確定基本電阻應該是什麼值。
還有一個小技巧。我們需要再用一次歐姆定律。我們知道Jetson的GPIO是3.3v。除以0.00020a得到電阻,對吧?不。結果是,在我們需要考慮的基極和發射極之間有0.7V的落差。這種下降是由於電晶體基極到發射極的N-P結造成的。所以:
在該電路中,基極電阻的13000Ω值是集電極可以達到20mA的最大電阻。
您會注意到,在我們的電路中,我們使用的是10kΩ電阻而不是13kΩ。 這有幾個原因。 首先,我們知道由於早期的限制電阻,LED不會吸收超過20mA的電流。 其次,13kΩ不是常見的電阻值,因此我們需要替代。 如果你想要安全,你會傾向於增大而不是減少。
布線
現在我們準備好把所有東西連接起來,讓它旋轉。LED和電晶體的電流都是單向流動的,並且都有正極和負極。對於LED來說,+是陽極,-是陰極。在一個5mm的LED上,正極通常有一個較長的腿,而負極通常在燈泡的邊緣有一個平坦的點。
對於電晶體,集電極在正極,發射極在負極。引腳的排列取決於所選的特定零件。
根據上面的原理圖,這裡有一個接線圖:
你需要檢查你的電晶體。收集器、基極和發射器是不同的,這取決於您擁有的部件號。這裡用的是P2N2222。我們將在Jetson上的引腳2上把紅線連接到+5V,在引腳6上把黑線連接到GND,在引腳12上把電晶體基座連接到基極電阻上。下面的演示示例選擇Pin 12。
軟體
一旦一切都連接好了,我們就可以運行一些軟體來讓LED眨眼了。
我們可以從命令行控制我們的LED。以下是一些有用的命令:
# Map GPIO Pin
# gpio79 is pin 12 on the Jetson Nano
$ echo 79 > /sys/class/gpio/export
# Set Direction
$ echo out > /sys/class/gpio/gpio79/direction
# Bit Bangin'!
$ echo 1 > /sys/class/gpio/gpio79/value
$ echo 0 > /sys/class/gpio/gpio79/value
# Unmap GPIO Pin
$ echo 79 > /sys/class/gpio/unexport
# Query Status
$ cat /sys/kernel/debug/gpio
在上面的代碼中,79指的是Linux sysfs GPIO的gpio79。如果我們看一下Jetson Nano J41的Pinout,我們可以看到gpio79實際上是pin 12。
主要:除了電源引腳、地引腳、IIC和UART的引腳外,其他的所有插針引腳,在默認的Jetson配置下,都是GPIO。插針引腳邊上的其他名字,則對應了當用戶對設備樹做出更改和重新映射引腳後,各自的推薦(特殊功能)用途。
Lady插一句:
這裡有三點需要說的:
(1)大部分的器件的引薦要麼做GPIO,要麼具有特殊功能。
(2)特殊功能往往可以被重新映射,例如UART2(假設的)可以被映射到某3個引腳上,也可以被映射到另外的其他地方。很多板子在生產的時候,首選的映射位置會在電路板上標明。(但也有板子會標明所有的可選映射位置)。
(3)本文說明了默認配置下都是GPIO,但用戶可以通過修改設備樹的方式進行重新映射和功能指定。
為了能夠訪問GPIO引腳,您需要具有適當的權限。這可以通過兩種方式實現。首先,可以從超級用戶終端運行命令。打開終端執行:
$ sudo su
然後就可以使用正確的權限執行命令。此外,可以將權限分配給您所屬的組。這通常是由:
$ sudo groupadd -f -r gpio
$ sudo usermod -a -G gpio your_user_name
通過將99-gpio.rules文件複製到rules.d目錄來安裝自定義udev規則:
$ sudo cp /opt/nvidia/jetson-gpio/etc/99-gpio.rules /etc/udev/rules.d/
請注意,對於要執行的新規則,您可能需要通過發出以下命令來重新引導或重新加載udev規則:
sudo udevadm control --reload-rules && sudo udevadm trigger
這個順序來自Jetson- gpio Python庫文檔,它安裝在默認的Jetson Nano鏡像中:/opt/nvidia/ Jetson- gpio/doc/README.txt。
Jetson.GPIO Python庫
有一個適用於Python的官方Jetson.GPIO庫。 Jetson.GPIO庫旨在與RPi.GPIO兼容。 我們可以運行Sample以獲得簡單的輸出來控制我們的LED:
$ cd / opt / nvidia / jetson-gpio / samples
$ sudo ./run_samples.sh simple_out.py
run_samples.sh腳本設置Jetson.GPIO庫的路徑,並調用simple_out.py來點亮連接到GPIO頭上的PIN 12的LED。
這只是觸及Jetson.GPIO庫,實際可用的比這更豐富。
結論
雖然打開和關閉LED似乎很多步驟,但我們現在有了通過Jetson GPIO header 控制外部設備的基礎。
更對關於Jetson NAO:
菜鳥手冊(2):給Jetson Nano安裝樹莓派攝像頭
菜鳥手冊(1):給Jetson Nano安裝DC電源
菜鳥手冊(3):(被我刪掉了)