【基于Xilinx ZYNQ7000的PYNQ框架项目】05使用Overlay库和python父子进程实现开发板按键控制LED灯流水或熄灭

05使用Overlay库和python父子进程实现开发板按键控制LED灯流水或熄灭

  • 前言
  • 一、PYNQ Overlay库的GPIO读写实现LED灯流水
  • 二、python父子进程实现按键即关闭程序
  • 总结


前言


前四篇文章完成后,其实整个项目就能完整运行起来了。但我们似乎忘了使用PYNQ的初心——用python编程实现对开发板硬件部分的控制。因此,本文章使用PYNQ Overlay库的GPIO读写实现LED灯流水,然后使用python父子进程的多进程编程实现按键即关闭程序。

一、PYNQ Overlay库的GPIO读写实现LED灯流水


这里就是借由PYNQ的Overlay库,使用python来控制硬件设备的读写。代码注释已经尽我所能写得很详细了。注意如果 overlay.axi_gpio_0 处报错,可能是vivado硬件设计时忘了加上AXI_GPIO模块或者位宽设置不正确,此时需要修改硬件文件并重新按前面文章制作、烧录一遍镜像!(报错原因也可能是其它的,具体问题具体分析)

from pynq import Overlay
import os
import time


# 导入overlay库(此处的.bit文件即为前面vivado工程导出的bit文件)
overlay=Overlay('./design_1.bit')

# vivado工程时设置了gpio0是控制LED灯的,gpio1是控制按键的
led = overlay.axi_gpio_0
key = overlay.axi_gpio_1
print("gpio start!")

# 代表每个LED灯灭时的输入
states=[1,2,4,8]
state=0

# 初始时让四个LED灯全亮
led.write(0x00,15)

while 1:
    # 每轮灭一个LED灯,达到流水效果
    led.write(0x04,states[state%4])
    state=state+1
    time.sleep(0.5)

    # 0:未按 1:按下;如果读取到按键不是0,则代表按键被按下
    if not key.read(0x00):
        print("stopping...")
        break;

# 检测到按键被按下后,LED灯全灭
led.write(0x00,0)

# 获取本进程的pid号
pid=os.getpid()
print(f"key.py stop.pid:{pid}")

程序运行时,LED灯流水效果:


二、python父子进程实现按键即关闭程序


上面只实现了按键使灯停止,还没有将按键与关闭程序联动起来。个人对于父子进程的理解都写在了代码注释中,有理解不对的地方还请指正。

import os
import time
import psutil


# 关闭此进程及其所有的递归子进程
def kill_process(pid):

    # 创建指定进程号的对象
    parent_proc = psutil.Process(pid)

    # 查找此进程所有的子进程及它们的递归子进程,全部杀死
    for child_proc in parent_proc.children(recursive=True):
        child_proc.kill()

    # 杀死本进程
    parent_proc.kill()


# 创建一个新进程,该新进程为control.py进程的子进程
# 在父进程内,参数pid的值是子进程的pid;在子进程内,参数pid的值是0
# 因此可用参数pid的值区别父子进程,从而进行多进程编程
pid=os.fork()

# 父进程执行内容
if(pid!=0):
    print(f"key进程编号{os.getpid()}")
    time.sleep(1)
    # 运行key.py文件
    os.system("sudo python key.py")
    print("parent_pid_end")
    # key.py文件运行结束后(说明按键被按下),完全杀死该进程
    kill_process(os.getpid())
    exit(0)

# 子进程执行内容
if not pid:
    print("请在1秒后,10秒内输入密码欸:")
    time.sleep(10)
    print("开始运行检测程序:")
    print(f"face进程编号{os.getpid()}")
    # 运行faceDetect.py文件
    os.system("python faceDetect.py")

按下key1按键后,LED灯全部熄灭,程序停止:


总结


至此,基于Xilinx ZYNQ7000的PYNQ框架的人脸识别项目的内容就介绍完毕啦!想回顾整个项目全貌
的请看第一篇文章:【基于Xilinx ZYNQ7000的PYNQ框架项目】01人脸识别项目介绍与展示。第一次写技术博客,有出错的地方还请大家多多指正!~

您的关注、点赞与收藏,是我持续创作优秀博客的最大动力!

本项目系列文章:

【基于Xilinx ZYNQ7000的PYNQ框架项目】01人脸识别项目介绍与展示

【基于Xilinx Zynq7000的PYNQ框架项目】02 PYNQ镜像制作

【基于xilinx Zynq7000的PYNQ框架项目】03 Socket实现开发板和电脑的实时视频传输并存储图片

【基于Xilinx ZYNQ7000的PYNQ框架项目】04开发板上运行人脸识别模型

你可能感兴趣的:(python,单片机,嵌入式硬件,fpga开发,硬件工程,opencv,视觉检测)