🎈Jetson nano_Hareware_新手向
24PIN-引腳分布圖
🐹GPIO🐹
安裝GPIO庫與配置
1、下載jetson-gpio庫
git clone https://github.com/NVIDIA/jetson-gpio
#下載jetson-gpio庫
2、將下載的文件移動到目錄:/opt/nvidia中
sudo mv jetson-gpio /opt/nvidia/
#移動文件至指定目錄下
3、安裝pip3工具
sudo apt-get install python3-pip
4、進入jetson-gpio文件夾,並安裝庫
cd /opt/nvidia/jetson-gpio
#進入文件夾
sudo python3 setup.py install
#安裝GPIO庫
5、設置用戶權限與修改規則
sudo groupadd -f -r gpio
#將用戶添加至組,賦予權限
sudo usermod -a -G gpio your_user_name
#your_user_name需改成自己的賬號名
sudo cp /opt/nvidia/jetson-gpio/lib/python/Jetson/GPIO/99-gpio.rules /etc/udev/rules.d/
#將99-gpio.rules文件復制到rules.d目錄
sudo udevadm control –reload-rules && sudo udevadm trigger
#重載rules規則來讓文件生效sudo
示例使用
cd /opt/nvidia/jetson-gpio/samples/
#進入示例文件夾
sudo python3 xxxx.py
#運行示例文件
#將xxxx替換為對應的程序文件名稱
示例腳本文件夾目錄
示例_Demo_1
- 簡單輸入程序,使用BCM 的引腳編碼模式,可讀取 PIN12 的值並打印到屏幕
sudo python3 simple_input.py
示例_Demo_2
- 程序會輸出高電平和低電平(每2秒交替更新) 到物理引腳 PIN12
sudo python3 simple_out.py
其他示例_Demoes
sudo python3 button_led.py 使用輪詢方式通過按鍵來控制 LED 燈
sudo python3 button_event.py 使用事件等待方式通過按鍵狀態來控制 LED 燈
sudo python3 button_interrupt.py 采用中斷的方式,通過按鍵來控制 LED 燈
手寫一個點燈程序
創建文件
sudo vi gpio_example.py
#創建gpio_example.py文件
編寫代碼
import Jetson.GPIO as GPIO
import time as time
#導入相關庫
LED_Pin = 11
GPIO.setmode(GPIO.BOARD)
GPIO.setup(LED_Pin, GPIO.OUT)
#設置目標引腳及模式
while (True):
GPIO.output(LED_Pin, GPIO.HIGH)
time.sleep(2)
GPIO.output(LED_Pin, GPIO.LOW)
time.sleep(2)
#主循環
GPIO.cleanup()
#清除GPIO的狀態
運行程序
sudo python3 gpio_example.py
🖍GPIO-部分至此結束!
🐹UART🐹
安裝serial庫與配置
1、安裝python3 serial庫
sudo apt-get install python3-serial
2、開啟臨時串口權限
sudo chmod 777 /dev/ttyTHS1
#開啟串口權限,關機后該權限也將被關閉,下次使用串口前需再次重新開啟;
3、獲取串口通信測試案例
git clone https://github.com/JetsonHacksNano/UARTDemo
#獲取串口通訊測試案例
cd UARTDemo
#進入該文件夾
4、硬件連接
Jetson Nano引腳8(TXD) →USB轉TTL模塊RX
Jetson Nano 引腳10(RXD) →USB轉TTL模塊TX
Jetson Nano J引腳6(GND) →USB轉TTL模塊GN
#Jetson Nano J引腳2(5V) →USB轉TTL模塊VCC 該引腳可不接
手寫一個串口通信程序
#! /usr/bin/python3
import time
import serial
#導入serial庫
serial_port = serial.Serial(
port="/dev/ttyTHS1",
baudrate=115200,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
)
time.sleep(1)
#串口配置信息
#波特率115200,8位數據位,無奇偶校驗位,1位停止位
try:
serial_port.write("UART Demonstration Program\r\n".encode())
serial_port.write("NVIDIA Jetson Nano Developer Kit\r\n".encode())
while True:
if serial_port.inWaiting() > 0:
data = serial_port.read()
print(data)
serial_port.write(data)
if data == "\r".encode():
serial_port.write("\n".encode())
except KeyboardInterrupt:
print("Exiting Program")
except Exception as exception_error:
print("Error occurred. Exiting Program")
print("Error: " + str(exception_error))
finally:
serial_port.close()
pass
運行程序
python3 uart_example.py
- 發送情況-串口助手
- 接收情況-Jetson nano端
🖍 UART-部分至此結束!
🐹I2C🐹
安裝smbus庫與配置
1、安裝python3 I2C模塊及開啟I2C訪問權限
sudo apt-get install -y python3-smbus
sudo usermod -aG i2c <用戶名> #添加用戶組
sudo reboot #重啟
2、下載I2Ctool及檢查是否安裝成功
sudo apt-get install -y i2c-tools #下載I2Ctool
apt-cache policy i2c-tools #檢查是否安裝成功
若在輸入上述指令后出現如下信息則表示安裝成功
這里以LCD1602_I2C為例,其地址為0X27
sudo i2cdetect -y -r -a 1
#掃描某一總線(BUS)上所有I2C設備,並打印其地址。
- 當顯示如下信息時,表示I2C總線掛載成功
🖍I2C-部分,至此結束!
🐹CSI-IMX219_Camera🐹
安裝輔助工具
安裝v4l2-utils協助工具
sudo apt install v4l-utils
查看攝像頭掛載情況
ls /dev/video*
輸出信息
掛載情況
- 第一個(/dev/video0)屬於IMX219 規格(CSI)攝像頭 --- 這里只插入一個CSI攝像頭
- 以下為其他場景下的情況,僅作記錄
(dev/video2)是 USB2.0 的攝像頭,接到 xusb-2(規格是 USB3)接口
(/dev/video1)是 USB 攝像頭,接到 xusb-3.2 (規格是 USB2)接口
查看掛載的攝像頭詳細參數情況
v4l2-ctl --device=/dev/video0 --list-formats-ext
輸出信息(執行該指令后,終端將精確列出該攝像頭的細節參數)
例如
RG10 代表這個攝像頭的數據格式;
10-bit Bayer RGRG/GBGB是進一步說明該格式使用的算法與通道對應的參數;
3264x2464、3264x1848、1920x1080、1640x1232、1280x720 代表尺寸;
Interval為性能參數,表示所支持的分辨率及該分辨率的最高執行幀率。
第一種-控制方式: Gstreamer
安裝Gstreamer
sudo add-apt-repository universe
sudo add-apt-repository multiverse
sudo apt-get update
sudo apt-get install gstreamer1.0-tools gstreamer1.0-alsa gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav
sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev libgstreamer-plugins-bad1.0-dev
讀取CSI攝像頭的實現步驟
- 創建Gstreamer管道
- 將Gstremer管道綁定至OpenCV的視頻流
- 逐幀提取並綁定
參考示例
import cv2
#設置gstreamer管道參數
def gstreamer_pipeline(
capture_width=1280, #攝像頭預捕獲的圖像寬度
capture_height=720, #攝像頭預捕獲的圖像高度
display_width=1280, #窗口顯示的圖像寬度
display_height=720, #窗口顯示的圖像高度
framerate=60, #捕獲幀率
flip_method=0, #是否旋轉圖像
):
return (
"nvarguscamerasrc ! "
"video/x-raw(memory:NVMM), "
"width=(int)%d, height=(int)%d, "
"format=(string)NV12, framerate=(fraction)%d/1 ! "
"nvvidconv flip-method=%d ! "
"video/x-raw, width=(int)%d, height=(int)%d, format=(string)BGRx ! "
"videoconvert ! "
"video/x-raw, format=(string)BGR ! appsink"
% (
capture_width,
capture_height,
framerate,
flip_method,
display_width,
display_height,
)
)
if __name__ == "__main__":
capture_width = 1280
capture_height = 720
display_width = 1280
display_height = 720
framerate = 60 # 幀數
flip_method = 0 # 方向
# 創建管道
print(gstreamer_pipeline(capture_width,capture_height,display_width,display_height,framerate,flip_method))
#管道與視頻流綁定
cap = cv2.VideoCapture(gstreamer_pipeline(flip_method=0), cv2.CAP_GSTREAMER)
if cap.isOpened():
window_handle = cv2.namedWindow("CSI Camera", cv2.WINDOW_AUTOSIZE)
# 逐幀顯示
while cv2.getWindowProperty("CSI Camera", 0) >= 0:
ret_val, img = cap.read()
cv2.imshow("CSI Camera", img)
keyCode = cv2.waitKey(30) & 0xFF
if keyCode == 27:# ESC鍵退出
break
cap.release()
cv2.destroyAllWindows()
else:
print("打開攝像頭失敗")
第二種-控制方式: Jetcam
安裝traitlets
- Python3.7以下使用 traitlets4.x
pip3 install traitlets==4.3.3 - Python3.7以上使用 traitlets5.x
pip3 install traitlets
安裝Jetcam
git clone https://github.com/NVIDIA-AI-IOT/jetcam
cd jetcam
sudo python3 setup.py install
參考示例
from jetcam.csi_camera import CSICamera
import cv2
#CSI-0
camera0 = CSICamera(capture_device=0, width=224, height=224)
image0 = camera0.read()
print(image0.shape)
print(camera0.value.shape)
#CSI-1
#camera1 = CSICamera(capture_device=1, width=224, height=224)
#image1 = camera1.read()
#print(image1.shape)
#print(camera1.value.shape)
while 1:
image0 = camera0.read()
cv2.imshow("CSI Camera0", image0)
#image1 = camera1.read()
#cv2.imshow("CSI Camera1", image1)
kk = cv2.waitKey(1)
if kk == ord('q'): #按下q鍵,退出
break
**🖍CSI-IMX219_Camera部分至此結束!**
2021-8-16
-Pretty Mouse-