1. Chú ý: Các bạn nên tham khảo Nội quy trước khi viết bài (click vào liên kết bên dưới).
    * Nội quy và Thông báo diễn đàn CNCProVN.com
    * Nếu bạn thấy hứng thú với bài viết. Hãy dùng chức năng Share to facebook để chia sẻ bài viết lên facebook.
Kết quả 1 đến 11 của 11

Chủ đề: Thuật toán đơn giản cho mục đích tự lập trình CNC

  1. #1
    Spam killer ahdvip's Avatar
    Ngày tham gia
    Nov 2013
    Đang ở
    Ho Chi Minh City, Vietnam, Vietnam
    Bài viết
    934
    Cám ơn
    103
    Được cám ơn 562 lần ở 304 bài viết

    Thuật toán đơn giản cho mục đích tự lập trình CNC

    Chào mọi người!
    -Trước đây em đã từng tự làm cho mình một máy CNC với phần mềm tự viết, tất nhiên thì phần mềm đó so với bây giờ chỉ có thể gọi là cùi bắp nhưng lúc đó nó là tất cả những niềm đam mê của em. Tuy vậy nhưng em biết cũng có rất nhiều anh em, các bạn sinh viên ít được tiếp xúc với CNC như em lúc đó cũng có cùng một sở thích đó là khát khao tự mình làm ra một phần mềm điều khiển máy cnc.
    -Trước đây khi làm máy CNC cho mình thì em có sử dụng một thuật toán của đồ hoạ máy tính để lập trình cho vi điều khiển, hôm nay em xin chia sẻ với mọi người để anh em nào thích có thể dựa vào đó để tham khảo một chút ít kinh nghiệm. Em không nói nó tối ưu nhưng nó đủ để làm một ứng dụng CNC đơn giản.

    THUẬT TOÁN BRESENHAM
    Hôm nay chỉ giới thiệu phần giải thuật để vẽ một đường thẳng bằng giải thuật Bresenham. Một máy CNC chạy G00-G01 thì vậy là đủ.
    +Giới thiệu sơ qua thuật toán Bresenham
    -Đây là một trong những thuật toán cổ nhất trong đồ hoạ máy tính được Jack E. Bresenham thiết kế vào năm 1962 tại công ty IBM.
    -Ưu điểm lớn nhất của thuật toán này là tốc độ xử lý rất nhanh do nó chỉ sử dụng các lệnh cộng trừ số học và lệnh trên pixel.
    -Chính nhờ giải thuật cực kì đơn giản, nên ngày nay nó vẫn được sử dụng rộng rãi và thường được thực hiện cả trong các card đồ họa hiện đại.
    +Vào vấn đề
    -Một đường cong bất kì sẽ bao gồm rất nhiều đường thẳng và với giải thuật này chúng ta sẽ vẽ một đường thẳng theo dạng bao gồm nhiều pixel.
    Click vào ảnh để xem ảnh lớn hơn. 

Name:	untitled3_zps8a6c3ffc.png 
Views:	136 
Size:	36.7 KB 
ID:	675
    -Một đường thẳng khi ta có được toạ độ điểm đầu và điểm cuối thì ta sẽ tính được hệ số góc của đường thẳng đó, dùng hệ số góc đó để áp vào các trường hợp của thuật toán này.
    Click vào ảnh để xem ảnh lớn hơn. 

Name:	untitled_zps0ec9499b.png 
Views:	2 
Size:	267.0 KB 
ID:	676
    -Sơ đồ giải thuật cụ thể cho một trường hợp
    Click vào ảnh để xem ảnh lớn hơn. 

Name:	untitled2_zps65360626.png 
Views:	0 
Size:	95.2 KB 
ID:	677

    +Ví dụ cụ thể: Cho điểm A( 3,4 ) và điểm B( 8,8 ). Tính các điểm thuộc đoạn AB theo thuật toán Bresenham
    Giải:
    dx=x2-x1=8-3=5;dy=y2-y1=8-4=4;
    p=2*đy-dx=2*4-5=3;
    c1=2*dy=2*4=8;c2=2*dy-2*dx=x*4-2*5=-2;
    x=3;y=4;
    Vẽ (3,4);
    p>=0 → p=p+c2=3+(-2)=1;y=y+1=4+1=5;
    x=x+1=3+1=4<=x2;
    Vẽ (4,5);
    p>=0 → p=p+c2=1+(-2)=-1;y=y+1=5+1=6;
    x=x+1=4+1=5<=x2;
    Vẽ (5,6);
    p<0 → p=p+c1=-1+8=7;
    x=x+1=5+1=6<=x2;
    Vẽ (6,6);
    p>=0 → p=p+c2=7+(-2)=5;y=y+1=6+1=7;
    x=x+1=6+1=7<=x2;
    Vẽ (7,7);
    p>=0 → p=p+c2=5+(-2)=3;y=y+1=7+1=8;
    x=x+1=7+1=8<=x2;
    Vẽ ( 8,8 );
    p>=0 → p=p+c2=3+(-2)=1;y=y+1=8+1=9;
    x=x+1=8+1=9>x2 → Dừng;
    Vậy các điểm thuộc đoạn AB là: ( 3,4 ) ( 4,5 ) ( 5,6 ) ( 6,6 ) ( 7,7 ) ( 8,8 ).

    Đang làm việc nên viết vội được chừng này, hy vọng anh em không chê, có chỗ nào sai thì bảo em, có giải thuật nào tốt hơn thì cùng chia sẻ.
    Thanks all!!
    Lần sửa cuối bởi ahdvip, ngày 11-11-2013 lúc 11:28:48 AM.

  2. Có 6 thành viên đã cám ơn ahdvip cho bài viết hữu ích này:


  3. #2
    Thợ bậc 7
    Ngày tham gia
    Nov 2013
    Bài viết
    1,069
    Cám ơn
    1,310
    Được cám ơn 505 lần ở 282 bài viết
    Thuật toán này chạy nhanh không phải ở chỗ cộng trừ mà ở chỗ nó chỉ thao tác trên số nguyên.
    Nó ra đời vào lúc các thế hệ máy tính đời đầu không có bộ xử lý số thực kèm theo nên khi xử lý các số thực để vẽ line thì tốc độ rất chậm.
    Anh đã từng học lập trình trên 286 và 386 nên có nắm sơ bộ vụ này.


    Thuật toán này tối ưu với các thiết bị hiển thị dạng pixel, còn máy CNC sử dụng số thực nên anh nghĩ thuật toán này không áp dụng đâu em.
    Món này phù hợp với mấy tay làm đèn quảng cáo là tốt nhất.
    Lần sửa cuối bởi anhcos, ngày 11-11-2013 lúc 12:07:31 PM.

  4. Có 3 thành viên đã cám ơn anhcos cho bài viết hữu ích này:


  5. #3
    Thợ phụ bậc 1
    Ngày tham gia
    Nov 2013
    Bài viết
    11
    Cám ơn
    7
    Được cám ơn 2 lần ở 2 bài viết
    máy cnc sử dụng số nguyên mà anh.
    hình như còn thuật toán Bresenham để vẽ đường tròn, elip,... nữa thì phải.

  6. #4
    Spam killer ahdvip's Avatar
    Ngày tham gia
    Nov 2013
    Đang ở
    Ho Chi Minh City, Vietnam, Vietnam
    Bài viết
    934
    Cám ơn
    103
    Được cám ơn 562 lần ở 304 bài viết
    Trích dẫn Gửi bởi anhcos Xem bài viết
    Thuật toán này chạy nhanh không phải ở chỗ cộng trừ mà ở chỗ nó chỉ thao tác trên số nguyên.
    Nó ra đời vào lúc các thế hệ máy tính đời đầu không có bộ xử lý số thực kèm theo nên khi xử lý các số thực để vẽ line thì tốc độ rất chậm.
    Anh đã từng học lập trình trên 286 và 386 nên có nắm sơ bộ vụ này.


    Thuật toán này tối ưu với các thiết bị hiển thị dạng pixel, còn máy CNC sử dụng số thực nên anh nghĩ thuật toán này không áp dụng đâu em.
    Món này phù hợp với mấy tay làm đèn quảng cáo là tốt nhất.
    ^^, chắc chắn đc mà anh. Anh nói chỗ nào không được để mình tranh luận thử.
    Em nói nó ở mức độ đơn giản thôi, nếu là số thực thì anh cho độ chính xác đi, em nhân nó lên 10, 100, 1000 lần là nó thành số nguyên thôi mà. Nếu cần ta có thể nội suy hoàn toàn trên máy tính rồi truyền một gói dữ liệu đã xử lí xuống cho vi điều khiển để cải thiện tốc độ.
    Độ phân giải càng lớn thì độ mịn càng tăng. X tăng <=> trục X dịch 1 đơn vị, Y tăng <=> trục Y dịch 1 đơn vị, cả 2 tăng thì XY cùng dịch. Cứ như vậy thì đầu dao sẽ chạy theo 1 đường thẳng dạng pixel thôi.
    Lần sửa cuối bởi ahdvip, ngày 11-11-2013 lúc 01:35:52 PM.

  7. Thành viên đã cám ơn ahdvip cho bài viết hữu ích này:


  8. #5
    Thợ bậc 7
    Ngày tham gia
    Nov 2013
    Bài viết
    1,069
    Cám ơn
    1,310
    Được cám ơn 505 lần ở 282 bài viết
    Đúng là tọa độ chỉ dịch theo từng bước đơn vị như em nói, nhưng nó khác ở chỗ không như vẽ điểm trên màn hình là bút vẽ nhảy cóc từ điểm này đến điểm kế tiếp, còn máy của ta chạy qua khoảng trống giữa 2 điểm đơn vị liền kề, nên nó vẫn là số thực thôi.

    Dùng hình giải tích để tính số đơn vị mà mỗi phương của CNC cần thực hiện.
    VD như đường thẳng: mình tính ra số bước mà các trục cần di chuyển, sau đó xuất lệnh quay cho các động cơ với cùng tốc độ như nhau.

  9. #6
    Thợ bậc 3
    Ngày tham gia
    Nov 2013
    Bài viết
    49
    Cám ơn
    13
    Được cám ơn 23 lần ở 19 bài viết
    Khi cả 2 trục x,y hoặc 3 trục x,y,z dịch chuyển về endpoint cùng lúc thì mới có nhiều vấn đề . Tính toán thì dùng có thực , khi sử dụng thuật toán trong vi xử lý thì dùng số nguyên thay thế , như vậy xử lý phần dư của phép tính khỏe hơn nhiều , xong rồi trả số thực . Nội suy không khó , cái khó là các hàm gia tốc vận tốc .
    B.r

  10. #7
    Thợ bậc 3
    Ngày tham gia
    Oct 2013
    Bài viết
    56
    Cám ơn
    45
    Được cám ơn 45 lần ở 18 bài viết
    Trên mạng có 1 thuật toán ước tính gia tốc và vận tốc thế nầy : nó xét vị trí hiện tại với vị trí mong muốn sau đó nó cộng vào 1 khoảng bằng nữa đường tới đích , chạy thử 1 lần rồi so và cộng 1/2 cứ thế tốc độ tính toán giảm đi hơn 1/2 lần !
    Chấp Nhận Thua 1 Trận Chiến Nhưng Sẽ Thắng Cả Cuộc Chiến .

  11. #8
    Thợ bậc 6 CKD's Avatar
    Ngày tham gia
    Nov 2013
    Bài viết
    4,402
    Cám ơn
    936
    Được cám ơn 3,745 lần ở 1,899 bài viết
    @ahdvip
    Đây là khởi nguồn của việc lập trình tính toán & điều khiển CNC đó. Tuy nhiên nếu chỉ nhiêu đó thì chỉ đúng trên lý thuyết hoặc có thể áp dụng trực tiếp trên máy tốc độ thấp, trên thực tế còn phải tính toán đồng bộ các trục, tính toán gia tốc v.v..
    @anhcos
    Đúng là CNC hoạt động với số lẻ 1/10, 1/100, 1/1000, 1/1000 và có thể xem tọa độ là số thực. Nhưng thực tế nó chỉ di chuyển theo bước dịch tương ứng và phải chẵn đơn vị là bước (dù máy chạy step hay servo đều vậy). Mỗi bước có thể là 1, 1/10, 1/100, 1/1000 đơn vị (dv) hoặc số khác. Do đó với giải thuật trên nếu chọn bước dịch là 1~1 thì mổi bước dịch là 1dv, nếu là 10~1 hoặc 100~1 hoặc 1000~1 tương ứng với 1/10, 1/100, 1/1000. Tất nhiên khi đó dữ liệu đầu vào sẽ được nhân và làm tròn với cấp số nhân tương ứng là 1, 10, 100, 1000 v.v...
    Phạm Duy Anh - Email: phamduyanh@gmail.com - DT: O9O8984O1O - CKD's Youtube Channel -> click here - Facebook
    121A Mậu Thân, p.Xuân Khánh, q.Ninh Kiều, tp CT

  12. #9
    Thợ bậc 3
    Ngày tham gia
    Nov 2013
    Bài viết
    49
    Cám ơn
    13
    Được cám ơn 23 lần ở 19 bài viết
    Trích dẫn Gửi bởi Khongnickname Xem bài viết
    Trên mạng có 1 thuật toán ước tính gia tốc và vận tốc thế nầy : nó xét vị trí hiện tại với vị trí mong muốn sau đó nó cộng vào 1 khoảng bằng nữa đường tới đích , chạy thử 1 lần rồi so và cộng 1/2 cứ thế tốc độ tính toán giảm đi hơn 1/2 lần !
    Không phải anh Phước ơi .
    Phải chia làm 2 bài toán để giải , 1 là :
    + Với quãng đường dịch chuyển vận tốc có đạt được vận tốc mong muốn ứng với gia tốc mình set đặt hay ko .
    Nếu max thì giải theo sơ đồ hình thang : tăng tốc , max vận tốc , giảm tốc .
    ......................Vận tốc max
    ........................______
    ...................../............\
    **tăng tốc...../..............\ Giảm tốc
    * __________/................ \____________


    + Với quãng đường dịch chuyển quá ngắn , không thể đạt vận tốc mong muốn với gia tốc mình set đặt thì phải
    Giải theo sơ đồ tam giác : tăng tốc , giảm tốc .
    Vận tốc giới hạn
    ............................./\
    ............Tăng tốc..../..\ giảm tốc
    _________________/....\_____________

  13. Có 2 thành viên đã cám ơn LEDUC cho bài viết hữu ích này:


  14. #10
    Thợ bậc 3
    Ngày tham gia
    Oct 2013
    Bài viết
    56
    Cám ơn
    45
    Được cám ơn 45 lần ở 18 bài viết
    Đó là cái mình muốn nói nhưng mà diễn tả không chính xác như bác , chỉ nhớ mang máng là thế !
    Chấp Nhận Thua 1 Trận Chiến Nhưng Sẽ Thắng Cả Cuộc Chiến .

  15. #11
    Spam killer ahdvip's Avatar
    Ngày tham gia
    Nov 2013
    Đang ở
    Ho Chi Minh City, Vietnam, Vietnam
    Bài viết
    934
    Cám ơn
    103
    Được cám ơn 562 lần ở 304 bài viết
    Lúc trước mấy cái này em toàn làm thực nghiệm thôi, không xài công thức gì cả, ^^, nhưng chỉ giải quyết vấn đề hình thang thôi.
    NGUYỄN NGỌC ĐỨC - cncquangnam@gmail.com - DĐ: 0989315944
    TK Techcombank: 19026797927015 (Tân Bình, HCM)

Các Chủ đề tương tự

  1. eto kẹp đơn giản nhưng cực kì chính xác.
    Bởi Nam CNC trong diễn đàn Trao đổi kinh nghiệm
    Trả lời: 1
    Bài viết cuối: 05-05-2015, 01:10:47 AM

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •