Nvidia Xavier GPIO 输入输出 中断 PWM

前言

Nvidia Jetson AGX Xavier 硬件相关
这篇讲到Xavier的40Pin扩展口和树莓派的40Pin扩展口类似, 本节就操作下GPIO. 方便起见, 再贴一下引脚映射:
在这里插入图片描述
RPi.GPIO 官方使用文档翻译
Jetson.GPIOAPI和树莓派的RPi.GPIO是一样的, 可以去参考我这篇之前的翻译文章.

Jetson.GPIO安装

NVIDIA/jetson-gpio, 这个Github仓库写的很详细, Jetson TX1, TX2, AGX Xavier和Nano的载板 默认都提供了40Pin的扩展口, 可以通过Jetson.GPIO这个Python库进行GPIO的操作, 和树莓派的RPi.GPIO有相同的API. 虽然Nvidia已经自带了jetson-gpio: /opt/nvidia/jetson-gpio/, 但还要配置环境什么的麻烦, 不如直接装一个:

## 先安装pip3
sudo apt install python3-pip

## 安装Jetson.GPIO
sudo pip3 install Jetson.GPIO
# Successfully installed Jetson.GPIO-2.0.4

如果直接输入python3, 然后import Jetson.GPIO as GPIO, 会提示权限不够:

raise RuntimeError("The current user does not have permissions set to "
RuntimeError: The current user does not have permissions set to access the library functionalites. Please configure permissions or use the root user to run this

涉及到硬件操作的, 用sudo开头, 直接sudo python3, 输入import Jetson.GPIO as GPIO, 就可以了.

可用引脚

jetson-gpio/samples/test_all_apis.py文件列出了各个Jetson板子测试的引脚, 以Xavier为例:

    'JETSON_XAVIER': {
        # Pre-test configuration, if boot-time pinmux doesn't set up PWM pins:
        # Set BOARD pin 18 as mux function PWM:
        # busybox devmem 0x2434090 32 0x401
        # Board mode pins
        'out_a': 18,
        'in_a': 19,
        'out_b': 21,
        'in_b': 22,
        'unimplemented_pins': (),
        # Other pin modes:
        'cvm_pin': 'MCLK05',
        'tegra_soc_pin': 'SOC_GPIO42',
        'all_pwms': (13, 15, 18),
    },

尽量用引脚 12, 13, 15, 18, 其它引脚没有测试, 有兴趣的对好原理图后, 可以试试, 留言给我.

点亮LED

首先把J514跳线帽设置为3.3V, 这样GPIO12通过了电平转换芯片TXB0108, 这里用12引脚作为输出驱动一颗LED, 连接方式:
Pin12 -> +LED- -> 4.7K电阻 -> GND(Pin14)
位置如图:
在这里插入图片描述
终端:

sudo python3

>>> import Jetson.GPIO as GPIO
>>> GPIO.setmode(GPIO.BOARD)
>>> LED = 12
>>> GPIO.setup(LED, GPIO.OUT)
>>> GPIO.output(LED, GPIO.HIGH)

然后就可以看到LED亮了, 继续输入 GPIO.output(LED, GPIO.LOW) 可以关闭LED.

GPIO.setmode(GPIO.BOARD)设置的是引脚编号, GPIO.BOARD这种编号方式和本文最上面图中引脚编号是一样的, Pin12就是图中的12引脚I2S2_CLK, 其实编号共有4种方式: GPIO.BOARD, GPIO.BCM, GPIO.CVM, GPIO.TEGRA_SOC or None, 详细解释:

The first two correspond to the modes provided by the RPi.GPIO library, i.e BOARD and BCM which refer to the pin number of the 40 pin GPIO header and the Broadcom SoC GPIO numbers respectively. The remaining two modes, CVM and TEGRA_SOC use strings instead of numbers which correspond to signal names on the CVM/CVB connector and the Tegra SoC respectively.

GPIO.setup(LED, GPIO.OUT) 就是设置引脚为输出, 同样的GPIO.setup(channel, GPIO.IN)表示设置输入, 还可以初始化设置为输出高GPIO.setup(channel, GPIO.OUT, initial=GPIO.HIGH), 也可以对多个通道同时设置:

# add as many as channels as needed. You can also use tuples: (18,12,13)
channels = [18, 12, 13]
GPIO.setup(channels, GPIO.OUT)

GPIO.output(LED, GPIO.HIGH) 设置LED引脚为高电平, 这样LED就亮了.

最后, 不用的话, 最好clean up一下, 让引脚回到默认状态:

GPIO.cleanup(LED)

上面Github的samples文件夹里面有许多输入, 输出, PWM, 按键, 中断的例子, 可以好好参考一下.

GPIO输出示例

创建文件gpio_out.py, 使用sudo python3 gpio_out.py运行可以看到LED每隔1s变换一次状态:

import Jetson.GPIO as GPIO
import time

LED = 12

def main():
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(LED, GPIO.OUT, initial=GPIO.LOW)
    curr_value = GPIO.LOW
    try:
        while True:
            time.sleep(1)
            GPIO.output(LED, curr_value)
            curr_value ^= GPIO.HIGH
    finally:
        GPIO.cleanup()
        
if __name__=='__main__':
    main()

GPIO输入示例

文件gpio_input.py:

import Jetson.GPIO as GPIO
import time

input_pin = 12

def main():
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(input_pin, GPIO.IN)
    prev_value = None
    try:
        while True:
            value = GPIO.input(input_pin)
            if value != prev_value:
                if value == GPIO.HIGH:
                    value_str = "HIGH"
                else:
                    value_str = "LOW"
                print("Pin {} Value is {}".format(input_pin,value_str))
                prev_value = value
            time.sleep(1)
    finally:
        GPIO.cleanup()

if __name__=='__main__':
    main()

然而, 只在12引脚成功, 在11和15引脚失败:

xavier@xavier-c:~/Documents/jetson-gpio/samples$ sudo python3 gpio_input.py 
Pin 12 Value is LOW
Pin 12 Value is HIGH
Pin 12 Value is LOW
Pin 12 Value is HIGH

下面关于interrupt, event, pwm的例子直接贴官方代码了.

GPIO Event

import Jetson.GPIO as GPIO
import time

# Pin Definitons:
led_pin = 12  # Board pin 12
but_pin = 18  # Board pin 18

def main():
    # Pin Setup:
    GPIO.setmode(GPIO.BOARD)  # BOARD pin-numbering scheme
    GPIO.setup(led_pin, GPIO.OUT)  # LED pin set as output
    GPIO.setup(but_pin, GPIO.IN)  # button pin set as input

    # Initial state for LEDs:
    GPIO.output(led_pin, GPIO.LOW)

    print("Starting demo now! Press CTRL+C to exit")
    try:
        while True:
            print("Waiting for button event")
            GPIO.wait_for_edge(but_pin, GPIO.FALLING)

            # event received when button pressed
            print("Button Pressed!")
            GPIO.output(led_pin, GPIO.HIGH)
            time.sleep(1)
            GPIO.output(led_pin, GPIO.LOW)
    finally:
        GPIO.cleanup()  # cleanup all GPIOs

if __name__ == '__main__':
    main()

注意GPIO.wait_for_edge还可以设置超时时间:

# timeout is in milliseconds
GPIO.wait_for_edge(channel, GPIO.RISING, timeout=500)

GPIO Interrupt

import Jetson.GPIO as GPIO
import time

# Pin Definitions:
led_pin_1 = 12
led_pin_2 = 13
but_pin = 18

# blink LED 2 quickly 5 times when button pressed
def blink(channel):
    print("Blink LED 2")
    for i in range(5):
        GPIO.output(led_pin_2, GPIO.HIGH)
        time.sleep(0.5)
        GPIO.output(led_pin_2, GPIO.LOW)
        time.sleep(0.5)

def main():
    # Pin Setup:
    GPIO.setmode(GPIO.BOARD)  # BOARD pin-numbering scheme
    GPIO.setup([led_pin_1, led_pin_2], GPIO.OUT)  # LED pins set as output
    GPIO.setup(but_pin, GPIO.IN)  # button pin set as input

    # Initial state for LEDs:
    GPIO.output(led_pin_1, GPIO.LOW)
    GPIO.output(led_pin_2, GPIO.LOW)

	# GPIO.RISING, GPIO.FALLING or GPIO.BOTH
    GPIO.add_event_detect(but_pin, GPIO.FALLING, callback=blink, bouncetime=10)
    print("Starting demo now! Press CTRL+C to exit")
    try:
        while True:
            # blink LED 1 slowly
            GPIO.output(led_pin_1, GPIO.HIGH)
            time.sleep(2)
            GPIO.output(led_pin_1, GPIO.LOW)
            time.sleep(2)
    finally:
        GPIO.cleanup()  # cleanup all GPIOs

if __name__ == '__main__':
    main()

注意其中的bouncetime(单位ms)很好用, 可以保证这段时间内只触发一次, 避免重复触发, 消抖什么的还不错.

PWM

import Jetson.GPIO as GPIO
import time

output_pins = {
    'JETSON_XAVIER': 18,
    'JETSON_NANO': 33,
}
output_pin = output_pins.get(GPIO.model, None)
if output_pin is None:
    raise Exception('PWM not supported on this board')


def main():
    # Pin Setup:
    # Board pin-numbering scheme
    GPIO.setmode(GPIO.BOARD)
    # set pin as an output pin with optional initial state of HIGH
    GPIO.setup(output_pin, GPIO.OUT, initial=GPIO.HIGH)
    p = GPIO.PWM(output_pin, 50)	# 50Hz
    p.start(25)	# 25% duty cycle

    print("PWM running. Press CTRL+C to exit.")
    try:
        while True:
        	# p.ChangeDutyCycle(dc)  # where 0.0 <= dc <= 100.0
            time.sleep(1)
    finally:
        p.stop()
        GPIO.cleanup()

if __name__ == '__main__':
    main()

注意PWM的限制:

The Jetson.GPIO library supports PWM only on pins with attached hardware PWM controllers. Unlike the RPi.GPIO library, the Jetson.GPIO library does not implement Software emulated PWM. Jetson Nano supports 2 PWM channels, and Jetson AGX Xavier supports 3 PWM channels. Jetson TX1 and TX2 do not support any PWM channels.

The system pinmux must be configured to connect the hardware PWM controlller(s) to the relevant pins. If the pinmux is not configured, PWM signals will not reach the pins!

这么看来, pwm用起来还是有点难度的, 需要修改pinmux, 具体可参考 JETSON NANO PWM配置 这篇文章.

微信公众号

欢迎扫描二维码关注本人微信公众号, 及时获取或者发送给我最新消息:
在这里插入图片描述

  • 11
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
NVIDIA Xavier NX是一款强大的嵌入式AI计算模块,可以广泛应用于无人驾驶、工业自动化、智能摄像头等领域。下面是关于NVIDIA Xavier NX产品手册的回答: 产品手册概述了Xavier NX的技术规格、功能特性以及应用场景。首先介绍了Xavier NX的硬件组成,它采用了高性能的NVIDIA Volta GPU和六核心Carmel ARM v8.2 64位CPU,配备了8GB LPDDR4x内存和16GB eMMC闪存。这些硬件配置使得Xavier NX具备了强大的计算能力和存储能力,可以处理高度复杂的机器学习和深度学习任务。 此外,产品手册还详细介绍了Xavier NX的软件支持。它可以运行NVIDIAJetPack SDK和TensorRT推理引擎,这使得开发者可以轻松构建和部署高效的AI模型。手册对于如何设置和启动Xavier NX提供了详细的指导,还介绍了如何使用TensorRT加速AI推理和深度学习模型的优化技巧。此外,手册还包含了开发者工具和开发环境的介绍,帮助开发者更好地利用Xavier NX进行软件开发和调试。 产品手册还重点强调了Xavier NX在无人驾驶、工业自动化和智能摄像头等领域的应用优势。它通过提供高度可靠性和低功耗的计算能力,为这些领域中的各种复杂任务提供了强力支持。不仅如此,Xavier NX还具备丰富的扩展性,支持多种传感器和接口,可以轻松与其他设备集成。 总的来说,NVIDIA Xavier NX产品手册提供了全面而详细的关于Xavier NX的介绍和应用指南。它不仅让用户了解到Xavier NX的硬件和软件特性,还帮助用户充分利用其强大的AI计算能力,实现在各个领域的应用创新。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值