Python和PyQT来开发嵌入式ARM界面如何实现

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

1)。 简介

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

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

2. 准备

a)。 Apalis iMX6Q ARM核心版配合Apalis Evalua     ti   on Board载板,连接调试串口     UART   1(载板X29)到开发主机方便调试。更多关于Apalis iMX6配合Apalis Evalua  TI on 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/mas     te   r/python/0005-libsoc-python3-support.patch

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

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

#IMAGE_INSTALL_append = “ python3 python3-     pi   p python3-libsoc python3-pyqt5 rng-tools ”

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

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

https://github.com/simonqin09/libsoc-examples/blob/master/python/0003-angst     rom   -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 Evalua  TI on 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/gp     iot   est_block.py

// m     ai   n 函数作为主函数,实现打开GP     IOs   ,同时设定初始化状态为高电平输出;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 ini  TI al status is ON

The LED turns OFF

interrupt  TI mes 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界面

 Python和PyQT来开发嵌入式ARM界面如何实现_设计制作_可编程逻辑

// LED Status 右边的 QF     ram   e 方框以及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

13
69
0
58

相关资讯

  1. 1、数控加工经验知识分享2079
  2. 2、人工智能的未来和挑战114
  3. 3、传统优势市场萎缩,工业机器人产业未来发展呈波浪式?3539
  4. 4、调节阀的种类及分类1938
  5. 5、智慧博物馆建设中的新技术应用3582
  6. 6、数字化转型是经济发展新动能的重要原动力2847
  7. 7、智慧城市将成为传感器行业的又一个千亿级市场2613
  8. 8、基于无线传感器网络在停车场监控系统中的应用1575
  9. 9、步入2018,MCMC在逐步成长1456
  10. 10、2019年的云计算安全预测4497
全部评论(0)
我也有话说
0
收藏
点赞
顶部