以下內容為網絡轉載:
 組裝教程
 






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


在底座安裝前 要預先將電機都固定好 電機固定螺絲孔留了調節余量 使用2GT-232閉口皮帶的話 將電機靠近旋轉軸方向固定 然后上緊螺絲 限位可以后面安裝 也可以一起安裝了


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


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


力臂的組裝按著感覺裝吧裝出來和上圖一樣就沒錯了
提示下標注尺寸的地方是兩個旋轉軸之間的距離和上面那根平衡臂是一樣長 214.7mm
請自行確定好尺寸

全部裝在一起就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 文泰雕刻軟件網盤鏈接 對于部分吧友的2560的使用CH340芯片 將無法用之前帖子里提供的方法燒錄HEX文件
可以使用ArduinoBuilder軟件燒錄 方法如下:


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;
最后都乘以弧度轉角度因子得到各軸轉動角度。

回答群友的問題
這里的f_scara[Y_AXIS]是一個負值
如果副臂旋轉角度出現在在正方向 那f_scara[Y_AXIS]就是正值

比如這樣


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

然后打開Configuration.h
找到MOTHERBOARD 定義部分

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

比如我們選擇的是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為真就能執行之后的一系列宏定義
想自己修改各腳位的功能就可以在這里修改。
我之前Melzi的Z軸步進電機驅動壞了我就通過修改Melzi在pins.h里對應的腳位定義,把E軸和Z軸對調。
在開源的第一代機械臂固件里,Melzi配置下面的E軸和Z軸還是相互對調的,如果自己編譯一代固件并玩Melzi控制板的朋友需要注意一下。
注:之前幫被別人適配UM控制板 控制DARM 所以DARM的開源固件里實際選擇的是UM控制板如果自己編譯固件的朋友請使用上面教的方法自行修改一下。修改限位參數:
在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所對應的限位開關一直處于觸發狀態,控制步進電機動作將受到限位的影響,將不能向正處于觸發狀態的限位方向運動。
以上的Word格式文檔51黑下載地址:
桌面機械臂DARM 制作教程.docx
(2.7 MB, 下載次數: 71)
2019-9-26 16:32 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|