Jetson.GPIO-适用于Tegra的Linux

Jetson.GPIO-适用于Tegra的Linux

https://github.com/NVIDIA/jetson-gpio

Jetson TX1,TX2,AGX Xavier和Nano开发板包含一个40针GPIO接头,类似于Raspberry Pi中的40针接头。可以使用Jetson GPIO库软件包中提供的Python库来控制这些GPIO的数字输入和输出。该库与用于Raspberry Pi的RPi.GPIO库具有相同的API,以便提供一种将在Raspberry Pi上运行的应用程序移动到Jetson板上的简便方法。

本文档介绍了Jetson GPIO库软件包中包含的内容,如何配置系统和运行提供的示例应用程序以及库API。

包装组件

除本文档外,Jetson GPIO库软件包还包含以下内容:

  1. lib/python/子目录包含实现所有库功能的Python模块。gpio.py模块是将被导入到应用程序中的主要组件,并提供所需的API。的gpio_event.pygpio_pin_data.py模块用于通过gpio.py模块和不能在给应用程序直接导入。

  2. samples/子目录包含在越来越熟悉库API和应用程序入门示例应用程序的帮助。在 simple_input.pysimple_output.py应用程序显示了如何进行分别读取和写入到GPIO引脚,而button_led.pybutton_event.pybutton_interrupt.py说明如何将按钮按压可用于闪烁一个分别使用忙等待,阻塞等待和中断回调LED。

安装

使用点子

安装该库的最简单方法是使用pip

sudo pip安装Jetson.GPIO

说明书下载

您可以克隆此git存储库,或下载其副本作为存档文件并解压缩。您可以将库文件放置在系统上任意位置。您可以通过手动设置直接在此目录中使用该库PYTHONPATH,或使用setup.py以下方法安装它:

sudo python3 setup.py安装

设置用户权限

为了使用Jetson GPIO库,必须首先设置正确的用户权限/组。

创建一个新的gpio用户组。然后将您的用户添加到新创建的组中。

须藤groupadd -f -r gpio
sudo usermod -a -G gpio your_user_name

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

如果已将源下载到Jetson.GPIO:

须藤cp lib / python / Jetson / GPIO / 99-gpio.rules /etc/udev/rules.d/

如果您从软件包中安装了Jetson.GPIO,例如使用pip进入虚拟环境:

须藤cp venv / lib / pythonNN / site-packages / Jetson / GPIO / 99-gpio.rules /etc/udev/rules.d/

为了使新规则生效,您需要通过运行以下命令重新引导或重新加载udev规则:

sudo udevadm控制-重新加载规则&& sudo udevadm触发器

运行示例脚本

通过根据需要设置权限,samples/可以使用目录中提供的示例应用程序 。下面介绍每个应用程序的操作:

  1. simple_input.py:此应用程序使用BCM引脚编号模式,并读取40引脚接头连接器的引脚12上的值,并将该值打印到屏幕上。

  2. simple_out.py:此应用程序使用Raspberry Pi的BCM引脚编号模式,每隔2秒在BCM引脚18(或接头板上的板卡引脚12)输出高低交替值。

  3. button_led.py:此应用程序使用BOARD引脚编号。它需要一个连接到引脚18和GND的按钮,一个将引脚18连接到3V3的上拉电阻以及一个连接到引脚12的LED和一个限流电阻。应用程序读取按钮状态,并每次将LED保持点亮1秒钟。按下按钮。

  4. button_event.py:此应用程序使用BOARD引脚编号。它需要一个连接到引脚18和GND的按钮,一个将该按钮连接到3V3的上拉电阻以及一个连接到引脚12的LED和一个限流电阻。该应用程序执行与button_led.py相同的功能,但执行阻塞等待按钮按下事件,而不是连续检查该引脚的值以减少CPU使用率。

  5. button_interrupt.py:此应用程序使用BOARD引脚编号。它需要一个连接到引脚18和GND的按钮,一个将按钮连接到3V3的上拉电阻,一个连接到引脚12的LED和限流电阻以及连接到引脚13的另一个LED和电流限制电阻。仅当按下按钮时,第一个LED才会连续且快速地闪烁第二个LED五次。

如果将Jetson.GPIO添加到PYTHONPATH,则要运行这些示例应用程序:

python3 < name_of_application_to_run >

或者,如果未将Jetson.GPIO添加到PYTHONPATH,则该run_sample.sh 脚本可用于运行这些示例应用程序。在samples /目录中,可以使用以下命令完成此操作:

./run_sample.sh < name_of_application_to_run >

脚本的用法也可以通过以下方式查看:

./run_sample.sh -h
./run_sample.sh-帮助

完整的库API

Jetson GPIO库提供RPi.GPIO库提供的所有公共API。下面讨论每种API的用法:

1.导入库

要导入Jetson.GPIO模块,请使用:

进口 Jetson。GPIO  作为 GPIO

这样,您可以在整个应用程序的其余部分中将该模块称为GPIO。对于使用RPi库的现有代码,也可以使用名称RPi.GPIO而不是Jetson.GPIO导入模块。

2.引脚编号

Jetson GPIO库提供了四种给I / O引脚编号的方法。前两个对应于RPi.GPIO库提供的模式,即BOARD和BCM,分别引用40引脚GPIO接头连接器的引脚号和Broadcom SoC GPIO编号。其余两种模式CVM和TEGRA_SOC使用字符串代替数字,而数字分别对应于CVM / CVB连接器和Tegra SoC上的信号名称。

要指定您正在使用哪种模式(强制性),请使用以下函数调用:

GPIO .setmode(GPIO。BOARD)
 #或
GPIO .setmode(GPIO。BCM)
 #或
GPIO .setmode(GPIO。CVM)
 #或
GPIO .setmode(GPIO。TEGRA_SOC)

要检查已设置的模式,可以调用:

模式=  GPIO .getmode()

该模式必须为GPIO.BOARD,GPIO.BCM,GPIO.CVM,GPIO.TEGRA_SOC或无。

3.警告

您尝试使用的GPIO可能已在当前应用程序外部使用。在这种情况下,如果使用的GPIO配置为除默认方向(输入)以外的任何值,Jetson GPIO库将向您发出警告。如果您在设置模式和通道之前尝试清理,它也会警告您。要禁用警告,请致电:

GPIO .setwarnings(False)

4.设置频道

在用作输入或输出之前,必须先设置GPIO通道。要将通道配置为输入,请调用:

#(其中信道是基于管脚号模式如上所述)
GPIO .setup(信道, GPIO。 IN)

要将通道设置为输出,请调用:

GPIO .setup(信道,GPIO。OUT)

也可以为输出通道指定一个初始值:

GPIO .setup(信道,GPIO。OUT,初始= GPIO。HIGH)

将一个通道设置为输出时,也可以一次设置多个通道:

#根据需要添加尽可能多的频道。也可以使用元组:(18,12,13) 
信道 = [ 18, 12, 13 ]
 GPIO .setup(信道, GPIO。 OUT)

5.输入

要读取通道的值,请使用:

GPIO。输入(通道)

这将返回GPIO.LOW或GPIO.HIGH。

6.输出

要设置配置为输出的引脚的值,请使用:

GPIO。输出(通道,状态)

状态可以是GPIO.LOW或GPIO.HIGH。

您还可以输出到频道列表或元组:

渠道= [ 18,12,13 ] #或使用元组
GPIO .OUTPUT(信道,GPIO。HIGH)#或GPIO.LOW 
#设定的第一信道为HIGH和休息到LOW 
GPIO .OUTPUT(信道,(GPIO。LOW,GPIO。HIGH,GPIO。HIGH))

7.清理

在程序结束时,最好清理通道,以便将所有引脚设置为默认状态。要清理所有使用的频道,请致电:

GPIO .cleanup()

如果您不想清除所有通道,也可以清除单个通道或通道列表或元组:

GPIO .cleanup(chan1)#仅清理chan1 
GPIO .cleanup([chan1,chan2])#仅清理chan1和chan2 
GPIO .cleanup((chan1,chan2))   #执行与先前语句相同的操作

8. Jetson董事会信息和图书馆版本

要获取有关Jetson模块的信息,请使用/阅读:

GPIO。JETSON_INFO

这为Python词典提供了以下键:P1_REVISION,RAM,REVISION,TYPE,MANUFACTURER和PROCESSOR。字典中的所有值都是字符串,但P1_REVISION是整数。

要获取有关库版本的信息,请使用/阅读:

GPIO。版

这提供了XYZ版本格式的字符串。

9.中断

除了忙轮询之外,该库还提供了三种监视输入事件的方法:

wait_for_edge()函数

该函数阻塞调用线程,直到检测到提供的边缘为止。该函数可以如下调用:

GPIO .wait_for_edge(信道,GPIO。瑞星)

第二个参数指定要检测的边缘,可以是GPIO.RISING,GPIO.FALLING或GPIO.BOTH。如果只想将等待时间限制为指定的时间,则可以选择设置超时:

#超时是毫秒
GPIO .wait_for_edge(信道, GPIO。瑞星,超时= 500)

该函数返回检测到边缘的通道;如果发生超时,则返回无。

event_detected()函数

此功能可用于定期检查自上次通话以来是否发生了事件。可以如下设置和调用该函数:

#集上升沿检测在信道上
GPIO .add_event_detect(信道, GPIO。瑞星)
run_other_code()
如果 GPIO .event_detected(channel):
    做点什么()

和以前一样,您可以检测GPIO.RISING,GPIO.FALLING或GPIO.BOTH的事件。

检测到边缘时运行回调函数

此功能可用于为回调函数运行第二个线程。因此,响应边缘,回调函数可以与主程序并发运行。此功能可以按如下方式使用:

#定义回调函数
def  callback_fn( channel):
     print( “从通道%s调用的回调” %通道)

#添加上升沿检测
GPIO .add_event_detect(信道, GPIO。瑞星,回调= callback_fn)

如果需要,还可以添加多个回调:

def  callback_one(channel):
     打印(“ First Callback ”)

def  callback_two(channel):
     打印(“ Second Callback ”)

GPIO .add_event_detect(信道,GPIO。瑞星)
 GPIO .add_event_callback(信道,callback_one)
 GPIO .add_event_callback(信道,callback_two)

在这种情况下,这两个回调是顺序运行的,而不是同时运行,因为只有线程运行所有回调函数。

为了通过将多个事件折叠为一个事件来防止多次调用回调函数,可以选择设置反跳时间:

# bouncetime集毫秒
GPIO .add_event_detect(信道, GPIO。瑞星,回调= callback_fn,
 bouncetime = 200)

如果不再需要边缘检测,可以按以下步骤将其删除:

GPIO .remove_event_detect(通道)

10.检查GPIO通道的功能

此功能使您可以检查提供的GPIO通道的功能:

GPIO .gpio_function(通道)

该函数返回GPIO.IN或GPIO.OUT。

11. PWM

参见samples/simple_pwm.py以获取有关如何使用PWM通道的详细信息。

Jetson.GPIO库仅在附带硬件PWM控制器的引脚上支持PWM。与RPi.GPIO库不同,Jetson.GPIO库不实现软件仿真的PWM。Jetson Nano支持2个PWM通道,而Jetson AGX Xavier支持3个PWM通道。Jetson TX1和TX2不支持任何PWM通道。

系统引脚复用器必须配置为将硬件PWM控制器连接到相关引脚。如果未配置pinmux,则PWM信号将不会到达引脚!Jetson.GPIO库不会动态修改pinmux配置来实现此目的。阅读L4T文档以获取有关如何配置pinmux的详细信息。

Linux kernel

static inline int gpio_get_value(unsigned gpio)
{
    return __gpio_get_value(gpio);
}
 
static inline void gpio_set_value(unsigned gpio, int value)
{
    __gpio_set_value(gpio, value);
}

你可能感兴趣的:(Jetson.GPIO-适用于Tegra的Linux)