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还能够集成很多的组件便利开发,就愈加简化了比方规划机器视觉、人工智能等范畴的嵌入式运用开发流程。
责任编辑:ct