前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >菜鸟手册(4):在Jetson NANO上使用GPIO

菜鸟手册(4):在Jetson NANO上使用GPIO

作者头像
GPUS Lady
发布2019-06-19 15:20:02
9.4K0
发布2019-06-19 15:20:02
举报
文章被收录于专栏:GPUS开发者GPUS开发者

我们使用GPIO与NVIDIA Jetson Nano上的外部设备进行通信.

介绍

关于Jetson Nano的一个好处是有一个扩展头,它对通用输入输出(GPIO)非常有用。您可能已经考虑过打开或关闭灯光作为程序的输出,或者想要从外部按钮读取按下。这就是GPIO有用的地方!

在本文中,我们将介绍如何通过打开和关闭发光二极管(LED)来控制GPIO输出。这可能是如何使用GPIO的最基本的例子之一。

您可能已经听说过,Jetson Nano上的GPIO引脚布局与Raspberry Pi(RPi)的40引脚布局兼容。此外,还有一个Jetson GPIO python库,它主要与RPi.GPIO兼容。 Jetson.GPIO预装在标准的Jetson Nano镜像包里了。

话虽如此,请注意Jetson Nano上GPIO扩展接头的电气特性与Raspberry Pi不同。特别是,Jetson Nano在GPIO引脚上的流动电流远低于RPi。

例如,RPi可以直接从GPIO引脚驱动LED,而Jetson则因为电流不足而使LED灯光昏暗。 Jetson需要一些帮助。正如您将看到的,开关晶体管正在拯救!

LED电路

零件清单

以下是我们将在此电路中使用的部分:

一个5毫米红色LED

一个P2N2222晶体管

一个330Ω电阻

一个10kΩ电阻

若干电线

一块面包板将所有东西连接在一起

关于LED

led是这样的。它们不线性地使用电流。如果任其自生自灭,它们会在一股神奇的烟雾中毁灭自己(就是烧掉啦)。但我们可以确保这不会发生。通过添加一个电阻(在这个应用程序中称为限流电阻),我们将限制LED能够绘制的电流量。我们根据欧姆定律选择电阻。

天啊! 数学 …

电子学的基本规则之一是欧姆定律。 你可能听说过它。

欧姆定律的简述是:在同一电路中,通过某段导体的电流跟这段导体两端的电压成正比,跟这段导体的电阻成反比。

“这对我们意味着什么?”简而言之,我们可以通过巧妙地选择一个合适的电阻,来设定LED实际可吸收电流的上限。这是因为电阻的电流值与所施加的电压成正比。我们只需要知道一些关于LED的事情就可以计算出合适的电阻值。

首先,LED有所谓的正向电压,这基本上是阴极和阳极之间的最小电压差,你需要供应给LED。我们需要计算的另一件事是正向电流这是LED能够连续处理的最大电流量。

本例中的LED正向电流为20mA,正向电压为2.0V。我们将使用Jetson Nano 5V引脚驱动LED,所以我们从5V中减去正向电压,然后除以20mA (0.020A),就像欧姆定律告诉我们的那样:

我们得到150Ω的结果,这是流过这个特定LED安全的最大电流量的值。 这里有几点需要注意。 首先,电阻没有150Ω。 即使有做,它们也有一些内在的公差,这表明它们可能与实际规定的阻力有一些差异。 这通常是一小部分,但较小的廉价电阻可能约为20%! 这意味着对于额定值为150Ω的电阻,电阻可以在120-180Ω的范围内。

但以最大电流运行LED会影响其寿命。 通常,人们最终会使用220和470Ω之间的电阻来实现此应用。 我们将使用通用的330Ω。

关于这个晶体管

这样就能保护我们的LED小朋友了。但是正如我们所说的,由于Jetson Nano GPIO引脚不够强大,不足以单独驱动LED,所以需要一些帮助。我们将使用晶体管作为开关,为LED提供电流。

晶体管放大能力。我们将使用双极结晶体管(BJT)。BJTs有两种:PNP和NPN。我们将使用NPN晶体管,这是大多数低功耗开关电路所使用的。

我们正在制造最基本的晶体管开关电路。一个普通的开关需要一个机械装置来物理地启动电路。我们这里的开关将由电流控制从Jetson GPIO引脚发送到晶体管。来自Jetson的控制信号流入晶体管基座,发射极与地面连接,输出端与集电极相连。

电路

这是我们将使用的电路示意图:

L1是我们的5V LED

R1是LED的限流电阻

Q1是我们一直在讨论的晶体管,P2N2222

R2是基准电阻,它可以告知电路中有多少电流流过。

对于该电路,请使用NPN BJT晶体管

计算晶体管位

还有一点神秘感。当Jetson GPIO为低电平(0V)时,晶体管处于截止模式。它看起来像集电极和发射极之间的开路。

然而,有大量的电流施加到基极,此时晶体管开始“饱和”。这就像集电极和发射极之间的短路一样。那时,电流流动,我们的LED亮起来,一切都很美好和快乐。

在我们的示例中,基极电流由位于Jetson GPIO引脚和晶体管基极之间的基极电阻决定。基极电阻的功能与LED上的限流电阻大致相同。注意,晶体管的饱和度由电流决定,而不是由BJT中的电压决定。

需要更多的数学来确定基本电阻应该是什么值。

还有一个小技巧。我们需要再用一次欧姆定律。我们知道Jetson的GPIO是3.3v。除以0.00020a得到电阻,对吧?不。结果是,在我们需要考虑的基极和发射极之间有0.7V的落差。这种下降是由于晶体管基极到发射极的N-P结造成的。所以:

在该电路中,基极电阻的13000Ω值是集电极可以达到20mA的最大电阻。

您会注意到,在我们的电路中,我们使用的是10kΩ电阻而不是13kΩ。 这有几个原因。 首先,我们知道由于早期的限制电阻,LED不会吸收超过20mA的电流。 其次,13kΩ不是常见的电阻值,因此我们需要替代。 如果你想要安全,你会倾向于增大而不是减少。

布线

现在我们准备好把所有东西连接起来,让它旋转。LED和晶体管的电流都是单向流动的,并且都有正极和负极。对于LED来说,+是阳极,-是阴极。在一个5mm的LED上,正极通常有一个较长的腿,而负极通常在灯泡的边缘有一个平坦的点。

对于晶体管,集电极在正极,发射极在负极。引脚的排列取决于所选的特定零件。

根据上面的原理图,这里有一个接线图:

你需要检查你的晶体管。收集器、基极和发射器是不同的,这取决于您拥有的部件号。这里用的是P2N2222。我们将在Jetson上的引脚2上把红线连接到+5V,在引脚6上把黑线连接到GND,在引脚12上把晶体管基座连接到基极电阻上。下面的演示示例选择Pin 12。

软件

一旦一切都连接好了,我们就可以运行一些软件来让LED眨眼了。

我们可以从命令行控制我们的LED。以下是一些有用的命令:

# Map GPIO Pin # gpio79 is pin 12 on the Jetson Nano $ echo 79 > /sys/class/gpio/export # Set Direction $ echo out > /sys/class/gpio/gpio79/direction # Bit Bangin'! $ echo 1 > /sys/class/gpio/gpio79/value $ echo 0 > /sys/class/gpio/gpio79/value # Unmap GPIO Pin $ echo 79 > /sys/class/gpio/unexport # Query Status $ cat /sys/kernel/debug/gpio

在上面的代码中,79指的是Linux sysfs GPIO的gpio79。如果我们看一下Jetson Nano J41的Pinout,我们可以看到gpio79实际上是pin 12。

主要:除了电源引脚、地引脚、IIC和UART的引脚外,其他的所有插针引脚,在默认的Jetson配置下,都是GPIO。插针引脚边上的其他名字,则对应了当用户对设备树做出更改和重新映射引脚后,各自的推荐(特殊功能)用途。

Lady插一句:

这里有三点需要说的:

(1)大部分的器件的引荐要么做GPIO,要么具有特殊功能。

(2)特殊功能往往可以被重新映射,例如UART2(假设的)可以被映射到某3个引脚上,也可以被映射到另外的其他地方。很多板子在生产的时候,首选的映射位置会在电路板上标明。(但也有板子会标明所有的可选映射位置)。

(3)本文说明了默认配置下都是GPIO,但用户可以通过修改设备树的方式进行重新映射和功能指定。

为了能够访问GPIO引脚,您需要具有适当的权限。这可以通过两种方式实现。首先,可以从超级用户终端运行命令。打开终端执行:

$ sudo su

然后就可以使用正确的权限执行命令。此外,可以将权限分配给您所属的组。这通常是由:

$ sudo groupadd -f -r gpio $ sudo usermod -a -G gpio your_user_name

通过将99-gpio.rules文件复制到rules.d目录来安装自定义udev规则:

$ sudo cp /opt/nvidia/jetson-gpio/etc/99-gpio.rules /etc/udev/rules.d/

请注意,对于要执行的新规则,您可能需要通过发出以下命令来重新引导或重新加载udev规则:

sudo udevadm control --reload-rules && sudo udevadm trigger

这个顺序来自Jetson- gpio Python库文档,它安装在默认的Jetson Nano镜像中:/opt/nvidia/ Jetson- gpio/doc/README.txt。

Jetson.GPIO Python库

有一个适用于Python的官方Jetson.GPIO库。 Jetson.GPIO库旨在与RPi.GPIO兼容。 我们可以运行Sample以获得简单的输出来控制我们的LED:

$ cd / opt / nvidia / jetson-gpio / samples

$ sudo ./run_samples.sh simple_out.py

run_samples.sh脚本设置Jetson.GPIO库的路径,并调用simple_out.py来点亮连接到GPIO头上的PIN 12的LED。

这只是触及Jetson.GPIO库,实际可用的比这更丰富。

结论

虽然打开和关闭LED似乎很多步骤,但我们现在有了通过Jetson GPIO header 控制外部设备的基础。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GPUS开发者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档