jetson nano GPIO控制说明-程序员宅基地

技术标签: python  嵌入式硬件  jetson nano  

一.GPIO介绍

GPIO(General Purpose Input Output)通用输入输出。有时候我们会简称为“IO口”。GPIO口在智能硬件开发中是一个比较重要的概念,用户可以通过GPIO口和硬件进行数据交互(如UART),控制硬件工作(如LED、蜂鸣器等),读取硬件的工作状态信号(如中断信号)等。Jetson TX1、TX2、AGX Xavier和Nano开发板包含一个40针GPIO接头,类似于树莓派中的40针接头。可以使用Jetson GPIO library包中提供的Python库或者C++库控制这些GPIO的数字输入和输出。该库与Raspberry Pi的RPi.GPIO库具有相同的API,以便提供将在Raspberrry Pi上运行的应用程序移动到Jetson板的简单方法。
GPIO四种模式:

  • BOARD
  • BCM
  • CVM
  • TEGRA_SOC

提示:四种模式可以分为两组:BOARD和BCM一组,CVM和TEFRA_SOC一组。其中,前两种源于RPi.GPIO library,因此Jetson Nano的引脚对照和树莓派一致,大家再开发学习时,可以参照树莓派.
在这里插入图片描述

在这里插入图片描述

二.安装GPIO库

python库

  1. jetson nano原版本系统自带,但是也可以直接pip安装或者官网下载源代码安装

    # pip直接安装
    sudo pip install Jetson.GPIO
    
    # 或者下载代码进行安装
    sudo python3 setup.py install
    
    
  2. 设置用户权限,为了使用Jetson GPIO库,必须首先设置正确的用户权限/组。创建新的gpio用户组。然后将用户添加到新创建的组中。

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

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

    • 如果是将源代码下载到Jetson.GPIO:

      sudo cp lib/python/Jetson/GPIO/99-gpio.rules /etc/udev/rules.d/
      
    • 如果是使用pip安装的Jetson.GPIO,则在虚拟环境中使用pip:

      sudo cp venv/lib/pythonNN/site-packages/Jetson/GPIO/99-gpio.rules /etc/udev/rules.d/
      
  3. 最后需要通过运行以下命令重新启动或重新加载udev规则:

    sudo udevadm control --reload-rules && sudo udevadm trigger
    

C++库

  1. 从官网克隆代码

    git clone https://github.com/pjueon/JetsonGPIO
    
  2. 创建构建目录并将目录更改为该目录。

    cd JetsonGPIO
    mkdir build && cd build
    
  3. 配置cmake

    cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_EXAMPLES=ON
    # 参数选项说明
    -DCMAKE_INSTALL_PREFIX=/usr # 选择基础安装目录
    -DBUILD_EXAMPLES=ON # 选择创建samples
    
  4. 构建以及安装库

    sudo make install
    

三.几种常用的通信协议

上面介绍了什么是GPIO口以及如何安装 GPIO库,但是我们还不能立即去使用。我们还得再了解一下几个常用的通信协议,这样我们才能愉快的使用。

UART

UART(Universal Asynchronous Receiver and Transmitter)是一种非常常见的接口或协议,几乎在每台计算机或微处理器上都可以找到它,中文我们一般称为通用异步收发传输器,也称其为RS-232标准。该协议是全双工协议,它也是一种包括特定通信的电子、机械和物理特性的全面标准。当在总线上发送数据时,数据电平需要转换成适合RS-232总线的电平,在总线上传输器发送不断变化的电压。高于3V的电压值即为逻辑0,而低于-3V的电压值即为逻辑1,-3~3V之间的电压值被称为不确定状态。
在这里插入图片描述

很多传感器在其输出引脚上都能使用UART通信协议,我们就可以使用这些传感器与我们的树莓派和Nano通信。

PWM

PWM(Pulse Width Modulation)脉冲宽度调制(简称脉宽调制,通俗的讲就是调节脉冲的宽度),是电子电力应用中非常重要的一种控制技术 。简单的说,PWM就是在一个周期内,控制高电平多长时间,低电平多长时间PWM有非常广泛的应用,比如直流电机的无极调速,开关电源、逆变器等。
在这里插入图片描述

I2C

I2 C(Inter-Integrated Circuit)是一种用两条连线工作的半双工协议,只要发送端在发送数据,接收端就只能监听而不能发送数据,相反也是如此。市面上有一些带有I2C接口的16×2字符点阵LCD显示器模块,我们可以写一下程序在这块屏幕上显示。
在这里插入图片描述

I2S

I2S(Inter-IC Sound, Integrated Interchip Sound)是飞利浦在1986年定义(1996年修订)的数字音频传输标准,用于数字音频数据在系统内部器件之间传输,例如编解码器CODEC、DSP、数字输入/输出接口、ADC、DAC和数字滤波器等。
在这里插入图片描述

SPI

SPI(Serial Peripheral Interface)串行外围设备接口是一种全双工短距单主设备通信协议,与UART不同,它是一种同步通信协议。SPI简单的连接方式之一是单主从连接,如图所示。一般来说,总共有4条数据线,分别是时钟(SCLK)、主入从出 (Master In Slave Out,MISO)、主出从入 (Master Out Slave In,MOSI)以及片选(CS)。
在这里插入图片描述
注意:NVIDIA Jetson Nano的GPIO口输入的电压为3.3v,大家确保输入电压不要超过3.3V,否则你的板子可能会坏。

四.控制函数说明

python(参考

  1. 设置GPIO的引脚定义

    GPIO.setmode(GPIO.BOARD)
    # or
    GPIO.setmode(GPIO.BCM)
    # or
    GPIO.setmode(GPIO.CVM)
    # or
    GPIO.setmode(GPIO.TEGRA_SOC)
    
  2. 消除警告

    GPIO.setwarnings(False)
    
  3. 设置一个引脚的模式

    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)
    
  4. 读取引脚的值

    GPIO.input(channel) #返回值为GPIO.LOW or GPIO.HIGH
    
  5. 设置引脚的值

    GPIO.output(channel, state) #state可以是GPIO.LOW or GPIO.HIGH
    
  6. 清除所有引脚的设置

    GPIO.cleanup() #清除所有引脚的值
    GPIO.cleanup([chan1, chan2]) #清除部分引脚的值
    
  7. 设置中断

    #第二个参数指定要检测的边缘,可以是GPIO.RISING、GPIO.FALLING或GPIO.BOTH。
    #如果您只想将等待时间限制为指定的时间,可以选择设置超时:
    GPIO.wait_for_edge(channel, GPIO.RISING)
    GPIO.wait_for_edge(channel, GPIO.RISING, timeout=500)
    
  8. 事件检测

    GPIO.add_event_detect(channel, GPIO.RISING)
    run_other_code()
    if GPIO.event_detected(channel):
        do_something()
    
  9. 事件回调函数

    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)
    

C++

  1. cmake链接库

    find_package(JetsonGPIO)
    target_link_libraries(mytarget JetsonGPIO)
    
  2. 程序导入库

    #include <JetsonGPIO.h>
    using namespace GPIO;
    
  3. 设置GPIO的引脚定义

    GPIO::setmode(GPIO::BOARD);
    // or
    GPIO::setmode(GPIO::BCM);
    // or
    GPIO::setmode(GPIO::CVM);
    // or
    GPIO::setmode(GPIO::TEGRA_SOC);
    
  4. 消除警告

    GPIO::setwarnings(false);
    
  5. 设置一个引脚的模式

    GPIO::setup(channel, GPIO::IN);
    GPIO::setup(channel, GPIO::OUT);
    GPIO::setup(channel, GPIO::OUT, GPIO::HIGH);
    
  6. 读取引脚的值

    int value = GPIO::input(channel);
    
  7. 设置引脚的值

    GPIO::output(channel, state); //GPIO::LOW(== 0) or GPIO::HIGH(== 1)
    
  8. 清除所有引脚的设置

    GPIO::cleanup();
    
  9. 设置中断

    #第二个参数指定要检测的边缘,可以是GPIO.RISING、GPIO.FALLING或GPIO.BOTH。
    #如果您只想将等待时间限制为指定的时间,可以选择设置超时:
    GPIO::wait_for_edge(channel, GPIO::RISING);
    
  10. 事件检测

    // set rising edge detection on the channel
    GPIO::add_event_detect(channel, GPIO::RISING);
    run_other_code();
    if(GPIO::event_detected(channel))
        do_something();
    
  11. 事件回调函数

    // you can also use callbacks witout any argument
    void callback_one() 
    {
          
        std::cout << "First Callback" << std::endl;
    }
    
    void callback_two() 
    {
          
        std::cout << "Second Callback" << std::endl;
    }
    
    GPIO::add_event_detect(channel, GPIO::RISING);
    GPIO::add_event_callback(channel, callback_one);
    GPIO::add_event_callback(channel, callback_two);
    

五.例程

在这里插入图片描述
在这里插入图片描述

import Jetson.GPIO as GPIO
import time
led_pin = 7
GPIO.setmode(GPIO.BOARD)
GPIO.setup(led_pin, GPIO.OUT)
try:

    while 1:
        print("on")
        GPIO.output(led_pin, GPIO.HIGH)
        time.sleep(2)
        print("off")
        GPIO.output(led_pin, GPIO.LOW)
        time.sleep(2)

except KeyboardInterrupt:
    GPIO.output(led_pin, GPIO.LOW)
    GPIO.cleanup()
print("done")

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_30150579/article/details/128470399

智能推荐

Docker 火了!外部网络可直接访问映射到 127.0.0.1 的服务。。。-程序员宅基地

文章浏览阅读130次。点击上方“Java基基”,选择“设为星标”做积极的人,而不是积极废人!每天14:00更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2021超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库中间件 Sharding-JDBC 和 MyCAT 源码解析...

教授专栏20 | 吴若昊团队: 利用血液游离DNA诊断败血症-程序员宅基地

文章浏览阅读462次。文 /吴若昊教授、敬秋雨博士2020年世界卫生组织发布全球首份败血症报告,呼吁对这一导致全世界1/5死亡的疾病采取全球行动。根据报告,败血症每年导致1100万人死亡,同时还使数百万人丧失能力,给医疗卫生系统造成了极大的负担和经济损失。另外有研究发现,COVID-19以及其他传染病的危重病人患败血症和死亡的风险更高。报告同时指出,通过及时发现和诊断败血症,可以极大程度降低..._敬秋雨

[百科] - SIP(会话发起协议)-程序员宅基地

文章浏览阅读387次。SIP(会话发起协议)SIP是类似于HTTP的基于文本的协议。SIP可以减少应用特别是高级应用的开发时间。由于基于IP协议的SIP利用了IP网络,固定网运营商也会逐渐认识到SIP技术对于他们的深远意义。SIPSIP(Session Initiation Protocol)是一个应用层的信令控制协议。用于创建、修改和释放一个或多个参与者的会话。这些会话可以是Internet多媒体会议[1] 、I..._itu-t提出sip

iOS 开发中常用的排序(冒泡、选择、快速、插入、希尔、归并、基数)算法-程序员宅基地

文章浏览阅读48次。https://www.cnblogs.com/ZachRobin/p/7094852.html1、冒泡排序:  冒泡算法是一种基础的排序算法,这种算法会重复的比较数组中相邻的两个元素。如果一个元素比另一个元素大(小),那么就交换这两个元素的位置。重复这一比较直至最后一个元素。这一比较会重复n-1趟,每一趟比较n-j次,j是已经排序好的元素个数。每一趟比较都能找出未排序元素中最大..._ios开发升序排序

运营必备九大互联网思维-程序员宅基地

文章浏览阅读8.9k次。Hello,大家好。今天给大家分享的是九大互联网思维。互联网思维,即在互联网的大背景下,对产品、用户、市场进行重新审视的思考方式。01 用户思维(关于管理者和消费者)用户思维是互联网思维最最重要的一个,包括三点:(1)得用户者得天下,用户是核心,让用户有满足感。用户是谁?中国十几亿人口,根据二八法则,80%都是屌丝,得屌丝者得天下。案例:微信、QQ汇集广大普通民众。(2)对于用户不仅要满足功能上的需求,更要洞察他们的情感需求,要感同身受,让他们有参与感,让用户主导产品的变化,进行更好_互联网思维

【序列dp】最长上升子序列(一)_最长上升子序列 dp-程序员宅基地

文章浏览阅读435次。登山的变体,求整个队列个数-max(每个点的最大上升序列+最大下降序列-1)但是有的区间为空,当a[k] >= a[i]时,即不满足上升子序列。计算时:a[i]=Math.max(满足条件的a[k])集合表示:所有以a[i]结尾的最长上升子序列。LIS的双向求解,主要掌握求最长下降序列,即。考虑如何计算,一般考虑最后一个点,可以取。空,a[0],a[1],…属性为Max即长度的最大值。_最长上升子序列 dp

随便推点

关于kettle配置SQL SERVER2008的说明_kettle sqlserver2008 jar-程序员宅基地

文章浏览阅读1.6k次。经过多次尝试发现kettle联结数据库需要两个前提条件:1.需要将sql2008相关的.jar包复制到lib目录下。2:需要以管理员的身份将SQL SERVER BROWSER服务启动,默认是禁用的,需要通过属性将其设为自动,然后将其启动。然后就是相关的设置,这里需要说明一点的是Instance Name(即数据库实例名称,默认是MSSQLSERVER),DataBase Name:为你需要使用的_kettle sqlserver2008 jar

java获取文件编码_java如何获取文件编码格式-程序员宅基地

文章浏览阅读1.4k次。1:简单判断是UTF-8或不是UTF-8,因为一般除了UTF-8之外就是GBK,所以就设置默认为GBK。按照给定的字符集存储文件时,在文件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原理就是只要读出文件前三个字节,判定这些字节的值,就可以得知其编码的格式。其实,如果项目运行的平台就是中文操作系统,如果这些文本文件在项目内产生,即开发人员可以控制文本的编码格式,只要判定两种常见的编码就可..._java 获取文件编码

MUI简介-最接近原生App体验的前端框架-程序员宅基地

文章浏览阅读172次。MUI简介-最接近原生App体验的前端框架一、总结一句话总结:最接近原生App体验的前端框架二、多端发布 – 开发一套代码,发布六个平台真正彻底的跨平台开发,不是简单的跨iOS和Android。基于mui,一套HTML5工程,通过前端构建工具(如grunt)条件编译,可同时发行到iOS Appstore、安卓各大应用商店、普通手机浏览器、微..._mui原生

CSS排版-程序员宅基地

文章浏览阅读42次。CSS样式菜单:<style type="text/css"> #form1 { width: 100%; /*如果要让form1居中显示,需要设置一个常规宽度不能设置为100%,否则在IE里面form1将会满屏显示*/ background-color: Gray; pa..._css让不同字大小在中位线上

图书管理员,c++_图书管理员c++-程序员宅基地

文章浏览阅读1k次,点赞2次,收藏4次。小 D 刚刚当上图书馆的管理员,她知道图书馆里所有书的图书编码,她请你帮她写一个程序,对于每一位读者,求出他所需要的书中图书编码最小的那本书,如果没有他需要的书,请输出 −1。输出文件有 q 行,每行包含一个整数,如果存在第 i 个读者所需要的书,则在第 i 行输出第 i 个读者所需要的书中图书编码最小的那本书的图书编码,否则输出 −1。接下来的 q 行,每行包含两个正整数,以一个空格分开,第一个正整数代表图书馆里读者的需求码的长度,第二个正整数代表读者的需求码。_图书管理员c++

实验4-2-7 找完数 (20分)-程序员宅基地

文章浏览阅读3k次。所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。输入格式:输入在一行中给出2个正整数m和n(1<m≤n≤10000),中间以空格分隔。输出格式:逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + … + 因子k”,其中完数和因子均按递增顺序给出。若区间内没有完数,则输出“None”。输入样例:2 30输出样例:6 = 1 + 2 +

推荐文章

热门文章

相关标签