云天 发表于 2021-10-4 13:01:12

PYNQ-Z2开发板——制作巡线小车

本帖最后由 云天 于 2021-10-4 13:05 编辑



PYNQ-Z2
PYNQ-Z2是一款FPGA开发板,它以ZYNQXC7Z020 FPGA为核心,利用ZYNQ中的可编程逻辑和Arm处理器的优势可以构建强大的嵌入式系统,PYNQ的开源框架可以使嵌入式编程用户在无需设计可编程逻辑电路的情况下充分发挥Xilinx ZYNQ SoC的功能,使用Ethernet作为PC和board之间的通讯方式,这块开发板除支持传统ZYNQ开发方式外,还可支持Python进行SoC编程,并且代码可直接在PYNQ-Z2上进行开发和调试。可编程逻辑电路以硬件库的形式导入并且可以通过API编程,这种方式基本上与软件库的导入和编程方式相同。PYNQ-Z2配备有以太网,HDMI输入/输出,MIC输入,音频输出,Arduino接口,树莓派接口,2个Pmod,用户LED,按钮和开关。兼容树莓派连接器、Arduino屏蔽连接器以及Pmod连接器可以支持多种配件拓展,同时这些接口也可以用作GPIO。 PYNQ 是 Python On Zynq 的缩写,它是一个软件开发框架,指导硬件层、驱动层和应用层之间的接口设计,PYNQ框架通过高层次的封装,将底层硬件FPGA实现细节与上层应用层的使用脱耦,让上层应用开发者通过Python编程就可以调用FPGA模块。其适用于大面积的设计者和开发者,能帮助用户实现多种高性能的嵌入式应用,包括:并行硬件执行,高帧率视频处理,硬件加速算法,实时信号处理,高带宽IO,低延时控制。PYNQ结合了ZYNQ与Python的全部优势,可结合DF arduino扩展板,树莓派扩展板使用;可广泛应用于机器学习、研究和原型制造等领域。
硬件资源
PYNQ包括有
① 选择板子的启动方式,分别从JTAG、QSPI Flash和SD卡启动。
JTAG启动方式:通过Micro-USB接口连接到电脑上,下载bit文件和elf文件,进行在线调试;
Flash启动方式:将程序烧录到Flash中,断电后从Flash中开始运行程序;
SD启动方式:将镜像文件拷贝到SD卡中,从SD卡中读取运行程序。
② 选择电源供电模式,分为从USB供电运行和从外部电源供电运行。
③SD卡配置,PYNQ从SD卡启动,SD卡中配置有启动镜像文件,需要有一块空白的SD卡、读卡器和配置教程。

启动步骤
将配置好的SD卡放入SK卡槽;
将①跳线帽连接到SD卡启动,②跳线帽连接到USB供电;
连接Micro USB和网线,USB线作为电源线和UART串口线,网线作为系统传输线;
将电源开关拨到ON位置;
现象:红色LED亮起表示板上有电源。几秒钟后,黄色/绿色LED亮起,表示板上设备正常运行。一分钟后两个蓝色LED和四个黄色/绿色 LED同时闪烁,之后蓝色LED关闭,而黄色/绿色发光二极管常亮,系统现已启动并可供使用。
打开web浏览器连接到Jupyter Notebook(http://192.168.2.99),登录账号密码为xilinx。
也可以在主机上访问,打开windows资源管理器,键入“ \\192.168.2.99\xilinx ”,登录账号密码为xilinx。
【巡线】

1、加载overlay
from pynq.overlays.base import BaseOverlay
from pynq_peripherals import ArduinoDIGILENTGroveAdapter, PmodGroveAdapter
import time
base = BaseOverlay('base.bit')Overlay(硬件库)是可编程/可配置的 FPGA 设计,可将用户应用程序从 Zynq 的处理系统扩展到可编程逻辑。

2、Adapter配置
adapter_A = PmodGroveAdapter(base.PMODA, G4='geared_motor')
adapter_B = PmodGroveAdapter(base.PMODB, G4='geared_motor')
arduino_adapter = ArduinoDIGILENTGroveAdapter(base.ARDUINO, G6='grove_line_finder',G5='grove_line_finder',G7='grove_usranger')PYNQ 外设的驱动程序和Jupyter Notebook是开源的。
您可以忽略传感器电路细节,通过简单地操作 python 对象来实现传感器数值的读取。
3、定义电机与传感器
right_motor = adapter_A.G4
left_motor = adapter_B.G4
right_motor.backward()
left_motor.backward()
right_motor.set_speed(0)
left_motor.set_speed(0)电机设置前进方向:motor.forward()
将方向设置为向后:motor.backward()
设置速度:motor.set_speed(10)
有效的速度值是从 0 到 100
left_line_finder = arduino_adapter.G5
right_line_finder = arduino_adapter.G6
usranger = arduino_adapter.G7传感器
4、电机控制函数
def stop():
    left_motor.set_speed(0)
    right_motor.set_speed(0)
    left_motor.backward()
    right_motor.backward()
def left_forward(speed):
    left_motor.forward()
    left_motor.set_speed(speed)
def right_forward(speed):
    right_motor.forward()
    right_motor.set_speed(speed)
   
def left_backward(speed):
    left_motor.backward()
    left_motor.set_speed(speed)
def right_backward(speed):
    right_motor.backward()
    right_motor.set_speed(speed)   
   
def forward(speed):
    right_forward(speed)
    left_forward(speed)
def backward(speed):
    right_backward(speed)
    left_backward(speed)
def turn(speed_left,speed_right):
    right_forward(speed_left)
    left_forward(speed_right)
flag=05、主程序

while 1:
    distance=usranger.get_distance()
    if distance>15:
      left_line=left_line_finder.line_found()
      right_line=right_line_finder.line_found()
      if not(left_line) and not(right_line):
            forward(30)
      elif not(left_line) and right_line:
            flag=1
            turn(20,30)
      elif left_line and not(right_line):
            flag=2
            turn(30,20)
      elif flag==1:
            turn(20,40)
      elif flag==2:
            turn(40,20)
    else:
      stop()
【演示视频】
https://www.bilibili.com/video/BV1h341117Wk?share_source=copy_web
https://www.bilibili.com/video/BV1Uq4y1R7zg?share_source=copy_web

大湿 发表于 2021-10-14 23:54:37

好耶好耶好耶

李臻飏 发表于 2021-10-16 17:09:22

厉害厉害

赤星三春牛! 发表于 2022-2-3 11:00:39

厉害厉害厉害!

赤星三春牛! 发表于 2022-2-3 11:01:00

点赞点赞点赞!

赤星三春牛! 发表于 2022-2-3 11:01:20

6666666666

虞城书生 发表于 2024-10-29 01:19:53

您好,请问如何固化ps端的程序?
页: [1]
查看完整版本: PYNQ-Z2开发板——制作巡线小车