以下內(nèi)容為網(wǎng)絡(luò)轉(zhuǎn)載:
 組裝教程
 






這里有三個(gè)長(zhǎng)度都是圓心到圓心的距離這個(gè)長(zhǎng)度是越精確越好,也看你使用要求寫(xiě)字、畫(huà)畫(huà)、激光雕刻之類(lèi)的長(zhǎng)度差一點(diǎn)點(diǎn)都不是大問(wèn)題
打印件有點(diǎn)收縮率,和碳管組裝時(shí)或緊或大,請(qǐng)自行找工具處理一下╮(╯▽╰)╭


在底座安裝前 要預(yù)先將電機(jī)都固定好 電機(jī)固定螺絲孔留了調(diào)節(jié)余量 使用2GT-232閉口皮帶的話(huà) 將電機(jī)靠近旋轉(zhuǎn)軸方向固定 然后上緊螺絲 限位可以后面安裝 也可以一起安裝了


底座安裝看著螺絲洞裝吧╮(╯▽╰)╭沒(méi)什么難度裝皮帶可能有點(diǎn)緊需要耐心2GT16齒同步輪按上圖的方向安裝


這里的驅(qū)動(dòng)軸 可能是最難裝的部分 有兩根緊繃的同步帶拉著 同樣需要耐心慢慢裝 ╮(╯▽╰)╭
兩邊各有兩顆M8墊片 共四顆墊片
光軸固定好后 用鎖緊打印件 將兩邊鎖緊


力臂的組裝按著感覺(jué)裝吧裝出來(lái)和上圖一樣就沒(méi)錯(cuò)了
提示下標(biāo)注尺寸的地方是兩個(gè)旋轉(zhuǎn)軸之間的距離和上面那根平衡臂是一樣長(zhǎng) 214.7mm
請(qǐng)自行確定好尺寸

全部裝在一起就OK了如何你長(zhǎng)度都沒(méi)搞錯(cuò)那DARM 機(jī)械臂部分就都裝好了
用手活動(dòng)下是否靈活╮(╯▽╰)╭
以上組裝教程有哪里不明白的地方可以回帖提問(wèn)擼主必將一一作答
后續(xù)電路和固件部分教程準(zhǔn)備。。。請(qǐng)隨時(shí)留意更新。。。
DARM 接線(xiàn)圖

ramp1.4

melzi
Ramps1.4:的電機(jī)接線(xiàn)端是杜邦線(xiàn)四芯插,如果發(fā)現(xiàn)電機(jī)方向不對(duì) 只要將插頭反向插入。
Melzi :如果是Melzi電機(jī)方向不對(duì),只要對(duì)換左邊或右邊的兩根線(xiàn),如線(xiàn)序?yàn)榧t藍(lán)黑綠 則紅藍(lán)對(duì)換或綠黑對(duì)換。
限位開(kāi)關(guān)接常閉,接線(xiàn)時(shí)不分正負(fù)。但插ramps1.4限位的時(shí)候要小心插入標(biāo)識(shí)S和—的位置不要插入+和-的位置(插錯(cuò)會(huì)造成短路╮(╯▽╰)╭看好再插,插完再檢查一遍。。。)
這里要感謝群友似曾相識(shí) 的鼎力相助 (*^__^*) 


紅色箭頭所示方向 為各軸旋轉(zhuǎn)正方向 接電機(jī)線(xiàn)的時(shí)候要確定好
HEX燒錄

2560燒錄方法

Melzi燒錄方法 指令詳細(xì)說(shuō)明
M84 解除電機(jī)自鎖(當(dāng)你需要手動(dòng)調(diào)整機(jī)械臂角度的時(shí)候需要用到)
M92 每轉(zhuǎn)動(dòng)一度需要的電機(jī)脈沖數(shù)量 XYZ對(duì)應(yīng)各自的電機(jī)
M366 機(jī)械臂臂長(zhǎng)等參數(shù) B200:主臂長(zhǎng)200mm;S214.7:副臂長(zhǎng)214.7mm;C40:光軸垂直投影和旋轉(zhuǎn)中心的距離40mm;H58:筆夾中心線(xiàn)到副臂靠近筆夾側(cè)旋轉(zhuǎn)軸的距離58mm。
M367 機(jī)械臂原點(diǎn)偏移量 將有圖示做說(shuō)明
M368 限位觸發(fā)角度設(shè)置
M500 保存參數(shù)到EEPROM
M502 恢復(fù)默認(rèn)參數(shù)到EEPROM
M503 讀取EEPROM數(shù)據(jù)并顯示
G90 絕對(duì)坐標(biāo)系
G91 相對(duì)坐標(biāo)系
G92 當(dāng)前坐標(biāo)設(shè)定
G93 當(dāng)前機(jī)械臂角度設(shè)定
G94 恢復(fù)笛卡爾坐標(biāo)系G代碼動(dòng)作(默認(rèn)為絕對(duì)坐標(biāo)系)
G95 執(zhí)行G代碼直接控制角度動(dòng)作(默認(rèn)為相對(duì)坐標(biāo)系)
 機(jī)械臂坐標(biāo)系



通過(guò)M367 偏移量設(shè)置可以任意定義原點(diǎn)坐標(biāo)╮(╯▽╰)╭ 限位調(diào)試:
首先限位在未觸發(fā)前是常閉的
限位接到控制板后可以用M119命令來(lái)查看限位的狀態(tài)
Open是未觸發(fā);TRIGGERED是已觸發(fā)
限位的安裝時(shí)主臂限位偏上 副臂限位偏下 如下圖

第一步:如果當(dāng)前電機(jī)處于鎖定發(fā)送M84 解除電機(jī)鎖定
然后將機(jī)械臂擺成下圖的角度(其實(shí)角度可以自己定只要你確定這個(gè)角度是對(duì)的)


第二步:確定好角度后就不要再動(dòng)機(jī)械臂發(fā)送G93 X90 Y-35 Z0(X表達(dá)主臂處于90度位置,Y表示副臂處于-35度位置,Z表示旋轉(zhuǎn)軸處于0度位置這里的單位都是角度)如果不是90度或-35度都沒(méi)關(guān)系 輸入你確定好的角度就可以
第三步:發(fā)送M114 記下當(dāng)前的X Y Z的值等下驗(yàn)證用(如X58.87 Y100.00 Z50.75)
第四步:將XY速度調(diào)整到120先操作+y去觸發(fā)副臂限位然后再操作+x去觸發(fā)主臂限位(一定要先Y再X)

第五步:使用M368 發(fā)送剛才的觸發(fā)角度并用M500 保存EEPROM和G28 角度初始化
第六步:發(fā)送G94回到笛卡爾坐標(biāo)系
第七步:輸入G1 X58.87 Y100.00 Z50.75 F900 (XYZ為剛才記下來(lái)的驗(yàn)證坐標(biāo))
當(dāng)機(jī)械臂停在坐標(biāo)位置后再用角度測(cè)量工具驗(yàn)證下角度是否正確
如果不正確請(qǐng)回到第一步 重新調(diào)整 ╮(╯▽╰)╭ 原點(diǎn)定義:

高度調(diào)整請(qǐng)根據(jù)實(shí)際情況
1、G28 角度初始化后 可以運(yùn)行到新坐標(biāo)原點(diǎn)或其他點(diǎn)(如 G1X0 Y0 F900)
2、操作Z軸 慢慢下降 到達(dá)工作平面
3、使用M114 命令查看當(dāng)前Z坐標(biāo) 如當(dāng)前Z坐標(biāo)為-50
4、查看M367 的Z值 如Z為-10
5、將兩個(gè)Z值相加 使用M367 保存新的Z值
6、使用M500 保存EEPROM
7、使用G28 重新初始化角度 現(xiàn)在Z軸0點(diǎn)已經(jīng)在工作平臺(tái)上了
可以使用G1 X0 Y0 Z0 F900 移動(dòng)到原點(diǎn)位置來(lái)確定一下
使用M500后已經(jīng)將參數(shù)保存到EEPROM里只要機(jī)械臂和工作平臺(tái)沒(méi)有移動(dòng)過(guò)位置,
設(shè)定的新原點(diǎn)坐標(biāo)一直保存在那里只要G28 初始化角度就可以跑G代碼了(或?qū)28加到G代碼的開(kāi)頭自動(dòng)運(yùn)行) http://pan.baidu.com/s/1c1phimc 調(diào)試DARM 用到的軟件 有興趣的盆友 可以加QQ群:250369605 來(lái)一起玩轉(zhuǎn)機(jī)械臂。。 DARM 寫(xiě)字教程
打開(kāi)文泰雕刻軟件選擇200*200 創(chuàng)建新文件

定義原定

輸入文字

生成刀路

保存刀路

給刀路文件添加運(yùn)行速度

使用Pronterface軟件打開(kāi)剛才生成的刀路文件

一切就緒就可以讓機(jī)械臂 寫(xiě)字了 ╮(╯▽╰)╭
 http://pan.baidu.com/s/1Mftoi 文泰雕刻軟件網(wǎng)盤(pán)鏈接 對(duì)于部分吧友的2560的使用CH340芯片 將無(wú)法用之前帖子里提供的方法燒錄HEX文件
可以使用ArduinoBuilder軟件燒錄 方法如下:


DARM 的兩個(gè)主要函數(shù)
1、 void calculate_SCARA_forward_Transform(float f_scara[3]) 機(jī)械臂正解函數(shù)
2、 void calculate_delta(float cartesian[3]) 機(jī)械臂反解函數(shù)
先來(lái)分析一下正解函數(shù)
正解函數(shù)是 已知機(jī)械臂的各旋轉(zhuǎn)角度 求得笛卡爾坐標(biāo)系三維坐標(biāo)值

先想象機(jī)械臂由主臂和副臂構(gòu)成的一個(gè)平面坐標(biāo)系,如下圖

CencerOffset 旋轉(zhuǎn)軸偏移量
HeadOffset 頭部偏移量
Linkage_1 主臂長(zhǎng)度
Linkage_2 副臂長(zhǎng)度
f_scara[X_AXIS] 主臂旋轉(zhuǎn)角度
f_scara[Y_AXIS] 副臂旋轉(zhuǎn)角度

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_cos = cos(f_scara[Y_AXIS]/SCARA_RAD2DEG)* Linkage_2;

主要是為了得到arm_xy的值。
然后想象從上往下觀(guān)察機(jī)械臂,現(xiàn)在主臂和副臂構(gòu)成一條線(xiàn),加上兩個(gè)偏移量就是arm_xy

delta[X_AXIS] = arm_xy *cos(f_scara[Z_AXIS]/SCARA_RAD2DEG) - SCARA_offset[X_AXIS];
delta[Y_AXIS] = arm_xy *sin(f_scara[Z_AXIS]/SCARA_RAD2DEG) - SCARA_offset[Y_AXIS];
delta[Z_AXIS] = x_sin + y_sin -SCARA_offset[Z_AXIS];
通過(guò)上面的公式就能得到當(dāng)前笛卡爾坐標(biāo)系的xyz三個(gè)坐標(biāo)軸。
Z坐標(biāo)(delta[Z_AXIS]) 可以看上面的第二幅 已經(jīng)得出。
幾個(gè)參數(shù)說(shuō)明:
1、SCARA_RAD2DEG 這是弧度轉(zhuǎn)角度的計(jì)算因子
SCARA_RAD2DEG = 180/pi = 57.2957795
2、SCARA_offset[X_AXIS]、SCARA_offset[Y_AXIS]、SCARA_offset[Z_AXIS]
是各軸笛卡爾坐標(biāo)系下的偏移量,為了自定義原點(diǎn)坐標(biāo),就是M367修改的參數(shù)值。 
SCARA_pos[X_AXIS] = cartesian[X_AXIS] *axis_scaling[X_AXIS] + SCARA_offset[X_AXIS];
SCARA_pos[Y_AXIS] = cartesian[Y_AXIS] *axis_scaling[Y_AXIS] + SCARA_offset[Y_AXIS];
SCARA_pos[Z_AXIS] = cartesian[Z_AXIS] *axis_scaling[Z_AXIS] + SCARA_offset[Z_AXIS];
先由上面公式得到實(shí)際的xyz坐標(biāo)值
SCARA_pos[X_AXIS] 代表X軸坐標(biāo)
SCARA_pos[Y_AXIS] 代表Y軸坐標(biāo)
SCARA_pos[Z_AXIS] 代表Z軸坐標(biāo)

此圖為由上向下觀(guān)察機(jī)械臂,主臂和副臂成一條直線(xiàn)。
ARM_XY = sqrt(pow(SCARA_pos[X_AXIS],2) +pow(SCARA_pos[Y_AXIS],2)) - CencerOffset - HeadOffset;
首先得到ARM_XY的值。

通過(guò)ARM_XY和SCARA_pos[Z_AXIS]得到ARM_XYZ。

這里用到了余弦定理(即已知三角形的三邊,求角度)
cosa=(b^2+c^2-a^2)/2bc
cosb=(a^2+c^2-b^2)/2ac
cosc=(a^2+b^2-c^2)/2ab
SCARA_C2 = (pow(ARM_XYZ,2) -pow(Linkage_1,2) - pow(Linkage_2,2))/(2 * Linkage_1 * Linkage_2);
SCARA_S2 = sqrt( 1 - pow(SCARA_C2,2) );
SCARA_K1 = Linkage_1 + Linkage_2 *SCARA_C2;
SCARA_K2 = Linkage_2 * SCARA_S2;
SCARA_theta = (atan2(SCARA_pos[Z_AXIS],ARM_XY)+atan2(SCARA_K2,SCARA_K1));
SCARA_psi = atan2(SCARA_S2, SCARA_C2);
主要獲得大臂夾角SCARA_theta 和大小臂夾角SCARA_psi
注:SCARA_C2 公式是(pow(Linkage_1,2) + pow(Linkage_2,2)- (pow(ARM_XYZ,2))/(2 *Linkage_1 * Linkage_2)前面加負(fù)號(hào)的簡(jiǎn)化公式。

delta[X_AXIS] = SCARA_theta * SCARA_RAD2DEG
delta[Y_AXIS] = (SCARA_theta - SCARA_psi) *SCARA_RAD2DEG
delta[Z_AXIS] =atan2(SCARA_pos[Y_AXIS],SCARA_pos[X_AXIS]) * SCARA_RAD2DEG;
最后都乘以弧度轉(zhuǎn)角度因子得到各軸轉(zhuǎn)動(dòng)角度。

回答群友的問(wèn)題
這里的f_scara[Y_AXIS]是一個(gè)負(fù)值
如果副臂旋轉(zhuǎn)角度出現(xiàn)在在正方向 那f_scara[Y_AXIS]就是正值

比如這樣


控制板的選擇主要看這三個(gè)文件boards.h Configuration.h pins.h
打開(kāi)boards.h 里面定義了各類(lèi)型控制板的宏定義
如果我們用的是2560+ramps1.4
則需要找到#define BOARD_RAMPS_13_EFB 33
如果我們用的是Melzi
則需要找到#define BOARD_MELZI 63

然后打開(kāi)Configuration.h
找到MOTHERBOARD 定義部分

這里就是定義你的固件是要使用哪種控制板
#ifndef MOTHERBOARD
#define MOTHERBOARD BOARD_ULTIMAKER //BOARD_MELZI
#endif
上面代碼的意思是如果沒(méi)有定義MOTHERBOARD 則定義MOTHERBOARD為BOARD_ULTIMAKER
所以我們可以在這段以前先定義MOTHERBOARD 如下
#define MOTHERBOARD BOARD_RAMPS_13_EFB
或者
#define MOTHERBOARD BOARD_MELZI
這里也可以填寫(xiě)
#define MOTHERBOARD 33
或
#define MOTHERBOARD 63
關(guān)于#define的用法請(qǐng)自行百度搜索
然后講一下
pins.h里的內(nèi)容

比如我們選擇的是ramps1.4為例
我們定位到pins.h里的第533行

由上面的宏定義可知
如果我們定義了#define MOTHERBOARD BOARD_RAMPS_13_EFB
那IS_RAMPS 就為真
#if IS_RAMPS || MB(3DRAG) || MB(AZTEEG_X3)|| MB(AZTEEG_X3_PRO)
只要IS_RAMPS為真就能執(zhí)行之后的一系列宏定義
想自己修改各腳位的功能就可以在這里修改。
我之前Melzi的Z軸步進(jìn)電機(jī)驅(qū)動(dòng)壞了我就通過(guò)修改Melzi在pins.h里對(duì)應(yīng)的腳位定義,把E軸和Z軸對(duì)調(diào)。
在開(kāi)源的第一代機(jī)械臂固件里,Melzi配置下面的E軸和Z軸還是相互對(duì)調(diào)的,如果自己編譯一代固件并玩Melzi控制板的朋友需要注意一下。
注:之前幫被別人適配UM控制板 控制DARM 所以DARM的開(kāi)源固件里實(shí)際選擇的是UM控制板如果自己編譯固件的朋友請(qǐng)使用上面教的方法自行修改一下。修改限位參數(shù):
在Configuration.h里關(guān)于限位的設(shè)置(可以搜索關(guān)鍵字,找到下面的內(nèi)容)
// coarse Endstop Settings
#define ENDSTOPPULLUPS // Comment this out(using // at the start of the line) to disable the endstop pullup resistors
#ifndef ENDSTOPPULLUPS
//fine endstop settings: Individual pullups. will be ignored if ENDSTOPPULLUPS isdefined
//#define ENDSTOPPULLUP_XMAX
//#define ENDSTOPPULLUP_YMAX
#define ENDSTOPPULLUP_ZMAX //open pin, inverted
#define ENDSTOPPULLUP_XMIN //open pin, inverted
#define ENDSTOPPULLUP_YMIN //open pin, inverted
//#define ENDSTOPPULLUP_ZMIN
#endif
#ifdef ENDSTOPPULLUPS
#define ENDSTOPPULLUP_XMAX
#define ENDSTOPPULLUP_YMAX
#define ENDSTOPPULLUP_ZMAX
#define ENDSTOPPULLUP_XMIN
#define ENDSTOPPULLUP_YMIN
#define ENDSTOPPULLUP_ZMIN
#endif
// The pullups are needed if you directlyconnect a mechanical endswitch between the signal and ground pins.
const bool X_MIN_ENDSTOP_INVERTING = true;// set to true to invert the logic of the endstop.
const bool Y_MIN_ENDSTOP_INVERTING = true;// set to true to invert the logic of the endstop.
const bool Z_MIN_ENDSTOP_INVERTING = true;// set to true to invert the logic of the endstop.
const bool X_MAX_ENDSTOP_INVERTING = false;// set to true to invert the logic of the endstop.
const bool Y_MAX_ENDSTOP_INVERTING = false;// set to true to invert the logic of the endstop.
const bool Z_MAX_ENDSTOP_INVERTING = true;// set to true to invert the logic of the endstop.
//#define DISABLE_MAX_ENDSTOPS
//#define DISABLE_MIN_ENDSTOPS
// Disable max endstops for compatibilitywith endstop checking routine
#if defined(COREXY) &&!defined(DISABLE_MAX_ENDSTOPS)
#define DISABLE_MAX_ENDSTOPS
#endif
分解開(kāi)來(lái)講解一下:
#define ENDSTOPPULLUPS
宏定義ENDSTOPPULLUPS 意思為限位端口的輸出弱上拉是否使能
#ifndef ENDSTOPPULLUPS
//fine endstop settings: Individual pullups. will be ignored if ENDSTOPPULLUPS isdefined
//#define ENDSTOPPULLUP_XMAX
//#define ENDSTOPPULLUP_YMAX
#define ENDSTOPPULLUP_ZMAX //open pin, inverted
#define ENDSTOPPULLUP_XMIN //open pin, inverted
#define ENDSTOPPULLUP_YMIN //open pin, inverted
//#define ENDSTOPPULLUP_ZMIN
#endif
如果ENDSTOPPULLUPS 沒(méi)有被定義則定義下面的內(nèi)容
#ifndef ENDSTOPPULLUPS
#endif
里面的內(nèi)容可以根據(jù)實(shí)際情況選擇或屏蔽掉
#ifdef ENDSTOPPULLUPS
#define ENDSTOPPULLUP_XMAX
#define ENDSTOPPULLUP_YMAX
#define ENDSTOPPULLUP_ZMAX
#define ENDSTOPPULLUP_XMIN
#define ENDSTOPPULLUP_YMIN
#define ENDSTOPPULLUP_ZMIN
#endif
如果ENDSTOPPULLUPS被之前定義了則使能全部限位的輸入弱上拉
const bool X_MIN_ENDSTOP_INVERTING = true;// set to true to invert the logic of the endstop.
const bool Y_MIN_ENDSTOP_INVERTING = true;// set to true to invert the logic of the endstop.
const bool Z_MIN_ENDSTOP_INVERTING = true;// set to true to invert the logic of the endstop.
const bool X_MAX_ENDSTOP_INVERTING = false;// set to true to invert the logic of the endstop.
const bool Y_MAX_ENDSTOP_INVERTING = false;// set to true to invert the logic of the endstop.
const bool Z_MAX_ENDSTOP_INVERTING = true;// set to true to invert the logic of the endstop.
定義限位的觸發(fā)極性
ENDSTOP_INVERTING的字面意思是限位觸發(fā)極性反向
ENDSTOP_INVERTING = true 表示低電平觸發(fā)(即不觸發(fā)狀態(tài)處于高電平)
因?yàn)閱?dòng)了輸入弱上拉功能,所以在沒(méi)有接任何的限位傳感器的情況下,檢測(cè)到的輸入是高電平,處于未觸發(fā)狀態(tài)。
所以如果我們可以將不使用的限位端口都設(shè)置成true 就不會(huì)影響機(jī)器運(yùn)行。
一般的機(jī)械限位接線(xiàn)方法有常開(kāi) 和 常閉 兩種
常開(kāi)和常閉 就字面意思來(lái)解釋 常開(kāi)就是在沒(méi)有觸發(fā)的情況下,兩個(gè)觸點(diǎn)是處于斷開(kāi)的狀態(tài)并一直保存著斷開(kāi)的狀態(tài)。直到觸發(fā)了限位,觸點(diǎn)閉合改變輸出信號(hào)。常閉可以自己理解。
DARM 默認(rèn)用的是常閉接法,所以在沒(méi)觸發(fā)的情況下,觸點(diǎn)是閉合的(即是跟GND處于短接狀態(tài))
如果使用常閉限位,需要將相應(yīng)的ENDSTOP_INVERTING設(shè)置為false
如果你暫時(shí)不想接限位,可以將ENDSTOP_INVERTING設(shè)置為true。先完成其他的調(diào)試。
不然的話(huà)ENDSTOP_INVERTING=false所對(duì)應(yīng)的限位開(kāi)關(guān)一直處于觸發(fā)狀態(tài),控制步進(jìn)電機(jī)動(dòng)作將受到限位的影響,將不能向正處于觸發(fā)狀態(tài)的限位方向運(yùn)動(dòng)。
以上的Word格式文檔51黑下載地址:
桌面機(jī)械臂DARM 制作教程.docx
(2.7 MB, 下載次數(shù): 71)
2019-9-26 16:32 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|