嵌入式 ARM 平台使用Python和PyQT开发界面应用程序
By Toradex秦海
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 <module>
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还可以集成大量的组件方便开发,就更加简化了比如设计机器视觉、人工智能等领域的嵌入式应用开发流程。
嵌入式 ARM 平台使用Python和PyQT开发界面应用程序相关推荐
- python 嵌入式界面_运用Python和PyQT开发嵌入式ARM的界面
Python是一种跨平台的计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大型项目的开发 1) ...
- mysql 客户端 交叉编译_移植mysql到嵌入式ARM平台
移植MySQL到嵌入式ARM平台 MySQL没有专门针对ARM的版本,移植到ARM没有官方文档可参考,因此,暂时参考这样一篇文档: http://blog.chinaunix.net/space.ph ...
- 移植mysql到嵌入式ARM平台
移植MySQL到嵌入式ARM平台 MySQL没有专门针对ARM的版本,移植到ARM没有官方文档可参考,因此,暂时参考这样一篇文档: http://blog.chinaunix.net/space ...
- 嵌入式 ARM 平台配置远程桌面
By Toradex秦海 1). 简介 在PC平台经远程桌面连接已经是非常方便了,而现在在嵌入式ARM平台,由于远程控制或者远程调试的需要,配置远程桌面的需求也越来越多,本文就着重演示基于嵌入式ARM ...
- 嵌入式ARM平台基于Linux配置24bit RGB输出
By Toradex秦海 1). 简介 嵌入式ARM平台设备采用Embedded Linux操作系统进行开发已经越来越成为主流,本文就着重演示在EmbeddedLinux下配置24bit RGB LC ...
- 用Python+OpenCV+PyQt开发的答题卡识别软件
用Python+OpenCV+PyQt开发的答题卡识别软件 软件使用说明 软件设计思路 如何设置答案 界面风格 备注 这是一个可以识别定制答题卡的软件,它可以根据用户自定的答案来进行识别,校对正误并统 ...
- Python+WebKit+HTML开发桌面应用程序
Python+WebKit+HTML开发桌面应用程序 前言 几天前写了一个备份的小工具,用Python写个脚本,也就花个一天的时间搞定,给客户用了一下,对功能很满意,但对界面不满足,想要一个图形界面来 ...
- 嵌入式 ARM 平台使用dm-crypt加密磁盘分区
By Toradex秦海 1). 简介 出于安全考虑,嵌入式设备有时需要将某个数据分区甚至整个文件系统进行加密处理,本文就介绍在嵌入式Linux系统下基于dm-crypt进行加密示例,dm-crypt ...
- zynq7000系列移植—JRE移植到嵌入式ARM平台(java运行在嵌入式linux)
转载:https://blog.csdn.net/weixin_39827918/article/details/78806642 前言 因公司项目需求,需要在zynq 7000平台下运行 java ...
最新文章
- mysql group by 天_MySQL group by语句如何优化
- mysql占用cpu_Mysql占用过高CPU时的优化手段(必看)
- PLC項目任務單2---狀態轉移圖
- DL之perceptron:利用perceptron感知机对股票实现预测
- [BUAA-SE-2018]结对作业测试报告
- Python用泰勒公式模拟函数
- C++面试题-面向对象-多态性与虚函数
- 图像色彩空间之RGB与HSI
- hibernate一级缓存_Hibernate缓存–一级缓存
- Python常用的几种数据结构-链表,数组,字典
- LAMMPS分子动力学模拟技术与应用 第一性原理计算方法及应用
- 爱快iKuai软路由系统远程升级(从2.5.10系统升级至3.X系列)教程(图文详解)
- Java中文件File相关知识
- 按键精灵sayString不生效
- 基于HFSS设计一种新型圆极化天线
- 流浪是对另一种生活的执着
- 电源模块设计过程(降压、正压转负压)-MC34063
- LVGL - 在STM32上的移植
- 【技术科普】区块链世界也存在多元宇宙
- PostgreSQL in amp; = any (values|array)
热门文章
- 国家普通话水平计算机辅助测试考试流程,2018年9月国家普通话水平智能测试考试流程...
- 教你更高效的管理医院设备,可别错过
- squid代理-----透明代理模式
- MQ7一氧化碳传感器
- auCDtect Task Manager——这不只是个无损检测工具,还能批量生成频谱图,强烈推荐
- 图像处理基础 || (一) python 读取图像的常用方式
- 题目0167-开心消消乐
- Python爬虫歌词及词频统计--(谢春花)
- lua如何打印行号_Lua常用代码
- 【Pytorch】读取model中的module和name