Jetson Nano 配置40引脚扩展接头
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jetson Nano 配置40引脚扩展接头相关的知识,希望对你有一定的参考价值。
参考技术A https://docs.nvidia.com/jetson/l4t/index.html#page/Tegra%2520Linux%2520Driver%2520Package%2520Development%2520Guide%2Fhw_setup_jetson_io.html%23每个Jetson开发套件均包含40针扩展插头。许多引脚可以用作GPIO或“特殊功能IO口(SFIO)”,例如I2C,I2S等。40引脚接头连接器使您可以将Jetson开发人员工具包连接到现成的Raspberry Pi HAT(Hardware Attached on Top),例如Seeed Grove模块,SparkFun Qwiic产品等。
烧录系统时,Jetson开发套件上所有I / O的默认配置写入设备中。要更改L4T 32.3之前的40引脚扩展插头的引脚配置,您必须使用Pinmux电子表格为相应的平台更新引脚配置,然后将新配置烧录到开发者套件中。尽管这可能是更新生产系统的适当方法,但开发时仍需要一种更方便的方法来测试不同的引脚配置。
从L4T 32.3版开始,NVIDIA提供了Jetson-IO工具来简化40针扩展插头的I / O配置。 Jetson‑IO 是基于Python的工具,可在开发人员工具包上运行并修改Device Tree Blob(DTB)固件,以便开发套件重新启动后使40针插头新配置生效。
要启动Jetson-IO,请在开发人员工具包上输入以下命令:
启动Jetson‑IO时,将显示以下屏幕。此时主屏幕显示40针接头当前的配置,并为您提供两个用于配置I / O的选项:
当您选择“配置兼容硬件(configure for compatible hardware)”选项时,Jetson‑IO将显示一些硬件模块的配置列表。
当前有两个硬件模块可供配置:
选择配置后,Jetson-IO返回主屏幕,主屏幕显示为针对该配置更新后的40针扩展接头的图。
您可以选择以下操作:
请注意,在更新配置文件之后,您仍然可以将开发人员工具包引导至先前的配置,因为Jetson ‑IO 通过为新配置添加新条目来更新extlinux.conf。先前的配置仍在文件中。引导目标时,引导加载程序使您可以选择配置(或文件中定义的任何其他配置)。
当您在主屏幕上选择“配置40针扩展头”选项时,Jetson-IO将显示40针头I / O支持的特殊功能列表。它在括号中显示了与功能相关的引脚。
例如,在NVIDIA ®杰特森™纳米开发工具包,杰特森-IO显示的功能列表如下。
有关支持的功能的更多详细信息,请参阅开发人员套件中的Jetson SoC 技术参考手册。
您可以根据需要选择或取消选择功能。
要接受所选的功能集,请选择“返回”选项。Jetson‑IO返回主屏幕。它会重新显示在“ 兼容硬件屏幕 ”之后显示的主 屏幕 ,并附加一个条目:
如果您希望从命令行而不是从菜单配置40针扩展头,NVIDIA提供了一组命令行工具,它们提供相同的功能。以下各节介绍了这些实用程序。
例子
显示可用硬件模块配置的列表。
例子
您可以通过为硬件模块创建设备树覆盖(Device Tree overlay)来使用Jetson‑IO支持自定义硬件模块。以下各节描述了此过程。
要添加对自定义硬件的支持到Jetson‑IO,您必须了解Jetson‑IO如何管理附加硬件。对硬件模块的支持由设备树覆盖文件(.dtbo文件)处理。
硬件模块的设备树覆盖必须定义:
该叠加名称属性必须是唯一的名称,从别人的覆盖区别。该兼容属性必须有一个或多个以下的,这取决于Jetson平台的支持。
用户可以通过输入以下命令来获取适用于其Jetson平台的正确兼容字符串。如果您有Jetson Nano开发人员工具包,此命令还将标识PCB版本。
例如,请考虑FE-PI Audio Z V2模块。目标的/ boot目录中是名称与模式匹配的覆盖文件:
您可以使用fdtdump实用工具检查覆盖文件的内容,并查看覆盖名称( overlay-name )和兼容属性( compatible )。例如,在Jetson Nano开发人员工具包上,您可以通过输入以下命令来显示这些属性:
要创建简单的设备树覆盖图以为Jetson Nano(带有A02载板和A02模块)开发人员工具包添加新的自定义属性,请在目标平台上创建一个名为my-overlay.dts的文件,内容如下:
输入以下命令以将DTS源文件编译为覆盖文件:
将新的覆盖文件复制到/ boot目录之后,Jetson‑IO会找到该覆盖文件并允许您应用它:
如果要为连接到40针扩展接头连接器的自定义硬件模块创建覆盖文件,则最简单的方法是使用Jetson-IO根据需要配置40针接头连接器并将配置导出为覆盖。您可以使用面向菜单的Jetson-IO脚本或关联的·config-by -...·命令行工具来执行此操作。
例如,要为启用I2S接口的Jetson Nano(A02)创建覆盖,请输入以下命令:
然后,您可以通过输入此命令将覆盖图转换为设备树源文件。
您可以根据需要为定制硬件修改生成的设备树源,并添加硬件模块所需的任何其他节点和/或属性。然后,您可以重新编译设备树源并将其放置在/ boot /目录中,以供Jetson‑IO使用:
NVIDIA Jetson之GPIO功能测试
0 背景
Jetson TX1、TX2、AGX Xavier 和 Nano 开发板包含一个 40 针 GPIO 接头,类似于 Raspberry Pi 中的 40 针接头。NV 官方给出了一个 GPIO 库,是 Python 版本,与 Raspberry Pi 的 RPi.GPIO 库相同,本文对该库的内容及使用方法做一个介绍。
1 安装方法
直接通过 pip 安装即可
sudo pip install Jetson.GPIO
下载示例代码
git clone https://github.com/NVIDIA/jetson-gpio.git
在 jetson-gpio 工程中
- lib/python 路径包含实现所有库功能的 Python 模块,gpio.py 模块是将被导入应用程序并提供所需 API 的主要组件,而 gpio_event.py 和 gpio_pin_data.py 是被 gpio.py 引用的,不能被应用程序直接调用
- samples 路径列举了一些应用示例,具体含义如下
simple_input.py
:此应用程序使用 BCM 引脚编号模式并读取 40 引脚接头的引脚 12 处的值并将该值打印到屏幕上。
simple_out.py
:此应用程序使用 Raspberry Pi 的 BCM 引脚编号模式,并每 2 秒在 BCM 引脚 18(或 BOARD 引脚 12)上输出交替的高低值。
button_led.py
:此应用程序使用 BOARD 引脚编号。它需要一个连接到引脚 18 和 GND 的按钮,一个将引脚 18 连接到 3V3 的上拉电阻,以及连接到引脚 12 的 LED 和限流电阻。应用程序读取按钮状态并保持 LED 每次亮起 1 秒按钮被按下。
button_event.py
:此应用程序使用 BOARD 引脚编号。它需要一个连接到引脚 18 和 GND 的按钮、一个将按钮连接到 3V3 的上拉电阻以及连接到引脚 12 的 LED 和限流电阻。该应用程序执行与 button_led.py 相同的功能,但执行阻塞等待按钮按下事件而不是不断检查引脚的值以减少 CPU 使用率。
button_interrupt.py
:此应用程序使用 BOARD 引脚编号。它需要一个连接到引脚 18 和 GND 的按钮、一个将按钮连接到 3V3 的上拉电阻、连接到引脚 12 的 LED 和限流电阻以及连接到引脚 13 的第二个 LED 和限流电阻。应用程序缓慢闪烁只有在按下按钮时,第一个 LED 才会连续快速闪烁第二个 LED 5 次。
2 API 功能
2.1 设置模式
支持四种模式,GPIO.BOARD, GPIO.BCM, GPIO.CVM, GPIO.TEGRA_SOC,每种模式的含义如下
- BOARD(the pin number of the 40 pin GPIO header):就是开发板上 40pin 的丝印引脚序号
- BCM(the Broadcom SoC GPIO numbers):是芯片的引脚编号,指芯片未焊接时的从初始引脚标注起周围一圈引脚的编号
- CVM 和 TEGRA_SOC 使用字符串代替数字,分别对应于CVM / CVB连接器和 Tegra SoC 上的信号名称
对于 Jetson 系列的板子,需要将模式设置为 BOARD,直接和板子上标的一致
GPIO.setmode(GPIO.BOARD)
可以使用下边的方法来获取设置是否成功
mode = GPIO.getmode()
得到的结果会是 GPIO.BOARD, GPIO.BCM, GPIO.CVM, GPIO.TEGRA_SOC 或者 None 中的一种
2.2 输入引脚
在调用 gpio 引脚前,第一步需要定义好是输入还是输出方向。
设置引脚为输入方向
GPIO.setup(channel, GPIO.IN)
其中,channel 为具体的引脚号,比如 30、25等等
读取引脚的输入值
state = GPIO.input(channel)
返回值为 GPIO.LOW 或 GPIO.HIGH,即低信号或高信号
2.3 输出引脚
设置引脚为输出方向
GPIO.setup(channel, GPIO.OUT)
也支持指定默认输出是高还是低
GPIO.setup(channel, GPIO.OUT, initial=GPIO.HIGH)
当然,也支持同时设置多个引脚的方向,如
channels = [18, 12, 13]
GPIO.setup(channels, GPIO.OUT)
定义好之后,设置引脚的输出值,支持多种模式
channels = [18, 12, 13] # or use tuples
GPIO.output(channels, GPIO.HIGH) # or GPIO.LOW
# set first channel to HIGH and rest to LOW
GPIO.output(channel, (GPIO.LOW, GPIO.HIGH, GPIO.HIGH))
2.4 检查方向
可以使用下边的接口来检查某个引脚是输入引脚还是输出引脚
GPIO.gpio_function(channel)
返回值是 GPIO.IN 或 GPIO.OUT
2.5 清除引脚功能
程序运行结束后,最好有一个清除操作,将引脚恢复到默认状态
GPIO.cleanup()
如果不想把所有引脚的状态清除,也可以选择清除指定引脚
GPIO.cleanup(chan1) # cleanup only chan1
GPIO.cleanup([chan1, chan2]) # cleanup only chan1 and chan2
GPIO.cleanup((chan1, chan2)) # does the same operation as previous statement
3 中断功能
在监测输入引脚的状态时,为了防止不停地轮询,占用 cpu 资源,API 提供了三种接口来改进
3.1 wait_for_edge()
此函数会阻塞调用线程,直到检测到提供的边缘为止,如
GPIO.wait_for_edge(channel, GPIO.RISING)
第二个参数表示要检测的变化信号,支持 GPIO.RISING, GPIO.FALLING 或 GPIO.BOTH,及上升沿触发、下降沿触发或都触发,另外也可以设置超时时间
# timeout is in milliseconds
GPIO.wait_for_edge(channel, GPIO.RISING, timeout=500)
函数的返回是检测到的信号,或者超时后返回 None
3.2 event_detected()
此函数可用于定期检查自上次调用以来是否发生了事件,可以按如下方式设置和调用该函数
# set rising edge detection on the channel
GPIO.add_event_detect(channel, GPIO.RISING)
run_other_code()
if GPIO.event_detected(channel):
do_something()
同样的,也支持上升沿、下降沿或上升下降沿几种触发方式
3.3 回调函数
在新的线程中执行回调函数,因此,主程序和回调函数可以并发运行来对事件进行响应,如
# define callback function
def callback_fn(channel):
print("Callback called from channel %s" % channel)
# add rising edge detection
GPIO.add_event_detect(channel, GPIO.RISING, callback=callback_fn)
也可以指定多个回调函数
def callback_one(channel):
print("First Callback")
def callback_two(channel):
print("Second Callback")
GPIO.add_event_detect(channel, GPIO.RISING)
GPIO.add_event_callback(channel, callback_one)
GPIO.add_event_callback(channel, callback_two)
但需要注意的是,多个回调函数会按顺序执行,而不是同时执行,这与 python 的线程机制有关。为了防止多个事件对回调函数的多次调用,可以选择设置去抖动时间:
# bouncetime set in milliseconds
GPIO.add_event_detect(channel, GPIO.RISING, callback=callback_fn,
bouncetime=200)
如果不需要检测变化,可以使用清除功能
GPIO.remove_event_detect(channel)
4 PWM 功能
samples/simple_pwm.py 显示了如何使用 PWM 功能,有两点需要注意:
(1)并不是每个开发板都有 PWM 功能,Jetson Nano 支持 2 个 PWM 通道,Jetson AGX Xavier 支持 3 个 PWM 通道。Jetson TX1 和 TX2 不支持任何 PWM 通道。
(2)jetson 板子默认没有开启 PWM 功能,需要使用 jetson-io 工具来配置,使能 PWM 功能,方法参考《NVIDIA Jetson之SPI功能使能》进行设置
5 C++ 接口
除了官方给出的 Python 接口,也有 C++ 接口的 GPIO API,功能与 python 的相同,使用方法类似,安装方法
git clone https://github.com/pjueon/JetsonGPIO
cd JetsonGPIO/build
make all
sudo make install
编译方法
g++ -o your_program_name your_source_code.cpp -lpthread -lJetsonGPIO
上述介绍的 API 接口实现方法,这里不再赘述,直接查看项目说明即可
以上是关于Jetson Nano 配置40引脚扩展接头的主要内容,如果未能解决你的问题,请参考以下文章