文章目录

  • 前言
  • 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 timeLED = 12def main():GPIO.setmode(GPIO.BOARD)GPIO.setup(LED, GPIO.OUT, initial=GPIO.LOW)curr_value = GPIO.LOWtry:while True:time.sleep(1)GPIO.output(LED, curr_value)curr_value ^= GPIO.HIGHfinally:GPIO.cleanup()if __name__=='__main__':main()

GPIO输入示例

文件gpio_input.py:

import Jetson.GPIO as GPIO
import timeinput_pin = 12def main():GPIO.setmode(GPIO.BOARD)GPIO.setup(input_pin, GPIO.IN)prev_value = Nonetry: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 = valuetime.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 18def main():# Pin Setup:GPIO.setmode(GPIO.BOARD)  # BOARD pin-numbering schemeGPIO.setup(led_pin, GPIO.OUT)  # LED pin set as outputGPIO.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 pressedprint("Button Pressed!")GPIO.output(led_pin, GPIO.HIGH)time.sleep(1)GPIO.output(led_pin, GPIO.LOW)finally:GPIO.cleanup()  # cleanup all GPIOsif __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 schemeGPIO.setup([led_pin_1, led_pin_2], GPIO.OUT)  # LED pins set as outputGPIO.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.BOTHGPIO.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 slowlyGPIO.output(led_pin_1, GPIO.HIGH)time.sleep(2)GPIO.output(led_pin_1, GPIO.LOW)time.sleep(2)finally:GPIO.cleanup()  # cleanup all GPIOsif __name__ == '__main__':main()

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

PWM

import Jetson.GPIO as GPIO
import timeoutput_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 schemeGPIO.setmode(GPIO.BOARD)# set pin as an output pin with optional initial state of HIGHGPIO.setup(output_pin, GPIO.OUT, initial=GPIO.HIGH)p = GPIO.PWM(output_pin, 50)    # 50Hzp.start(25)   # 25% duty cycleprint("PWM running. Press CTRL+C to exit.")try:while True:# p.ChangeDutyCycle(dc)  # where 0.0 <= dc <= 100.0time.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配置 这篇文章.

微信公众号

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

Nvidia Xavier GPIO 输入输出 中断 PWM相关推荐

  1. 基于天问block编译环境下ASRPRO语音芯片程序编写教程(二)语音识别,GPIO输入输出,PWM输出篇

    本篇教程将基于天问block内的官方范例代码讲解如何编写ASRPRO语音芯片程序以实现语音识别,GPIO输入输出和PWM输出功能. 1.智能语音对话 该程序中添加识别词功能添加命令词选项(黑色部分)为 ...

  2. NVIDIA Xavier CAN

    文章目录 前言 Jetson/AGX Xavier CAN 更新Pinmux方法1 更新Pinmux方法2 挂载CAN控制器 配置CAN接口 打开或关闭CAN CAN收发 小结Xavier CAN配置 ...

  3. NVIDIA Xavier UART

    文章目录 前言 40-Pin扩展口中的UART pyserial 调试串口 微信公众号 前言 Nvidia Xavier GPIO 输入输出 中断 PWM 上节总结了40-Pin扩展口中GPIO的应用 ...

  4. nvidia xavier平台无PD控制器USB接口调试

    NVIDIA英伟达 1. 前言 问题: 基于nvidia xavier核心板,设计载板,但是USB功能无法使用: 硬件: OTG连接器使用Micro B VBUS_ID=GPIO30(B55) pin ...

  5. AGX Xavier GPIO

    NVIDIA Jetson AGX Xavier GPIO Header Pinout 要使120Ω电阻串联的开关元件受Xavier的GPIO控制. 可以做开关的元器件有MOS管.三极管.二极管. 二 ...

  6. STM32F7普通定时器的使用(定时+中断+PWM)

    此篇博客记录的是自己通过CubeMX学习F7系列定时器功能的过程,献给有过标准库开发经验的同学. 基本计时功能 最简单的,定时器嘛,基本的定时器就是定时功能,简单来说就是TIMx->CNT会跟随 ...

  7. TMS2833X之GPIO外设中断的控制

    1.外设中断寄存器说明 F2833x系列可支持7个外部中断,分别是XINT1-XINT7,每个外部中断可以选择上升沿或下降沿触发,且可以被使能或禁止. GPIO外部中断寄存器主要有选择寄存器(GPIO ...

  8. STM32H743之GPIO外部中断实验

    硬件连接 将 LED,独立按键五项摇杆按键的跳线(KEY JMP)接好. 操作与现象 按下 CTR(五项摇杆中间)按键,LED1灯状态变化一次. 相关知识准备 GPIO工作模式详细介绍 GPIO_MO ...

  9. hal库开启中断关中断_[STM32]HAL库下GPIO按键中断与去抖问题分析(分析源码解决问题)...

    自上篇文章STM32 非阻塞HAL_UART_ReceiveIT解析与实际应用,具体总结了HAL库下套娃函数中如何看清库函数的脉络,更细致的认识调用的过程,以解决潜在的问题.又又又遇到了新的问题(GP ...

最新文章

  1. java中hashcode_浅谈Java中的Hash值
  2. JSP中的重定向和请求转发以及它们的区别
  3. 定义一个DOG类(Java)
  4. axios  一些用法总结
  5. 【实战演练】两种方法让 Docker 帮您快速构建应用程序
  6. 【转】Nginx系列(五)--nginx+tomcat实现负载均衡
  7. django设置mysql数据库连接_django如何设置连接mysql数据库
  8. 进阶攻略|前端最全的框架总结
  9. apt-get包管理详解
  10. 国内十大主流安卓和iOSApp应用商店推广渠道列表
  11. Ubuntu: 使用U盘拷贝文件
  12. 计算机无法创建新文件夹,使用win10系统时,发现无法新建文件夹怎么办,学会这招即可修复...
  13. 如何成为一个牛逼的程序员?
  14. java poi word bookmarks_poi根据word/excel模板(书签)创建导出word/excel文档
  15. Vue实现表格的分页打印和导出Excel功能
  16. python+nodejs+php+springboot+vue 社区小区报修 -社区信息管理
  17. 阿里云云原生数据湖体系全解读——数据湖 云原生计算引擎
  18. 计算机网络---计算机网络体系结构与参考模型
  19. Zabbix监控屏幕全屏显示多个监控项
  20. Elasticsearch:shard 分配感知

热门文章

  1. 修改Context path和端口号
  2. CPU缓存——L1+L2详解
  3. 软件工程导论第一次作业
  4. DAY2:使用 docker-compose 搭建 wordpress
  5. 相约云台山,露营party嗨起来
  6. 敏感词检测算法review
  7. 给docker中的ubuntu系统安装桌面程序
  8. 我们去首都机场为火星人送行
  9. 五子棋简单AI算法(C#版)
  10. 使用免费的Photoshop操作自动删除背景