美文网首页Isaac SDKNvidia Jetson
Jetson.GPIO-适用于Tegra的Linux

Jetson.GPIO-适用于Tegra的Linux

作者: YottaYuan | 来源:发表于2020-03-16 01:57 被阅读0次

    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

        本文链接:https://www.haomeiwen.com/subject/rffkjhtx.html