GPIO库的API用法

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

1.导入库

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

import Jetson.GPIO as GPIO

通过这种方式,您可以在应用程序的其余部分中将该模块称为GPIO。模块也可以使用RPi的名称导入。GPIO代替了Jetson。GPIO用于使用RPi库的现有代码。

2.引脚编号

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

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

GPIO.setmode(GPIO.BOARD)# or

GPIO.setmode(GPIO.BCM)# or

GPIO.setmode(GPIO.CVM)# or

GPIO.setmode(GPIO.TEGRA_SOC)

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

mode = GPIO.getmode()

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

3.警告

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

GPIO.setwarnings(False)

4.设置通道

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

GPIO.setup(channel, GPIO.IN)

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

GPIO.setup(channel, GPIO.OUT)

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

GPIO.setup(channel, GPIO.OUT, initial=GPIO.HIGH)

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

channels = [18, 12, 13]

GPIO.setup(channels, GPIO.OUT)

5.输入

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

GPIO.input(channel)

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

6.输出

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

GPIO.output(channel, state)

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

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

channels = [18, 12, 13] # or use tuples

GPIO.output(channels, GPIO.HIGH) # or GPIO.LOW

set first channel to HIGH and rest to LOW

GPIO.output(channel, (GPIO.LOW, GPIO.HIGH, GPIO.HIGH))

7.清理

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

GPIO.cleanup()

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

GPIO.cleanup(chan1) # cleanup only chan1

GPIO.cleanup([chan1, chan2]) # cleanup only chan1 and chan2

GPIO.cleanup((chan1, chan2)) # does the same operation as previous statement

8.jetson模块信息和库版本

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

GPIO.JETSON_INFO

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

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

GPIO.VERSION

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

9.中断

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

wait_for_edge()函数

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

GPIO.wait_for_edge(channel, GPIO.RISING)

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

timeout is in milliseconds

GPIO.wait_for_edge(channel, GPIO.RISING, timeout=500)

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

event_detected()函数

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

set rising edge detection on the channel

GPIO.add_event_detect(channel, GPIO.RISING)

run_other_code()

if GPIO.event_detected(channel):

do_something()

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

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

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

define callback function

def callback_fn(channel):

print("Callback called from channel %s" % channel)

add rising edge detection

GPIO.add_event_detect(channel, GPIO.RISING, callback=callback_fn)

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

def callback_one(channel):

print("First Callback")

def callback_two(channel):

print("Second Callback")

GPIO.add_event_detect(channel, GPIO.RISING)

GPIO.add_event_callback(channel, callback_one)

GPIO.add_event_callback(channel, callback_two)

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

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

bouncetime set in milliseconds

GPIO.add_event_detect(channel, GPIO.RISING, callback=callback_fn,bouncetime=200)

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

GPIO.remove_event_detect(channel)

10.检查GPIO通道的功能

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

GPIO.gpio_function(channel)

该函数返回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的详细信息

完整英文版说明见: https://github.com/NVIDIA/jetson-gpio