Jetson Nano开发板40针引脚详解

Jetson Nano开发板40针引脚详解

Jetson Nano是一款由英伟达开发的微型电脑主板,功能强大,价格适中,功耗低等众多特点,让他深受广大创客的喜爱。

Jetson Nano 主板采用小型双列直插式内存模块 (SO-DIMM) 外形尺寸,插入一块 100x80mm 开发板上。开发板上有许多典型的计算机接口,如 USB 3.0、千兆以太网和视频(支持 4k 60fps)。还有一套40引脚扩展引脚,Raspberry Pi 上的引脚非常相似。其布局与 Pi 的引脚几乎相同,还支持 Pi 的摄像头。本文要详细介绍一下Jetson Nano的40针引脚,并分析其功能特点。

J41引脚列表

.pow33v { border: 8px solid #fd952a!important; } .pow5v { border: 8px solid #fc363b!important; } .i2c { border: 8px solid #fc4cfc!important; } .i2s { border: 8px solid #63c9cb!important; } .uart { border: 8px solid #ab60fb!important; } .spi { border: 8px solid #343ffb!important; } .gnd { background-color: black!important; line-height: 19px; border: 8px solid yellow!important; color: #ffffff; } .pin { background-color: white; width: 35px; height: 35px; line-height: 17px; position: relative; border: 8px solid green; border-radius: 100%; text-align: center; margin: 0px auto; } .pow33v-bg { background-color: #fecb9c !important; } .gnd-bg { background-color: #dddddd !important; } .pow5v-bg { background-color: #fecccd !important; } .i2c-bg { background-color: #fecdfe !important; } .i2s-bg { background-color: #d0e7f4 !important; } .spi-bg { background-color: #d0e7f4 !important; } .uart-bg { background-color: #e6e7fe !important; } .i2s-bg { background-color: #d0f7fa !important; } .gpio-bg { background-color: #cefcce !important; } table#pinout { width:100%; text-align: center; } table img { height:250px; }

GPIO (BCM)名称引脚引脚名称GPIO (BCM)
3.3V输出125.0V 输出
I2C_2_SDA**I2C Bus 13**45.0V 输出
I2C_2_SCL**I2C Bus 15**6GND
GPIO216**(D4)AUDIO_MCLK7**8UART_TX2
**/dev/ttyTHS1
GND9**10UART_RX2**/dev/ttyTHS1
GPIO50
(D17)UART_2_RTS11**12I2S_4_SCLKGPIO79
**(D18)
GPIO232
(D23)SPI_2_SCK13**14GND
GPIO194**(D22)LCD_TE15**16SPI_2_CS1GPIO232
**(D23)
3.3V输出17**18SPI_2_CS0GPIO15
**(D24)
GPIO16
(D10)SPI_1_MOSI19**20GND
GPIO17**(D9)SPI_1_MOSO21**22SPI_2_MISOGPIO13
**(D23)
GPIO18
(D11)SPI_1_SCK23**24SPI_1_CS0GPIO19
**(D8)
GND25**26SPI_1_CS1GPIO20**(D7)
I2C_1_SDA

I2C Bus 0 | 27** | 28 | I2C_1_SCL I2C Bus 0 | | | GPIO149 (D5) | CAM_AF_EN | 29 | 30 | GND | | | GPIO200**(D6) | GPIO_PZ0 | 31** | 32 | LCD_BL_PWM | GPIO168**(D12) | | GPIO38 (D13) | GPIO_PE6 | 33** | 34 | GND | | | GPIO76**(D19) | I2S_4_LRCK | 35** | 36 | UART_2_CTS | GPIO51**(D16) | | GPIO12 (D26) | SPI_2_MOSI | 37** | 38 | I2S_4_SDIN | GPIO77**(D20) | | | GND | 39** | 40 | I2S_4_SDOUT | GPIO78 (D21) |

引脚顶部底部照片

从板子顶部看从板子底部看

GPIO引脚

对于那些使用过树莓派的人来说,GPIO(通用输入/输出)引脚是一种接口形式,我们可以连接传感器、灯和其他组件,可以通过编程(C++、Python等)。 Jetson Nano的40针引脚和树莓派兼容接头 (J41),但GPIO 要在 JetsonNano 上旋转才能和树莓派的HAT兼容。与树莓派一样,Jetson Nano的GPIO电压为3.3V,因此在不使用电压电平转换的情况下,不应将高于3.3V 的电压电平连接Nano GPIO 引脚。

I2C引脚

Jeton Nano I2C 控制器支持NXP I2C 间总线 (I2C) 规范中定义的设备进行系统扩展。 I2C 总线支持与多个设备的串行设备通信,I2C 控制器处理时钟源协商,标准和快速设备的速度协商,根据 I2C 协议支持 7 位从地址,并支持主从操作模式。 I2C 控制器支持以下工作模式:Master – Standard-mode(最高 100Kbit/s)、Fast-mode(最高 400Kbit/s)、Fast-mode plus(Fm+,最高 1Mbit/s);Slave – 标准模式(最高 100Kbit/s)、快速模式(最高 400 Kbit/s)、Fastmode plus(Fm+,最高 1Mbit/s)。

引脚供电

两个5V的power引脚都可以供3A的供电,如果使用的带电源的扩展板就可以很容易的供电了,至于J48引脚,有无跳线帽均可(GND要连)。


参考文章:

  1. 物理引脚编号(Physical Pin Number):按引脚在排针上的物理位置顺序编号,从1开始依次递增,直观易找。

  2. BCM编号(Broadcom SOC Channel):采用芯片内部的通道编号方式,与物理位置无关,编程时使用此编号来指定GPIO。


Jetson Nano GPIO 实战应用

1. 使用Python控制GPIO

Jetson Nano支持使用Python库Jetson.GPIO来控制GPIO引脚:

安装Jetson.GPIO库

sudo apt update
sudo apt install python3-pip
sudo pip3 install Jetson.GPIO

基础GPIO示例

import Jetson.GPIO as GPIO
import time

# 设置GPIO模式
GPIO.setmode(GPIO.BOARD)  # 使用物理引脚编号
GPIO.setwarnings(False)

# 配置引脚7为输出
output_pin = 7  # BOARD引脚7,对应BCM GPIO4
GPIO.setup(output_pin, GPIO.OUT, initial=GPIO.LOW)

print("Starting blinking LED...")

try:
    while True:
        GPIO.output(output_pin, GPIO.HIGH)
        print("LED ON")
        time.sleep(1)
        
        GPIO.output(output_pin, GPIO.LOW)
        print("LED OFF")
        time.sleep(1)
        
except KeyboardInterrupt:
    print("Program stopped by user")
finally:
    GPIO.cleanup()

2. 读取按钮输入

import Jetson.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)

button_pin = 11  # BOARD引脚11
led_pin = 7

GPIO.setup(button_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(led_pin, GPIO.OUT)

print("Press the button to toggle LED...")

try:
    while True:
        button_state = GPIO.input(button_pin)
        
        if button_state == GPIO.LOW:  # 按钮按下(低电平)
            GPIO.output(led_pin, GPIO.HIGH)
            print("Button pressed - LED ON")
        else:
            GPIO.output(led_pin, GPIO.LOW)
            print("Button released - LED OFF")
        
        time.sleep(0.1)  # 简单去抖动
        
except KeyboardInterrupt:
    print("Program stopped")
finally:
    GPIO.cleanup()

3. PWM输出控制

import Jetson.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)

# 引脚32支持PWM(PWM0)
pwm_pin = 32
GPIO.setup(pwm_pin, GPIO.OUT)

# 创建PWM对象,频率1kHz
pwm = GPIO.PWM(pwm_pin, 1000)

# 启动PWM,初始占空比0%
pwm.start(0)

print("Starting PWM control...")

try:
    while True:
        # 逐渐增加亮度
        for duty in range(0, 101, 5):
            pwm.ChangeDutyCycle(duty)
            print(f"Duty cycle: {duty}%")
            time.sleep(0.1)
        
        # 逐渐降低亮度
        for duty in range(100, -1, -5):
            pwm.ChangeDutyCycle(duty)
            print(f"Duty cycle: {duty}%")
            time.sleep(0.1)
            
except KeyboardInterrupt:
    print("Program stopped")
finally:
    pwm.stop()
    GPIO.cleanup()

4. I2C通信示例

安装I2C工具

sudo apt install python3-smbus i2c-tools

扫描I2C设备

sudo i2cdetect -y -r 1

读取I2C传感器(如MPU6050)

import smbus
import time

# I2C总线1
bus = smbus.SMBus(1)

# MPU6050地址
MPU6050_ADDR = 0x68

# 唤醒MPU6050
bus.write_byte_data(MPU6050_ADDR, 0x6B, 0)

print("Reading MPU6050 data...")

try:
    while True:
        # 读取加速度数据(6字节)
        accel_data = bus.read_i2c_block_data(MPU6050_ADDR, 0x3B, 6)
        
        # 转换为有符号整数
        accel_x = (accel_data[0] << 8) | accel_data[1]
        accel_y = (accel_data[2] << 8) | accel_data[3]
        accel_z = (accel_data[4] << 8) | accel_data[5]
        
        # 转换为g值(灵敏度:±2g = 16384 LSB/g)
        accel_x = accel_x / 16384.0
        accel_y = accel_y / 16384.0
        accel_z = accel_z / 16384.0
        
        print(f"Accel X: {accel_x:.2f}g, Y: {accel_y:.2f}g, Z: {accel_z:.2f}g")
        
        time.sleep(0.5)
        
except KeyboardInterrupt:
    print("Program stopped")

5. SPI通信示例

安装SPI工具

sudo apt install python3-spidev

SPI通信示例

import spidev
import time

# 创建SPI对象
spi = spidev.SpiDev()

# 打开SPI总线0,设备0
spi.open(0, 0)

# 配置SPI
spi.max_speed_hz = 500000  # 500kHz
spi.mode = 0  # SPI模式0

print("Starting SPI communication...")

try:
    while True:
        # 发送数据并接收
        data_to_send = [0x01, 0x02, 0x03]
        response = spi.xfer2(data_to_send)
        
        print(f"Sent: {data_to_send}")
        print(f"Received: {response}")
        
        time.sleep(1)
        
except KeyboardInterrupt:
    print("Program stopped")
finally:
    spi.close()

6. UART串口通信

配置UART

# 禁用串口控制台
sudo systemctl stop serial-getty@ttyS0.service
sudo systemctl disable serial-getty@ttyS0.service

# 编辑/boot/extlinux/extlinux.conf,添加:
# console=none

UART通信示例

import serial
import time

# 配置串口
ser = serial.Serial(
    port='/dev/ttyTHS1',  # Jetson Nano UART
    baudrate=115200,
    timeout=1
)

print("Starting UART communication...")

try:
    while True:
        # 发送数据
        message = "Hello from Jetson Nano!\n"
        ser.write(message.encode())
        print(f"Sent: {message.strip()}")
        
        # 接收数据
        if ser.in_waiting > 0:
            received = ser.readline().decode().strip()
            print(f"Received: {received}")
        
        time.sleep(1)
        
except KeyboardInterrupt:
    print("Program stopped")
finally:
    ser.close()

7. 实际应用案例

案例1:智能温控风扇

import Jetson.GPIO as GPIO
import time

# 配置
FAN_PIN = 32  # PWM控制引脚
TEMP_THRESHOLD = 50  # 温度阈值(摄氏度)

GPIO.setmode(GPIO.BOARD)
GPIO.setup(FAN_PIN, GPIO.OUT)
fan_pwm = GPIO.PWM(FAN_PIN, 25000)  # 25kHz PWM频率
fan_pwm.start(0)

def get_cpu_temperature():
    with open('/sys/devices/virtual/thermal/thermal_zone0/temp', 'r') as f:
        return int(f.read()) / 1000.0

try:
    while True:
        temp = get_cpu_temperature()
        
        if temp < 40:
            fan_pwm.ChangeDutyCycle(0)
        elif temp < 50:
            fan_pwm.ChangeDutyCycle(30)
        elif temp < 60:
            fan_pwm.ChangeDutyCycle(60)
        else:
            fan_pwm.ChangeDutyCycle(100)
        
        print(f"Temperature: {temp:.1f}°C, Fan: {fan_pwm.ChangeDutyCycle}%")
        time.sleep(2)
        
except KeyboardInterrupt:
    fan_pwm.stop()
    GPIO.cleanup()

案例2:LED矩阵显示

import Jetson.GPIO as GPIO
import time

# 8x8 LED矩阵引脚配置
ROW_PINS = [7, 11, 13, 15, 19, 21, 23, 29]
COL_PINS = [12, 16, 18, 22, 24, 26, 28, 32]

GPIO.setmode(GPIO.BOARD)

for pin in ROW_PINS + COL_PINS:
    GPIO.setup(pin, GPIO.OUT)
    GPIO.output(pin, GPIO.LOW)

# 显示图案(心形)
heart_pattern = [
    [0,1,1,0,0,1,1,0],
    [1,0,0,1,1,0,0,1],
    [1,0,0,0,0,0,0,1],
    [0,1,0,0,0,0,1,0],
    [0,0,1,0,0,1,0,0],
    [0,0,0,1,1,0,0,0],
    [0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0]
]

try:
    while True:
        for row_idx, row_pin in enumerate(ROW_PINS):
            # 激活当前行
            GPIO.output(row_pin, GPIO.HIGH)
            
            # 设置列状态
            for col_idx, col_pin in enumerate(COL_PINS):
                GPIO.output(col_pin, not heart_pattern[row_idx][col_idx])
            
            time.sleep(0.002)  # 2ms扫描间隔
            
            # 关闭当前行
            GPIO.output(row_pin, GPIO.LOW)
            
except KeyboardInterrupt:
    GPIO.cleanup()

8. 常见问题与解决方案

问题1:GPIO权限错误

# 将用户添加到gpio组
sudo usermod -a -G gpio $USER
# 重新登录或重启

问题2:I2C设备未检测到

# 检查I2C是否启用
sudo i2cdetect -y -r 1
# 检查设备树
sudo /opt/nvidia/jetson-io/jetson-io.py

问题3:PWM频率不准确

  • Jetson Nano的PWM硬件支持有限
  • 对于精确频率需求,考虑使用软件PWM或外部PWM芯片

问题4:GPIO响应速度慢

  • Python库有开销,对于高速应用使用C/C++
  • 考虑使用Jetson的硬件加速器

9. 安全注意事项

  1. 电压限制:GPIO引脚为3.3V,不要连接5V设备
  2. 电流限制:每个引脚最大输出16mA,总电流限制
  3. 静电保护:操作前释放静电
  4. 短路保护:避免引脚直接接地或接电源
  5. 电源隔离:外部设备使用独立电源

10. 进阶学习资源

官方文档

社区资源

项目灵感

掌握Jetson Nano的GPIO接口,你就可以连接各种传感器、执行器和通信模块,创造出功能丰富的嵌入式AI应用。从简单的LED控制开始,逐步探索更复杂的项目,如机器人控制、计算机视觉系统和物联网网关。祝你开发愉快!


相关资源: