Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发

1). 简介

随着Python在互联网人工智能领域的流行,大家也慢慢感受到Python开发的便利,本文就基于嵌入式ARM平台,介绍使用Python配合PyQT5模块来开发图形化应用程序。

本文所演示的ARM平台来自于Toradex 基于NXP iMX6 ARM处理器的Apalis iMX6 ARM嵌入式平台。

2. 准备

a). Apalis iMX6Q ARM核心版配合Apalis Evaluation Board载板,连接调试串口UART1(载板X29)到开发主机方便调试。更多关于Apalis iMX6配合Apalis Evaluation Board载板的说明请参考Datasheet和开发上手指南。

b). Apalis iMX6Q 默认的Linux BSP是不包含Python,QT等支持的,需要重新编译。

./ 基于Toradex Linux BSP release V2.8

./ 参考这里搭建Openembedded 编译环境,然后适配下面patch,用于使本文测试需要的 libsoc适配 Python3。

https://github.com/simonqin09/libsoc-examples/blob/master/python/0005-libsoc-python3-support.patch

./ 修改 build/conf/local.conf 文件,增加需要的组件

--------------------------

#IMAGE_INSTALL_append = " python3 python3-pip python3-libsoc python3-pyqt5 rng-tools "

--------------------------

./ 适配下面patch,在标准image bb文件中增加QT5的支持

https://github.com/simonqin09/libsoc-examples/blob/master/python/0003-angstrom-qt5-lxde-image.patch

./ 重新编译image

--------------------------

$ bitbake -k angstrom-qt5-lxde-image

--------------------------

./ 新生成的image位于 deploy/images/apalis-imx6/ 目录,参考这里的说明更新到Apalis iMX6模块上面

3). Python GPIO中断测试程序

a). 首先我们先不包含图形界面,单独通过Python来完成简单的GPIO中断测试程序,本程序通过调用 libsoc 来完成GPIO控制,关于libsoc的使用和说明请参考这里。

b). Apalis Evaluation Board载板硬件连接配置如下,X4 GPIO05(MXM3_11)对应系统中的GPIO号码是170,作为按键输入使用;X4 GPIO06(MXM3_13)对应系统中的GPIO号码是169,作为输出驱动LED使用。

X4 GPIO05 X34 SW5

X4 GPIO06 X34 LED1

c). 源代码请参考如下,分别实现了阻塞模式和非阻塞模式中断相应,实现功能就是按键交替点亮和关闭LED灯。

./ 阻塞模式 – https://github.com/simonqin09/libsoc-examples/blob/master/python/gpiotest_block.py

// main 函数作为主函数,实现打开GPIOs,同时设定初始化状态为高电平输出;test_interrupt_handler函数实现中断相应,采用 gpio_in.wait_for_interrupt 为阻塞式中断,捕获中断才会继续进行,捕获中断后做了简单的防误触处理。

./ 非阻塞模式 – https://github.com/simonqin09/libsoc-examples/blob/master/python/gpiotest_nonblock.py

// main 函数作为主函数,实现打开GPIOs,同时设定初始化状态为高电平输出;另外,在main函数里面采用gpio_in.start_interrupt_handler来使能中断相应,为非阻塞式;在main函数最后通过while来接收键盘输入实现退出应用;gpio_in.wait_for_interrupt依然作为中断处理函数相应中断并驱动LED状态改变。

d). 将Python代码直接复制到Apalis iMX6上面测试运行结果如下:

./ 阻塞模式下,最后是通过Ctrl-C强制退出程序

-----------------------

root@apalis-imx6:~# ./gpiotest_block.py

The LED initial status is ON

The LED turns OFF

interrupt times is 1

The LED turns ON

interrupt times is 2

^Clibsoc-gpio-debug: Interrupted system call

Traceback (most recent call last):

File "./gpiotest_block.py", line 54, in

main(gpio_input_id, gpio_output_id)

File "./gpiotest_block.py", line 45, in main

test_interrupt_handler(gpio_in, gpio_out)

File "./gpiotest_block.py", line 12, in test_interrupt_handler

gpio_in.wait_for_interrupt(-1)

File "/usr/lib/python3.5/site-packages/libsoc/gpio.py", line 118, in wait_for_interrupt

if api.libsoc_gpio_wait_interrupt(self._gpio, timeout) != 0:

KeyboardInterrupt

-----------------------

./ 非阻塞模式下

-----------------------

root@apalis-imx6:~# ./gpiotest_nonblock.py

The LED initial status is ON

please enter 'Q' to quit

The LED turns OFF

The LED turns ON

The LED turns OFF

Q

Do you really want to quit? yes or no

yes

root@apalis-imx6:~#

-----------------------

4). 使用PyQt5实现图形化界面GPIO中断程序

a). 硬件配置和连接和上面的测试场景一致。

b). 为了方便开发PyQt5界面,首先通过Qtcreator创建如下QWidget项目UI界面

// LED Status 右边的 QFrame 方框以及QLable用于显示LED当前的状态

// ‘Turn ON’和’Turn OFF’ 两个PushButton用于通过界面控制LED状态,’Exit’ PushButton用于退出程序

./ 最终的UI源代码参考如下,将对应的mainwindow.ui文件复制到Apalis iMX6 Python应用相同路径下

https://github.com/simonqin09/libsoc-examples/blob/master/python/mainwindow.ui

c). 程序源代码参考如下:

https://github.com/simonqin09/libsoc-examples/blob/master/python/gpiotest_pyqt5.py

说明如下:

./ class ApplicationWindow 用于实现Qt5界面以及相关按键操作:

// 首先通过 loadUi 函数来加载之前制作好的UI文件 mainwindow.ui,然后初始化界面显示,连接各个按键对应的处理程序

// 最后开启一个新的Qthread线程self.thread,用于处理外部GPIO按键中断相应,连接新线程反馈信号的处理程序,最后启动新线程

// LedStatusChange 函数为处理新线程反馈回来的LED状态变化信号而同步改变界面显示状态的函数

// Button_On_clicked 和 Button_Off_clicked 函数用于根据界面按键的点击来对应改变LED GPIO输出以及界面显示的函数

// Button_Exit_clicked 和 closeEvent 函数用于处理退出程序包括子线程的退出等相关的函数

./ class gpioInterrupt 为用于处理GPIO中断同时对于改变LED GPIO输出以及将LED状态变化反馈给界面主程序

// 首先定义反馈信号,并初始化所需要使用的GPIO引脚

// run 函数部分基本就是上面第3章节的阻塞模式Python应用的代码,这里就不做赘述了

d). 测试运行结果如下:

-----------------------

root@apalis-imx6:~# ./gpiotest_pyqt5.py

The LED initial status is ON

set LOW

set HIGH

The LED turns OFF

button clicked for setting LOW

The LED turns ON

button clicked for setting HIGH

root@apalis-imx6:~#

-----------------------

5). 总结

如上述示例,使用Python和PyQt5非常方便了创建一个嵌入式界面应用程序示例,相对于传统C语言开机要配置交叉编译环境,整个流程更加快捷方便,同时在实现比较简单的控制的时候其运行效率也是可以接受的,另外Python还可以集成大量的组件方便开发,就更加简化了比如设计机器视觉、人工智能等领域的嵌入式应用开发流程。

python 嵌入式界面_运用Python和PyQT开发嵌入式ARM的界面相关推荐

  1. python 抽奖库_用 python 写一个年会抽奖小程序

    使用 pyinstaller 打包工具常用参数指南 pyinstaller -F demo.py 参数 含义 -F 指定打包后只生成一个exe格式的文件 -D –onedir 创建一个目录,包含exe ...

  2. python 概率分布模型_使用python的概率模型进行公司估值

    python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...

  3. python 时间序列预测_使用Python进行动手时间序列预测

    python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...

  4. python制作软件界面_使用Python制作一个带GUI界面的词云自动生成工具(一)

    在现实生活中你可能会遇到这种情况:想知道一篇论文中哪个词语最多,哪些词语最少(以此判断文章的主要内容):想知道一部小说中哪一个人物出现的次数最多(当然,出现次数最多的那个人也不一定是主脚):想知道一部 ...

  5. 如何给python爬虫加界面_给Python爬虫做一个界面.上

    做爬虫做了那么久,开始逐渐不满足写好程序,每次只能完成一件事情.开始思考如何可以做一个简单界面交互,再增加爬虫的可操作室,做交互界面有两个思路: 用Django做一个web界面: 用PyQt做一个ex ...

  6. python制作窗口界面_用python编写简单ui界面窗口

    学习了Python编程语言之后,可以做许多有趣的事情.例如可以使用python设计一个窗口,现在小编将使用tkinter为大家演示创建一个小窗口,设置了2个按钮,一个是btn关闭窗口,另一个是btn用 ...

  7. python做炫酷的界面_用python打造可视化爬虫监控系统,酷炫的图形化界面

    安装 InfluxDB 修改配置文件/usr/local/etc/influxdb.conf,如果原文件中没有对应配置项,需自己添加. 3. 安装配置 Grafana 安装 Grafana 并修改 G ...

  8. python软件测试脚本_基于Python的实时嵌入式软件测试脚本

    摘 要:计算机技术应用的不断普及,使得实时嵌入式软件在航空.航天.工业控制.交通.医疗和军事安全等诸多领域发挥着愈来愈重要的作用.不难看出,这些领域对软件的可靠性有很严格的要求,因为该领域的软件一旦失 ...

  9. python做ui界面_用python编写简单ui界面窗口

    新用户新地理处理,最常见的方法是使用工具对话框执行地理处理操作.当必须执行一次只有一个工具,这个工具对话框确实是一个好方法去经营.地理处理工具易于使用和显示警告图标或错误图标及相关消息旁边不当使用参数 ...

最新文章

  1. Android如何在java代码中设置margin
  2. Web框架之Django篇
  3. openstack+essex+quantum成功show
  4. 监控开发之用munin来自定义插件监控redis和mongodb
  5. 随想录(字节序和位序)
  6. yolo3做行人检测+deep-sort做匹配,端对端做多目标跟踪
  7. 乐视入股酷派,手机圈全面战争已开打
  8. 《信息学奥赛一本通·初赛真题解析》
  9. 在matlab中的polyval函数,Python/Numpy中三输出等价的Matlab polyval函数
  10. python,检测代理ip是否有效
  11. 流体力学基础——粘性
  12. Proof Compression
  13. 数据的抽取的非正态性处理
  14. python安装途中遇到的问题和解决方法
  15. 是 公安大学王大伟教授写的文章~~~
  16. STM32H750VB程序无法下载的问题
  17. ISO9001质量管理体系认证需要准备什么资料
  18. AE不能直接拖素材进来了,只能通过导入的方式,不知道是哪里出问题了?
  19. 第2届中国机器博弈锦标赛
  20. c语言简单编程题目及答案,经典练习C语言编程的题目及答案整理.pdf

热门文章

  1. 马尔可夫决策过程(MDP)
  2. curl: (52) Empty reply from server
  3. 加入rtp组播_耗时10+小时撰写 带你系统认识组播 收藏这些概念
  4. Python技术知识清单(数据科学)
  5. PyTorch 学习笔记(二):PyTorch的数据增强与数据标准化
  6. Python之调用函数
  7. 文具订购(【CCF】NOI Online能力测试 入门组第一题)
  8. Altium的原理图主题修改为Orcad的默认样式(Altium原理图样式更改)
  9. Java:jar包和war包区别
  10. 算法提高 身份证号码升级