基于FPGA的三自由度机械臂并行控制IP核的研究与开发*
2021-06-19江豪杰陆欣云王培楠姜翟跃
江豪杰,周 锋,陆欣云,王培楠,朱 宁,姜翟跃
(南京工程学院 信息与通信工程学院,江苏 南京 211167)
机械臂是现代工业革命变革、现代工业水平高度提高催生的一种新技术产品,从较高层次来说,机械臂是集机械设计、计算机程序控制等多领域知识和多种设计方法于一身的一种新型自动化装备,特别是近年来互联网、大数据的发展和应用机械臂已开始从自动化向智能化领域迈进。FPGA技术应用于步进电机控制领域的技术优势在于FPGA控制实时性高,单片机实时控制能力弱。并且FPGA内部有集成锁相环,可实现外部时钟的倍频,适合高速场合,单片机的运行速度是比不上FPGA的。
1 系统总体框图
图1主控芯片采用Alter公司的EP4CE10F17C8芯片和勘智公司的K210芯片。实现根据由K210芯片驱动摄像头识别指定颜色物体后将其坐标通过串口发送给FPGA,使其产生相应的PWM波驱动电机以使机械臂抓取相应颜色的物体。
图1 系统框图
2 系统机械设计
通过UG软件设计整个机械臂的结构,通过激光切割机加工制作。机械臂为三自由度关节构成。
建模分析:
图2便是在CAD作的三维建模前的准备。
图2 三维建模前的准备
首先,选择三自由度机械臂的侧视图为分析面。分别以轴承底座,关节1,关节2,末端执行机构建立坐标系,量出各个需要的角度以及长度,为在solidworks中三维建模以及后续进行机械臂的运动学分析做好准备。
其次,在solidworks根据CAD作的平面图完整详细地建模出这个机械臂的整体结构,以便于后续分析。虽然在solidworks中建模能够很好地表示出整个三自由度机械臂的外形结构,但是仍然无法观察到机械臂的内部结构,于是便只能选择作机械臂的爆炸图。当我们作完机械臂的爆炸图之后便可以清楚地观察到整个三自由度机械臂的具体组成:轴承底座,支撑关节1的外壳,支撑关节2的外壳,末端执行机构,以及最核心的凸轮四杆机构。
此时,便可以发现轴承底座的作用是对整个机械臂进行旋转运动,但最核心的仍然是这个凸轮四杆机构,我们需要对其再次分析,重新建模才能更清楚地了解机械臂的运动原理。由于关节2的外壳仅仅是与三角件连接机构铰接并无其他作用,于是便可以把它简化成一个长度相同、质量相同的杆。
3 系统硬件设计
硬件电路主要由电机驱动模块以及K210板卡模块组成,在电机驱动模块的设计中加入了光电感应开关以及限位开关。电机驱动模块通过输入端的坐标从而控制FPGA产生相应的PWM波来控制电机的输出状态。K210板卡模块则是负责颜色识别与所要识别目标的坐标的发送功能。传感系统由光电感应开关和限位开关构成,辅助机械臂可以更加稳定地抓取目标物体。
3.1 驱动器部分
机械臂的动作采用步进电机驱动,步进电机采用PL42B010B的型号,驱动电流为0.7A,步进电机驱动芯片采用Allegros公司出品的A4988双极型微步电动机驱动器。该驱动器具有可调限流、过流、过热保护,以及五种不同的细分(最低为1/16步)。它的工作电压为8-35V,在没有散热片或有空气流通的时候,每相最高可提供约为1A的电流(在有足够冷却的情况下,每相最高可提供约为2A的电流)。根据FPGA产生的不同的PWM波驱动电机以不同方式的转动,来达到抓取不同位置的物体。
3.2 物体颜色识别与坐标发送部分
颜色识别部分采用勘智公司的以K210为主控芯片的Maix py bit产品来驱动OV7725来进行物体颜色的识别及物体坐标的发送。Maix py bit是基于microPython的嵌入式机器视觉模块,目标是成为机器视觉界的“Arduino”。它成本低易拓展,开发环境友好,除了用于图像处理外,还可以用microPython调用其硬件资源,进行I/O控制,与现实世界进行交互。实现颜色识别的过程中,首先在软件中的机器视觉栏中根据当前环境的亮度进行阈值编辑,从而实现对指定颜色的识别与追踪。将Maix py bit上的15脚作为串口数据发送端口,接到FPGA上的串口数据接收端口,同理,将Maix py bit上的17脚作为接收端口并与FPGA上的数据发送端口相连。同时将两块芯片进行共地以确保数据准确实时的传输。
串口发送坐标中在有效数据之前加上B3、B4作为起始标志符,有效数据之后加上B5、B6作为末尾标志符,以方便通过串口将数据传输至FPGA进行处理的时候,防止意外状况从而处理错误的坐标。
3.3 传感器模块
3.3.1 限位开关
在机械臂三个轴的起始位置装配了机械限位开关,它一方面对每一个轴的运动极限进行保护,另一方面将所有轴回归到限位开关的位置对应的机械臂末端执行机构的位置定义为原点,从而可以对后续机械臂的位置控制建立参考原点。
3.3.2 光电感应开关
传感器采用光电感应开光来检测物体是否到来,检测到物体后发送信号到芯片从而给电机驱动模块。
图3为电机驱动原理图。
图3 电机驱动原理图
4 软件设计
4.1 颜色识别与坐标发送模块
4.1.1 颜色识别
使用find_blobs函数来查找颜色图像中的颜色色块。为了使色彩追踪效果好应当在非常受控制的照明环境中进行实验。图像选择色彩图RGB565的格式,选用QVGA的速度来进行识别。实验中关闭白平衡,白平衡是默认开启的,在颜色识别实验中需要将其关闭。
设置颜色阈值:设置在当前稳定光照环境下所要追踪的颜色的阈值,其语法句式如下Colour_threshold=(minL,maxL,minA,maxA,minB,maxB),括号中的数值分别为L、A、B的最大值和最小值,L、A、B的值可以在软件maix IDE图像左侧三个坐标图中获得。设置blobs作为判定变量,当找到颜色时即对其使能,否则不使能,语法句式如下blobs=img.find_blobs([colour_threshold])。
4.1.2 坐标定位
通过迭代找到目标颜色区域,并将具体数据赋给变量b,相应语法句式见下:for b in blobs:此句的作用就是从blobs进行迭代取值,每次把值赋给b,而这里的blobs即为颜色识别部分的blobs,通过颜色识别中的blobs=img.find_blobs([colour_threshold]);即可将所要查找色块对象的列表信息全部赋给blobs,此处数据很多但是通过对库函数imag.find_blobs的学习可以知道b[5],b[6]分别对应着所要识别色块中心坐标的x和y坐标。从而进行赋值x=b[5],y=b[6]即可实现对识别颜色对象的中心x和y坐标了。
4.1.3 坐标发送
这里我们使用串口通信的方式将所要识别颜色对象的中心x和y坐标发送给FPGA。这里我们将K210上的15脚作为数据发送脚,17脚作为数据接收脚,其对应的例化程序如下:
fm.register(board_info.PIN15,fm.fpioa.UART1_TX)
fm.register(board_info.PIN17,fm.fpioa.UART1_RX)
这里串口发送用库函数uart_A.write()来实现,其中括号里面就是要发送的数据,这里我们将FH赋值为0作为前校验位,以防实际应用时出现干扰。如果直接将采集到的坐标数据作为有效数据发送出去就会产生错误。x与y就是上面通过x=b[5],y=b[6](所赋值得到的识别颜色对象的中心x和y坐标)。
4.2 电机驱动部分
此次电机驱动部分采用DDA插补控制实现方案,本文在设计积分插补器模块中采用了有限状态机的方法。积分累加的过程分为三个状态:空闲状态(Idle)、累加状态(ADD)和溢出状态(Full)。在空闲状态Idle,如果还没有启动信号start,则保持处于空闲等待状态,直到启动信号start为1有效时,则从空闲状态读入被积函数寄存器和累加器的初始值,转入累加状态(ADD)。在累加状态(ADD),置工作忙信号Busy为1,将被积函数寄存器的值和累加器的值进行累加,累加的结果存在累加器中,如果累加有溢出,则转入溢出状态(Full|)。在溢出状态(Full|),输出插补脉冲,计数器的值(为被积函数寄存器的终点坐标值)减1,然后继续累加,直至计数器的值减为0,返回到空闲状态。
以下为状态转移代码部分:
if(x[16]==1'b1)//x[16]作为x轴进位标志,如果为1,进入状态2,
S=2;
if(y[16]==1'b1)//y[16]作为y轴进位标志,如果为1,进入状态3,
S=3;
if(z[16]==1'b1)//z[16]作为z轴进位标志,如果为1,进入状态4,
S=4;
if((counter_A==16'b0)&(counter_B==16'b0))//如果计数器为0就回到空闲状态,
begin Busy﹤=1'b0;S=0;end
主程序流程图见图4。
图4 主程序流程图
5 实际测试
通过对颜色识别、物体抓取进行测试,可以看到机械臂可以实现对不同颜色物体的准确抓取。其具体实物图如图5。
图5 机械臂实物图