本系统利用上位机识别图像对图像进行处理,然后将轨迹信息通过串口发送给下位机,下位机接受到点的坐标,通过这些坐标计算出步进电机转动所需要的pwm信号和en信号dir信号和抬笔舵机所需信号。绘图机器人的整体系统设计框架如下。
1 上位机程序设计
上位机程序采用 C++编写,使用OpenCV视觉处理库进行图像处理一共有四种画图方法:
(1)将图片二值化后直接轮廓化。
(2)也可以采用Canny算子对二值图像进行边沿检测后寻找轮廓。
(3)或者将二值化的图像进行细分后轮廓化。
(4)除此之外,还可以通过描点来直接绘制图画,这总方式画出来的图像是最漂亮的,但花费的时间比较长。
无论哪种绘图方法最终的图像信息都是转化为区域链码后发送给下位机器,下位机将数据存储进缓冲区,再将缓冲区的数据绘制成图,不断执行。直到最后一个子图执行完毕。
1.1 二值化寻找轮廓
读取图片对原图像转化为灰度图像,选择合适的二值化分割值,设置对应点为黑色(R 值 为 0,G 值为 0,B 值为 0)。经过二值化算法后我们得到了二值图像(非黑即白),为了得到轮廓图,们需要经过图像的轮廓化算法对图像进行处理。对二值化的图像进行遍历,如果该点为黑色且上下左右都为黑色(只比较 R 的值即可),那么就将对应点置为白色,否则,对应点色值不变。以下是经过分割值 value 下的二值化图像以及轮廓图像。之后将轮廓的区域链码获取后发送到单片机即可。
1.2 Canny算子
Canny边缘检测算子是John F.Canny于 1986 年开发出来的一个多级边缘检测算法。更为重要的是 Canny 创立了边缘检测计算理论(Computational theory ofedge detection),解释了这项技术是如何工作的。Canny边缘检测算法以Canny的名字命名,被很多人推崇为当今最优的边缘检测的算法。
将灰度图像二值化后,直接进行Canny边沿检测如下。
1.3 细化算法
为了得到文字的骨架,从而实现文字的书写,上位机采用细化算法来实现,细化过程中要根据每个像素的八个相邻点的情况来判断该点是否可以剔除或保留,其实质类似于腐蚀操作。
如上图除了c图和e图,其余的点都不能移除,通过遍历所有的像素点后就可以得到图像细化的骨架了。
1.4 描点画图
前面几总方法都是使用轮廓画图,描点画图就是将图像一个个点点出来,通过遍历所有二值化后的像素点,由上至下,从左到右检测黑白跳变,确定笔的起点和终点,最后发送边界链码至下位机运行。
1.5 获取区域链码
由前面算法得到的边沿数组,通过遍历所有边沿坐标,记录下的一个坐标后,将后一个坐标与前一个坐标相比较得到坐标的插值用0-7表示八个方向然后发送给下位机运行,为了让代码的适应性更强,本系统将长度大于500的边界切割成多条边界,这样分别发送给下位机,保证了上下位机不会丢失通讯信息。
2 下位机程序设计
2.1步进电机模块程序设计
4988控制逻辑简单,主要分为睡眠、正反转、复位、使能、细分等模式控制。
(1)睡眠模式:Sleep管脚电平置0,进入睡眠模式,驱动器输出待机模式;Sleep管脚置1,驱动器处于正常工作状态;
(2)正反转模式:正转模式DIR管脚置0或1,反转模式置1或0;
(3)复位模式:复位模式下容易消耗能量,产生的冲击电流较大。直接RESET管脚置1,在不影响系统工作时RESET管脚置0复位。一旦驱动芯片复位,系统将回归到原始A4988 I/O端口控制状态;
(4)使能模式:使能模式控制系统是否开始工作,ENBALBE管脚置0开始工作,置1停止工作;
(5)细分模式:通过MS1、MS2、MS3控制细分系数,A4988细分为1/16细分为最小,通过计算角度值可得最小细分角度为全步进角度的1/16。A4988驱动逻辑控制如表所示。
控制步进电机得PWM由定时器2产生,通过设定目标位置来对PWM得脉冲次数进行控制,通过设置定时器2的中断时间来实现对PWM的频率进行控制,从而控制电机速度。
2.2 控制算法程序设计
本系统通过由上位机传来的八方向边界链码来对步进电机进行控制,在控制步进电机的过程中同样将将笔尖移动的方向设为八个方向,这两样带来了两个好处:
- 绘制同样大小的图片的数据量大大减小,该系统最大可以绘制3500*3500个像素大小的图片,如果直接发送坐标数据笔尖挪动一个位置至少需要四个字节的数据,但是如果使用八方向边界链码,只需要发送起始坐标,之后笔尖挪动一个位置都只需要3bit的数据,大大减少了数据量的传输,增强了系统的实时性。
- 控制精度大大提升,代码量大大减少。由于直接使用坐标可能会需要控制X,Y两个轴的步进电机以不同的速度运行,这样频繁的修改PWM的频率容易导致步进电机丢步,但在使用八方向边界链码后,虽然在微观上PWM频率没变,但宏观上电机的速度发生了变化,这样间接的控制的电机的速度,而且使用该方法比传统使用两点确定一条线段的控制方法代码量大大减少,给出两点后需要STM32 通过插值算法计算出其间的各个点,再通过前后两点的位置关系完成绘图任务,这样浪费了时间和资源还不利于代码书写。
2.3 通信模块程序设计
串口通信设计上设置波特率为115200,为了保障数据的安全性、真实性、可靠性,本系统设置了自己的通信协议,包括帧头和帧尾校验位来传输数据。帧格式说明如下[以下数据是十六进制的]:
数据位 | 数据 | 功能 |
Byte 0 | A5 | 帧起始字节1 |
Byte 1 | 5A | 帧起始字节2 |
Byte 2 |
| 本帧包含的字节数,除了起始字节外,每组数据至少20000个数据000*3/8=7500 两位数据就够低位在前 |
Byte 3 |
|
|
Byte 4 | 00 | 帧功能: 01:开启绘图:数据位无 02:绘图起始坐标:数据为绘图起始位置 32位,低位在前 03:绘图长度:后面传输数据的长度 16位 04:放大倍数:8位 05:绘图数据:三位 低位在前 06:结束绘图:数据位无 |
Byte 5 | 01 | 数据值[范围0-255] 8*3 =24一个数据包含8个像素点的数据 |
Byte 6 | 02 |
|
Byte 7 | 03 |
|
Byte n | AA | 帧结束。 |
为了增强系统的实时性和容错率,尽可能的让传输的数据少,我们将三个字节的数据作为一组数据8*3 =24一组数据包含8个像素点的数据,以此来达到系统目的。
3.1 实物效果
实物的整体图片如下:
写字台的机械结构如下:
硬件电路板如下:
3.2上位机测试
上位机的调试界面如上通过滑条调整好相应参数后,键盘输入开始绘图。
3.3功能测试
3.3.1素描画测试
下图是绘画前的原图与采用二值化描点和Canny边沿检测绘画后的图片的对比。
3.3.2 汉字测试
下面是原图与机器书写空心字和实心字的对比。