</>CoderDIY
← Quay lại danh sách
Bài viết

Máy vẽ CNC mini (pen plotter) tự chế bằng Arduino

Tác giả: CoderDIY··Đọc bằng tiếng Anh
🖊️

Máy CNC hay máy cắt laser “thật” tốn kém và cần không gian riêng, nhưng máy vẽ CNC mini (pen plotter) — chỉ thay đầu cắt bằng một cây bút — có thể lắp trên bàn làm việc với chi phí linh kiện rất thấp. Đây là dự án nền tảng tuyệt vời để hiểu cách máy CNC di chuyển theo tọa độ X-Y chính xác bằng lệnh G-code, trước khi đầu tư vào máy CNC phay hoặc laser cắt thật sự.

Nguyên lý hoạt động

  1. Arduino chạy firmware GRBL (mã nguồn mở, chuyên dùng cho điều khiển CNC), nhận lệnh G-code qua Serial từ máy tính — mỗi dòng G-code mô tả một chuyển động (ví dụ “di chuyển tới tọa độ X=50, Y=30” hoặc “nhấc/hạ bút”).
  2. GRBL chuyển đổi mỗi lệnh di chuyển thành chuỗi xung điều khiển hai động cơ bước (trục X và trục Y), tính toán tốc độ và gia tốc để đường vẽ mượt mà thay vì giật cục.
  3. Bút được gắn trên một cơ cấu nâng/hạ đơn giản (thường dùng servo nhỏ) — hạ bút khi cần vẽ nét, nhấc bút khi di chuyển giữa các nét không liền mạch.
  4. Trên máy tính, phần mềm như Inkscape (với plugin xuất G-code) hoặc các công cụ chuyển ảnh sang vector chuyển đổi hình ảnh/chữ viết thành file G-code, rồi gửi từng dòng lệnh qua phần mềm điều khiển (Universal G-code Sender hoặc tương tự).
<rect x="10" y="20" width="140" height="60" rx="10" class="box" />
<text x="80" y="45" text-anchor="middle" class="label">File vector</text>
<text x="80" y="62" text-anchor="middle" class="label">(Inkscape → G-code)</text>

<rect x="170" y="20" width="140" height="60" rx="10" class="box" />
<text x="240" y="45" text-anchor="middle" class="label">Gửi Serial</text>
<text x="240" y="62" text-anchor="middle" class="label">(UGS)</text>

<rect x="330" y="20" width="140" height="60" rx="10" class="box" />
<text x="400" y="45" text-anchor="middle" class="label">GRBL trên Arduino</text>
<text x="400" y="62" text-anchor="middle" class="label">tính xung động cơ</text>

<rect x="490" y="20" width="140" height="60" rx="10" class="box" />
<text x="560" y="45" text-anchor="middle" class="label">2 động cơ bước</text>
<text x="560" y="62" text-anchor="middle" class="label">+ servo nâng/hạ bút</text>

<line x1="150" y1="50" x2="170" y2="50" class="arrow" />
<line x1="310" y1="50" x2="330" y2="50" class="arrow" />
<line x1="470" y1="50" x2="490" y2="50" class="arrow" />

<text x="320" y="130" text-anchor="middle" class="sublabel">GRBL gửi phản hồi "ok" sau mỗi lệnh để UGS gửi tiếp dòng kế tiếp</text>
Luồng dữ liệu từ file thiết kế tới chuyển động vật lý: vector hóa, xuất G-code, gửi từng lệnh qua Serial, GRBL điều khiển động cơ.

Linh kiện

  • Arduino Uno (nạp firmware GRBL, tương thích tốt với shield CNC phổ biến)
  • CNC Shield v3 (hoặc mạch tự đấu tương đương) gắn 2-3 driver động cơ bước A4988
  • 2 động cơ bước NEMA17 cho trục X và Y
  • Servo nhỏ (SG90) để nâng/hạ bút
  • Khung cơ khí: thanh trượt, dây curoa GT2, hoặc bộ kit máy vẽ CNC DIY bán sẵn (phổ biến trên các sàn linh kiện điện tử)
  • Nguồn 12V cấp cho CNC Shield/driver động cơ
<rect x="30" y="90" width="150" height="90" rx="10" class="box" />
<text x="105" y="140" text-anchor="middle" class="label">Arduino Uno</text>

<rect x="240" y="90" width="150" height="90" rx="10" class="box" />
<text x="315" y="130" text-anchor="middle" class="label">CNC Shield</text>
<text x="315" y="148" text-anchor="middle" class="label">+ driver A4988</text>

<rect x="450" y="30" width="150" height="70" rx="10" class="box" />
<text x="525" y="70" text-anchor="middle" class="label">Động cơ bước X/Y</text>

<rect x="450" y="150" width="150" height="70" rx="10" class="box" />
<text x="525" y="190" text-anchor="middle" class="label">Servo nâng bút</text>

<line x1="180" y1="135" x2="240" y2="135" class="wire" />
<text x="210" y="125" text-anchor="middle" class="sublabel">gắn shield trực tiếp</text>

<line x1="390" y1="115" x2="450" y2="65" class="wire" />
<text x="420" y="95" text-anchor="middle" class="sublabel">2x cuộn dây</text>

<line x1="390" y1="155" x2="450" y2="185" class="wire" />
<text x="420" y="175" text-anchor="middle" class="sublabel">PWM</text>
CNC Shield gắn trực tiếp lên Arduino Uno, điều khiển động cơ bước X/Y qua driver A4988, servo nâng bút nối vào chân PWM còn trống.

Code mẫu

Nạp firmware GRBL vào Arduino qua Arduino IDE (chỉ cần tải mã nguồn GRBL, mở example và upload — không cần viết code từ đầu). Sau khi nạp xong, có thể gửi G-code trực tiếp qua Serial Monitor hoặc script Python đơn giản để kiểm tra:

import serial
import time

PORT = "COM3"  # doi thanh cong cua ban
BAUD = 115200

gcode_lines = [
    "G21",           # don vi mm
    "G90",           # toa do tuyet doi
    "G0 X10 Y10",    # di chuyen nhanh toi diem bat dau, khong ve
    "M3 S0",         # ha but (servo, tuy cau hinh GRBL)
    "G1 X50 Y10 F1000", # ve duong thang toi X=50,Y=10 voi toc do 1000mm/phut
    "G1 X50 Y50",
    "G1 X10 Y50",
    "G1 X10 Y10",
    "M5",            # nhac but len
]

ser = serial.Serial(PORT, BAUD, timeout=2)
time.sleep(2)  # cho GRBL khoi dong

for line in gcode_lines:
    ser.write((line + "\n").encode())
    while True:
        response = ser.readline().decode().strip()
        if response == "ok":
            break
        elif response:
            print("GRBL:", response)

print("Da ve xong hinh vuong!")
ser.close()

Những lỗi thường gặp

  • Không hiệu chỉnh $100/$101 (steps/mm) trong GRBL khiến hình vẽ ra bị sai tỷ lệ so với thiết kế gốc — cần đo khoảng cách di chuyển thực tế so với lệnh gửi để tính lại thông số này cho đúng cơ khí đang dùng.
  • Dây curoa GT2 bị chùng làm mất bước khi đổi hướng đột ngột, khiến hình vẽ bị lệch dần theo thời gian — luôn căng dây curoa vừa đủ, không quá chặt (làm động cơ nặng tải) cũng không quá lỏng.
  • Servo nâng bút phản ứng không đồng bộ với lệnh di chuyển khiến bút vẽ vệt thừa khi đang di chuyển tới điểm bắt đầu nét mới — cần thêm độ trễ nhỏ (G4 P0.2 — dừng 0.2 giây) sau lệnh nâng/hạ bút trước khi di chuyển tiếp.
  • Gửi cả file G-code cùng lúc mà không đợi phản hồi “ok” làm tràn bộ đệm Serial của GRBL, khiến máy vẽ bỏ lệnh hoặc dừng giữa chừng — luôn gửi từng dòng và đợi “ok” như trong code mẫu.

Mở rộng

Thay đầu bút bằng module laser diode công suất thấp để khắc nhẹ trên gỗ/da (cẩn trọng an toàn mắt và cháy nổ), nâng cấp lên 3 trục để trở thành máy phay mini công suất thấp, hoặc tham khảo kỹ thuật điều khiển động cơ chính xác trong bài robot tự cân bằng với PID nếu muốn hiểu sâu hơn về vòng điều khiển động cơ theo thời gian thực.

Thẻ:#arduino#cnc#robotics

Bình luận