เครื่อง CNC เป็น Computerized Numerical Control Machinesซึ่งใช้ในการวาดหรือออกแบบชิ้นส่วนเครื่องจักรใด ๆ ตามโปรแกรมการออกแบบที่ใส่เข้าไปในหน่วยควบคุมของพวกเขา หน่วยควบคุมสามารถเป็นได้ทั้งคอมพิวเตอร์หรือไมโครคอนโทรลเลอร์ เครื่อง CNC มีมอเตอร์แบบ stepper และ servo เพื่อออกแบบตามโปรแกรม fed
หลังจากค้นคว้าเกี่ยวกับเครื่อง CNC แล้วฉันตัดสินใจที่จะสร้างเครื่อง CNCโดยใช้วัสดุที่มีอยู่ในท้องถิ่น มีเครื่อง CNC จำนวนมากในโลกซึ่งบางส่วนมีความซับซ้อนทางด้านเทคนิคและซับซ้อนเพื่อให้หรือใช้งานได้อย่างถูกต้อง ด้วยเหตุนี้ฉันจึงตัดสินใจที่จะทำเครื่อง CNC Plotter Machine โดยใช้ Arduinoซึ่งง่ายที่สุดในการทำ
นี้เครื่อง CNC Arduino DIYสามารถวาดมากที่สุดของรูปทรงพื้นฐานข้อความและแม้กระทั่งการ์ตูน การดำเนินการนี้คล้ายคลึงกับวิธีการที่มนุษย์เขียนไว้ มันเร็วและถูกต้องมากขึ้นเมื่อเทียบกับที่มนุษย์สามารถเขียนหรือวาดได้ ตรวจสอบวิดีโอสาธิตที่ท้ายบทแนะนำนี้

การทำงานของเครื่อง CNC:

สำหรับเครื่อง CNC plotting operationต้องใช้แกน 3 แกน (แกน x แกน y และแกน z) แกน x และแกน y ทำงานพร้อมกันเพื่อสร้างภาพ 2D บนกระดาษธรรมดาเหล่านี้ x และ y แกนวางอยู่ที่ 90 องศาซึ่งกันและกันเพื่อให้จุดใด ๆ บนพื้นผิวธรรมดาถูกกำหนดด้วยค่าที่กำหนดของ x และ y แกน z ใช้ยกและวางปากกาลงบนกระดาษธรรมดา
คอมพิวเตอร์จะสร้างพิกัดที่เหมาะสมและส่งไปยังไมโครคอนโทรลเลอร์ผ่านทางพอร์ต USB ไมโครคอนโทรลเลอร์ตีความพิกัดเหล่านี้และควบคุมตำแหน่งของมอเตอร์เพื่อสร้างภาพ ที่นี่เราได้ใช้ Arduino เป็นไมโครคอนโทรลเลอร์เพื่อสร้างเครื่องซีเอ็นซีนี้
มาเริ่มขั้นตอนการสร้างอุปกรณ์นี้ทีละขั้นตอน

สิ่งที่คุณต้องการ:

หมายเหตุ:การออกแบบของฉันมีความแตกต่างกันไปในแง่ของขนาดและวัสดุที่ใช้ ฉันไม่สามารถหาไดรฟ์ดีวีดีเก่าได้ดังนั้นฉันจึงเลือกใช้เครื่องพิมพ์ ไม่ว่าคุณจะใช้อะไรให้ตรวจสอบว่ามีมอเตอร์แบบสเต็ปเปอร์
ความต้องการฮาร์ดแวร์:
  1. แผ่นอลูมิเนียม (710mm x 710mm)
  2. เครื่องพิมพ์ HP / Epson เก่า คุณสามารถใช้ไดรฟ์ดีวีดีคอมพิวเตอร์เครื่องเก่าได้
  3. สลักเกลียวและถั่ว
  4. แก้ว Perspex
  5. Arduino UNO
  6. โล่ไดรเวอร์มอเตอร์ L293D
  7. มอเตอร์เซอร์โวแบบมินิ
  8. ปากกา
arduino ไดรเวอร์มอเตอร์สำหรับเครื่อง cnc plotter
อู่ต่อเครื่องพิมพ์สำหรับเครื่อง arnino cnc แผ่นอะลูมิเนียมสำหรับเครื่อง arnino cnc

เครื่องมือ
  1. ไขควง
  2. เจาะ
  3. เครื่องมือตัด (เลื่อยลูกซอง)
  4. กาว
  5. อุปกรณ์เบญจรงค์

โปรแกรม:
สำหรับการทำงานที่มีประสิทธิภาพของเครื่องนี้จะใช้ซอฟต์แวร์ต่อไปนี้ ไปที่เว็บไซต์ต่างๆและดาวน์โหลดได้
  1. Arduino IDE เวอร์ชัน 1.6.6 หรือที่ใหม่กว่าจากที่นี่
  2. การประมวลผลเวอร์ชัน IDE 3.1.1 หรือใหม่กว่าจากที่นี่
  3. รุ่น Inkscape 0.48.5 ดาวน์โหลดได้จากที่นี่
  4. ตัวควบคุม Grbl (อุปกรณ์เสริม)

ฐานเครื่อง CNC Plotter Machine:

ตัวเครื่องหลักของเครื่องนี้เป็นฐานที่รองรับชิ้นส่วนหลัก ๆ ของเครื่องด้วยกันเพื่อให้เครื่องมีความมั่นคงและเป็นแบบพกพา ในการออกแบบนี้เราจะใช้อลูมิเนียมในการสร้างฐานเนื่องจากมีน้ำหนักเบาง่ายต่อการงอและตัดและยังให้ลักษณะเงางามดีเนื่องจากไม่เป็นสนิม
การออกแบบและขนาดของฐานของฉันแสดงไว้ด้านล่าง:
ขนาดฐานอลูมิเนียมสำหรับเครื่อง CNC Arduino
หมายเหตุ:ขนาดทั้งหมดเป็นมิลลิเมตร

หลังจากการดัดและตัดแล้วผมสามารถผลิตฐานที่มั่นคงได้ดังรูปด้านล่าง:
ฐานอลูมิเนียมสำหรับเครื่องพล็อตเตอร์ Arduino CNC

การประกอบแกน X, Y และ Z:

ในการทำแกน x และ yใช้แท่นวางเครื่องพิมพ์สองใบ แต่ละชิ้นส่วนเหล่านี้ประกอบด้วยมอเตอร์แบบสเต็ปเปอร์และกลไกการขับเคลื่อนสายพานโดยปกติแล้วจะใช้เพื่อเคลื่อนย้ายสายพานลำเลียงไปมา
การรวบรวมแกน X, Y และ Z

สำหรับแกน zจะติดมอเตอร์เซอร์โวขนาดเล็กไว้บนแกน y โดยใช้กาว มอเตอร์เซอร์โวนี้ใช้เพื่อเลื่อนปากกาขึ้นและลง ควรมีกลไกสนับสนุนที่ดีซึ่งจะช่วยให้ปากกาฟรีและลื่นไหล
ประกอบแกน z สำหรับเครื่อง CNC Arduino
ประกอบแกน z สำหรับเครื่อง CNC Arduino

แท่นวางเครื่อง CNC:

เนื่องจากขนาดใหญ่ของเครื่องนี้อุปกรณ์จะสามารถวาดบนกระดาษขนาด A5 ได้ ดังนั้นเราจึงจะตัด A5 (148mmx210mm) ออกจากกระจก Perspex จากนั้นติดไว้บนส่วนที่เคลื่อนที่ด้วยแกน x โดยใช้กาว
กระจกรูปวาดสำหรับเครื่อง arduino CNC

การเดินสายไฟและวงจรของเครื่อง CNC:

ใส่โลโกร์ไดรเวอร์ L293Dลงบนบอร์ด Arduino UNO โล่นี้สามารถขับเคลื่อนมอเตอร์ stepper สองตัวพร้อมกันและเซอร์โวมอเตอร์สองตัว เชื่อมต่อมอเตอร์ stepper สองแบบดังรูปด้านล่าง ควรเชื่อมต่อสายดินกับมอเตอร์ชนิด bipoplar
 การเดินสายมอเตอร์สำหรับเครื่อง arduino CNC
ยังติดมอเตอร์เซอร์โว miniเพื่อ servo1 เชื่อมต่อแหล่งจ่ายไฟ 7.5V - 9V เข้ากับพอร์ตพลังงานของโล่ไดรเวอร์มอเตอร์ เครื่องพร้อมแล้วสำหรับการทดสอบ

Arduino CNC Machine รหัสและการทดสอบ:

แรกเราต้องทดสอบมอเตอร์ก้าวและดูว่ามีการเชื่อมต่ออย่างถูกต้องหรือไม่
เนื่องจากเรามีการใช้โล่คนขับรถมอเตอร์ L293D เราจำเป็นต้องดาวน์โหลดห้องสมุด AFmotor จากที่นี่ จากนั้นเพิ่มลงในโฟลเดอร์ห้องสมุด Arduino IDE ของคุณ ให้แน่ใจว่าคุณเปลี่ยนชื่อไปAFMotor หาก Arduino IDE เปิดปิดและเปิดอีกครั้งและคลิกที่ไฟล์ -> ตัวอย่าง -> Adafruit มอเตอร์โล่ Library -> stepper ตรวจสอบให้แน่ใจว่าคุณได้เลือกพอร์ตและบอร์ดที่ถูกต้องแล้วอัปโหลดโค้ดลงในบอร์ด Arduino ควรสังเกตการเคลื่อนไหวบางอย่างในมอเตอร์สตาร์ทมอเตอร์
ในการทดสอบมอเตอร์สองให้เปลี่ยนพอร์ตมอเตอร์จาก 2 เป็น 1 ในบรรทัดต่อไปนี้แล้วอัปโหลดรหัสอีกครั้ง
#include <AFMotor.h>

// เชื่อมต่อมอเตอร์ทีละก้าวกับ 48 ก้าวต่อการหมุน (7.5 องศา)
/ ถึงมอเตอร์พอร์ต # 2 (M3 และ M4)
มอเตอร์ AF_Stepper (48, 2);

รหัส Arduino สำหรับเครื่อง CNC:
รหัส Arduino สำหรับเครื่อง CNC
เมื่อมอเตอร์สตาร์ทตอบสนองได้อย่างเหมาะสมให้คัดลอกโค้ด Arduino สำหรับเครื่อง CNCจากส่วนรหัสด้านล่างและอัปโหลดไปที่บอร์ด Arduino คุณสามารถดาวน์โหลดโค้ดจากที่นี่ได้

G-Code สำหรับเครื่อง CNC:
G - CODE เป็นภาษาที่เราบอกให้คอมพิวเตอร์ (CNC) ทำอะไร เป็นไฟล์ที่ประกอบด้วยพิกัด X, Y และ Z
ตัวอย่างเช่น:
G17 G20 G90 G94 G54
G0 Z0.25X-0.5 Y0
Z0.1
G01 Z0 F5
G02 X0 Y0.5 I0.5 J0 F2.5
X0.5 Y0 I0 J-0.5
X0 Y-0.5 I-0.5 J0
X-0.5 Y0 I0 J0.5
G01 Z0.1 F5
G00 X0 Y0 Z0.25
การเขียนโค้ด G สำหรับสี่เหลี่ยมผืนผ้าง่ายๆอาจเป็นเรื่องที่ท้าทายจริงๆ แต่โชคดีที่เรามีซอฟต์แวร์ที่สามารถช่วยเราสร้าง G-Code ได้ ซอฟต์แวร์นี้จะเรียกว่า " Inkscape " ดาวน์โหลดได้จากที่นี่
คุณสามารถสร้าง G-Code ของคุณเองได้โดยใช้Inkscapeซึ่งเราได้อธิบายไว้ในส่วนถัดไปหรือคุณสามารถใช้ G-Codes ที่พร้อมใช้งานบนอินเทอร์เน็ตได้
ก่อนที่ฉันจะแสดงวิธีสร้าง G-Codes โดยใช้ Inkscape จะอธิบายวิธีการส่งรหัส G เหล่านี้เข้าไปใน Arduino ซอฟต์แวร์ที่จะช่วยให้เราส่ง G-รหัสลงใน Arduino จะเรียกว่าการประมวลผล

กำลังประมวลผล IDE เพื่ออัปโหลด G-Code:
แพลตฟอร์มนี้จะช่วยให้เราส่งรหัส G ไปที่บอร์ด Arduino โดยจะต้องดาวน์โหลดไฟล์ GCTRL.PDE
ดาวน์โหลดไฟล์ GCTRL.pde จากที่นี่และเปิดใช้งานการประมวลผล IDE
การประมวลผล IDE สำหรับการอัปโหลด g-code ในเครื่อง CNC Arduino
เมื่อคุณเปิดเอกสารใน IDE การประมวลผลแล้วให้คลิกเรียกใช้ หน้าต่างปรากฏขึ้นพร้อมกับคำแนะนำทั้งหมด กดปุ่มpบนแป้นพิมพ์ ระบบจะขอให้คุณเลือกพอร์ต เลือกพอร์ตที่บอร์ด Arduino ของคุณเชื่อมต่อ กรณีของฉันคือพอร์ต 6
กดgและเรียกดูไปยังโฟลเดอร์ที่คุณบันทึก G-CODE ไว้ เลือก G-CODE ขวาและกด Enter หากทุกสิ่งทุกอย่างถูกเชื่อมต่ออย่างถูกต้องคุณจะเห็นอุปกรณ์ที่เริ่มทำขึ้นบนกระดาษ
หากคุณต้องการยุติกระบวนการเพียงกดxและอุปกรณ์จะหยุดทำสิ่งใดก็ตาม

วิธีการสร้างรหัส G ของคุณเอง:

เรากล่าวว่าInkscapeเป็นซอฟต์แวร์ที่เราจะใช้ในการสร้าง G-CODES ของเรา ในตัวอย่างนี้เราจะสร้างข้อความง่ายๆ ( HELLO WORLD)ดังรูปด้านล่าง
inkscap สำหรับการสร้าง g-code สำหรับเครื่อง CNC Arduino
หมายเหตุ : Inkscape ไม่มีวิธีที่สร้างขึ้นในการบันทึกเป็นไฟล์ G-Code ดังนั้นคุณต้องติดตั้ง Add-onเพื่อให้สามารถเอ็กซ์พอร์ตภาพไปยังไฟล์ G-CODE ได้ ดาวน์โหลดปลั๊กอิน MakerBot Unicorn จากที่นี่พร้อมกับบันทึกการติดตั้ง
หากการติดตั้งเสร็จสมบูรณ์ให้เปิด Inkscape ไปที่ File menu และคลิก "Document Properties" ขนาดการเปลี่ยนแปลงครั้งแรกจาก px ถึง mm ลดความกว้างและความสูงเป็น 90 มม. ตอนนี้ปิดหน้าต่างนี้ ตารางจะปรากฏเป็นพื้นที่วาดภาพ นี่คือพื้นที่ที่เราจะใช้เขียนข้อความของเรา

ตอนนี้ที่แถบด้านซ้ายคลิกที่สร้างและแก้ไขแท็กวัตถุข้อความ พิมพ์ข้อความ " HELLO WORLD " แล้ววางตำแหน่งไว้ที่มุมบนขวาของสี่เหลี่ยมดังที่แสดงด้านล่าง
inkscap สำหรับการสร้าง g-code สำหรับเครื่อง CNC Arduino
คลิกที่ข้อความและเลือกประเภทของแบบอักษรที่คุณต้องการ คลิกสมัครและปิด
ตอนนี้คลิกที่เส้นทางและเลือก " วัตถุเพื่อเส้นทาง "
ข้อความของคุณพร้อมที่จะบันทึกเป็น G-CODE แล้ว คลิกที่ไฟล์ -> save asแล้วพิมพ์ชื่อไฟล์เป็น "hello world"
เปลี่ยนประเภทไฟล์เป็น"MakerBot Unicon G-Code"ดังรูปด้านล่าง ซึ่งจะปรากฏเฉพาะเมื่อติดตั้ง Add-on สำเร็จ สุดท้ายคลิกที่บันทึกและคลิก OK ในหน้าต่างป๊อปอัพ
inkscap สำหรับการสร้าง g-code สำหรับเครื่อง CNC Arduino
คุณได้สร้าง G-Code และสามารถวางแผนโดยใช้ขั้นตอนก่อนหน้าได้

ตัวควบคุม GRBL:

grbl controller สำหรับเครื่อง CNC Arduino

เมื่อคุณสร้าง G-Code โดยใช้ Inkscape แล้วอาจจำเป็นต้องดู G-Code เพื่อให้มั่นใจว่าอยู่ในขีด จำกัด ของรูปวาด
ขีด จำกัด ของการวาดภาพจะถูกตั้งค่าในรหัส Arduino ซีเอ็นซีในสายที่แสดงด้านล่าง:
การตั้งค่าขีด จำกัด ขนาดในโค้ด arduino สำหรับเครื่องซีเอ็นซี
ภาพที่แสดงในตัวควบคุม GRBL ไม่ควรเกินขีด จำกัด ดังที่แสดงไว้ในโค้ด CNC Arduinoด้านบน หากเกินกว่าขีด จำกัด ดังกล่าวสำหรับด้านลบของแกน x ส่วนที่ด้านลบจะไม่ได้รับการวางแผน
ในตัวอย่างนี้ค่า x และ y อยู่ในช่วงตั้งแต่ 0 มม. ถึง 40 มม.
ตั้งแต่ฉันใช้ชิ้นส่วนเครื่องพิมพ์ที่สามารถพล็อตในพื้นที่ขนาดใหญ่ผมเปลี่ยนค่าสูงสุดจาก 40mm ไป 60mm
เมื่อใดก็ตามที่คุณสร้าง G-Code โดยใช้ Inkscape คุณสามารถเปิด G-Code ในโปรแกรม GRBL เพื่อดูว่ามีข้อ จำกัด อยู่หรือไม่ หากไม่อยู่ภายในคุณต้องปรับขนาดภาพใน Inkscape จนกว่าจะอยู่ในขอบเขตที่คุณกำหนด

ดังนั้นนี้เป็นวิธีที่ถูกและง่ายที่สุดในการสร้างเครื่อง CNC พลอตเตอร์โดยใช้ Arduino Uno ที่บ้าน ลองใช้และแจ้งให้เราทราบในความคิดเห็นนอกจากนี้โปรดตรวจสอบวิดีโอด้านล่าง
รหัส
/ *  
 ส่ง GCODE ไปที่ Sketch นี้โดยใช้ gctrl.pde https://github.com/damellis/gctrl
 แปลง SVG เป็น GCODE พร้อมปลั๊กอิน MakerBot Unicorn สำหรับ Inkscape ที่นี่https://github.com/martymcguire/inkscape-unicorn
 Arduino code for เครื่อง CNC Plotter มินินี้อิงตาม: https://github.com/adidax/mini_cnc_plotter_firmware
* /
#include <Servo.h> 
#include <AFMotor.h>
#define LINE_BUFFER_LENGTH 512
char STEP = MICROSTEP;
// ตำแหน่ง Servo สำหรับขึ้นและลง  
const int penZUp = 115; 
const int penZDown = 83;
// เซอร์โวบนขา PWM 10 
const int penServoPin = 10;
// ควรเหมาะสมสำหรับ DVD steppers แต่ไม่สำคัญเกินไปที่นี่
const int stepsPerRevolution = 48; 
// สร้างเซอร์โววัตถุเพื่อควบคุม servo  
penServo servo;  
/ / เริ่มต้นการทำงานของสเต็ปเปอร์สำหรับแกน X และ Y โดยใช้หมุด Arduino นี้สำหรับ L-299D H-bridge 
AF_Stepper myStepperY (stepsPerRevolution, 1);            
AF_Stepper myStepperX (stepsPerRevolution, 2);  
/ * โครงสร้างตัวแปรทั่วโลก * / 
struct point {  
  float x; 
  ลอย y; 
  float z; 
};
/ / ตำแหน่งปัจจุบันของ
ตัวควบคุม actuator plothead struct จุด;
/ / การตั้งค่าการวาดภาพควรจะตกลง
ลอย StepInc = 1; 
int StepDelay = 0; 
int LineDelay = 0; 
int penDelay = 50;
ขั้นตอนมอเตอร์ไป 1 มิลลิเมตร 
// ใช้แบบทดสอบเพื่อไป 100 ขั้นตอน วัดความยาวของเส้น 
// คำนวณขั้นตอนต่อมิลลิเมตร เข้าที่นี่. 
float StepsPerMillimeterX = 100.0; 
float StepsPerMillimeterY = 100.0;
// ขีด จำกัด หุ่นยนต์วาดใน mm 
/ / OK เริ่มต้นด้วย สามารถปรับขนาดได้สูงถึง 50 มม. 
ลอย Xmin = 0; 
float Xmax = 40; 
ลอย Ymin = 0; 
ลอย Ymax = 40; 
float Zmin = 0; 
floax Zmax = 1;
ลอย Xpos = Xmin; 
ลอย Ypos = Ymin; 
ลอย Zpos = Zmax; 
// ตั้งค่าเป็น true เพื่อรับเอาต์พุตการแก้ปัญหา 
boolean verbose = false;
// ต้องแปล  
// G1 สำหรับการเคลื่อนย้าย
// G4 P300 (รอ 150ms) 
// M300 S30 (ปากกาลง) 
// M300 S50 (ปากกาขึ้น) 
// ยกเลิกสิ่งที่มี a ( 
// ยกเลิกคำสั่งอื่น ๆ !
/ ********************** 
 * การตั้งค่าเป็นโมฆะ () - Initialisations 
 ******************** *** / 
ตั้งค่าเป็นโมฆะ () { 
  // ตั้ง
  
  Serial.begin (9600); 
  
  penServo.attach (penServoPin); 
  penServo.write (penZUp); 
  ล่าช้า (100);
  // ลดลงถ้าจำเป็น
  myStepperX.setSpeed ​​(600); 
  myStepperY.setSpeed (600);  
  
  // ตั้งค่าและย้ายไปที่ตำแหน่งเริ่มต้นเริ่มต้น
  // TBD
  // การแจ้งเตือน !!! 
  Serial.println ("เครื่อง CNC พล็อตเตอร์ขนาดเล็กที่มีชีวิตชีวาและเตะ!"); 
  Serial.print ("ช่วง X มาจาก"); 
  Serial.print (Xmin); 
  Serial.print ("ถึง"); 
  Serial.print (xmax); 
  Serial.println ("mm."); 
  Serial.print ("ช่วง Y มาจาก"); 
  Serial.print (ymin); 
  Serial.print ("ถึง"); 
  Serial.print (ymax); 
  Serial.println ("mm."); 
}
/ ********************** 
 * void loop () - ลูปหลัก
 ******************* **** / 
void loop ()  

  
  ล่าช้า (100); 
  บรรทัดอักขระ [LINE_BUFFER_LENGTH]; 
  char c; 
  int lineIndex; 
  bool lineIsComment, LineSemiColon;
  lineIndex = 0; 
  lineSemiColon = false; 
  lineIsComment = false;
  while (1) {
    // การรับสัญญาณ Serial - ส่วนใหญ่จาก Grbl เพิ่มการสนับสนุนเครื่องหมายอัฒภาค
    ขณะที่ (Serial.available ()> 0) { 
      c = Serial.read (); 
      หาก ((c == '\ n') || (c == '\ r')) {// สิ้นสุดของเส้นถึง
        if (lineIndex> 0) {// Line เสร็จสมบูรณ์ แล้วรัน! 
          บรรทัด [lineIndex] = '\ 0'; // สิ้นสุดสตริง
          ถ้า (verbose) {  
            Serial.print ("Received:"); 
            Serial.println (บรรทัด); 
          } 
          processIncomingLine (บรรทัด lineIndex); 
          lineIndex = 0; 
        }  
        else {  
          // บรรทัดว่างหรือข้อคิดเห็น ข้ามบล็อก

        lineIsComment = false; 
        lineSemiColon = false; 
        Serial.println ( "ok");    
      }  
      else { 
        if ((lineIsComment) || (lineSemiColon)) {// ทิ้งอักขระแสดงความคิดเห็นทั้งหมด
          หาก (c == ')') lineIsComment = false; // จบความคิดเห็น สายงาน 
        }  
        else { 
          if (c <= '') {// ทิ้ง whitepace และตัวควบคุม
          }  
          else if (c == '/') {/ / Block delete not supported. ละเว้นอักขระ 
          }  
          else if (c == '('
            lineIsComment = true; 
          }  
          else if (c == ';') { 
            lineSemiColon = true; 
          }  
          else if (lineIndex> = LINE_BUFFER_LENGTH-1) { 
            Serial.println ("ERROR - lineBuffer overflow"); 
            lineIsComment = false; 
            lineSemiColon = false; 
          }  
          else if (c> = 'a' && c <= 'z') {/ / Upcase lowercase 
            line [lineIndex ++] = c-'a '+' A '; 
          }  
          else { 
            line [lineIndex ++] = c;





void processIncomingLine (char * line, int charNB) { 
  int currentIndex = 0; 
  ถ่านบัฟเฟอร์ [64]; / / หวังว่า 64 จะเพียงพอสำหรับ 1 พารามิเตอร์
  struct จุด newPos;
  newPos.x = 0.0; 
  newPos.y = 0.0;
  // ต้องแปล  
  // G1 สำหรับการเคลื่อนย้าย
  // G4 P300 (รอ 150ms) 
  // G1 X60 Y30 
  // G1 X30 Y50 
  // M300 S30 (ปากกาลง) 
  // M300 S50 (ปากกาขึ้น) 
  // ทิ้งอะไรที่มี ( 
  // ยกเลิกคำสั่งอื่น ๆ !
  ขณะที่ (currentIndex <charNB) { 
    switch (บรรทัด [currentIndex ++]) {/ เลือกคำสั่งถ้ามี
    กรณี 'U': 
      penUp (); 
      ทำลาย; 
    กรณี 'D': 
      penDown (); 
      ทำลาย; 
    กรณี 'G': 
      buffer [0] = บรรทัด [currentIndex ++]; // /! \ Dirty - ใช้ได้เฉพาะกับคำสั่ง 2 หลัก
      // buffer [1] = line [currentIndex ++]; 
      // buffer [2] = '\ 0'; 
      buffer [1] = '\ 0';
      สวิตช์ (atoi (buffer)) {// เลือกคำสั่ง G 
      กรณี 0: // G00 & G01 - การเคลื่อนไหวหรือการเคลื่อนไหวเร็ว เช่นเดียวกันกับ
      กรณีนี้ 1: 
        // /! \ Dirty - สมมติว่า X อยู่ก่อน Y 
        char * indexX = strchr (บรรทัด + currentIndex, 'X'); / / รับตำแหน่ง X / Y ในสตริง (ถ้ามี) 
        char * indexY = strchr (บรรทัด + currentIndex, 'Y'); 
        if (indexY <= 0) { 
          newPos.x = atof (indexX + 1); 
          newPos.y = actuatorPos.y; 
        }  
        else if (indexX <= 0) { 
          newPos.y = atof (indexY + 1); 
          newPos.x = actuatorPos.x; 
        }  
        else {
          newPos.y = atof (indexY + 1); 
          indexY = '\ 0'; 
          newPos.x = atof (indexX + 1); 
        } 
        drawLine (newPos.x, newPos.y); 
        // Serial.println ("ok"); 
        actuatorPos.x = newPos.x; 
        actuatorPos.y = newPos.y; 
        ทำลาย; 
      } 
      break; 
    กรณี 'M': 
      buffer [0] = บรรทัด [currentIndex ++]; // /! \ Dirty - ใช้งานได้เฉพาะกับ
      บัฟเฟอร์คำสั่ง 3 หลัก[1] = บรรทัด [currentIndex ++]; 
      buffer [2] = บรรทัด [currentIndex ++]; 
      buffer [3] = '\ 0'; 
      สวิตช์ (atoi (buffer)) { 
      กรณี 300: 
        {
          char * indexS = strchr (บรรทัด + currentIndex, 'S'); 
          float Spos = atof (ดัชนี + 1); 
          // Serial.println ("ok"); 
          if (Spos == 30) {  
            penDown (); 
          } 
          if (Spos == 50) {  
            penUp (); 
          } 
          break; 
        } 
      กรณี 114: // M114 - Repport ตำแหน่ง
        Serial.print (ตำแหน่ง "แอบโซลูท: X ="); 
        Serial.print (actuatorPos.x); 
        Serial.print ("- Y ="); 
        Serial.println (actuatorPos.y); 
        ทำลาย; 
      ค่าเริ่มต้น:
        Serial.print ("Command not recognized: M"); 
        Serial.println (บัฟเฟอร์); 
      } 
    } 
  } 
}
/ ********************************* 
 * วาดเส้นจาก (x0; y0) ถึง (x1; y1) . 
 * int (x1; y1): พิกัดที่เริ่มต้น
 * int (x2; y2): พิกัดที่สิ้นสุดแล้ว
 ****************************** **** / 
โมฆะ drawLine (float x1, float y1) {
  if (verbose) 
  { 
    Serial.print ("fx1, fy1:"); 
    Serial.print (x1); 
    Serial.print ( ""); 
    Serial.print (y1); 
    Serial.println ( ""); 
  }  
  / / นำคำสั่งภายในวงเงิน
  ถ้า (x1> = Xmax) {  
    x1 = Xmax; 
  } 
  if (x1 <= Xmin) {  
    x1 = Xmin; 
  } 
  if (y1> = Ymax) {  
    y1 = Ymax; 
  } 
  if (y1 <= Ymin) {  
    y1 = Ymin; 
  }
  if (verbose) 
  { 
    Serial.print ("Xpos, Ypos:"); 
    Serial.print (Xpos); 
    Serial.print ( ""); 
    Serial.print (ypos); 
    Serial.println ( ""); 
  }
  if (verbose) 
  { 
    Serial.print ("x1, y1:"); 
    Serial.print (x1); 
    Serial.print ( ""); 
    Serial.print (y1); 
    Serial.println ( ""); 
  }
  // แปลงพิกัดเป็นขั้นตอน
  x1 = (int) (x1 * StepsPerMillimeterX); 
  y1 = (int) (y1 * StepsPerMillimeterY); 
  float x0 = Xpos; 
  ลอย y0 = Ypos;
  // ลองหาการเปลี่ยนแปลงของพิกัด
  dx = abs (x1-x0); 
  ยาว dy = abs (y1-y0); 
  int sx = x0 <x1? StepInc: -StepInc; 
  int SY = y0 <y1? StepInc: -StepInc;
  ยาว i; 
  ยาวกว่า = 0;
  ถ้า (dx> dy) { 
    for (i = 0; i <dx; ++ i) { 
      myStepperX.onestep (sx, STEP); 
      มากกว่า + = DY; 
      if (over> = dx) { 
        over- = dx; 
        myStepperY.onestep (SY, STEP); 
      } 
    ล่าช้า (StepDelay); 
    } 
  } 
  else { 
    for (i = 0; i <i; i + i) { 
      myStepperY.onestep (sy, STEP); 
      มากกว่า + = DX; 
      ถ้า (มากกว่า> = dy) { 
        over- = dy; 
        myStepperX.onestep (SX, STEP); 
      } 
      ล่าช้า (StepDelay); 
    }     
  }
  if (verbose) 
  { 
    Serial.print ("dx, dy:"); 
    Serial.print (DX); 
    Serial.print ( ""); 
    Serial.print (DY); 
    Serial.println ( ""); 
  }
  ถ้า (verbose) 
  { 
    Serial.print ("ไป ("); 
    Serial.print (x0); 
    Serial.print (","); 
    Serial.print (y0); 
    Serial.println (")"); 
  }
  / / ล่าช้าก่อนที่จะส่งสายการบิน
  ล่าช้า (LineDelay); 
  / / ปรับปรุงตำแหน่ง
  Xpos = x1; 
  Ypos = y1; 
}
// ยกปากกา
penoid เป็นโมฆะ () {  
  penServo.write (penZUp); 
  ล่าช้า (penDelay); 
  Zpos = Zmax; 
  digitalWrite (15, ต่ำ); 
    digitalWrite (16, HIGH); 
  ถ้า (verbose) {  
    Serial.println ("ปากกาขึ้น!"); 
    
  }  

/ / ลดปากกา
โมฆะ penDown () {  
  penServo.write (penZDown); 
  ล่าช้า (penDelay); 
  Zpos = Zmin; 
  digitalWrite (15, HIGH); 
    digitalWrite (16, ต่ำ); 
  ถ้า (verbose) {  
    Serial.println ("ปากกาลง"); 
  }  
}