Jetbot基础教程-Jetson的40针引脚

Jetson Nano 采用与树莓派兼容的 40 针引脚的设计,在战略上是个非常高明的设计。
嵌入式设备有个被天生赋予的重点任务,就是要成为自动控制整体方案中的一员。早期市场对自动控制的需求主要集中在单纯的“机电控制”上,而具备智能计算的 Jetson 系列产品相对与几十元的这类控制板来说,成本高出了一个阶位。
但是随着“智能+控制”的结合功能成为新工业主流需求之后,成本已经不是最首要的关键因素,因为智能设备所带来的价值已经远远超过先前的成本差异。NVIDIA Jetson 设备就是在这样的风潮下逐渐崭露头角,为智能工业带来新的生命力。

透过“扩充引脚”的方式与机电控制设备进行对接,是绝大部分嵌入式设备所采用的方法。NVIDIA 在 2015 年的 Jetson TK1 产品就已经配置了这方面的引脚,经历了 TX1/TX2 到 AGX Xavier 的阶段,依旧保有这方面的接口(如下图),一直到 2019 年 Jetson Nano 推出之后,采用与树莓派兼容的 40 针引脚的设计,在战略上是个非常高明的设计。

 

过去 10 年是创客(maker)兴盛的年代,而树莓派凭借“硬件开源”的风潮吸引庞大的民间实力,开发了相当齐全的周边产品,下表是比较常用的一部分设备清单,全部都是基于树莓派 40 针引脚定义所设计。

 

如今 Jetson Nano(含2GB)、Xavier NX 等开发套件的引脚也兼容于树莓派的定义时,就表示上面列表中的周边设备,都能直接适用于现在主流的 Jetson 开发套件,不仅无需依赖中间的转换器,包括代码也可以不需要修改,就能将原本不具备深度学习能力的树莓派方案,立即移植到 NVIDIA 的智能 Jetson 设备上,马上变成“智能控制”的应用设备,实用价值瞬间就提高一个档次。

本文属于 Jetbot 系列中的一环,不过在进入与周边设备(PiOLED、PCA9685 等)对接之前,有必要让初学者对 Jetson 的 40 针引脚的细节与使用有进一步的了解,因为 Jetbot 是一个经典的项目,但更重要是要让初学者可以自行搭建更多的应用。

过去缺乏智能识别能力的创客项目,多属于较为单调的固定执行流程的应用,但是有了 NVIDIA Jetson 的智能识别能力之后,就能让这类项目变得非常多彩多姿,并且更加贴近生活或工作上的实用场景,例如根据垃圾分类识别后进行处理的机械手臂、根据猫脸识别后对特定猫开启喂食器、根据水果成熟度进行采摘等应用,都是实用价值非常高的,这才是真正智能设备的创造动力。

网上有不少探索 Jetson 这 40 根引脚的文章,但内容相对笼统并且有些部分的混淆,对初学者来说会产生障碍。本文的重点就是将以下三个部分讲解清楚:

  • 40 根引脚的 SPIO 与 GPIO

  • Jetson-IO 工具与 Jetson.GPIO 开发库

  • 四种 GPIO 引脚调用模式:BOARD、BCM、CVM、TEGRA_SOC

只要将这三个关系捋清楚后,整个 40 针引脚的使用就会瞬间变得非常简单。假如上述三个关系您都很熟悉了,就可以跳过本文的内容;如果还没搞清楚的,请仔细阅读本文,能让您很有条理地掌握这些引脚的使用要领。

  • 40针引脚的SPIO与GPIO


下图是 Jetson 的 40 帧引脚图的说明,适用于 Nano(含2GB)、Xavier NX 与 AGX Xavier 等开发套件。虽然上面满满的内容,乍看之下的确令人眼花缭乱,只要看完我们所作的分解之后,就会让这部分的内容变得非常简单。

 

首先,虽然大家平常时候习惯将这些引脚统称为 GPIO,但事实上这 40 根引脚主要分成 GPIO(General Purpose I/O)通用功能与 SFIO(Special Function I/O)特定功能两大类,后者总共有 18 根与开发套件底板电子电力直连的脚位,这是不能重新定义的固定功能,主要分为以下三种:

1. 供电相关:这个部分需要非常细心处理,如果错用可能会造成 Jetson 设备损坏。这里也进一步分成三种功能:

(1) 5V 直流电输入/输出:脚位[2, 4],在标识上唯一使用“红色”的地方,可以对 Jetson 开发套件作为“供电”用途,有些 Jetbot 第三方套件就是用这种方式对 Nano(含2GB)进行供电,不过这些都是专业厂商自行设计的电路,如果不太熟悉供电原理的读者,请勿随意尝试以避免对设备造成破坏。

这两个接脚也能对 5.0V 规格的周边设备进行供电,但是非常不推荐这样使用,因为 Jetson 本身的电力已经处于吃紧状态,如果再对其他设备提供 5V 输出,很可能影响整体稳定性。

(2) 3.3V 直流电输出:脚位[1, 17],可以为一些低电设备进行供电。例如在 Jetbot 项目中使用的 PiOLED 与 PCA9685,就是由 Nano(含2GB)的 3.3V 供电口对这两个元件进行供电。

(3) GND 接地点:脚位[6, 9, 14, 20, 25, 30, 34, 39]共 8 个。

2. 二组 I2C:I2C1_SDA/SCL=>脚位[27, 28];I2C2_SDA/SCL => 脚位[3, 5]

3. 一组 UART:UART2_TX/RX=>脚位[8, 10]

这样一整理之后,是不是就变得很简单了?撇开电源相关的 12 根脚位之外,真正需要了解的,就是两组 I2C 与一组 UART 共 6 个脚位,这 18 根脚位的定义与树莓派是完全一致的。在 Jetbot 项目中也就使用 1 组 3.3V/GND 电源与 1 组 I2C 的 SDA/SCL 而已,总共 4 根引脚就能完成智能车的任务。

如果原本树莓派创客项目中只使用这类的 I2C 或 UART 引脚的话,几乎不需修改代码就能将原本的应用移植到 Jetson Nano(含2GB)设备上,立刻升级为智能识别的应用,所展现的价值就马上提高一个台阶。

至于另外 22 根“可重新定义”脚位,才是很多网上所探索的“GPIO” 内容,其实正确的说法应该是“Jetson 的 22 根 GPIO 引脚使用”才对,不过这里就不去纠正这些小问题,重点在于让大家更清楚剩下这 22 根引脚的用法。

事实上这些引脚也有两种处理方式:

1.透过 Jetson-IO 工具将特定引脚设置成为 SFIO 用途,然后配合特定的开发库;2.作为 GPIO 用途,透过 Jetson.GPIO 或其他开发库直接调用
网上大部分的混淆就在这个 Jetson-IO 工具与 Jetson.GPIO 库,前者是 Jetpack 自带的底层系统引脚配置工具,后者是针对 GPIO 引脚的应用层开发库,二者之间是不仅完全独立的,甚至某种角度上还有些许“互斥”的关系。

接下去带着大家将这两个工具认识清楚,这样日后的开发就会非常简单。

  • Jetson-IO引脚配置工具

前面已经清楚在 40 根引脚中有 18 根是固定好的不能重新定义,剩下的问题就是如何处理这 22 根“可重新定义”的引脚,是否有什么工具可以协助我们确认目前所有脚位的状态呢?这就是 Jetson-IO 的主要工作了,请执行以下指令,看看显示怎样的结果?

sudo /opt/nvidia/jetson-io/config-by-pin.py

是否看到显示从 1 到 40 的状态?核对一下,是不是除了前面所说 18 个 SFIO 位置之外的 22 个引脚,都显示“unused” 状态?这些呈现“unused”的脚位就是 GPIO 的状态,能用 Jetson.GPIO 库直接指派与调用。

如果要对这 22 个脚位进行重新定义,该使用什么方法来操作?Jetson-IO 工具就是扮演“配置脚位功能”的角色,这是 NVIDIA 从 L4T 32.3 版本开始,提供可以修改引脚定义的工具,在 Jetpack 烧录过程就编译到开发套件的 /opt/nvidia/jetsion-io 目录下,这是属于系统底层的配置工具。

因为设备所有 I/O 的默认配置是静态定义的,早期要更改 40 针扩展引脚定义时置,必须使用相应平台的 pinmux 电子表格去更新管脚配置,然后将新配置烧回开发套件中,虽然这是更新系统的一种适当方法,但在开发的阶段,需要一种更方便的方法,来测试不同的管脚配置。

Jetson-IO 工具就是要简化 40 针引脚 I/O 配置的修改任务,提供一套基于 Python 的简单代码,最终会将修改的内容写入设备树(DTB, Device Tree, Blob)固件,重启设备就能让新的设置生效,非常方便。

如果想要修改前面所提到的 22 根脚位定义,最轻松的方法就是执行以下步骤:

sudo /opt/nvidia/jetson-io/jetson-io.py

进入主菜单后,选择下面的“Configure 40-pin expansion header”,就会出现以下选择菜单视窗,透过“上下键”与“空键”选择要设定的组:

 

这里是根据“功能”的提供脚位组合,所定义的脚位与前面 40 针引脚定义图是完全对应的,也就是说在 18 根 SFIO 以外的脚位,必须经过 Jetson-IO 的配置之后,才会具备引脚图中的功能,但这个步骤并未出现在任何说明文件或网上教程之中,导致很多初学者完全无法理会其中的奥秘,我们在这里为大家打开这个黑箱子。

现在试着启动 spi1 组设置,Jetson-IO 工具会同时配置后面的 5 个脚位。设置完毕后选择“Save and reboot to reconfigure pins”,重启系统之后再执行:

sudo /opt/nvidia/jetson-io/config-by-pin.py

是否看到脚位[19, 21, 23, 24, 26]的状态,现在都出现“spi1”的标识了?

在 /opt/nvidia/jetson-io/ 目录下还有 config-by-function.py、config-by-pin.py 与 config-by-hardware.py 三个工具,根据不同目的查询与设置 GPIO 接脚属性。详细的内容请至 https://docs.nvidia.com/jetson/archives/l4t-archived/l4t-325/index.html 里“Hardware Setup”的“Configuring the 40-Pin Expansion Header”,有完整的使用说明。


  • Jetson.GPIO应用开发库

这是属于应用级的开发库,是针对“未被 Jetson-IO 设置为 SPIO”的 GPIO 引脚进行配置与运作的应用库。

例如引脚 19 在前面 Jetson-IO 配置为 spi1 功能之前,就是作为 GPIO 功能,可以用 Jetson.GPIO 库去指派与调用;但是经过 spi1 配置并重启之后,引脚 19 已经属于 SFIO 而非 GPIO,这时候如果用 Jetson.GPIO 库去指定这个引脚,就不会产生作用。

前面提过“从某种角度来说 Jetson.GPIO 与 Jetson-IO 是互斥的”,道理就在这个地方,一旦被 Jetson-IO 配置并启动的脚位,就不再属于 GPIO 的功能了。

这个 Jetson.GPIO 开发库并不在 Jetpack 安装包里,因此需要手动安装与从 github 上下载范例代码。下面指令可以简单安装这个库:

sudopip3installJetson.GPIO

如果想要获得这个开发库的范例,就执行以下指令:

cd ~ && git clone  https://github.com/NVIDIA/jetson-gpio cd jetson-gpio/samples

这里的范例都需要结合一些很基本的电子实验设备,例如面包板、LED 灯、杜邦线、小电阻、小电容之类的设备,实验内容非常简单,请自行采购相关元件并跟着说明执行就可以,这里不做这些范例的讲解。

至于还有些环境变量配置问题,也请参考开源项目内的说明,不过在 Jetbot 项目中都已经调试好了。


  • 四种GPIO引脚调用模式

这是最后一个容易造成混淆的部分,因为作为 GPIO 用途的脚位有四种调用的模式,这也是因为过去长年积累的兼容性问题所导致的,不过只要搞清楚之后也都不是大问题。

在代码一开始的时候,需要使用“GPIO.setmode(GPIO_MODE)”指令进行模式的指定,其中“GPIO_MODE”可以是以下四种:

1. GPIO.BOARD:这种模式的引脚是根据“1~40”的物理编号进行指定,是最简单易懂的方式,不过必须注意得避开已经设置为 SFIO 的引脚。例如:

GPIO.setmode(GPIO.BOARD)GPIO.setup(12, GPIO.IN)                      # 设置12号引脚为输入GPIO.setup(13, GPIO.OUT, initial=GPIO.HIGH) # 设置13号引脚为输出
这是最直观而且简单的模式,推荐初学者使用!

2. GPIO.BCM:这种编号是因为控制芯片主要来自于博通(Broadcom)公司,而他们自定义了一组 BCM 编码方式,在 Jetson Nano(含2GB)开发套件的针脚位背面所印刷的“Dxx”编号(如下图),就是 BCM 的编码。

 

下面是简单的调用方法,不过指定的脚位是根据 BCM 编码原则:

GPIO.setmode(GPIO.BCM)GPIO.setup(12, GPIO.IN)    # 设置D12(BOARD的32)脚位为输入GPIO.setup(13, GPIO.OUT)  # 设置D13(BOARD的33)脚位为输出
很多传统树莓派的项目里习惯使用 BCM 编码,仔细对照就能轻易理解。

3. GPIO.CVM与GPIO.TEGRA_SOC:这两种模式使用各 GPIO 管脚命名的字符串,作为设置引脚的参数,其中 CVM 是根据 CVM/CVB 连接器信号名称命名,

TEGRA_SOC 是根据 Tegra SoC 中信号名称来命名的。例如:

GPIO.setmode(GPIO.TEGRA_SOC)GPIO.setup('SPI1_SCK', GPIO.IN)      # 设置BOARD的23脚位为输出GPIO.setup('SPI1_MISO', GPIO.OUT)  # 设置BOARD的21脚位为输出


  • 结语

过去大家对于 NVIDIA Jetson 系列产品的深度学习能力是比较熟悉的,但是要将使用价值再扩展到工业场景的时候,也必须对这个 40 针引脚的用法有足够的掌握。
本文将大部分困扰初学者的问题进行较更有逻辑的梳理,日后只要大家能弄清楚 SFIO 与 GPIO 之间的差异、Jetson-IO 与 Jetson.GPIO 的不同,以及 GPIO 四种编码模式的对应脚位如何查找,其他的问题就是透过代码去熟练这些调用,也不必在乎是用 Python 库还是 C 语言库了。
- 本文内容来自网络,如有侵权,请联系本站处理。

2022-04   阅读(83)   评论(0)
 标签: 人工智能

涨知识
结构化编程

结构化程序设计是采用顺序结构、选择结构(IF语句)、循环结构(FOR,WHILE语句)、子程序等来进行程序设计的一种编程典范。

评论:
相关文章
Jetbot基础教程-机电控制设备的安装

机电控制是智能车最重要的输出功能,需要搭配 “DC-Stepper-Motor” 控制板,因为 3D 打印车体是根据这个控制板所设计的。


一文全面讲解AI芯片!

2010 年以来, 由于大数据产业的发展, 数据量呈现爆炸性增长态势,而传统的计算架构又无法支撑深度学习的大规模并行计算需求,于是研究界对 AI 芯片进行了新一轮的技术研发与应用研究。AI 芯片是人工智能时代的技术核心之一,决定了平台的基础架构和发展生态。


嵌入式AI从入门到放肆【K210篇】-- 硬件与环境

本文从芯片架构,到开发板选型,再到软件开发环境的搭建介绍了关于K210的基础ABC,这块KPU其实有很多有意思的应用,我会在后面的文章中进行更多介绍,包括SDK中各个模块的使用方式,以及如何将自己的AI模型部署到K210上面去运行。


ChatGPT背后模型被证实具有人类心智!斯坦福新研究炸了

Stanford一名学者上周发表论文,证明GPT-3之后的AI模型,其同理心能力可能已经和9岁的小孩差不多。而这本来认为是人类独有的特质。


MaixPy是什么?

MaixPy 是将 Micropython 移植到 K210 的一个项目,不但支持 MCU 常规操作, 还集成了硬件加速的 AI 机器视觉和麦克风阵列相关的算法。


艾伦·图灵 –人工智能之父

Sometimes it is the people who no one imagines anything of who do the things that no one can imagine.


Maixduino几种开发环境的搭建

Sipeed k210 RISC-V AI+lOT ESP32视觉听觉开发套装的开发环境搭建。


6000字人工智能科普,高中生都能读懂

本文是《人工智能基础(高中版)》的读书笔记,这本书的配图非常好,把难以理解的概念图形化,所以读后感会引用书中的图片(图片版权归商汤科技所有)。


用树莓派4b构建深度学习应用(3) OpenCV篇

这一篇主要介绍一下最新版的 OpenCV 4.4 在树莓派上的编译,安装与使用。