介绍
这是使用Digilent Zybo Zynq-7000开发板为GoPro创建3轴手持照相机稳定装备的指南。此项目是为CPE实时操作系统课程(CPE 439)开发的。稳定器使用三个伺服器和一个IMU来纠正用户的运动,以保持相机的水平。
项目所需的部件
步骤1:Vivado硬件设置
让我们开始为项目创建底层的块设计。
- 打开Vivado 2016.2,点击“Create New Project”图标,然后点击“Next>”。
- 命名您的项目,然后点击“下一步>”。
- 选择RTL项目,然后点击“下一步>”。
- 键入到搜索栏xc7z010clg400-1,然后选择部分,然后点击“下一步>”和“完成”。
第2步:设置模块设计(相关文件见附件)
现在我们将开始通过添加和设置Zynq IP模块来生成模块设计。
- 在左侧面板的IP Integrator下,单击“创建块设计”,然后单击“确定”。
- 右键单击“图表”选项卡,然后选择“添加IP ...”。
- 键入“ZYNQ7处理系统”并单击选择。
- 双击出现的Zynq块。
- 点击“导入XPS设置”,导入提供的“ZYBO_zynq_def.xml”文件。
- 转到“MIO配置”,选择“应用处理器单元”,并启用定时器0和看门狗定时器。
- 在“I / O外围设备”下的同一个选项卡中,选择ENET 0(并将下拉菜单更改为“MIO 16 .. 27”,USB 0,SD 0,UART 1,I2C 0。
- 在“GPIO”下,检查GPIO MIO,ENET复位,USB复位和I2C复位。
- 现在导航到“时钟配置”。在PL结构时钟下选择FCLK_CLK0。然后,点击“确定”。
第3步:创建自定义PWM IP模块(相关文件见附件)
这个IP模块允许电路板发送一个PWM信号来控制舵机的运动。增加了逻辑来减慢时钟,使脉冲以正确的速率输出。该块取0到180之间的一个数字,并将其转换成一个750-2150的usec脉冲。
- 现在,在左上角附近的工具选项卡下,点击“创建和打包IP ...”,然后点击下一步。
- 然后选择“创建一个新的AXI4外设”并点击下一步。
- 命名您的PWM IP块(我们将其命名为pwm_core),然后单击下一步,然后单击下一页上的下一步。
- 现在点击“编辑IP”,然后点击完成。这将打开一个新窗口来编辑pwm块。
- 在“Sources”选项卡和“Design Sources”下,展开“pwm_core_v1_0”(用您的名称替换pwm_core ),然后打开变得可见的文件。
- 将“pwm_core_v1_0_S00_AXI.v”下提供的代码复制并粘贴到项目底部的zip文件中。按Ctrl + Shift + R,用你的名字替换“pwm_core” 。
- 接下来打开“ name _v1_0”,并在文件“pwm_core_v1_0.v”中提供的代码中复制。按Ctrl + Shift + R并用名称替换“pwm_core” 。
- 现在导航到“Package IP - name ”选项卡并选择“Customization Parameters”。
- 在这个标签中,顶部会有一个黄色的条形文字。选择此项,“隐藏参数”将显示在框中。
- 现在进入“Customization GUI”,右键点击Pwm Counter Max,选择“Edit Parameter ...”。
- 选中“在自定义GUI中可见”和“指定范围”框。
- 将“类型:”下拉菜单更改为整数范围,并将最小值设置为0,最大值设置为65535,然后选中“显示范围”框。现在点击OK。
- 在“Page 0”树下拖动Pwm Counter Max。现在转到“查看和打包”并点击“重新打包IP”按钮。
第4步:添加PWM IP模块进行设计
我们将IP块添加到块设计中,以允许用户通过处理器访问PWM IP块。
- 右键单击图表选项卡,然后单击“IP设置...”。导航到“资源库管理器”选项卡。
- 点击绿色加号按钮并选择它。现在在文件管理器中找到ip_repo并将其添加到项目中。然后点击应用,然后确定。
- 右键单击图表选项卡,然后单击“添加IP ...”。输入您的PWM IP块名称并选择它。
- 在屏幕顶部应该有一个绿色的条,首先选择“运行连接自动化”,然后单击确定。然后单击“运行块自动化”,然后单击确定。
- 双击PWM模块并将Pwm Counter Max从128更改为1024。
- 将鼠标指针悬停在PWM模块的PWM0上。应该有一个小铅笔,当你做的时候出现。右键单击并选择“创建端口...”,然后在打开窗口时单击确定。这为要传递的信号创建一个外部端口。
- 对PWM1和PWM2重复步骤6。
- 找到边栏上的小圆形双箭头图标,然后单击该图标。它会重新生成布局,并且您的块设计应该看起来像上面的图片。
步骤5:配置HDL包装并设置约束文件(相关文件见附件)
我们现在要为我们的模块设计生成高级设计,然后将PWM0,PWM1和PWM2映射到Zybo板上的Pmod引脚。
- 转到“来源”选项卡。右键点击“Design Sources”下的块设计文件,然后点击“Create HDL Wrapper ...”。选择“复制生成的包装,以允许用户编辑”,然后单击确定。这将生成我们创建的块设计的高级设计。
- 我们将输出的Pmod是JE。
- 在“文件”下,选择“添加源...”并选择“添加或创建约束”,然后单击“下一步”。
- 点击添加文件,然后选择包含的“ZYBO_Master.xdc”文件。如果你查看这个文件,你会注意到除了“## Pmod Header JE”下的六个“set_property”行之外,所有内容都没有注释。您会注意到PWM0,PWM1和PWM2是这些行的参数。它们映射到JE Pmod的引脚1,引脚2和引脚3。
第6步:生成比特流
在我们继续之前,我们需要生成硬件设计的比特流以导出到SDK。
- 在侧栏的“程序和调试”下,选择“生成位流”。这将运行综合,然后执行,然后生成设计的比特流。
- 纠正弹出的任何错误,但通常可以忽略警告。
- 转到文件 - >启动SDK,然后单击确定。这将打开Xilinx SDK。
第7步:在SDK中设置项目
这部分可能有点令人沮丧。如有疑问,建立一个新的BSP并替换旧的BSP。这节省了我们一大堆的调试时间。
- 首先下载最新版本的FreeRTOS 。
- 通过单击文件 - >导入,从FreeRTOS中提取所有内容并将其导入到SDK中,然后在“常规”下单击“现有项目进入工作区”,然后单击下一步。
- 在FreeRTOS文件夹中进入“FreeRTOS / Demo / CORTEX_A9_Zynq_ZC702”。只从这个位置导入“RTOSDemo”。
- 现在点击File-> New Board Support Package生成一个Board Support Package(BSP)。
- 选择“ps7_cortexa9_0”并选中“lwip141”,然后单击确定。
- 右键单击RTOSDemo蓝色文件夹并选择“Project References”。
- 取消选择“RTOSDemo_bsp”并检查刚刚创建的新BSP。
第8步:FreeRTOS代码修改(相关文件见附件)
我们提供的代码可以分成7个不同的文件。main.c,iic_main_thread.c,xil_printfloat.c,xil_printfloat.h,IIC_funcs.c,IIC_funcs.h和iic_imu.h。iic_main_thread.c中的代码已经从Kris Winer的库中调用。我们主要改变了他的代码,把任务合并到Zybo板上。我们还增加了计算相机方向校正的功能。我们留下了几个对调试有用的打印语句。他们中的大多数被评论,但如果你觉得需要你可以取消他们的评论。
- 修改main.c文件最简单的方法是用我们包含的main.c文件中的代码复制代码。
- 要创建一个新文件,请右键点击RTOSDemo下的src文件夹并选择C Source File。将该文件命名为“iic_main_thread.c”。
- 复制包含的“iic_main_thread.c”中的代码并将其粘贴到新创建的文件中。
- 用剩余的文件重复步骤2和3。
- 在gcc中需要一个链接指令。要将其添加到构建路径中,请右键单击RTOSDemo并选择“C / C ++构建设置”。
- 一个新窗口将打开。导航到ARM v7 gcc链接器 - >库。选择右上角的小文件,然后输入“m”。这将包括项目中的数学库。
- 使用Ctrl + B构建项目来确认一切正常。检查生成的警告,但您可能会忽略它们。
- 有几个地方需要修改,主要是你当前位置的磁偏角。我们将解释如何在教程的校准部分中进行更改。
第9步:稳定器的3D打印(相关文件见附件)
您需要3D打印这个项目的几个部分。可以购买与我们的印刷部件具有相似尺寸/尺寸的部件。
- 使用提供的文件打印GoPro的手臂和托架。
- 您需要将脚手架添加到.stl文件。
- 一旦打印,修剪/清理多余脚手架的部分。
- 如果您愿意,可以用3D打印部件替换木制销钉。
步骤10:组装零件
这是安装稳定器的几个部分。购买的支架配有4个自攻螺钉和4个带螺母的螺栓。由于有3个舵机,其中一个伺服喇叭需要预先敲击,以允许2个螺栓穿过。
- 将8个引脚焊接到IMU中,每边4个。
- IMU连接到支架中央的GoPro 3D打印支架上。
- 调整支架的方向,使伺服安装孔位于左侧。将IMU放置在距离您最近的边缘,引脚悬挂在边缘上。然后,将GoPro安装架放在IMU的顶部,将IMU和安装架固定在支架上。
- 将HS-5485HB连接到集成在3D打印臂上的伺服支架。
- 将GoPro支架旋入连接到机械臂的伺服系统,确保伺服机构处于其运动范围的中间位置。
- 接下来,将HS-5685MH伺服器连接到伺服支架上。然后用其中一个螺丝轻敲伺服喇叭。现在将伺服器连接到最后一个伺服支架的底部。
- 现在将最后一个伺服器连接到HS-5685MH伺服器上的支架上。然后将手臂旋入该伺服器,确保手臂已拧紧,以便每个方向移动90度。
- 为了完成万向节的结构,在GoPro支架和3D印刷臂之间加入一小块木销。你现在已经组装了稳定器。
- 最后,您可以添加连接到底部伺服支架的手柄。
步骤11:将Zybo连接到稳定器
这样做时有几件事要小心。你要确保电源的5V不会进入Zybo板,因为这会导致板的问题。确保仔细检查你的跳线,确认没有电线被切换。
- 将Zybo附加到稳定器上,您将需要15根male-to-male 跳线和4对male-to-female跳线。
- 首先,沿面包板的+和 - 导轨将两个跳线连接到您的5V电源。这些将提供舵机的权力。
- 然后,将3对跳线连接到面包板的+和 - 导轨上。这将是每个舵机的动力。
- 将+和 - 跳线的另一端插入每个舵机。
- 在面包板的导轨和Zybo JE Pmod的一个GND引脚之间连接跳线(见步骤5的图片)。这将在Zybo电路板和电源之间建立一个共同点。
- 接下来将信号线连接到JE Pmod的引脚1,引脚2和引脚3。引脚1映射到底部伺服器,引脚2映射到手臂末端的伺服器,引脚3映射到中间伺服器。
- 将4根母线插入IMU分线的GND,VDD,SDA和SCL引脚。GND和VDD插入GND和JF引脚上的3V3。将SDA引脚插入引脚8,将SCL插入JF的引脚7(参见步骤5的图片)。
- 最后,使用micro USB电缆将电脑连接到电路板。这将允许uart通信,并允许您编程Zybo板。
第十二步:真北校正
IMU中的磁强计的校准对于装置的正确操作是重要的。磁偏角将磁北向校正为正北。
- 为了纠正磁性和真北方的差异,你需要结合两种服务,谷歌地图和NOAA的磁场计算器。
- 使用Google地图查找您当前位置的纬度和经度。
- 把你当前的经纬度插入磁场计算器。
- 返回的是磁偏角。将此计算插入“iic_main_thread.c”行378中的代码。如果你的赤纬是东,然后从偏航值减去,如果是西,那么增加偏航值。
*照片取自Sparkfun的MPU 9250连接指南。
第13步:运行程序(相关文件见附件)
你一直在等待的那一刻!该项目的最好的部分是看到它的工作。我们注意到的一个问题是,从IMU报告的数值有所偏离。低通滤波器可以帮助纠正这种漂移,并且用磁力计摆弄,加速度和陀螺仪校准也将有助于纠正这种漂移。
- 首先,在SDK中构建所有,这可以通过按Ctrl + B来完成。
- 确保电源已打开并设置为5V。仔细检查所有电线是否正确到位。
- 然后,要运行该程序,请按任务栏上部中心的绿色三角形。
- 程序运行时,舵机全部复位到0位,准备好钻机移动。程序初始化后,舵机将回到90度的位置。
- 一个磁力计校准功能将运行,方向将被打印到UART终端,您可以通过串行监视器(如“putty”或SDK中提供的串行监视器)连接到该终端。
- 校准将使您将图8中的设备移动大约10秒钟。你可以通过注释“iic_main_thread.c”的第273行来删除这一步。如果你注释掉,你需要取消注释行323 - 325“iic_main_thread.c”。这些值最初是从上面的磁力仪校准中收集的,然后作为值插入。
- 校准后,稳定码将被初始化,设备将保持相机稳定。