1. 引言
写字是人类基本行为习惯之一,仿人功能写字机器人的研究是目前机器人发展的一个重要分支,国内外对于写字机器人的研发和应用 [1] 都已经取得了一定的成果。国内小米推出的小米写字机,能够实现手写识别和书写,美国的AxiDraw机器人能够实现高精度的自动书写。结合现有成品以及相关文献在理论研究层面,要研究分析写字机器人的运动学过程并解决规划路径的解析工作,也要研究分析如何对写字机器人进行路径规划、画笔的力道控制、画笔的位置控制、画笔的速度控制等内容。在实践操作层面,涉及到系统的机械结构设计、整体电路设计、硬件设计与选择、软件开发等内容。本文设计实现的写字机器人将字轨迹通过运算,转换成机器人要运动的路径。具体要在完成系统参数初始化、系统部件之间通信初始化的前提下,通过反解算法设置舵机的起笔、落笔子程序功能实现,步进电机的前进、停止子程序功能实现,转弯子程序功能实现等。
2. 系统总体设计方案
2.1. 系统概述
本系统旨在设计并实现一个完整统一的竖直平面写字机,具体包括电源驱动模块、上位机控制软件、下位机主控芯片模块、画笔驱动模块、硬件连接支撑部件等。该写字机首先能够实现硬件搭建并具备一定的抗干扰能力,在此基础之上实现各功能算法子系统能够正常运作,从而使写字机能够完成对人们给定坐标串进行解析转化为电机与舵机的相关动作,从而实现预定轨迹路径的写字作图功能并可通过调节参数和起始落笔点从而实现工作区域大小和位置的改变。
2.2. 系统实现方法
实现画笔写字绘图功能的关键是使画笔运动与使画笔按照预期轨迹运动。在电源设备的供能下,主控芯片通过引脚接线即可以使电机使能而运动,而控制电机按照预期轨迹运动则需要通过主控芯片通过算法逻辑解析电机与舵机的运动行为从而控制控制画笔的按照预期规划运动。为体现自主性,本次设计通过人工规划文字路径并设计相关路径坐标串储存在程序中,主控芯片运行至数据坐标串时顺序读取坐标串从而控制画笔一步接一步按照预期轨迹移动从而写出相关文字。通过所建立的各种运动子程序,以画笔起始点为坐标原点,通过画笔移动连接按顺序所给出的各坐标点,以此完成写字作图功能。
3. 系统构建
系统整体结构包括电源驱动模块、上位机控制软件、下位机主控芯片模块、画笔驱动模块、硬件连接支撑部件等,具体系统工作流程如图1所示。

Figure 1. System hardware working principle diagram
图1. 系统硬件工作原理图
3.1. 系统总体电路设计及主控芯片选型
写字机系统以Arduino Uno R3为主控板 [2] ,该主控板最高工作频率达72 MHz,是一种的低功耗、性能稳定的单片机。驱动系统采用28BYJ-48步进电机带动线绳从而扯动画笔在竖直二维平面上的按轨迹移动,画笔的抬起与落下通过性能稳定的TS90A 90g舵机进行控制,机械传动系统结构包括电机支架、线轴、线绳、舵机支架、画板等,电源系统采用USB数据线进行供电。
由以上可知硬件电路模块包含主控芯片、串口通信模块(配置在主控芯片内)、步进电机及驱动模块、抬笔舵机模块、电源等五个模块。主控芯片图、系统总体电路连接图,整体电路连接图如图2所示。

Figure 2. Overall circuit connection diagram
图2. 整体电路连接图
Arduino Uno板内部具有智能电源切换电路 [3] ,电路原理如图3所示。其工作原理是在运算放大器U3、二极管D1、稳压器U1与U2和分压电阻R1与R2的共同作用下,无论是通过S1、S2控制的外接电源供电或者USB供电方法,都能在智能电源切换电路的作用下输出符合主控芯片工作状态的稳定的电压。

Figure 3. Intelligent power switching circuit
图3. 智能电源切换电路
智能电源切换电路的存在使得主控芯片可以同时连接多个电源 [4] ,此电路会自主选择最高可用电压的作为主控芯片的供电电源,然后将其此电源接入稳压器进行稳压操作。兼顾便利与经济性,本文设计所采用供电方法是用主控板与电脑相连的USB线进行供电,此时的USB数据线不仅起到了供电的作用,还是进行电脑程序数据与主控板进行通信的通信线。
Arduino Uno板通过扩展插座提供14个数字I/O口,引脚编号为0~13。数字I/O口作为输出口使用时具有一定的带负载能力,此时需要注意的是每个I/O口的平均电流不宜超过20 mA,峰值电流不能超过40 mA,且所有I/O口的电流总和不要超过200 mA。
14个数字I/O口中的3、5、6、9、10、11引脚支持PWM输出,应用在本次设计中,两步进电机记为M1、M2,两步进电机驱动器的各4条信号线IN1~IN4分别对应连接Arduino Uno板的2、3、5、6和7、8、9、10引脚来进行控制信号的传递。
3.2. 电机及驱动选型
考虑本次设计的技术指标要求如精确控制画笔走停,停电后不会因负载而被反向拉动且考虑经济性与操作方便等因素,决定采用步进电机,具体型号采用28BYJ-48步进电机,通过驱动板的连接即可进行供电,不用外加电源,自带减速齿轮,力道可以满足我们的需求,且有成熟的实际工业应用案例,如一般空调的导风板就是用此电机进行拉动。
该步进电机可在5~12 V的直流供电电压下进行工作,常采用单四拍、双四拍和八拍作为电机的通电驱动方式,本次电机驱动型别是四相八拍,电机的通过接受电脉冲信号而进行相应驱动,每接受一个电脉冲信号电机就会转过一个最小的基本角度(步距角),通过给定电机不同数量与性质的电脉冲信号就可控制电机进行相应的转动。
3.3. ULN2003步进电机驱动

Figure 4. Schematic diagram of stepper motor drive
图4. 步进电机驱动示意图
ULN2003步进电机驱动板与Arduino Uno控制板进行图4相应的电路连接 [5] ,步进电机通过ULN2003电机驱动板从Arduino Uno控制板接收相应的驱动和控制信息,本次设计中直接将驱动板的“+”、“−”引脚与控制板的VCC与GND引脚相连接进行供电,驱动板的四个引脚IN1~IN4与控制板的数字口进行连接,其中画板右侧步进电机的IN1~IN4与Arduino Uno主控板的2、3、4、5数字引脚进行连接,画板左侧步进电机的IN1~IN4与Arduino Uno主控板的7、8、9、10数字引脚进行连接。
3.4. 抬笔舵机选型
舵机,英文名称servo,是一个处于闭环工作状态的伺服单元,因此有着较为精准的输出和稳定的工作性能,且有这体积小、重量轻、输出稳定且输出力矩大的特性。内部一般包括电机及其控制器、减速器等部件,如上所述舵机是一个闭环系统,舵机内有一个对转轴转角进行实时监测的角度传感器,通过检测到的实际输出转角与理想输出转角的差值可以相应的产生控制信号控制舵机的运动从而转到理想的角度。
舵机有输出保持功能,即当给定电脉冲调制信号的宽度以后,舵机执行机构就会产生与之对应的转角,在保持供电的情况下,此角度可在施加外界转矩的作用下而保持固定,直至下一个驱动控制调制电脉冲信号的到来,此特点非常适合作为本次的抬笔与落笔动作的控制机构,以此来保证画笔的正常抬起与落下。
3.5. 硬件支撑传动部件
硬件支撑传动部件 [6] 包括扯动画笔移动的线轴与线绳、提供输出转角使线轴转动的步进电机及其支撑机构、使画笔抬起落下的抬笔舵机及其支撑机构、用于书写工作的画笔的支撑机构。在主控芯片、步进电机与抬笔舵机进行选型并确定相应支撑与传动部件后,系统整体硬件安装情况如图5所示。

Figure 5. Overall hardware assembly appearance of the system
图5. 系统整体硬件组装外观图
3.6. 供电方式选择
采用USB数据线进行供电,既可以与笔记本电脑相连,也可与移动电源等相连。
4. 系统算法设计
4.1. 上位机编译平台Arduino IDE
写字机器人雏形机之所以不能称之为完全意义上的写字机器人,是因为它只有硬件结构而不具备软件编程功能。本次设计主控芯片采用Arduino Uno控制板,主控芯片需要被写入代码程序才能工作运行,对主控芯片的算法编写与录入由上位机编译平台Arduino IDE来完成。
Arduino IDE是一款开源软件并支持代码程序的在线烧录,打开Arduino IDE,Arduino IDE界面的上方、中间与下方分别是工具栏、代码编辑区和消息通知区。
4.2. 画笔水平移动子程序设计
主控芯片通过设定的算法逻辑解析坐标串代码 [7] ,通过数字引脚发出的相应的PWM脉冲信号,该脉冲信号作为步进电机驱动器ULN2003的输入信号,电机驱动器按照其接收的信号内容来决定相应电机的动作内容,从而使画笔产生相应的位移。
本设计采用步28BYJ-48步进电机,一周步长2048步转360度。又本设计采用线轴直径35 mm,周长为110 mm,通过计算可知步进电机步距为0.0537 mm,即每步线绳被拉动的距离的最小分辨率为0.0537 mm。
为了写出来的汉字平滑,步进电机每步运动后要进行相应的等待延时时间设定且转弯等待时间也要进行设定,应等待笔静止后再运动。为了确定画笔的行走路径可遍历平面,则要实现画笔即可前进又可后退,映射到电机的正反转带动线绳的卷入与卷出。
4.3. 中画笔竖直移动子程序设计
本设计中,以竖直面为基准平面通过调整程序参数以此来控制舵机相对于竖直基准面的旋转角度从而控制画笔抬起与落下。按照下图所示方式安装画笔及其固定装置,通过实际现场调试可知,抬笔参数可选择范围为:120˚~180˚,落笔参数可选择范围为:0˚~110˚。
完成以上硬件连接后,要进行舵机与Arduino Uno主控板的通信。
4.4. 图画笔移动至目的位置的路径算法规划程序设计
画笔要实现如图6所示的移动,即要从D移动到D′的位置,只需要通过相应的算法分别计算出画笔移动前与移动后AD和AD′的差,BD和BD′的差,即得出两线轴要放多少线或收多少线和舵机的动作,从而可确定电机应该正转还是反转及转过的步数,至此就完成了画笔按照预期轨迹的一步移动,重复上述操作,就可以实现画笔的按照给定数据坐标串的规划路径的移动。

Figure 6. Schematic diagram of brush movement
图6. 画笔移动示意图
完成系统各参数设定后,以画笔初始落点为坐标原点,以给定坐标点为目的点,依据勾股定理原理,可反解出电机的相应动作,具体实现流程如图7所示。

Figure 7. Flow chart of the brush moving according to the expected trajectory
图7. 画笔按照预期轨迹移动流程图
5. 系统测试
5.1. 主控芯片工作情况测试
第一步首先在Arduino开发板上装上原型扩展板和面包板,并用导线连接电路。
第二步用USB线将Arduino Uno板连到电脑,连接成功后,电源指示灯亮起。
第三步用鼠标点击“这台电脑”,并单击右键/管理/设备管理器/端口,查看Arduino Uno连接的COM口并记录,后续下载程序在此端口进行。
第四步是在代码输入后,进行代码的编译工作。如果显示没有错误,设置Arduino IDE板子型号以及相应的串口号后,进行代码的上传工作。
第五步是观察测试结果,面包板上的LED每隔一秒交替亮灭一次,说明主控芯片正常工作。
在本次设计中,依据实际现场情况,主控芯片通电后相应指示灯亮且与之相连的面包板上的LED等按照设定规律变化,说明主控芯片处于正常工作状态。
5.2. 基础坐标数值参数测试
已知实际系统的水平距离参数(单位为mm)为400,即X = 400;竖直距离参数(单位为mm)为150,即Y = 150。现进行距离参数的不同对实际绘图效果的影响测试 [8] ,以下图形中,图8给出了Y = 80,X分别等于200、400、800是的实际绘出效果;图9给出了Y = 150,X分别等于200、400、800时的实际绘出效果;图10给出了Y = 250,X分别等于200、400、800是的实际绘出效果;图11给出了不同变量组合下所绘出的九张图的综合对比照。

Figure 8. Actual plot when Y = 80
图8. Y = 80时实际绘出图

Figure 9. Actual plot when Y = 150
图9. Y = 150时实际绘出图

Figure 11. Comprehensive comparison of different variable value combinations
图11. 不同变量值组合下的综合对比图
5.3. 系统绘图写字子程序测试
5.3.1. 画线子程序设计
依据现场设备实际距离数据调整相应距离参数并设置由测试得出的合理延时等待时间,以画笔初始落点为坐标原点,在画笔的最佳工作区进行直线、矩形与菱形图形的实际绘出效果如图12所示。
以上图形的正确绘出说明在各硬件处于正常工作状态且各参数选择合理的情况下,此直线子程序可正确运行。
5.3.2. 画圆形、心形等曲线子程序测试
依据现场设备实际距离数据调整相应距离参数并设置由测试得出的合理延时等待时间,以画笔初始落点为坐标原点,在画笔的最佳工作区进行圆形、心形与蝴蝶曲线的绘出效果如图13所示。
5.3.3. 规划路径程序设计测试
以“谷”字为例,“谷”字的笔画数为七、端点(端点在本文中的含义是字体各笔画的起点、终点及笔画中的各拐点)数为十二且书写笔画顺序如图14所示。以初始画笔落点为坐标原点即(0, 0)点,画板右侧为X轴正方向,画板下方为Y轴正方向。端点坐标即代表了画笔实际运行的具体行进路径,分析可知各端点坐标分别是(−32, 65),(−36, 71),(−28, 65),(−24, 71),(−30, 68),(−37, 80),(−30, 68),(−23, 80),(−34,77),(−34, 85),(−26, 77),(−26, 85)。

Figure 14. Writing stroke order of the character “Gu”
图14. “谷”字的书写笔画顺序
书写“谷”字的具体过程如图15描述,首先 [9] 在电脑程序界面进行路径端点坐标值的程序录入,然后编译并通过USB数据线将代码上传至Arduino Uno控制板,相应坐标数据串代码如下所示,其中moveto()语句表示画笔从起始坐标点快速移动至目的坐标点,line()语句表示从起始坐标点作直线运动至目标坐标点,pen down()语句执行的操作是使画笔落下,此时画笔移动会留下笔迹,pen up()语句执行的操作是使画笔抬起,此时画笔移动不会留下笔迹。

Figure 15. Actual writing effect of the character “Gu”
图15. “谷”字的实际写出效果图
6. 总结
本文设计实现了一种基于路径规划的绘图写字机器人的解决方案,具体包括硬件选择及电路搭建、机械传动结构选择与搭建、画笔运动算法程序开发等。该方案具有结构紧凑合理、搭建简单、工作稳定、调试方便等优点,可以按照规划好的字体笔划进行书写。且本次设计所开发采用的算法逻辑简单、灵活而且实用性高,同时通过添加延时等待程序得出理想的延时等待参数,可以实现在整体工作时间与写字绘图的流畅与平滑性之间达到一个较好的均衡,延时等待程序也可以减少书写毛刺的产生并增加画笔移动运行的平稳。