PDA

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



ahdvip
11-11-2013, 11:27:09 AM
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.
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.
676
-Sơ đồ giải thuật cụ thể cho một trường hợp
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!!

anhcos
11-11-2013, 12:06:05 PM
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.

magic_kid
11-11-2013, 12:40:31 PM
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.

ahdvip
11-11-2013, 01:28:05 PM
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.

anhcos
11-11-2013, 01:53:36 PM
Đú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.

LEDUC
11-11-2013, 04:54:14 PM
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

Khongnickname
11-11-2013, 04:58:08 PM
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 !

CKD
11-11-2013, 05:05:47 PM
@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...

LEDUC
12-11-2013, 12:06:05 PM
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
_________________/....\_____________

Khongnickname
12-11-2013, 12:14:35 PM
Đó 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ế !

ahdvip
12-11-2013, 12:28:21 PM
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.