Qt调用Python脚本读取JetsonNano开发板GPIO电平信号

一、简介

1.实现功能

能够实时读取JetsonNano开发板GPIO口的电平信号,并将读到的电平信号返回到Qt主程序中

2.环境工具

开发板:JetsonNano
系统:Ubuntu
语言:C/C++,python

二、准备工作

1.JetsonNano开发板GPIO口介绍

GPIO.png

JetsonNano的引脚与树莓派相似,有两种定义模式,一种是BCM编码,对应的是GPIO功能编码(图中Sysfs GPIO),一种是物理引脚编码,即BOARD编码(图中Pin)。

2.查看开发板是否预装了GPIO口的运行环境

cd /opt/nvidia/jetson-gpio

一般默认是安装好的,如果没有安装好,依次执行一下命令

安装pip工具
 sudo apt-get update
 sudo apt-get install python-pip
 sudo apt-get install python3-pip
下载安装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

注意:这里的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

以上方法参照https://www.waveshare.net/study/portal.php?mod=view&aid=882这篇文章,我自己并没有实际操作过,因为我得板子里已经是预装好了的

3查看一些官方示例

官方给出了一些关于GPIO口的输入输出PWM控制等的简单例子,进入文件夹可查看

cd /opt/nvidia/jetson-gpio/samples/

三、使用Qt调用Python

1.将Python的include和lib添加到Qt工程的.pro文件中

找到Python的安装路径,在Qt的.pro文件中添加include和lib,如图在.pro的最后添加即可,我这里为了不出错,把两个版本的python库都加进来了,其实加3.6应该就可以,加进去之后记得Ctrl+S保存一下,或者直接编译一下


.pro文件.png

2.在qt中加入头文件#include<python.h>

如果第一步没问题的话,#include<python.h>会自动补齐

3.根据自己的需要编写python脚本

我这里要实现的功能是实时读取35,36,37,38四个GPIO口的电平状态,返回0或者1到主程序中,当35,36,38电平为高的时候,主程序的四个监控画面对应其中一个全屏显示;37脚外接控制台,长时间拉高,当控制台电源按钮关闭时,控制台会掩饰30s关闭,但是会将Pin37拉低,如果Pin37为低电平,开发板关机。python脚本程序如下。

#!/usr/bin/env python

import RPi.GPIO as GPIO
import time

#这里我用BOARD编码的方式定义引脚
input_pin = 37   
left_pin = 35
right_pin = 36
back_pin = 38

def sleep_time(hour,min,sec):
        return hour *3600 + min * 60 +sec

def left():
    GPIO.setmode(GPIO.BOARD)#设置引脚为BOARD编码
    try:
        while True:
            GPIO.setup(left_pin,GPIO.IN)#设置引脚为输入
            value2 = GPIO.input(left_pin)#将该引脚的电平状态赋予value2
            return value2#返回value2,在qt中调用时所需要用到的值
            time.sleep(5)
    finally:
        GPIO.cleanup()#使用完后将引脚状态清零初始化
#下面的每个函数对应一个引脚,写法大同小异
def right():
    GPIO.setmode(GPIO.BOARD)
    try:
        while True:
            GPIO.setup(right_pin,GPIO.IN)
            value3 = GPIO.input(right_pin)
            return value3
            time.sleep(5)
    finally:
        GPIO.cleanup()

def back():
    GPIO.setmode(GPIO.BOARD)
    try:
        while True:
            GPIO.setup(back_pin,GPIO.IN)
            value4 = GPIO.input(back_pin)
            return value4
            time.sleep(5)
    finally:
        GPIO.cleanup()

def main():
    prev_value = None
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(input_pin, GPIO.IN)
    try:
        while True:
            value1 = GPIO.input(input_pin)
            return value1
            time.sleep(5)
    finally:
        GPIO.cleanup()

if __name__ == '__main__':
    main()

这里返回的value值,只有0和1,不会有电压大小

4.编写Qt程序

调用方法如下面的代码,头文件等忽略,只展示程序主体

void MainWindow::GpioRead
{
    while(true)
    {
        Py_Initialize();//初始化
        if(!Py_IsInitialized())
        {
            qDebug()<<"python init fail";
        }
        else
        {
            qDebug()<<"python init sucess";
        }
        //导入python需要使用的头文件
        PyRun_SimpleString("import sys");
        PyRun_SimpleString("sys.path.append('./')");
        //将需要调用的python脚本打开,simple_input.py,不要写.py,写文件名即可
        PyObject *pModule = PyImport_ImportModule("simple_input");
        if(!pModule)
        {
            qDebug()<<"can not open file";
        }
        else
        {
            qDebug()<<"open python file sucess";
        }
        //调用打开的python脚本中的函数,这里调用的是main函数
        PyObject *pFun = new PyObject;
        pFun = PyObject_GetAttrString(pModule,"main");
        if(!pFun)
        {
            qDebug()<<"get fun fail";
        }
        else
        {
            qDebug()<<"get fun sucess";
        }

        PyObject *pCallBack = new PyObject;
        pCallBack = PyObject_CallFunction(pFun,NULL);
        //将调用main函数所得的返回值以int类型返回赋予pyResult
        int pyResult = 0;
        PyArg_Parse(pCallBack,"i",&pyResult);
        //如果返回值为0,即引脚电平为0,执行关机命令
        if(pyResult == 0)
        {
            system("halt -p");
        }
        //调用left函数,返回值赋予pyResultl
        PyObject *pleft = new PyObject;
        pleft = PyObject_GetAttrString(pModule,"left");
        PyObject *pCallBackl = new PyObject;
        pCallBackl = PyObject_CallFunction(pleft,NULL);
        PyArg_Parse(pCallBackl,"i",&pyResultl);
        qDebug()<<"pyResultl = "<<pyResultl;
        //调用right函数,返回值赋予pyResultr
        PyObject *pright = new PyObject;
        pright = PyObject_GetAttrString(pModule,"right");
        PyObject *pCallBackr = new PyObject;
        pCallBackr = PyObject_CallFunction(pright,NULL);
        PyArg_Parse(pCallBackr,"i",&pyResultr);
        qDebug()<<"pyResultr = "<<pyResultr;
        //调用back函数,返回值赋予pyResultb
        PyObject *pback = new PyObject;
        pback = PyObject_GetAttrString(pModule,"back");
        PyObject *pCallBackb = new PyObject;
        pCallBackb = PyObject_CallFunction(pback,NULL);
        PyArg_Parse(pCallBackb,"i",&pyResultb);
        qDebug()<<"pyResultb = "<<pyResultb;
        //调用函数gpioFullBack,传入参数,当返回值为1时,对应的监控画面全屏,该函数后续贴出
        gpioFullBack(pyResultl,pyResultr,pyResultb);
        Py_Finalize();//关闭python文件
        sleep(5);//延时5s
     }
}

5.将Qt程序进行编译

编译Qt程序,先不要运行,编译通过后,将写好的python脚本文件放在编译的文件夹下。然后运行程序,亲测基本是没有问题的

四、补充

1、gpioFullBack函数

//一共有四个画面,对应前后左右,当倒车时,左转时,右转时,都有对应的画面全屏显示
void MainWindow::gpioFullBack(int pyResultFull,int pyResultFulll,int pyResultFullr)
{
    int height = this->geometry().height() - this->ui->toolBar->height();
    if(pyResultFull == 1)
    {
            QRect draw_rect(this->geometry().x(), this->geometry().y(), this->geometry().width(), height);
            ui->label_show_second_camera->resize(draw_rect.width(), draw_rect.height());
            ui->label_show_second_camera->move(draw_rect.x(), draw_rect.y());
            ui->label_show_first_caemra->hide();
            ui->label_show_third_camera->hide();
            ui->label_show_fourth_camera->hide();
    }
    else if(pyResultFulll == 1)
    {

        QRect draw_rect(this->geometry().x(), this->geometry().y(), this->geometry().width(), height);
        ui->label_show_third_camera->resize(draw_rect.width(), draw_rect.height());
        ui->label_show_third_camera->move(draw_rect.x(), draw_rect.y());
        ui->label_show_first_caemra->hide();
        ui->label_show_second_camera->hide();
        ui->label_show_fourth_camera->hide();
    }
    else if(pyResultFullr == 1)
    {
        QRect draw_rect(this->geometry().x(), this->geometry().y(), this->geometry().width(), height);
        ui->label_show_fourth_camera->resize(draw_rect.width(), draw_rect.height());
        ui->label_show_fourth_camera->move(draw_rect.x(), draw_rect.y());
        ui->label_show_first_caemra->hide();
        ui->label_show_second_camera->hide();
        ui->label_show_third_camera->hide();
    }
    else
    {
        adjustItem(use_camera_);
    }
}

2.过程中遇到的问题

略,后续补充

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容