jetson nano 和树莓派一样作为嵌入式设备提供了GPIO接口,其位置如下图红色框选部分。
其中部分引脚功能已标注丝印具体功能如下表所示:
NVIDIA官方提供了基于python的JetsonGPIO库用来控制GPIO,这样可以方便在人工智能程序中进行GPIO控制。
这里我使用的是jupyterLab,在官方提供的镜像中,这个是自带的,如果你没有的话需要下载安装,但是如果你有屏幕键鼠全套的话,其实也不用。
首先在命令行输入下面的指令:
安装Jetson.GPIO库:
sudo pip install Jetson.GPIO
sudo pip3 install Jetson.GPIO
设置用户权限:
sudo groupadd -f -r gpio
sudo usermod -a -G gpio your_user_name
将99-gpio.rules文件复制到rules.d目录
sudo cp lib/python/Jetson/GPIO/99-gpio.rules /etc/udev/rules.d/
重载rules规则来让文件生效
sudo udevadm control --reload-rules && sudo udevadm trigger
由于官方镜像已经安装配置好了,所以没有配置截图。
cd /opt/nvidia/jetson-gpio/samples/
该文件夹中包含几个示例文件:
运行simple_out.py,将二极管的正极连接丝印12的针脚,负极连接一个GND针脚,LED灯就会两秒灭两秒暗。
import Jetson.GPIO as GPIO
这里就对上面的四种模式进行说明:
设置方式:
GPIO.setmode(GPIO.BOARD)
# or
GPIO.setmode(GPIO.BCM)
# or
GPIO.setmode(GPIO.CVM)
# or
GPIO.setmode(GPIO.TEGRA_SOC)
如果要检查当前的引脚编号模式使用下面的语句:
mode = GPIO.getmode()
获得的结果mode是上面四种中的一个或者为空(None)
您尝试使用的GPIO可能已在当前应用程序外部使用。在这种情况下,如果使用的GPIO配置为除默认方向(输入)以外的任何值,Jetson GPIO库将向您发出警告。如果在设置模式和通道之前尝试清理,它也会警告您。要禁用警告,请使用下面的语句:
GPIO.setwarnings(False)
在用作输入输出之前,针脚必须先设置GPIO输出输出模式,要将通道配置为输入使用:
GPIO.setup(channel, GPIO.IN)
要设置输出:
GPIO.setup(channel, GPIO.OUT)
要指定初始值(以初始值为高电平为例):
GPIO.setup(channel, GPIO.OUT, initial=GPIO.HIGH)
一次性设置多个针脚:
# 你可以随意的增加通道数,你也可以使用元组来代替列表: (18,12,13)
channels = [18, 12, 13]
GPIO.setup(channels, GPIO.OUT)
要读取通道(针脚)的值:
GPIO.input(channel)
返回值为:GPIO.LOW 或者 GPIO.HIGH.
设置一个针脚的输出:
GPIO.output(channel, state)
channels = [18, 12, 13] # 或使用元组
# 设置全为高(或低)
GPIO.output(channels, GPIO.HIGH) # 或GPIO.LOW
# 分别设置三个通道的电平(通道和状态数量要一致)
GPIO.output(channels, (GPIO.LOW, GPIO.HIGH, GPIO.HIGH))
在程序结束时最好清理通道,将引脚设置为默认状态,下面的语句就可以清理所有通道:
GPIO.cleanup()
如果不想清除所有通道,也可以清除单个通道或通道列表或元组:
GPIO.cleanup(chan1) # 仅清理chan1
GPIO.cleanup([chan1, chan2]) # 仅清理chan1和chan2
GPIO.cleanup((chan1, chan2)) # 和上一句相同
获取模块信息使用下面的语句:
GPIO.JETSON_INFO
库版本的信息使用下面的语句:
GPIO.VERSION
除了轮询外,该库还提供了三种事件监听方法:
WAIT_FOR_EDGE() 函数
他可以阻塞线程,知道检测到信号发生为止,函数调用如下:
GPIO.wait_for_edge(channel, GPIO.RISING)
如果只想将等待时间限制为指定的时间,则可以选择设置超时:
# timeout为毫秒值
GPIO.wait_for_edge(channel, GPIO.RISING, timeout=500)
EVENT_DETECTED() 函数
这个函数可以检测在某一通道上是否接收到了某一信号,其使用方式如下:
GPIO.add_event_detect(channel, GPIO.RISING)
run_other_code()
if GPIO.event_detected(channel):
do_something()
当检测到某一信号时运行回调函数
回调函数可以与主程序并发运行,因为两者不在同一个线程,使用方法如下:
# 定义回调函数
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 设置的是毫秒值
GPIO.add_event_detect(channel, GPIO.RISING, callback=callback_fn,
bouncetime=200)
如果不再需要信号检测,则可以按以下步骤将其删除:
GPIO.remove_event_detect(channel)
使用下面的语句可以检测GPIO通道的功能:
GPIO.gpio_function(channel)
该函数返回GPIO.IN或GPIO.OUT。
请参阅示例文件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控制器连接到相关引脚。如果未配置引脚复用器,则PWM信号将不会到达引脚!Jetson.GPIO库不会动态修改引脚复用器配置来实现此目的。