2021-8-18 15:17:29 [显示全部楼层]
33400浏览
查看: 33400|回复: 4

[项目] drawbot 桌面级scara机械臂

[复制链接]
drawbot 桌面级scara机械臂图1

在thingiverse上闲逛的时候,翻到了一个好几年前的机械臂项目,一下子就被这骚粉色吸引了。桌面级scara机械臂,运动机构为两个42步进电机和一个9g舵机,控制板为mega 2560 和ramps 1.4,其他部件主要为3D打印件,工作范围为A4纸,使用国标G代码,目前可以实现写字画画功能。

drawbot 桌面级scara机械臂图19

作者自己为了方便在淘宝开了店:点击前往

drawbot 所用零件除打印件和铝管外均为标件,tb上都能买到。打印件tb上也有代打的,当然也可以找我打。

bom 表已整理完成,见下表。螺钉螺母数量可能不准确,建议多备几颗。舵机线长度需要80cm,长度不够的,需要自己接延长线。M8x55六角螺钉可用Φ8x40xM8 塞打螺钉代替,提高两个驱动轮同轴度。

步进电机和限位开关线长度为40cm。

铝管长度为178mm  200mm(老款笔夹)  178mm 197mm(新款笔夹),bom中长度有误,请注意。


材料清单

Part name unit
内六角螺钉 M8*55 1
内六角螺钉 M3*25 2
内六角螺钉 M3*12 3
内六角螺钉 M3*20 8
内六角螺钉 M3*50 4
内六角螺钉 M4*12 1
内六角螺钉 M4*30 1
内六角螺钉 M4*35 1
内六角螺钉 M3*16 1
内六角螺钉 M3*10 1
内六角螺钉 M2*10 4
内六角螺钉 M3*12 手拧螺丝 1
螺母 M3 12
螺母 M8 1
螺母 M4 3
垫片 M4 4
垫片 M8 2
带轮 608zzz 2
带轮 624zzz 5
铝管 15mm 13mm 153mm 1
铝管 15mm 13mm 181mm 1
电气 mega1560 1
电气 ramps1.4 1
电气 A4988 2
电气 Limit switch限位开关 2
电气 42 step motor步进电机 2
电气 9g servo 舵机 1

软件

需要使用的软件主要如下

下面是作者更新过的清单

将mega2560连接电脑,选择对应的端口,用xloader烧录hex固件。

drawbot 桌面级scara机械臂图2
打开机械臂大师,选择对应端口连接

drawbot 桌面级scara机械臂图3
出现如下返回值则连接成功。

drawbot 桌面级scara机械臂图4

软件界面介绍如下

常用的控制指令如下:

  • G1 X10 Y10   直线移动

  • G28 回home点,每次开机后需要先回home点以确定机械臂位置

  • G90 切换到绝对坐标系

  • G91切换到相对坐标系

  • G94切换到直角坐标系

  • G95切换到到角度坐标系

  • M3 舵机落笔  转到默认落笔角度

  • M3 S15 舵机转到15度

  • M4 L10 T40  设置默认落笔角度为10 默认抬笔角度为40

  • 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恢复出厂设置,然后将机器摆成图示角度,点击自动标定按钮,数秒后标定完成,然后发送M500指令保存设置
1.大臂与电机座侧边平行
2.小臂与大臂呈45度角

发送G28回到HOME点,导入G代码生成软件导出的G代码,就可以开始愉快的写字了。写字测试,由于抬笔结构为旋转式抬笔,速度太快写字会飘,后续考虑改结构,做成直上直下结构。


模型下载地址https://www.thingiverse.com/thing:3096135


制作过程

舵机线不够长的,先将线加长到80cm,在较长的一根铝管一端装上舵机支架,将舵机线穿入管内
drawbot 桌面级scara机械臂图5
装上舵机和笔夹,之前bom表漏掉了一个2mm*12mm光轴,可用钢丝代替。

drawbot 桌面级scara机械臂图6
穿线

drawbot 桌面级scara机械臂图7

drawbot 桌面级scara机械臂图8

安装连接件

drawbot 桌面级scara机械臂图9
drawbot 桌面级scara机械臂图10

安装皮带轮,提前套入同步带,不要漏了

drawbot 桌面级scara机械臂图11

限位开关为常闭型,如果买的常开型,自己改下线,接触片朝下。

drawbot 桌面级scara机械臂图12

有个螺孔被挡住了,3颗勉强固定,网上底座图纸孔位已更新

drawbot 桌面级scara机械臂图13

两个M4螺钉反装如图,正装转动螺母会松

drawbot 桌面级scara机械臂图14

插上电机线,裹上束线管,机械部分就算完成了

drawbot 桌面级scara机械臂图15
全家福

drawbot 桌面级scara机械臂图16


坐标系定义如下,X轴平行于电机座侧边,原点相对于旋转中心偏移如下

drawbot 桌面级scara机械臂图17


代码

控制板作为下位机,他的作用是解释上位机发过来的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,得到用户坐标系下的末端坐标值。

反解算法如下

drawbot 桌面级scara机械臂图18

void calculate_delta(float cartesian[3]){

float SCARA_pos[2];
  static 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,速度为很慢,所有用一条弧线代替折线,两条线的加速度梯形相交,设定值即为相交点的速度,设置越大,速度越快,路径被倒成的圆角也就越大。

本文为发布者再原作者的基础上做了重新排版后发布的,原作者为贴吧高唱我爱你,如有维权请联系。


白凡  高级技师

发表于 2021-9-9 12:30:32

膜拜巨佬!!!666666!
回复

使用道具 举报

SHERRY  学徒

发表于 2021-10-30 22:59:54

Hex固件在哪儿?不见固件啊,求一个研究研究 425095@qq.com
回复

使用道具 举报

DFSyeEXpQKu  见习技师

发表于 2022-9-24 23:13:58

膜拜大佬!!!感谢分享
回复

使用道具 举报

捣腾一个机器人  见习技师

发表于 2022-11-7 11:41:08

厉害厉害
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail