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库软件包还包含以下内容:
该
lib/python/
子目录包含实现所有库功能的Python模块。gpio.py模块是将被导入到应用程序中的主要组件,并提供所需的API。的gpio_event.py
和gpio_pin_data.py
模块用于通过gpio.py
模块和不能在给应用程序直接导入。该
samples/
子目录包含在越来越熟悉库API和应用程序入门示例应用程序的帮助。在simple_input.py
和simple_output.py
应用程序显示了如何进行分别读取和写入到GPIO引脚,而button_led.py
,button_event.py
并button_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/
可以使用目录中提供的示例应用程序 。下面介绍每个应用程序的操作:
simple_input.py
:此应用程序使用BCM引脚编号模式,并读取40引脚接头连接器的引脚12上的值,并将该值打印到屏幕上。simple_out.py
:此应用程序使用Raspberry Pi的BCM引脚编号模式,每隔2秒在BCM引脚18(或接头板上的板卡引脚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五次。
如果将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);
}