这个机器人由三个步进电机以及其驱动芯片组成。电机控制芯片的脉冲与正反转信号由计算机并口(打印机口)输出,程序由VB编写!
绘图型工艺品机器人制作经验
张皓(zh1110)
2006.3.11 jiangshu china
首先我信仰基督教,2个月前我连电子学还没有入门到现在的成果非常迅速,感谢上帝给我能造出这个机器手.其次也感谢同事冯给我的一些指导.
一个月前同事冯告诉我一些他以前参加机器人比赛的情况,我很感兴趣并有了制造机器人的打算,目的是设计一类通用机器人可以完成工艺家凿刻、折、绘图的手工劳动。因为绘图无需大电机力矩,所以首先着手此机器人开发。
下面就其机械,电子、软件控制分别介绍:
机械部分是在一块铝塑板平台上安置一旋转盘,盘上放纸桶。边上安装两关节的手臂,手臂由二个步进电机控制,平台由一个步进电机控制。末端手臂扎有用毛笔毛制成的笔,纸桶转动同时笔在纸桶边做上下运动,这样就在纸桶上绘上了笔画。大臂与平台有机械限位,在运行前归零用,小臂与大臂间也有同样限位.机器的各种尺寸参数在程序中设置成Const方便调整。
电子部分由三个步进电机专用驱动芯片驱动三电机,芯片的脉冲CP与正反转信号DIR由计算机并口(打印机口)输出。因为并口输出高电平电压为3.6V,而驱动芯片需要5V.所以用一片74HC244做缓冲、244还可防护计算机并口.VB不能控制打印机端口用虚拟设备驱动模块"WinIo.dll"输出(WinIo是动态安装的,但在VB编辑环境无法连接).
电路图:
|
软件部分:
如此控制:用户先在绘图区随意涂抹,涂抹中鼠标按下时调用Maddline函数生成一条新直线,在鼠标移动的过程中坐标会加入到新直线的点数据中,数据可通过SaveRobotFile及LoadRobotFile函数保存到磁盘。绘制的直线数量是不定的,而每条直线中又包含许多点,所以自定义类型如下:
Public Type Dpoint '点类型
x As Single
y As Single
End Type
Public Type Dline '线类型
p() As Dpoint
End Type
Public myl() As Dline'可变数组
|
之后为了处理方便,直线数据要转化为相对简单的轨迹Trail()数据.其定义如下:
Public Type Track '轨迹点类型
x1 As Single '伪3空间(模拟区)的点X坐标
y1 As Single 'Y坐标
Ang1 As Single '步进电机1角度
Ang2 As Single '步进电机2角度
Ang3 As Single '步进电机3角度
Ni As Long '该点属于原直线数据中第几条
Nj As Long '该点在原直线数据中属于第几点
End Type
Dim Trail() As Track
现在已知笔在桶上的位置,又如何反算出电机角度呢?
我们通过第一张图很容易算出笔尖坐标为Length1-Length2/2,Length4+Length3'(如下),之后用直角三角函数算出C值.
再用三角函数C2=A2+B2-2*A*B*COS(a)算出电机1的上半角MoterAng1-a.以此方法就再算出电机1的下半角MoterAng1-b,电机2的角度MoterAng2.
程序中的几个主要全局变量与函数:
Public autorun As Boolean '程序在模拟/滑块拖动状态切换标志
Public maxtime As Single’每次运动的时间,用于细分
Const pi = 3.1415926'圆周率,弧度与角度单位切换用(计算用弧度制,显示用角度制)
Const pidivd = pi / 180
Const VI1 As Single ......'每个电机的减速比
Public Const PDEG1 As Single = 360 / VI1......'每个脉冲电机的转角。
脉冲数=(步进电机要达到角度―步进电机当前角度)/每个脉冲电机的转角
Declare Function GetTickCount Lib "kernel32" () As Long '高精度计时用系统函数
Declare Function GetPortVal Lib "WinIo.dll" 'WinIo.dll读端口函数
Declare Function SetPortVal Lib "WinIo.dll"'WinIo.dll写端口函数
Public Sub runsim()'模拟运行开始,直线数据转化为轨迹数据
Function CaleUseTime'估算每步运行的时间
Function cale3dx'一点转化到伪3空间
Public Sub RUNAddressOut'输出打印机端口值,每个电机占用2位,共六位,vb中用或操作符 " Or"合并后输出一字节.
|
对于延时处理,VB自带的TIMER控件最快只能1/18秒触发一次,时间要求不高的场合可以使用这个控件.有的初学者喜欢用一个大的FOR循环,这也不妥当,因为不同电脑CPU速度不同而造成时间差异.
合适的方法是用WINAPI函数GetTickCount返回系统运行时间的时间(理论上达到毫秒级别).
WINAPI还提供一个的函数QueryPerformanceCounter直接获取CPU周期,精度更可达微秒级别,但是使用它会降低系统性能.本系统即用此函数,用QueryPerformanceCounter获取CPU周期,QueryPerformanceFrequency取得CPU频率,两数相除即得到时间.
开始遇到的问题:
我在开始使用舵机+单片机作为系统,但经过实践发现舵机无法达到精度.不是单片机输出的脉宽精度不够,是舵机内的控制芯片只有3度左右精度.之后我使用了3个减速步进电机并放弃单片机,但步进电机用于小臂与旋转平台速度显的过慢,将其改造去除末级尼龙齿轮用电烙铁将前级齿轮与塑料转盘熔合就达到要求了.
还有一个问题是步进电机存在间隙在转向时发生误差有待解决.
手机拍摄的照片(点击大图):
程序文件下载ZIP
摄象下载WMV
|