เครื่อง 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 ("ปากกาลง"); 
  }  
}