怎样运用Python开发嵌入式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开发嵌入式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:~#

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

 怎样运用Python开发嵌入式ARM的界面_设计制作_电源/新能源

5)。 总结

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

来源:中国电子网

93
17
0
21

相关资讯

  1. 1、首个行业方案颠覆呼叫中心!李飞飞李佳公布谷歌AI四大进展255
  2. 2、索尔思光电完成超过1亿美元的股权融资,金坛新晶圆厂将正式开业3952
  3. 3、深圳区块链产业联盟成立,搭建政产学研合作平台3649
  4. 4、激光脉冲产生的电流有多快?瞬间撼动物质纳米结构2250
  5. 5、5G拐点将至国产手机将会再一次洗牌2801
  6. 6、北京智源学者计划重磅发布!旷视科技实验室成立4854
  7. 7、​聚集3.15:LED灯具假冒产品何时止?4363
  8. 8、华为发布首款面向行业广域T级别高密路由器——NE40E-F1A2200
  9. 9、为什么EMC很重要?4908
  10. 10、不同以往,新型电动纳米传感器可加快疾病的早期诊断3508
全部评论(0)
我也有话说
0
收藏
点赞
顶部