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