เครื่อง CNC Plotter DIY Arduino
ARDUINO
เครื่อง 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 เป็นไมโครคอนโทรลเลอร์เพื่อสร้างเครื่องซีเอ็นซีนี้
มาเริ่มขั้นตอนการสร้างอุปกรณ์นี้ทีละขั้นตอน
สิ่งที่คุณต้องการ:
หมายเหตุ:การออกแบบของฉันมีความแตกต่างกันไปในแง่ของขนาดและวัสดุที่ใช้ ฉันไม่สามารถหาไดรฟ์ดีวีดีเก่าได้ดังนั้นฉันจึงเลือกใช้เครื่องพิมพ์ ไม่ว่าคุณจะใช้อะไรให้ตรวจสอบว่ามีมอเตอร์แบบสเต็ปเปอร์
ความต้องการฮาร์ดแวร์:
- แผ่นอลูมิเนียม (710mm x 710mm)
- เครื่องพิมพ์ HP / Epson เก่า คุณสามารถใช้ไดรฟ์ดีวีดีคอมพิวเตอร์เครื่องเก่าได้
- สลักเกลียวและถั่ว
- แก้ว Perspex
- Arduino UNO
- โล่ไดรเวอร์มอเตอร์ L293D
- มอเตอร์เซอร์โวแบบมินิ
- ปากกา
เครื่องมือ
- ไขควง
- เจาะ
- เครื่องมือตัด (เลื่อยลูกซอง)
- กาว
- อุปกรณ์เบญจรงค์
โปรแกรม:
สำหรับการทำงานที่มีประสิทธิภาพของเครื่องนี้จะใช้ซอฟต์แวร์ต่อไปนี้ ไปที่เว็บไซต์ต่างๆและดาวน์โหลดได้
- Arduino IDE เวอร์ชัน 1.6.6 หรือที่ใหม่กว่าจากที่นี่
- การประมวลผลเวอร์ชัน IDE 3.1.1 หรือใหม่กว่าจากที่นี่
- รุ่น Inkscape 0.48.5 ดาวน์โหลดได้จากที่นี่
- ตัวควบคุม Grbl (อุปกรณ์เสริม)
ฐานเครื่อง CNC Plotter Machine:
ตัวเครื่องหลักของเครื่องนี้เป็นฐานที่รองรับชิ้นส่วนหลัก ๆ ของเครื่องด้วยกันเพื่อให้เครื่องมีความมั่นคงและเป็นแบบพกพา ในการออกแบบนี้เราจะใช้อลูมิเนียมในการสร้างฐานเนื่องจากมีน้ำหนักเบาง่ายต่อการงอและตัดและยังให้ลักษณะเงางามดีเนื่องจากไม่เป็นสนิม
การออกแบบและขนาดของฐานของฉันแสดงไว้ด้านล่าง:
หมายเหตุ:ขนาดทั้งหมดเป็นมิลลิเมตร
หลังจากการดัดและตัดแล้วผมสามารถผลิตฐานที่มั่นคงได้ดังรูปด้านล่าง:
การประกอบแกน X, Y และ Z:
ในการทำแกน x และ yใช้แท่นวางเครื่องพิมพ์สองใบ แต่ละชิ้นส่วนเหล่านี้ประกอบด้วยมอเตอร์แบบสเต็ปเปอร์และกลไกการขับเคลื่อนสายพานโดยปกติแล้วจะใช้เพื่อเคลื่อนย้ายสายพานลำเลียงไปมา
สำหรับแกน zจะติดมอเตอร์เซอร์โวขนาดเล็กไว้บนแกน y โดยใช้กาว มอเตอร์เซอร์โวนี้ใช้เพื่อเลื่อนปากกาขึ้นและลง ควรมีกลไกสนับสนุนที่ดีซึ่งจะช่วยให้ปากกาฟรีและลื่นไหล
แท่นวางเครื่อง CNC:
เนื่องจากขนาดใหญ่ของเครื่องนี้อุปกรณ์จะสามารถวาดบนกระดาษขนาด A5 ได้ ดังนั้นเราจึงจะตัด A5 (148mmx210mm) ออกจากกระจก Perspex จากนั้นติดไว้บนส่วนที่เคลื่อนที่ด้วยแกน x โดยใช้กาว
การเดินสายไฟและวงจรของเครื่อง CNC:
ใส่โลโกร์ไดรเวอร์ L293Dลงบนบอร์ด Arduino UNO โล่นี้สามารถขับเคลื่อนมอเตอร์ stepper สองตัวพร้อมกันและเซอร์โวมอเตอร์สองตัว เชื่อมต่อมอเตอร์ stepper สองแบบดังรูปด้านล่าง ควรเชื่อมต่อสายดินกับมอเตอร์ชนิด bipoplar
ยังติดมอเตอร์เซอร์โว 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 คุณสามารถดาวน์โหลดโค้ดจากที่นี่ได้
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 การประมวลผลแล้วให้คลิกเรียกใช้ หน้าต่างปรากฏขึ้นพร้อมกับคำแนะนำทั้งหมด กดปุ่มpบนแป้นพิมพ์ ระบบจะขอให้คุณเลือกพอร์ต เลือกพอร์ตที่บอร์ด Arduino ของคุณเชื่อมต่อ กรณีของฉันคือพอร์ต 6
กดgและเรียกดูไปยังโฟลเดอร์ที่คุณบันทึก G-CODE ไว้ เลือก G-CODE ขวาและกด Enter หากทุกสิ่งทุกอย่างถูกเชื่อมต่ออย่างถูกต้องคุณจะเห็นอุปกรณ์ที่เริ่มทำขึ้นบนกระดาษ
หากคุณต้องการยุติกระบวนการเพียงกดxและอุปกรณ์จะหยุดทำสิ่งใดก็ตาม
วิธีการสร้างรหัส G ของคุณเอง:
เรากล่าวว่าInkscapeเป็นซอฟต์แวร์ที่เราจะใช้ในการสร้าง G-CODES ของเรา ในตัวอย่างนี้เราจะสร้างข้อความง่ายๆ ( HELLO WORLD)ดังรูปด้านล่าง
หมายเหตุ : Inkscape ไม่มีวิธีที่สร้างขึ้นในการบันทึกเป็นไฟล์ G-Code ดังนั้นคุณต้องติดตั้ง Add-onเพื่อให้สามารถเอ็กซ์พอร์ตภาพไปยังไฟล์ G-CODE ได้ ดาวน์โหลดปลั๊กอิน MakerBot Unicorn จากที่นี่พร้อมกับบันทึกการติดตั้ง
หากการติดตั้งเสร็จสมบูรณ์ให้เปิด Inkscape ไปที่ File menu และคลิก "Document Properties" ขนาดการเปลี่ยนแปลงครั้งแรกจาก px ถึง mm ลดความกว้างและความสูงเป็น 90 มม. ตอนนี้ปิดหน้าต่างนี้ ตารางจะปรากฏเป็นพื้นที่วาดภาพ นี่คือพื้นที่ที่เราจะใช้เขียนข้อความของเรา
ตอนนี้ที่แถบด้านซ้ายคลิกที่สร้างและแก้ไขแท็กวัตถุข้อความ พิมพ์ข้อความ " HELLO WORLD " แล้ววางตำแหน่งไว้ที่มุมบนขวาของสี่เหลี่ยมดังที่แสดงด้านล่าง
คลิกที่ข้อความและเลือกประเภทของแบบอักษรที่คุณต้องการ คลิกสมัครและปิด
ตอนนี้คลิกที่เส้นทางและเลือก " วัตถุเพื่อเส้นทาง "
ข้อความของคุณพร้อมที่จะบันทึกเป็น G-CODE แล้ว คลิกที่ไฟล์ -> save asแล้วพิมพ์ชื่อไฟล์เป็น "hello world"
เปลี่ยนประเภทไฟล์เป็น"MakerBot Unicon G-Code"ดังรูปด้านล่าง ซึ่งจะปรากฏเฉพาะเมื่อติดตั้ง Add-on สำเร็จ สุดท้ายคลิกที่บันทึกและคลิก OK ในหน้าต่างป๊อปอัพ
คุณได้สร้าง G-Code และสามารถวางแผนโดยใช้ขั้นตอนก่อนหน้าได้
ตัวควบคุม GRBL:
เมื่อคุณสร้าง G-Code โดยใช้ Inkscape แล้วอาจจำเป็นต้องดู G-Code เพื่อให้มั่นใจว่าอยู่ในขีด จำกัด ของรูปวาด
ขีด จำกัด ของการวาดภาพจะถูกตั้งค่าในรหัส 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
* /
ส่ง 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>
#include <AFMotor.h>
#define LINE_BUFFER_LENGTH 512
char STEP = MICROSTEP;
// ตำแหน่ง Servo สำหรับขึ้นและลง
const int penZUp = 115;
const int penZDown = 83;
const int penZUp = 115;
const int penZDown = 83;
// เซอร์โวบนขา PWM 10
const int penServoPin = 10;
const int penServoPin = 10;
// ควรเหมาะสมสำหรับ DVD steppers แต่ไม่สำคัญเกินไปที่นี่
const int stepsPerRevolution = 48;
const int stepsPerRevolution = 48;
// สร้างเซอร์โววัตถุเพื่อควบคุม servo
penServo servo;
penServo servo;
/ / เริ่มต้นการทำงานของสเต็ปเปอร์สำหรับแกน X และ Y โดยใช้หมุด Arduino นี้สำหรับ L-299D H-bridge
AF_Stepper myStepperY (stepsPerRevolution, 1);
AF_Stepper myStepperX (stepsPerRevolution, 2);
AF_Stepper myStepperY (stepsPerRevolution, 1);
AF_Stepper myStepperX (stepsPerRevolution, 2);
/ * โครงสร้างตัวแปรทั่วโลก * /
struct point {
float x;
ลอย y;
float z;
};
struct point {
float x;
ลอย y;
float z;
};
/ / ตำแหน่งปัจจุบันของ
ตัวควบคุม actuator plothead struct จุด;
ตัวควบคุม actuator plothead struct จุด;
/ / การตั้งค่าการวาดภาพควรจะตกลง
ลอย StepInc = 1;
int StepDelay = 0;
int LineDelay = 0;
int penDelay = 50;
ลอย StepInc = 1;
int StepDelay = 0;
int LineDelay = 0;
int penDelay = 50;
ขั้นตอนมอเตอร์ไป 1 มิลลิเมตร
// ใช้แบบทดสอบเพื่อไป 100 ขั้นตอน วัดความยาวของเส้น
// คำนวณขั้นตอนต่อมิลลิเมตร เข้าที่นี่.
float StepsPerMillimeterX = 100.0;
float StepsPerMillimeterY = 100.0;
// ใช้แบบทดสอบเพื่อไป 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;
/ / OK เริ่มต้นด้วย สามารถปรับขนาดได้สูงถึง 50 มม.
ลอย Xmin = 0;
float Xmax = 40;
ลอย Ymin = 0;
ลอย Ymax = 40;
float Zmin = 0;
floax Zmax = 1;
ลอย Xpos = Xmin;
ลอย Ypos = Ymin;
ลอย Zpos = Zmax;
ลอย Ypos = Ymin;
ลอย Zpos = Zmax;
// ตั้งค่าเป็น true เพื่อรับเอาต์พุตการแก้ปัญหา
boolean verbose = false;
boolean verbose = false;
// ต้องแปล
// G1 สำหรับการเคลื่อนย้าย
// G4 P300 (รอ 150ms)
// M300 S30 (ปากกาลง)
// M300 S50 (ปากกาขึ้น)
// ยกเลิกสิ่งที่มี a (
// ยกเลิกคำสั่งอื่น ๆ !
// G1 สำหรับการเคลื่อนย้าย
// G4 P300 (รอ 150ms)
// M300 S30 (ปากกาลง)
// M300 S50 (ปากกาขึ้น)
// ยกเลิกสิ่งที่มี a (
// ยกเลิกคำสั่งอื่น ๆ !
/ **********************
* การตั้งค่าเป็นโมฆะ () - Initialisations
******************** *** /
ตั้งค่าเป็นโมฆะ () {
// ตั้ง
Serial.begin (9600);
penServo.attach (penServoPin);
penServo.write (penZUp);
ล่าช้า (100);
* การตั้งค่าเป็นโมฆะ () - Initialisations
******************** *** /
ตั้งค่าเป็นโมฆะ () {
// ตั้ง
Serial.begin (9600);
penServo.attach (penServoPin);
penServo.write (penZUp);
ล่าช้า (100);
// ลดลงถ้าจำเป็น
myStepperX.setSpeed (600);
myStepperY.setSpeed (600);
// ตั้งค่าและย้ายไปที่ตำแหน่งเริ่มต้นเริ่มต้น
// TBD
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.");
}
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;
* void loop () - ลูปหลัก
******************* **** /
void loop ()
{
ล่าช้า (100);
บรรทัดอักขระ [LINE_BUFFER_LENGTH];
char c;
int lineIndex;
bool lineIsComment, LineSemiColon;
lineIndex = 0;
lineSemiColon = false;
lineIsComment = false;
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;
ขณะที่ (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;
int currentIndex = 0;
ถ่านบัฟเฟอร์ [64]; / / หวังว่า 64 จะเพียงพอสำหรับ 1 พารามิเตอร์
struct จุด newPos;
newPos.x = 0.0;
newPos.y = 0.0;
newPos.y = 0.0;
// ต้องแปล
// G1 สำหรับการเคลื่อนย้าย
// G4 P300 (รอ 150ms)
// G1 X60 Y30
// G1 X30 Y50
// M300 S30 (ปากกาลง)
// M300 S50 (ปากกาขึ้น)
// ทิ้งอะไรที่มี (
// ยกเลิกคำสั่งอื่น ๆ !
// 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';
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 (บัฟเฟอร์);
}
}
}
}
กรณี 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) {
* วาดเส้นจาก (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 ( "");
}
{
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;
}
ถ้า (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 ( "");
}
{
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 ( "");
}
{
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;
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;
dx = abs (x1-x0);
ยาว dy = abs (y1-y0);
int sx = x0 <x1? StepInc: -StepInc;
int SY = y0 <y1? StepInc: -StepInc;
ยาว i;
ยาวกว่า = 0;
ยาวกว่า = 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);
}
}
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 ( "");
}
{
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 (")");
}
{
Serial.print ("ไป (");
Serial.print (x0);
Serial.print (",");
Serial.print (y0);
Serial.println (")");
}
/ / ล่าช้าก่อนที่จะส่งสายการบิน
ล่าช้า (LineDelay);
/ / ปรับปรุงตำแหน่ง
Xpos = x1;
Ypos = y1;
}
ล่าช้า (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 ("ปากกาลง");
}
}
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 ("ปากกาลง");
}
}
ไม่มีความคิดเห็น:
แสดงความคิดเห็น