Nvidia Xavier GPIO 输入输出 中断 PWM

2023-05-16

文章目录

    • 前言
    • Jetson.GPIO安装
    • 可用引脚
    • 点亮LED
    • GPIO输出示例
    • GPIO输入示例
    • GPIO Event
    • GPIO Interrupt
    • 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配置 这篇文章.

微信公众号

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nvidia Xavier GPIO 输入输出 中断 PWM 的相关文章

  • 2020硕博无人机文献调研(1)

    1 旋翼无人机自主降落技术研究 xff0c 山东大学 xff0c 岳文斌 创新点 xff1a 利用视觉Apriltag算法进行二维码识别 关于AprilTag详见 https blog csdn net han784851198 artic
  • PX4姿态控制基础

    无人机姿态控制代码实现的四个步骤 订阅数据 xff08 飞机现姿态 xff0c 飞机期望姿态 xff09 PID 外环计算 xff08 作用于姿态误差 xff0c 角速度 xff09 作用 xff1a 产生期望角速度 xff0c 并发布出去

随机推荐

  • PX4位置控制基础

    接受数据 xff08 获取位置信息 期望位置 xff09 外环控制PID xff08 位置环 xff09 xff1a 通过调节速度减小位置差 xff0c 位置差需要通过速度去弥补 判定模式不同 xff0c 位置差的来源 xff08 三种控制
  • ROS2开机程序自启动

    运行环境 系统 xff1a Ubuntu20ROS xff1a foxy 添加服务脚本 sudo vi etc systemd system rc local service 内容如下 xff1a Unit Description 61 e
  • 【STM32】条件编译不起作用是什么原因

    在工程中定义了几个条件编译 xff0c 用来适应不同的硬件设备 xff0c 但是好像不起作用似的 这种情况可能是在多个文件中使用了条件编译 xff0c 但是编译工程的时候又只是编译了部分文件 xff0c 即使有部分使用了条件编译的文件没有被
  • 一文看懂rtc实时时钟和单片机时钟的区别

    rtc实时时钟和单片机时钟的区别 实时时钟是指给日期及时间计数器累加的时钟 xff0c 通常是32768Hz xff0c 系统时钟是指单片机内部的主时钟 xff0c 给各个模块提供工作时钟的基础 xff0c CPU时钟是指经过CPU的PLL
  • PhotoScan处理无人机航拍照片GCP校正流程

    PhotoScan处理无人机航拍照片GCP校正流程 软件最近更新版本较频繁 xff0c 菜单条目变化较大 xff0c 但基本功能没变 Agisoft PhotoScan xff08 APS xff09 现改名 Metashape了 Phot
  • 2022年研发效能实践案例智库集-EQCon

    2022年研发效能实践案例智库集 xff1a Docs
  • git四区逻辑关系(工作区、暂存区、本地仓库、远程仓库)

  • 推荐一个提高实现目标效率和过滤不现实目标的方法:WOOP

    推荐一个提高实现目标效率和过滤不现实目标的方法 xff1a WOOP WOOP 分别是 Wish xff08 愿望 xff09 Outcome xff08 效果 xff09 Obstacle xff08 障碍 xff09 和 Plannin
  • 序列图教程-完整指南及示例

    Sequence Diagram Tutorial Complete Guide with Examples Creately
  • 什么是好的策略?

    好的策略是承认每个人都是自私的 xff0c 但是你的策略能够在人人都是自私的基础上获得全局利益的最大化 xff0c 如果你的全局利益最大化是建立在要求每个人都是大公无私的 xff0c 那就是失败的设计 xff0c 因为这必然会导致失败
  • 软件工程3.0

  • pod、container、sidecar

    pod是一个小家庭 xff0c 它把密不可分的家庭成员 container 聚在一起 xff0c Infra container则是家长 xff0c 掌管家中共通资源 xff0c 解决顺序和依赖关系 xff0c 家庭成员通过sidecar方
  • 4种SQL标准的事务隔离级别

    SQL标准的事务隔离级别包括 xff1a 读未提交 xff08 read uncommitted xff09 xff1a 一个事务还没提交时 xff0c 它做的变更就能被别的事务看到 读提交 xff08 read committed xff
  • 设计容器网络插件的初步思路

    同一个 Pod 里面的所有用户容器的进出流量 xff0c 可以认为都是通过 Infra 容器完成的 当为Kubernetes 开发一个网络插件时 xff0c 应该重点考虑的是如何配置这个 Pod 的 Network Namespace xf
  • 各种显示接口DBI、DPI、LTDC、DSI、FSMC

    各种显示接口DBI DPI LTDC DSI FSMC qq 23899395 2019 06 05 17 30 36 4810 收藏 36 版权 首先 xff0c MIPI xff08 Mobile Industry Processor
  • 在ubuntu 16.04安装ROS Kinetic

    ubuntu16 04 已经发布一个月了 xff0c ROS的Kinetic也已经发布 xff0c 需要了解ROS发行版及支持维护的时间等 xff0c 可以参考如下网页 xff1a http wiki ros org Distributio
  • ROS创建工作空间和功能包

    所有的ROS程序 xff0c 包括我们自己开发的程序 xff0c 都被组织成功能包 xff0c 而ROS的功能包被存放在称之为工作空间的目录下 因此 xff0c 在我们写程序之前 xff0c 第一步是创建一个工作空间以容纳我们的功能包 1
  • MPU-6000(6050)介绍

    MPU 6000 xff08 6050 xff09 简介 MPU 60X0是全球首例9 轴运动处理传感器 它集成了3 轴MEMS陀螺仪 xff0c 3 轴MEMS加速度计 xff0c 以及一个可扩展的数字运动处理器DMP xff08 Dig
  • lwip/uip移植之一

    最近一直想移植一个tcp ip协议栈到板子上 xff0c 于是想到了lwip和uip lwip是一个比较完整的协议栈 xff0c 功能强大 xff0c 结合ucos系统更是方便完美 xff0c 但是需要几十k的ram xff0c 这点在我f
  • Nvidia Xavier GPIO 输入输出 中断 PWM

    文章目录 前言Jetson GPIO安装可用引脚点亮LEDGPIO输出示例GPIO输入示例GPIO EventGPIO InterruptPWM微信公众号 前言 Nvidia Jetson AGX Xavier 硬件相关 这篇讲到Xavie