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 工程中

  1.  lib/python 路径包含实现所有库功能的 Python 模块,gpio.py 模块是将被导入应用程序并提供所需 API 的主要组件,而 gpio_event.py 和 gpio_pin_data.py 是被 gpio.py 引用的,不能被应用程序直接调用
  2. 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引脚扩展接头的主要内容,如果未能解决你的问题,请参考以下文章

NVIDIA Jetson之GPIO功能测试

Jetson Nano驱动机器人的左右两路电机

Jetson_nano环境配置

NVIDIA Jetson之GPIO引脚设置

Jetson nano开发笔记jetson nano 环境搭建与常见软件安装

jetson nano安装与配置