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

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

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

  1. 40 根引脚的 SPIO 与 GPIO
  2. Jetson-IO工具与 Jetson.GPIO 开发库
  3. 四种 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]前面的jetbot的显示屏已经展示过PiOLED

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
sudo /opt/nvidia/jetson-io/config-by-pin.py
Header 1 [default]: Jetson 40pin Header1: 3.3V2: 5V3: i2c24: 5V5: i2c26: GND7: unused8: uartb9: GND10: uartb11: unused12: unused13: unused14: GND16: unused17: 3.3V18: unused19: unused20: GND21: unused22: unused23: unused24: unused25: GND26: unused27: i2c128: i2c130: GND32: unused33: unused34: GND35: unused36: unused37: unused38: unused39: GND40: unused
Header 2: Jetson Nano CSI Connector1: GND7: GND13: GND19: GND29: 3.3V

是否看到显示从 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 上下载范例代码。下面指令可以简单安装这个库:

sudo pip3 install Jetson.GPIO

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

1.cd ~ && git clone https://github.com/NVIDIA/jetson-gpio
2.cd jetson-gpio/samples
button_event.py      button_led.py  issue40.py          jetson-gpio-test.py  run_sample.sh    simple_out.py  test_all_apis.py        test_all_pins.py
button_interrupt.py  docker         issue40-trigger.py  jetson_model.py      simple_input.py  simple_pwm.py  test_all_pins_input.py

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

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

  • 四种GPIO引脚调用模式

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

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

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

1.GPIO.setmode(GPIO.BOARD)
2.GPIO.setup(12, GPIO.IN)                      # 设置12号引脚为输入
3.GPIO.setup(13, GPIO.OUT, initial=GPIO.HIGH) # 设置13号引脚为输出

这是最直观而且简单的模式,推荐初学者使用!

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

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

1.GPIO.setmode(GPIO.BCM)
2.GPIO.setup(12, GPIO.IN)    # 设置D12(BOARD的32)脚位为输入
3.GPIO.setup(13, GPIO.OUT)  # 设置D13(BOARD的33)脚位为输出

很多传统树莓派的项目里习惯使用 BCM 编码,仔细对照就能轻易理解。

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

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

本实例电灯的话将LED的正极接在Jetson Nano的第十一个引脚上,负极接在第三十九个引脚(GND)上,通过控制引脚输出高低电平,控制LED的亮灭。

import Jetson.GPIO as GPIO
import time as timeLED_Pin = 11
GPIO.setmode(GPIO.BOARD)
GPIO.setup(LED_Pin, GPIO.OUT)while (True):GPIO.output(LED_Pin, GPIO.HIGH)time.sleep(2)GPIO.output(LED_Pin, GPIO.LOW)time.sleep(2)GPIO.cleanup()

具体效果如下

49d83cb1c67034a3e3a343d781f673e3

  • 结语

过去大家对于 NVIDIA Jetson 系列产品的深度学习能力是比较熟悉的,但是要将使用价值再扩展到工业场景的时候,也必须对这个 40 针引脚的用法有足够的掌握。

本文将大部分困扰初学者的问题进行较更有逻辑的梳理,日后只要大家能弄清楚SFIO 与 GPIO 之间的差异、Jetson-IO 与 Jetson.GPIO 的不同,以及 GPIO 四种编码模式的对应脚位如何查找,其他的问题就是透过代码去熟练这些调用,也不必在乎是用 Python 库还是 C 语言库了。

基于Jetson Nano2GB 的 40Pin学习 GPIO 点亮LED灯笔记记录相关推荐

  1. 【STM32学习笔记-点亮LED灯】

    STM32学习笔记-点亮LED灯 文章目录 STM32学习笔记-点亮LED灯 一.原理图分析 二.代码分析 1.mian函数 2.led.c函数 3.led.h函数 4.函数文件整理 5.LED_In ...

  2. STM32学习笔记——点亮LED

    STM32学习笔记--点亮LED 本人学习STM32是直接通过操作stm32的寄存器,使用的开发板是野火ISO-V2版本: 先简单的介绍一下stm32的GPIO: stm32的GPIO有多种模式: 1 ...

  3. 嵌入式开发学习之--点亮LED灯(中)

    上篇我们主要学习的是环境搭建和实际操作,这篇详细记录一下整个思考的过程. 首先,我们需要想一个问题,这个灯为什么会亮? 物理上来说,LED灯属于发光二极管,只要有正确的电压就会发亮.也就是说,我们烧写 ...

  4. 用c语言编程点亮7个二极管,树莓派4B C语言编程实现GPIO点亮LED发光二极管(LED灯)...

    树莓派4B C语言点亮LED发光二极管(LED灯) 1.树莓派 40Pin 引脚GPIO对照表 2.wiringPi库更新 开启一个终端输入:gpio readall 如果发生错误信息,那么请执行下面 ...

  5. STM8学习笔记---点亮LED灯

    对单片机操作时一般有三个步骤,1.系统时钟选择.2.单片机外设初始化.3主程序编写. 同样要点亮LED灯时,也要按照这个步骤来. 首先选择系统时钟,打开STM8S中文参考手册,找到时钟寄存器 可以看到 ...

  6. N76E003 学习一 点亮LED

    //这3个头文件一般是必须的 #include "N76E003.h" #include "SFR_Macro.h" #include "Functi ...

  7. 配置STM32寄存器控制GPIO点亮LED

    STM32点亮LED 寄存器方式 IO简介 1.每个IO可以自由编程,但是IO口寄存器必须按照32位字被访问. 2.每个IO端口都有7个寄存器来控制. CRL [0-7]端口配置寄存器  32位 CR ...

  8. 嵌入式开发学习之--点亮LED灯(上)

    在嵌入式学习里,点亮LED灯的地位就如同编程语言学习里的"hello world",是每个初学者都必须经历的一关,因为点亮了LED灯,至少可以说明几件事: 1.开发环境没问题,包括 ...

  9. STm32 使用 stm32cube GPIO 点亮 led 的

    有关软件的使用以及其它准备工作请参考:使用HAL库.STM32CubeMX和Keil 5开发入门教程(一):点亮一盏LED灯(NUCLEO-F411RE) 一.API说明 HAL库一共包含如下6个IO ...

最新文章

  1. Python实现五子棋人机对战 | CSDN博文精选
  2. 世界上有哪些代码量很少,但很牛逼很经典的算法或项目案例?
  3. math-neon基于NEON指令的数学库
  4. 转:性能测试中的性能测试指标与用户体验分析
  5. AIDE支持实时错误检查、代码重构、代码智能导航、生成APK
  6. flutter 获取定位_从头开发一个Flutter插件(二)高德地图定位插件
  7. 如何配置Xshell连接Ubuntu
  8. 整数大小比较(信息学奥赛一本通-T1043)
  9. 《Go 语言程序设计》读书笔记 (五) 协程与通道
  10. java 自定义报表_设计好的报表是如何在 web 上显示的
  11. mysql数据库练习题_50道SQL练习题及答案(MySQL版)
  12. verilog简单驱动VGA
  13. ICP经营许可证办理流程有哪些?
  14. 给虚拟机下载安装jdk,hadoop等(非常详细的步骤)
  15. 计算机网络——局域网(期末复习)
  16. 视频教程-PR教程-Premiere 2020影视剪辑实战精讲-其他
  17. IP地址,子网掩码和网关
  18. eclipse安装PyDev-使用eclipse开发python
  19. numpy中rand与randn的区别
  20. mysql逻辑运算符的优先顺序_布尔逻辑算符的类型和在检索式中优先执行的顺序...

热门文章

  1. css实现word下划线
  2. graph使泳道图的label横向显示
  3. 卸载 Creative Cloud 桌面应用程序 - 操作篇
  4. 13级计算机商务沟通与礼仪结课论文,计算机组装和维护结课论文
  5. 使用 FFmpeg 批量转换视频格式 mp4转ts(bat命令行)
  6. 云脉名片识别 名片管理 名片扫描
  7. 0xc0000001
  8. 关于STM32 RTC时钟使用内部/外部晶振的切换方法
  9. android充值金币功能,运营人员必读:手机游戏充值流程及问题详解
  10. python金融工程的工具包_《华尔街学堂:三大金融技能工具——Wind. Excel 与 Python》...