[靚仔鼠]Jetson nano_Hardware_新手向


🎈Jetson nano_Hareware_新手向

24PIN-引腳分布圖
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-


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM