# Hệ thống Điện > Board điều khiển khác >  Tự động so dao - Auto tool length setter

## CKD

*Tự động so dao - Auto tool length setter*

Vừa rồi, nhân lúc vọc con máy nhà mình, mình có làm một video clip nói về việc sét/so phôi tự động cho máy CNC dùng Mach3.
Có nhiều bạn hỏi và xin code. Thật tình mà nói là code viết theo máy nên có cho mà các bạn không rành về code thì cũng khó lòng mà làm cho nó chạy được. Vì không phải cứ copy & paste là chạy đâu. Đời nó không đơn giản như thế.




Nhưng để làm được thì cũng không có gì quá phức tạp, chỉ là qua nhiều công đoạn mà thôi. Mình thì không có nhiều thời gian để có thể giúp tất cả các bạn theo kiểu PM hay email được. Vậy nên mình lập chủ đề này với mấy mục đích.
1. Giới thiệu cách làm, cài đặt, và code mẫu.
2. Các bạn đã làm, đang làm và sẽ làm cùng tham gia chủ đề để trao đổi và chia sẻ giải pháp

Để bắt đầu cần
1. Các từ khoá có thể tìm trên google hay youtube: "mach3" "tool setter" "touch probe"
2. Công tắc, cảm biến. Cái này thì có rất nhiều cách để có thể làm
Mua là cách đơn giản nhất. Nhược điểm là không phải lúc nào cũng có và giá tốt.
Chế, vừa thoả mãn niềm đam mê chế tạo, vừa có cái để dùng. Có rất nhiều mẫu từ đơn giản đến phức tạp, phù hợp với mọi nhu cầu.
3. Đấu nối với Mach3 BOB. Theo trải nghiệm thì Probe chỉ hiệu quả với các BOB LPT. BOB USB thì phải xem tuỳ theo loại có hổ trợ hay không. Với BOB USB nếu có hổ trợ thì phải cài đặt theo đúng hướng dẫn của BOB. Không thể tuỳ ý config input Probe như các input kiểu home/limit được.
4. Viết macro code cho Mach3 có thể chạy tự động. Macro code này có thể được nhúng vào trong Sreen, lưu trong file riêng, hoặc lưu cả trong file G-code đều chạy được.

Các trò từ 1-3 thì hầu hết các bạn tham gia đều có thể tự xử, cũng đã có chủ đề để trao đổi về *Probe*
- http://forum.cncprovn.com/threads/3016-DIY-Touch-Probe
- http://forum.cncprovn.com/threads/81...u-cao-cua-phoi
- http://forum.cncprovn.com/threads/39...up-auto-Z-zero
mình hy vọng sẽ được tiếp tục chia sẻ thêm trong chủ đề này.

Phần mình sẽ đi thẳng vào bước 4 vì ít bạn nghiên cứu tới phần này, được tiếp tục ở bài bên dưới nhe.

Một số hình ảnh tool setter hay touch probe tự chế nhe.


Cái này có thể mua trên taobao, cũng có thể tự chế vì rất rất đơn giản


http://www.brusselsprout.org/cnc/1p-probe/


Giao diện Mach3 độ  :Big Grin:

----------

cuong, haignition, hoangson, huyquynhbk, QuyND, saudau

----------


## CKD

Trình tự máy chạy khi sét phôi hay dao tự động là thế này.
1. Chạy từ khoảng an toàn, tiến về phía vật cần dò.
2. Khi chạm vật cần dò thì dừng lại.
3. Có thể lặp lại thao tác lần 2/3 với vận tốc thấp hơn để tăng độ chính xác của phép đo.
4. Xác định toạ độ tại điểm dò, có thể zero trục toạ độ, lưu lại hay thực hiện thao tác nào mà người dùng muốn.

Bước 1.
Bị trí bắt đầu di chuyển là do người sử dụng quyết định.

Bước 2.
Dù là đang chạy với macro, g-code hay được nhúng vào screen thì cú pháp và lệnh được dùng đều là G-code.
- Lệnh: G31 X Y Z F
---> G31 mach3 gọi là "Straight Probe"
---> X Y Z là toạ độ muốn đầu dò đi đến. Là tuỳ ý, tức là có thể di chuyển đồng thời cùng lúc XYZ hoặc chỉ một phương X/Y/Z thôi cũng Ok
---> F là tốc độ di chuyển.

Bước 3.
Vì khi di chuyển, phát hiện tín hiệu Probe, dừng lại mất một khoảng thời gian để xử lý nên muốn càng chính xác thì tốc độ di chuyển khi dò phải càng chậm. Với khoảng di chuyển xa thì mất nhiều thời gian.
Do đó để giải quyết bài toán được hiệu quả hơn thì ta chia thành 2-3 lần dò với tốc độ di chuyển khác nhau, Ví dụ với hệ toạ độ tuyệt đối G90 vị trí gắn sensor khoảng gần -100:
- Dò lần 1 với tốc độ 2000mm/min theo phương Z
---> G31 Z-100 F2000
- sau khi tác Probe tác động thì phải lùi lại 5mm
---> G0 Z(Z hiện tại + 5)
- Dò lần 1 với tốc độ 200mm/min theo phương Z
---> G31 Z-100 F200

Bước 4
Tuỳ người sử dụng nên sẽ bàn sau.

----------

Fusionvie, hoangson, huyquynhbk, saudau, Tuanlm

----------


## CKD

Như trình bày phía trên. Ta cần quan tâm mấy nội dung:

*1. Hệ toạ độ mà ta chạy các lệnh.*
- Mach3 cho phép ghi nhớ nhiều hệ toạ độ làm việc khác nhau, gọi là work offset. Do đó các hệ toạ độ này có thể không trùng khớp với hệ toạ độ máy.
- Với các kiểu probe khác nhau thì ta cũng có cách làm khác nhau. Ví dụ loại đặt Probe (sẽ gọi là sensor -> cảm biến) trên mặt phôi, loại đăt cảm biến cố định trên bàn máy, loại đặt cảm biến trên đầu spindle v.v... Mỗi cách đặt cảm biến khác nhau thì phương thức di chuyển, vận hành cũng khác nhau. Chính vì thế mà mình nói ở trên là copy/paste sẽ không thể chạy được vì phải phù hợp với thực tế.
- Vậy thì dùng work offset coordinate (hệ toạ độ phôi) hay machine coordinate (hệ toạ độ máy) là tuỳ theo nhu cầu và thiết kế cụ thể.
- Nếu muốn dùng machine coordinate thì máy phải có chức năng reference home (chức năng về toạ độ góc máy, hay gọi đơn giản là về Home).
- Như mô hình mà các bạn có thể thấy trong clip, cách đơn giản để chạy là dùng *toạ độ máy*. Và mình sẽ phân tích theo hướng này. *Những cách thức khác các bạn khi thực hiện, chia sẻ và thảo luận thêm sau này*.

Để dùng toạ độ gốc máy, thì ta có một lệnh đơn giản là
G53 X Y Z F
Với G53 là yêu cầu chạy theo hệ toạ độ góc máy. XYZ là điểm cần đế, F là tốc độ.
*Lưu ý: G53 chỉ chạy được trong hệ toạ độ tuyệt đối G90*

*2. Toạ độ của sensor*
Toạ độ sensor phụ thuộc vào vị trí lắp đặt cụ thể của sensor trong không gian vận hành máy và so với toạ độ góc máy. Mình sẽ ký hiệu là *Xs*, *Ys* và *Zs* cho các chú thích sau này. Giá trị cụ thể cho ví dụ là:
- Xs = 0
- Ys = 0
- Zs = -150
Và tạo độ gốc máy, vị trí home được thiết lập là
- X = 0
- Y = 0
- Z = 0

3. Macro code
Mình sẽ tập trung vào macro code. Vì dù là nhúng vào screen hay macro thì nó vẫn là Mach3 VB Macro. Có rất nhiều tài liệu hướng dẫn về macro, các bạn có thể tìm theo từ khoá "Mach3_V3.x_Macro_Prog_Ref" hoặc có thể download bên dưới bài viết.
Ngoài ra các bạn nên tìm hiểu thêm về OEMcode, OEMled, OEMdro trên Mach3 Wiki https://en.wikipedia.org/wiki/Mach3

Bắt đầu thôi


```
'Thiet lap vi tri sensor
Xs = 0
Ys = 0
Zs = -150
'Thiet lap cac thong so van hanh
Ffast = 2000
Fslow = 200
Zmove = Zs + (-5) 'Chay qua 5mm de dam bao sensor lam viec
'RUN
Code "G90" 'Su dung he toa do tuyet doi
Code "G53 Z0 F5000" 'Chay nhanh ve vi tri cao nhat cua may
Code "G53 X" & Xs & " Y" & Ys & " F5000" 'Chay nhanh ve vi tri sensor
Code "G31 Z" & Zmove & " F" & Ffast 'Chay nhanh xuong sensor
While IsMoving 'Cho cho den khi dung lai
Wend
Code "G91"
Code "G0 Z5" 'Chay nguoc len 5mm
While IsMoving 'Cho cho den khi dung lai
Wend
Code "G90"
Code "G31 Z" & Zmove & " F" & Fslow 'Chay cham xuong sensor
While IsMoving 'Cho cho den khi dung lai
Wend
'Done, cho thuc hien thao tac tiep theo
```

----------

anhcos, Bongmayquathem, Fusionvie, hoangson, huyquynhbk, Nguyen Thien Minh Nguyen, saudau, trungga, Tuanlm

----------


## CKD

Chú thích thêm về code
*Zmove = Zs + (-5)*
Zs là toạ độ của sensor, nhưng khi chạm sensor có thể cần đi thêm một quảng đường nữa. Do đó để đảm bảo cần di chuyển thêm một đoạn nhỏ  :Big Grin: .
Ngoài ra còn lưu ý thêm chiều dài dao, tool holder v.v...

*Code "G53 Z0 F5000"* là cú pháp để macro thi hành một lệnh G-code có nội dung là *G53 Z0 F5000*, bên trong dấu "" là một chuổi lệnh (ký tự). Tương tự với các dòng khác
*Code "G53 X" & Xs & " Y" & Ys & " F5000"* dòng này có điểm đặt biệt là có xuất hiện dấu &. Chức năng của nó là ghép các đoạn lại với nhau. Cụ thể là trích giá trị của các biến Xs, Ys và ghép lại thành một chuổi. Dòng này sẽ tương đương
*Code "G53 X0 Y0 F5000"*

*While IsMoving* 'Cho cho den khi dung lai
*Wend*
Là đoạn code bắt buộc để máy tạm dừng và chờ kết quả của dòng lệnh phía trên nó.
Khác biệt của việc chạy lệnh G-code trong môi trường macro khác với việc chạy lệnh G-code trong file G-code hay MDI. Trong môi trường macro các lệnh thực thi như di chuyển các trục sẽ thông được dừng lại chờ mà sau khi phát lệnh sẽ thực hiện lệnh kế tiếp. Do đó, muốn máy tạm dừng lại để chờ kết quả thì việc dùng cú pháp While IsMoving - Wend là cần thiết.

* Ghi chú:
Việc tách một số giá trị và lưu thành biến giúp ta dễ dàng thay đổi giá trị theo thực tế, đơn giản và giảm rủi ro lỗi trong quá trình hiệu chỉnh code.
Trong quá trình di chuyển có thay đổi hệ toạ độ tuyệt đối/tương đối để đơn giản quá trình tính toán.

Đến đây tạm kết thúc. Quá trình thực tế sẽ
1. Di chuyển lên vị trí cao nhất, ứng với tạo độ gốc máy Z = 0
2. Di chuyển đến vị trí đặt sensor, Xs Ys
3. Di chuyển xuống cho đến khi sensor bị tác động. Di chuyển nhanh
4. Di chuyển ngược lên 5mm
5. Di chuyển xuống cho đến khi sensor bị tác động. Di chuyển chậm
6. Kết thúc chương trình

Sau khi sensor bị tác động lần 2 thì dừng lại chờ xử lý tiếp theo. Cách thức thực hiện tiếp theo tuỳ theo ý đồ người dùng mà khác nhau. Có thể
- Zero Z
- Bù trừ chiều cao và Zero Z
- Bù trừ vào bẳng tool lengh offset
- V.v....

----------

haignition, hoangmanh, hoangson, huyquynhbk, maxx.side, Nguyen Thien Minh Nguyen, saudau, Tuanlm

----------


## huyquynhbk

thanks cụ CKD đã chia sẽ ah.máy của cụ Tuấn hói chưa có món này đâu. để e gạ cụ ấy làm chuột bạch ah. hí hí

----------


## CKD

Các nôi dung trên thì cơ bản là nó work được như cái clip rồi.

Nội dung sau dấu nháy *'*  là chú thích, không được thực thi trong macro

*Nhưng muốn nó ngon và an toàn hơn thì phải làm sao?*

Ví dụ: *Muốn nó có thể kiểm tra cài đặt Probe PIN trước khi vận hành. Nếu không có, quen cài đặt input Probe thì nó cứ cắm đầu à.*



```
If IsSuchSignal(22) Then
'Noi dung lenh
Else
'Dung khan cap - Estop
DoOEMButton(1003)
Exit Sub
End If
```

Đoạn lệnh trên sẽ kiểm tra xem tín hiệu Probe đã được Active chưa. Nếu đã active thì mới chạy, nếu chưa active thì bấm nút Estop.
*Lưu ý là đã active input Porbe, mà config Pin/Port sai thì nó cũng chạy à nhe.*

*DoOEMButton(1003)* là lệnh kích nút E-Stop trên màn hình mach3.
*Exit Sub* là lệnh thoát khỏi macro

Ví dụ: *Muốn nó Zero Z thì phải làm sao?*



```
'Done, cho thuc hien thao tac tiep theo
Call SetDRO(2, Zvalue)
```

Trong đó
*Call* là gọi một hàm VB của Mach3
*SetDRO* là hàm VB mach3, có tác dụng gán giá trị vào DRO số 2, giá trị được gán là Zvalue.

Trong mach3 6 axis DRO XYZABC được đánh số từ 0 đến 5, tức là tương ứng với Z là DRO 2
*Zvalue* là giá trị mà ta muốn gán vào. Nếu muốn Zero Z thì Zvalue = 0 là Ok

Ngoài ra như trong clip thì nó còn phức tạp hơn nữa. Cái này không hẵn là nó có nhiều tính năng hơn, mà một phần là thói quen trong lập trình.

----------

blacksky2411, Diyodira, Fusionvie, hoangson, Nguyen Thien Minh Nguyen, ppgas, saudau, Tuanlm, vufree

----------


## vufree

Ơn Giời Cậu Đây Rồi.... cứ ước ao làm mấy cái của Nợ này nhưng chả biết tí khái niệm nào cả... hôm nay đã mở mang .. Cám ơn Cụ CKD.

----------


## anhcos

Viết trực tiếp trong file gcode cũng được CKD, không cần đến macro, nhưng trông khó nhai hơn tí.

----------


## CKD

> Viết trực tiếp trong file gcode cũng được CKD, không cần đến macro, nhưng trông khó nhai hơn tí.


Thì em đã nói là chạy trực tiếp trong file g-code được mà. Nhưng cách này thì rối rắm và bất tiện nên chưa bàn đến.

----------


## phê tê bốc

Mach3 là thế, còn Planet CNC thì sao nhỉ. Mò mãi chưa ra thuốc.

----------


## vufree

Trong Mach3 thì cái LED Nó làm cái gì Cụ nhỉ?? Cụ cho xin cái ví dụ sinh động về LED với. Thanks

----------


## CKD

> Trong Mach3 thì cái LED Nó làm cái gì Cụ nhỉ?? Cụ cho xin cái ví dụ sinh động về LED với. Thanks


LED là LED, là mấy cái tín hiệu màu trên screen mà bạn thấy đó.

----------


## CKD

> Mach3 là thế, còn Planet CNC thì sao nhỉ. Mò mãi chưa ra thuốc.


Planet nó cũng hổ trợ mà.
Không có bob planet nên không rỏ

----------


## vufree

À vậy LED chỉ là các câu lệnh hiển thì màu sắc thôi hả Cụ. Thanks

----------


## CKD

Cụ thấy các thiết bị lòng vòng trong nhà thì LED dùng làm gì?
1. Làm trang trí
2. Làm tín hiệu. Trạng thái on/off của LED thể hiện một tín hiệu nào đó đã được định nghĩa.

VD cái amp nó có nhiều LED:
- LED power để chỉ báo có nguồn
- LED signal input để chỉ báo input nào được chọn
- LED EQ để để báo mức tín hiệu theo tần số
- v.v....

Với Mach3 thì cũng vậy
- LED là chỉ báo tín hiệu. Tín hiệu có thể là các in/output, các trạng thái làm việc v.v...
- DRO và OEMDRO dùng ghi nhận và hiển thị giá trị của biến hay hằng gì đó. VD toạ độ XYZ..
Có phân biệt DRO và OEMDRO, khác nhau thì không rỏ ràng lắm, đại để là DRO là những biến/hằng cơ bản của Mach3, OEMDRO là những biến/hằng được người dùng thêm vào.
- Param là ô nhớ lưu các dữ liệu cứng để chương trình chạy. Những dữ liệu này nếu được thay đổi thì phải khởi động lại chương trình mới có tác dụng. Một số param có thể có tác dụng ngay. Nói chung là tuỳ tính năng của Param
- Còn nhiều nhiều nữa  :Big Grin:

----------

QuyND

----------


## vufree

Không có OEM là danh sách mã lệnh mach3 cũ. Có OEM là danh sách mã lệnh mach3 mới...Ví dụ SetDRO thì XYZABC từ 0-5, nhưng nếu dùng SetOEMDRO thì lại là 800-805.???.

----------


## anhcos

> Không có OEM là danh sách mã lệnh mach3 cũ. Không có OEM là danh sách mã lệnh mach3 mới...Ví dụ SetDRO thì XYZABC từ 0-5, nhưng nếu dùng SetOEMDRO thì lại là 802-807..


Bác phải tự mò mẫm chứ có chút xíu này bác cũng hỏi.
Bác tham khảo ở đây, có đủ cho bác cần: http://www.machsupport.com/Mach3Wiki...itle=Main_Page

----------

QuyND

----------


## vufree

> Bác phải tự mò mẫm chứ có chút xíu này bác cũng hỏi.
> Bác tham khảo ở đây, có đủ cho bác cần: http://www.machsupport.com/Mach3Wiki...itle=Main_Page


Không phải vậy hả Bác???? Ok để Mình mò coi sao...

----------


## CKD

Thật ra thì không có những định nghĩa sự khác biệt cho DRO và OEMDRO, nên nói nên dùng cái nào thì cũng khó trả lời là dùng cái nào thì đúng hơn.

Chỉ là với Mach3 những phiên bản đầu tiên thì một số DRO không có trong OEMDRO, phiên bản mới thì OEMDRO có đủ hết mọi DRO trong mach3 có. Vây nên về khã năng sử dụng thì chỉ cấn nắm rỏ OEMDRO là Ok.
Điều tương tự cũng có ở LED & OEMLED  :Big Grin: 

Nhìn chung, các DRO (or LED) sẽ xuất hiện trong OEMDRO (OEMLED) từ giá trị 800 trở về sau.

Ngoài ra còn có UserDRO, UserLED để người dùng có thể tự định nghĩa thêm. Bắt đầu đánh số = 1000

Một số DRO được xem là Param nên cũng có thể truy xuất và cập nhật giá tri với hàm GetParam/SetParam v.v... có rất nhiều biến được định nghĩa khác nhau, nhưng nội dung lại giống nhau hoàn toàn.

Dùng thế nào cho hợp lý? Chưa phát hiện được sự khác nhau. Nên hiện tại, khi dùng là dựa vào các DRO đã biết rỏ, và thói quen thôi.

*Ví dụ: mấy lệnh sau là giống nhau*
GetParam(ZDRO)
GetDRO(2)
GetOEMDRO(802)

Và còn nhiều Param/DRO/OEMDRO cùng chỉ về một đối tượng. Tất nhiêu trong số đó thì cũng có những tham số chỉ có thể truy cập với GetParam hoặc GetDRO hoặc GetOEMDRO.

Cá nhân thì do thói quen, thường thì trong đầu không nhớ gì hết. Nên khi sử dụng phải tra cứu tài liệu. Và Mach3 không nhất quán về từ khoá. Nên hay tìm hiểu trước DRO + Param vì nó chỉ tầm vài chục giá trị. Quá trình tìm kiếm sẽ nhanh hơn.

----------

vufree

----------


## Huudong

giờ em mới tìm ra bài này, đọc và đã thông, bắt tay vô vọc thôi ạ, Cảm ơn cụ CKD đã hướng dẫn.

----------

