以下內(nèi)容為網(wǎng)絡(luò)轉(zhuǎn)載:
這里有三個長度都是圓心到圓心的距離這個長度是越精確越好,也看你使用要求寫字、畫畫、激光雕刻之類的長度差一點(diǎn)點(diǎn)都不是大問題
打印件有點(diǎn)收縮率,和碳管組裝時或緊或大,請自行找工具處理一下╮(╯▽╰)╭
在底座安裝前 要預(yù)先將電機(jī)都固定好 電機(jī)固定螺絲孔留了調(diào)節(jié)余量 使用2GT-232閉口皮帶的話 將電機(jī)靠近旋轉(zhuǎn)軸方向固定 然后上緊螺絲 限位可以后面安裝 也可以一起安裝了
底座安裝看著螺絲洞裝吧╮(╯▽╰)╭沒什么難度裝皮帶可能有點(diǎn)緊需要耐心2GT16齒同步輪按上圖的方向安裝
這里的驅(qū)動軸 可能是最難裝的部分 有兩根緊繃的同步帶拉著 同樣需要耐心慢慢裝 ╮(╯▽╰)╭
兩邊各有兩顆M8墊片 共四顆墊片
光軸固定好后 用鎖緊打印件 將兩邊鎖緊
全部裝在一起就OK了如何你長度都沒搞錯那DARM 機(jī)械臂部分就都裝好了
用手活動下是否靈活╮(╯▽╰)╭
以上組裝教程有哪里不明白的地方可以回帖提問擼主必將一一作答
后續(xù)電路和固件部分教程準(zhǔn)備。。。請隨時留意更新。。。
DARM 接線圖
ramp1.4
melzi
Ramps1.4:的電機(jī)接線端是杜邦線四芯插,如果發(fā)現(xiàn)電機(jī)方向不對 只要將插頭反向插入。
Melzi :如果是Melzi電機(jī)方向不對,只要對換左邊或右邊的兩根線,如線序?yàn)榧t藍(lán)黑綠 則紅藍(lán)對換或綠黑對換。
限位開關(guān)接常閉,接線時不分正負(fù)。但插ramps1.4限位的時候要小心插入標(biāo)識S和—的位置不要插入+和-的位置(插錯會造成短路╮(╯▽╰)╭看好再插,插完再檢查一遍。。。)
這里要感謝群友似曾相識 的鼎力相助 (*^__^*)
紅色箭頭所示方向 為各軸旋轉(zhuǎn)正方向 接電機(jī)線的時候要確定好
HEX燒錄
2560燒錄方法
Melzi燒錄方法
指令詳細(xì)說明
M84 解除電機(jī)自鎖(當(dāng)你需要手動調(diào)整機(jī)械臂角度的時候需要用到)
M92 每轉(zhuǎn)動一度需要的電機(jī)脈沖數(shù)量 XYZ對應(yīng)各自的電機(jī)
M366 機(jī)械臂臂長等參數(shù) B200:主臂長200mm;S214.7:副臂長214.7mm;C40:光軸垂直投影和旋轉(zhuǎn)中心的距離40mm;H58:筆夾中心線到副臂靠近筆夾側(cè)旋轉(zhuǎn)軸的距離58mm。
M367 機(jī)械臂原點(diǎn)偏移量 將有圖示做說明
M368 限位觸發(fā)角度設(shè)置
M500 保存參數(shù)到EEPROM
M502 恢復(fù)默認(rèn)參數(shù)到EEPROM
M503 讀取EEPROM數(shù)據(jù)并顯示
G90 絕對坐標(biāo)系
G91 相對坐標(biāo)系
G92 當(dāng)前坐標(biāo)設(shè)定
G93 當(dāng)前機(jī)械臂角度設(shè)定
G94 恢復(fù)笛卡爾坐標(biāo)系G代碼動作(默認(rèn)為絕對坐標(biāo)系)
G95 執(zhí)行G代碼直接控制角度動作(默認(rèn)為相對坐標(biāo)系)
機(jī)械臂坐標(biāo)系
通過M367 偏移量設(shè)置可以任意定義原點(diǎn)坐標(biāo)╮(╯▽╰)╭
限位調(diào)試:
首先限位在未觸發(fā)前是常閉的
限位接到控制板后可以用M119命令來查看限位的狀態(tài)
Open是未觸發(fā);TRIGGERED是已觸發(fā)
限位的安裝時主臂限位偏上 副臂限位偏下 如下圖
第一步:如果當(dāng)前電機(jī)處于鎖定發(fā)送M84 解除電機(jī)鎖定
然后將機(jī)械臂擺成下圖的角度(其實(shí)角度可以自己定只要你確定這個角度是對的)
第二步:確定好角度后就不要再動機(jī)械臂發(fā)送G93 X90 Y-35 Z0(X表達(dá)主臂處于90度位置,Y表示副臂處于-35度位置,Z表示旋轉(zhuǎn)軸處于0度位置這里的單位都是角度)如果不是90度或-35度都沒關(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為剛才記下來的驗(yàn)證坐標(biāo))
當(dāng)機(jī)械臂停在坐標(biāo)位置后再用角度測量工具驗(yàn)證下角度是否正確
如果不正確請回到第一步 重新調(diào)整 ╮(╯▽╰)╭
原點(diǎn)定義:
高度調(diào)整請根據(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、將兩個Z值相加 使用M367 保存新的Z值
6、使用M500 保存EEPROM
7、使用G28 重新初始化角度 現(xiàn)在Z軸0點(diǎn)已經(jīng)在工作平臺上了
可以使用G1 X0 Y0 Z0 F900 移動到原點(diǎn)位置來確定一下
使用M500后已經(jīng)將參數(shù)保存到EEPROM里只要機(jī)械臂和工作平臺沒有移動過位置,
設(shè)定的新原點(diǎn)坐標(biāo)一直保存在那里只要G28 初始化角度就可以跑G代碼了(或?qū)28加到G代碼的開頭自動運(yùn)行)
http://pan.baidu.com/s/1c1phimc
調(diào)試DARM 用到的軟件
有興趣的盆友 可以加QQ群:250369605 來一起玩轉(zhuǎn)機(jī)械臂!!
DARM 寫字教程
打開文泰雕刻軟件選擇200*200 創(chuàng)建新文件
定義原定
輸入文字
生成刀路
保存刀路
給刀路文件添加運(yùn)行速度
使用Pronterface軟件打開剛才生成的刀路文件
一切就緒就可以讓機(jī)械臂 寫字了 ╮(╯▽╰)╭
http://pan.baidu.com/s/1Mftoi 文泰雕刻軟件網(wǎng)盤鏈接
DARM 的兩個主要函數(shù)
1、 void calculate_SCARA_forward_Transform(float f_scara[3]) 機(jī)械臂正解函數(shù)
2、 void calculate_delta(float cartesian[3]) 機(jī)械臂反解函數(shù)
先來分析一下正解函數(shù)
正解函數(shù)是 已知機(jī)械臂的各旋轉(zhuǎn)角度 求得笛卡爾坐標(biāo)系三維坐標(biāo)值
先想象機(jī)械臂由主臂和副臂構(gòu)成的一個平面坐標(biāo)系,如下圖
CencerOffset 旋轉(zhuǎn)軸偏移量
HeadOffset 頭部偏移量
Linkage_1 主臂長度
Linkage_2 副臂長度
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的值。
然后想象從上往下觀察機(jī)械臂,現(xiàn)在主臂和副臂構(gòu)成一條線,加上兩個偏移量就是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];
通過上面的公式就能得到當(dāng)前笛卡爾坐標(biāo)系的xyz三個坐標(biāo)軸。
Z坐標(biāo)(delta[Z_AXIS]) 可以看上面的第二幅 已經(jīng)得出。
幾個參數(shù)說明:
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)
此圖為由上向下觀察機(jī)械臂,主臂和副臂成一條直線。
ARM_XY = sqrt(pow(SCARA_pos[X_AXIS],2) +pow(SCARA_pos[Y_AXIS],2)) - CencerOffset - HeadOffset;
首先得到ARM_XY的值。
通過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ù)號的簡化公式。
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)動角度。
修改限位參數(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
分解開來講解一下:
#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 沒有被定義則定義下面的內(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)閱恿溯斎肴跎侠δ埽栽跊]有接任何的限位傳感器的情況下,檢測到的輸入是高電平,處于未觸發(fā)狀態(tài)。
所以如果我們可以將不使用的限位端口都設(shè)置成true 就不會影響機(jī)器運(yùn)行。
一般的機(jī)械限位接線方法有常開 和 常閉 兩種
常開和常閉 就字面意思來解釋 常開就是在沒有觸發(fā)的情況下,兩個觸點(diǎn)是處于斷開的狀態(tài)并一直保存著斷開的狀態(tài)。直到觸發(fā)了限位,觸點(diǎn)閉合改變輸出信號。常閉可以自己理解。
DARM 默認(rèn)用的是常閉接法,所以在沒觸發(fā)的情況下,觸點(diǎn)是閉合的(即是跟GND處于短接狀態(tài))
如果使用常閉限位,需要將相應(yīng)的ENDSTOP_INVERTING設(shè)置為false
如果你暫時不想接限位,可以將ENDSTOP_INVERTING設(shè)置為true。先完成其他的調(diào)試。
不然的話ENDSTOP_INVERTING=false所對應(yīng)的限位開關(guān)一直處于觸發(fā)狀態(tài),控制步進(jìn)電機(jī)動作將受到限位的影響,將不能向正處于觸發(fā)狀態(tài)的限位方向運(yùn)動。
歡迎光臨 (http://www.torrancerestoration.com/bbs/) | Powered by Discuz! X3.1 |