本帖最后由 jf_45354799 于 2024-11-2 14:14 编辑
先来一张效果图
这个项目上个月就在做了,结构和代码反反复复改了多次,加上自己又太忙,一直没来得及发帖分享。所以先立这个帖子吧,这两天先打点零件出个组装教程。
3D打印零件路径如下,可自行下载
drawbot by MG-mossbot - Thingiverse
需要用到的软件如下:
Xloader固件烧录软件 用于给控制板烧录程序
机械臂大师上位机(作者原创软件) 用于给机械臂发送指令
G代码生成软件1 inkscape及相关插件 用于把照片文字生成可供执行的G代码
G代码生成软件2 奎享雕刻绿色版 生成手写体G
代码 可通过手机app制作自己的专属字体 G代码生成软件3 laserGRBL,支持中文 用于把照片文字生成可供执行的G代码
项目简介:
桌面级scara机械臂,运动机构为两个42步进电机和一个9g舵机,控制板为mega 2560 和ramps 1.4,其他部件主要为3D打印件,工作范围为A4纸,使用国标G代码,目前可以实现写字画画功能。
交流q群 791947714
---------------------机械安装教程-------------------
drawbot 所用零件除打印件和铝管外均为标件,tb上都能买到。 打印件tb上也有代打的,当然也可以找我打。
bom 表已整理完成,见下表,此表为最新表,适用于新笔夹。
舵机线长度需要80cm,长度不够的,需要自己接延长线。M8*55六角螺钉可用Φ8**40-M6 塞打螺钉代替,M8螺母也需换成M6。提高两个驱动轮同轴度。
零件差不多齐了,开搞了 注 下面教程不分照片使用的是笔夹为老版本, 新笔夹安装图如下。
舵机线不够长的,先将线加长到80cm,在较长的一根铝管一端装上舵机支架,将舵机线穿入管内
装上舵机和笔夹,2mm*12mm光轴,2*12螺钉代替
安装连接件,两轴承中心距需为50mm,舵机线从管内穿过
安装皮带轮,提前套入同步带,不要漏了
限位开关为常闭型,如果买的常开型,自己改下线,接触片朝下。
安装步进电机
两个M4螺钉反装如图
插上电机线,裹上束线管,机械部分就算完成了
电气接线图如下,舵机 红正黑负 棕色为信号线,4988
驱动模块下面 需全部短接,以设置步进电机为16细分。电源为12v 电流大于2A即可。 ---------------------调试教程-------------------
将mega2560连接电脑,打开设备管理器-端口找到如下端口, 如果电脑无法识别控制板,需要控制板驱动,找商家要即可。
用xloader烧录hex固件。固件在thingiverse 3D打印件文件包中,选择对应的端口,波特率115200
打开机械臂大师,选择对应端口连接
出现如下返回值则连接成功。如果没有出现返回值,按一下控制板上的按钮即可。
软件界面如下
常用的控制指令如下:
引用: G1 X10 Y10 直线移动
G28 回home点,每次开机后需要先回home点以确定机械臂位置
G90 切换到绝对坐标
G91切换到相对坐标系
G94切换到直角坐标系
G95切换到到角度坐标系
M3 舵机落笔 转到默认落笔角度
M3 S15 舵机转到15度
M4 L10 T40 设置默认落笔角度L 默认抬笔角度为T (用M4修改抬笔落笔舵机角度后,再通过M3 M5指令抬笔落笔,确认角度是否合适 )
M5舵机抬笔 转到默认抬笔角度M92 X48.8 Y48.8 设置电机分辨率,如果电机步进角是1.8°,16细分直接用出厂设置就行
M203 X2000 Y2000 设置电机最大运动速度
M201 X1000 Y1000 设置电机运动加速度
M205 X0.8 电机运动平滑度 (下面介绍)
M503 查看机械臂设置参数
M501 载入用户参数(保存到EEPROM的参数)
M502 恢复出厂设置
M500 保存用户参数(保存到EEPROM)
M370 将当面位置定义为坐标原点
M700 自动标定
所有参数修改后需用M500保存,否则重启后数据会丢失
首次连接后需要先发送M502恢复出厂设置,然后将机器摆成图示角度,大臂与电机座侧边平行,大小臂之间夹角为45°,可用A4纸对折得到45度角。
点击自动标定按钮,机械臂会自动归位,并触发限位,并通过计算到触发限位移动的步数,确定机械臂的角度,并数秒后标定完成,然后发送M500指令保存设置。
标定完成后,下次开机只需要回home位(点机械臂大师的中小房子即可,即G28指令)。如果机械臂重新拆装后,则需要重新标定。
如果标定后画线不直,请确认安装后下面3个尺寸是否准确,大小臂各长200mm,大臂和大臂拉杆轴承中心距离50mm。
发送G28回到HOME点,导入G代码生成软件导出的G代码,就可以开始愉快的写字了。
坐标系定义如下,X轴平行于电机座侧边,原点相对于旋转中心偏移如下,书写范围可以覆盖整个A4纸。
------------------------ ----控制代码部分-------- -------------------------控制板作为下位机,他的作用是解释上位机发过来的G代码,G代码包含运动坐标值和一些控制指令,对于运动控制,下位机就是将G代码转换成步进电机的脉冲控制步进电机。这里比较关键的就是坐标正解反解函数,已知末端坐标值求出机械臂的角度,或已知机械臂的角度求出末端坐标值。
大多数工业scara机械臂副臂控制电机位于主臂和副臂上,电机控制的大臂小臂之间的角度,属于“相对”角度scara。如下图
和drawbot一样的平行四边形结构,副臂电机控制的副臂相对于世界坐标系的角度,即“绝对角度”scara
通过同步带传送,将电机移动到固定底座上,也为“绝对角度”scara
两种结构运动算法稍微有点区别。marlin 自带的scara算法属于“相对角度”scara,这里容易被忽略。
drawbot正解算法如下:
引用: void calculate_SCARA_forward_Transform(float f_scara[3])
{
float x_sin, x_cos, y_sin, y_cos;
x_sin = sin(f_scara[X_AXIS]/SCARA_RAD2DEG) * Linkage_1;
x_cos = cos(f_scara[X_AXIS]/SCARA_RAD2DEG) * Linkage_1;
y_sin = sin(f_scara[Y_AXIS]/SCARA_RAD2DEG) * Linkage_2;//当Y电机控制小臂相对于世界坐标系旋转角度时使用此公式
y_cos = cos(f_scara[Y_AXIS]/SCARA_RAD2DEG) * Linkage_2;//当Y电机控制小臂相对于世界坐标系旋转角度时使用此公式
delta[X_AXIS] = -x_cos - y_cos - SCARA_offset[X_AXIS]; //求得用户坐标系下X值
delta[Y_AXIS] = x_sin + y_sin - SCARA_offset[Y_AXIS]; //求得用户坐标系下Y值
}
SCARA_RAD2DEG弧度角度转换常数,即180/π。三角函数计算是弧度计算,所以所有角度需先转换成弧度。通过三角函数关系算出x_sin x_cos y_sin y_cos.
则图中黄色向量表示世界坐标系下的末端位置,(-x_cos - y_cos,x_sin + y_sin ) 。再减去用户坐标偏移SCARA_offset,得到用户坐标系下的末端坐标值。
反解算法如下
引用: void calculate_delta(float cartesian[3]){
float SCARA_pos[2];
sta
tic float SCARA_C2, SCARA_S2, SCARA_K1, SCARA_K2, SCARA_theta, SCARA_psi;
SCARA_pos[X_AXIS] = -cartesian[X_AXIS] - SCARA_offset[X_AXIS]; //求世界坐标系下X值并取反
SCARA_pos[Y_AXIS] = cartesian[Y_AXIS] + SCARA_offset[Y_AXIS]; //求世界坐标系下Y值
SCARA_C2 = ( sq(SCARA_pos[X_AXIS]) + sq(SCARA_pos[Y_AXIS]) - (float)L1_2 - (float)L2_2 ) /(2*Linkage_1*Linkage_2);
SCARA_S2 = sqrt( 1 - sq(SCARA_C2) );
SCARA_K1 = Linkage_1 + Linkage_2 * SCARA_C2;
SCARA_K2 = Linkage_2 * SCARA_S2;
SCARA_theta = ( atan2(SCARA_K1, SCARA_K2)-atan2(SCARA_pos[X_AXIS],SCARA_pos[Y_AXIS]) ) ;//大臂旋转角度,即主臂与-X轴夹角
SCARA_psi = atan2(SCARA_S2,SCARA_C2) + SCARA_theta;//小臂旋转角度,当Y电机控制小臂相对于世界坐标系旋转角度时使用此公式
delta[X_AXIS] = SCARA_theta * SCARA_RAD2DEG; //大臂旋转角度转换为弧度
delta[Y_AXIS] = SCARA_psi * SCARA_RAD2DEG; //小臂旋转角度转换为弧度
}
}
cartesian[X_AXIS][Y_AXIS]为用户坐标系下坐标值,加上SCARA_offset得到世界坐标系下坐标值。
其中SCARA_pos[X_AXIS]向量方向向右,与原坐标值X方向相反,故取反。
#define L1_2 sq(Linkage_1)
#define L2_2 sq(Linkage_2)
L1_2 L2_2是预先定义好的臂长的平方
则直线AB距离的平方为 sq(SCARA_pos[X_AXIS]) + sq(SCARA_pos[Y_AXIS]
三角形ABC中,现已知三边长度,由余弦定理推出 cosC=(a^2+b^2-c^2)/2ab
α的补角为
arccos [ ( (float)L1_2 + (float)L2_2- sq(SCARA_pos[X_AXIS]) - sq(SCARA_pos[Y_AXIS]) ) /(2Linkage_1Linkage_2) ]//这里是伪代码,C语言没有arccos函数
SCARA_C2为补角的cos值得取反
SCARA_C2 = ( sq(SCARA_pos[X_AXIS]) + sq(SCARA_pos[Y_AXIS]) - (float)L1_2 - (float)L2_2 ) /(2Linkage_1Linkage_2);
将α cos值转换为sin值
SCARA_S2 = sqrt( 1 - sq(SCARA_C2) );
根据三角函数关系求出 SCARA_K1 SCARA_K2
由图可知SCARA_theta +δ+β =π/2 δ+γ =π/2
则SCARA_theta =γ-β = ( atan2(SCARA_K1, SCARA_K2)-atan2(SCARA_pos[X_AXIS],SCARA_pos[Y_AXIS]) )
SCARA_psi = α+SCARA_theta = atan2(SCARA_S2,SCARA_C2) + SCARA_theta
乘上弧度角度转换因子得出大小臂角度值
delta[X_AXIS] = SCARA_theta SCARA_RAD2DEG
delta[Y_AXIS] = SCARA_psi SCARA_RAD2DEG
运动平滑度参数设置补充说明,运动平滑度就是工业机器人中的CNT值,因为速度不可以瞬间改变,折线运动中,如果准确运动到折点,折点速度为0,速度为很慢,所有用一条弧线代替折线,两条线的加速度梯形相交,设定值即为相交点的速度,设置越大,速度越快,路径被倒成的圆角也就越大。