Search
Search titles only
By:
Search titles only
By:
Log in
Register
Search
Search titles only
By:
Search titles only
By:
Menu
Install the app
Install
Forums
New posts
All threads
Latest threads
New posts
Trending threads
Trending
Search forums
What's new
New posts
New ads
New profile posts
Latest activity
Free Ads
Latest reviews
Search ads
Members
Current visitors
New profile posts
Search profile posts
Contact us
Latest ads
එක පැකේජ් එකයි මාසෙටම Unlimited Internet. තාමත් DATA CARD දාන්න සල්ලි වියදම් කරනවද? අඩුම මිලට අපෙන්.
sayuru bandara
Updated:
Tuesday at 12:30 PM
Ad icon
ඉන්ටර්නෙට් එකෙන් හරියටම සල්ලි හොයන්න සහ Success වෙන්න කැමතිද? 🚀 (E-Money & Success Stories)
siri sumana
Updated:
Saturday at 11:44 PM
Gemini AI PRO 18 months Offer
Hawaka
Updated:
May 27, 2026
Ad icon
koko account
DasunEranga
Updated:
May 27, 2026
Ad icon
koko account
DasunEranga
Updated:
May 27, 2026
Electronics
Vehicles
Property
Search
Reply to thread
Forums
General
ElaKiri Help
CNC Plotter
Get the App
JavaScript is disabled. For a better experience, please enable JavaScript in your browser before proceeding.
You are using an out of date browser. It may not display this or other websites correctly.
You should upgrade or use an
alternative browser
.
Message
<blockquote data-quote="iPissa" data-source="post: 21680456" data-attributes="member: 562804"><p>Machn Code eka PM karanna baa diga wadi kiyanawa. </p><p></p><p>me tiyenn code eka machan.</p><p></p><p>/* </p><p> Mini CNC Plotter firmware, based in TinyCNC <a href="https://github.com/MakerBlock/TinyCNC-Sketches" target="_blank">https://github.com/MakerBlock/TinyCNC-Sketches</a></p><p> Send GCODE to this Sketch using gctrl.pde <a href="https://github.com/damellis/gctrl" target="_blank">https://github.com/damellis/gctrl</a></p><p> Convert SVG to GCODE with MakerBot Unicorn plugin for Inkscape available here <a href="https://github.com/martymcguire/inkscape-unicorn" target="_blank">https://github.com/martymcguire/inkscape-unicorn</a></p><p> </p><p> More information about the Mini CNC Plotter here (german, sorry): <a href="http://www.makerblog.at/2015/02/projekt-mini-cnc-plotter-aus-alten-cddvd-laufwerken/" target="_blank">http://www.makerblog.at/2015/02/projekt-mini-cnc-plotter-aus-alten-cddvd-laufwerken/</a></p><p> */</p><p></p><p>#include <Servo.h></p><p>#include <AFMotor.h></p><p></p><p>#define LINE_BUFFER_LENGTH 512</p><p></p><p>char STEP = MICROSTEP ;</p><p></p><p>// Servo position for Up and Down </p><p>const int penZUp = 95;</p><p>const int penZDown = 83;</p><p></p><p>// Servo on PWM pin 10</p><p>const int penServoPin =10 ;</p><p></p><p>// Should be right for DVD steppers, but is not too important here</p><p>const int stepsPerRevolution = 100; </p><p></p><p>// create servo object to control a servo </p><p>Servo penServo; </p><p></p><p>// Initialize steppers for X- and Y-axis using this Arduino pins for the L293D H-bridge</p><p>AF_Stepper myStepperY(stepsPerRevolution,1); </p><p>AF_Stepper myStepperX(stepsPerRevolution,2); </p><p></p><p>/* Structures, global variables */</p><p>struct point { </p><p> float x; </p><p> float y; </p><p> float z; </p><p>};</p><p></p><p>// Current position of plothead</p><p>struct point actuatorPos;</p><p></p><p>// Drawing settings, should be OK</p><p>float StepInc = 1;</p><p>int StepDelay = 0;</p><p>int LineDelay =0;</p><p>int penDelay = 50;</p><p></p><p>// Motor steps to go 1 millimeter.</p><p>// Use test sketch to go 100 steps. Measure the length of line. </p><p>// Calculate steps per mm. Enter here.</p><p>float StepsPerMillimeterX = 100.0;</p><p>float StepsPerMillimeterY = 100.0;</p><p></p><p>// Drawing robot limits, in mm</p><p>// OK to start with. Could go up to 50 mm if calibrated well. </p><p>float Xmin = 0;</p><p>float Xmax = 40;</p><p>float Ymin = 0;</p><p>float Ymax = 40;</p><p>float Zmin = 0;</p><p>float Zmax = 1;</p><p></p><p>float Xpos = Xmin;</p><p>float Ypos = Ymin;</p><p>float Zpos = Zmax; </p><p></p><p>// Set to true to get debug output.</p><p>boolean verbose = false;</p><p></p><p>// Needs to interpret </p><p>// G1 for moving</p><p>// G4 P300 (wait 150ms)</p><p>// M300 S30 (pen down)</p><p>// M300 S50 (pen up)</p><p>// Discard anything with a (</p><p>// Discard any other command!</p><p></p><p>/**********************</p><p> * void setup() - Initialisations</p><p> ***********************/</p><p>void setup() {</p><p> // Setup</p><p> </p><p> Serial.begin( 9600 );</p><p> </p><p> penServo.attach(penServoPin);</p><p> penServo.write(penZUp);</p><p> delay(100);</p><p></p><p> // Decrease if necessary</p><p> myStepperX.setSpeed(600);</p><p></p><p> myStepperY.setSpeed(600); </p><p> </p><p></p><p> // Set & move to initial default position</p><p> // TBD</p><p></p><p> // Notifications!!!</p><p> Serial.println("Mini CNC Plotter alive and kicking!");</p><p> Serial.print("X range is from "); </p><p> Serial.print(Xmin); </p><p> Serial.print(" to "); </p><p> Serial.print(Xmax); </p><p> Serial.println(" mm."); </p><p> Serial.print("Y range is from "); </p><p> Serial.print(Ymin); </p><p> Serial.print(" to "); </p><p> Serial.print(Ymax); </p><p> Serial.println(" mm."); </p><p>}</p><p></p><p>/**********************</p><p> * void loop() - Main loop</p><p> ***********************/</p><p>void loop() </p><p>{</p><p> </p><p> delay(100);</p><p> char line[ LINE_BUFFER_LENGTH ];</p><p> char c;</p><p> int lineIndex;</p><p> bool lineIsComment, lineSemiColon;</p><p></p><p> lineIndex = 0;</p><p> lineSemiColon = false;</p><p> lineIsComment = false;</p><p></p><p> while (1) {</p><p></p><p> // Serial reception - Mostly from Grbl, added semicolon support</p><p> while ( Serial.available()>0 ) {</p><p> c = Serial.read();</p><p> if (( c == '\n') || (c == '\r') ) { // End of line reached</p><p> if ( lineIndex > 0 ) { // Line is complete. Then execute!</p><p> line[ lineIndex ] = '\0'; // Terminate string</p><p> if (verbose) { </p><p> Serial.print( "Received : "); </p><p> Serial.println( line ); </p><p> }</p><p> processIncomingLine( line, lineIndex );</p><p> lineIndex = 0;</p><p> } </p><p> else { </p><p> // Empty or comment line. Skip block.</p><p> }</p><p> lineIsComment = false;</p><p> lineSemiColon = false;</p><p> Serial.println("ok"); </p><p> } </p><p> else {</p><p> if ( (lineIsComment) || (lineSemiColon) ) { // Throw away all comment characters</p><p> if ( c == ')' ) lineIsComment = false; // End of comment. Resume line.</p><p> } </p><p> else {</p><p> if ( c <= ' ' ) { // Throw away whitepace and control characters</p><p> } </p><p> else if ( c == '/' ) { // Block delete not supported. Ignore character.</p><p> } </p><p> else if ( c == '(' ) { // Enable comments flag and ignore all characters until ')' or EOL.</p><p> lineIsComment = true;</p><p> } </p><p> else if ( c == ';' ) {</p><p> lineSemiColon = true;</p><p> } </p><p> else if ( lineIndex >= LINE_BUFFER_LENGTH-1 ) {</p><p> Serial.println( "ERROR - lineBuffer overflow" );</p><p> lineIsComment = false;</p><p> lineSemiColon = false;</p><p> } </p><p> else if ( c >= 'a' && c <= 'z' ) { // Upcase lowercase</p><p> line[ lineIndex++ ] = c-'a'+'A';</p><p> } </p><p> else {</p><p> line[ lineIndex++ ] = c;</p><p> }</p><p> }</p><p> }</p><p> }</p><p> }</p><p>}</p><p></p><p>void processIncomingLine( char* line, int charNB ) {</p><p> int currentIndex = 0;</p><p> char buffer[ 64 ]; // Hope that 64 is enough for 1 parameter</p><p> struct point newPos;</p><p></p><p> newPos.x = 0.0;</p><p> newPos.y = 0.0;</p><p></p><p> // Needs to interpret </p><p> // G1 for moving</p><p> // G4 P300 (wait 150ms)</p><p> // G1 X60 Y30</p><p> // G1 X30 Y50</p><p> // M300 S30 (pen down)</p><p> // M300 S50 (pen up)</p><p> // Discard anything with a (</p><p> // Discard any other command!</p><p></p><p> while( currentIndex < charNB ) {</p><p> switch ( line[ currentIndex++ ] ) { // Select command, if any</p><p> case 'U':</p><p> penUp(); </p><p> break;</p><p> case 'D':</p><p> penDown(); </p><p> break;</p><p> case 'G':</p><p> buffer[0] = line[ currentIndex++ ]; // /!\ Dirty - Only works with 2 digit commands</p><p> // buffer[1] = line[ currentIndex++ ];</p><p> // buffer[2] = '\0';</p><p> buffer[1] = '\0';</p><p></p><p> switch ( atoi( buffer ) ){ // Select G command</p><p> case 0: // G00 & G01 - Movement or fast movement. Same here</p><p> case 1:</p><p> // /!\ Dirty - Suppose that X is before Y</p><p> char* indexX = strchr( line+currentIndex, 'X' ); // Get X/Y position in the string (if any)</p><p> char* indexY = strchr( line+currentIndex, 'Y' );</p><p> if ( indexY <= 0 ) {</p><p> newPos.x = atof( indexX + 1); </p><p> newPos.y = actuatorPos.y;</p><p> } </p><p> else if ( indexX <= 0 ) {</p><p> newPos.y = atof( indexY + 1);</p><p> newPos.x = actuatorPos.x;</p><p> } </p><p> else {</p><p> newPos.y = atof( indexY + 1);</p><p> indexY = '\0';</p><p> newPos.x = atof( indexX + 1);</p><p> }</p><p> drawLine(newPos.x, newPos.y );</p><p> // Serial.println("ok");</p><p> actuatorPos.x = newPos.x;</p><p> actuatorPos.y = newPos.y;</p><p> break;</p><p> }</p><p> break;</p><p> case 'M':</p><p> buffer[0] = line[ currentIndex++ ]; // /!\ Dirty - Only works with 3 digit commands</p><p> buffer[1] = line[ currentIndex++ ];</p><p> buffer[2] = line[ currentIndex++ ];</p><p> buffer[3] = '\0';</p><p> switch ( atoi( buffer ) ){</p><p> case 300:</p><p> {</p><p> char* indexS = strchr( line+currentIndex, 'S' );</p><p> float Spos = atof( indexS + 1);</p><p> // Serial.println("ok");</p><p> if (Spos == 30) { </p><p> penDown(); </p><p> }</p><p> if (Spos == 50) { </p><p> penUp(); </p><p> }</p><p> break;</p><p> }</p><p> case 114: // M114 - Repport position</p><p> Serial.print( "Absolute position : X = " );</p><p> Serial.print( actuatorPos.x );</p><p> Serial.print( " - Y = " );</p><p> Serial.println( actuatorPos.y );</p><p> break;</p><p> default:</p><p> Serial.print( "Command not recognized : M");</p><p> Serial.println( buffer );</p><p> }</p><p> }</p><p> }</p><p></p><p></p><p></p><p>}</p><p></p><p></p><p>/*********************************</p><p> * Draw a line from (x0;y0) to (x1;y1). </p><p> * Bresenham algo from <a href="https://www.marginallyclever.com/blog/2013/08/how-to-build-an-2-axis-arduino-cnc-gcode-interpreter/" target="_blank">https://www.marginallyclever.com/blog/2013/08/how-to-build-an-2-axis-arduino-cnc-gcode-interpreter/</a></p><p> * int (x1;y1) : Starting coordinates</p><p> * int (x2;y2) : Ending coordinates</p><p> **********************************/</p><p>void drawLine(float x1, float y1) {</p><p></p><p> if (verbose)</p><p> {</p><p> Serial.print("fx1, fy1: ");</p><p> Serial.print(x1);</p><p> Serial.print(",");</p><p> Serial.print(y1);</p><p> Serial.println("");</p><p> } </p><p></p><p> // Bring instructions within limits</p><p> if (x1 >= Xmax) { </p><p> x1 = Xmax; </p><p> }</p><p> if (x1 <= Xmin) { </p><p> x1 = Xmin; </p><p> }</p><p> if (y1 >= Ymax) { </p><p> y1 = Ymax; </p><p> }</p><p> if (y1 <= Ymin) { </p><p> y1 = Ymin; </p><p> }</p><p></p><p> if (verbose)</p><p> {</p><p> Serial.print("Xpos, Ypos: ");</p><p> Serial.print(Xpos);</p><p> Serial.print(",");</p><p> Serial.print(Ypos);</p><p> Serial.println("");</p><p> }</p><p></p><p> if (verbose)</p><p> {</p><p> Serial.print("x1, y1: ");</p><p> Serial.print(x1);</p><p> Serial.print(",");</p><p> Serial.print(y1);</p><p> Serial.println("");</p><p> }</p><p></p><p> // Convert coordinates to steps</p><p> x1 = (int)(x1*StepsPerMillimeterX);</p><p> y1 = (int)(y1*StepsPerMillimeterY);</p><p> float x0 = Xpos;</p><p> float y0 = Ypos;</p><p></p><p> // Let's find out the change for the coordinates</p><p> long dx = abs(x1-x0);</p><p> long dy = abs(y1-y0);</p><p> int sx = x0<x1 ? StepInc : -StepInc;</p><p> int sy = y0<y1 ? StepInc : -StepInc;</p><p></p><p> long i;</p><p> long over = 0;</p><p></p><p> if (dx > dy) {</p><p> for (i=0; i<dx; ++i) {</p><p> myStepperX.onestep(sx,STEP);</p><p> over+=dy;</p><p> if (over>=dx) {</p><p> over-=dx;</p><p> myStepperY.onestep(sy,STEP);</p><p> }</p><p> delay(StepDelay);</p><p> }</p><p> }</p><p> else {</p><p> for (i=0; i<dy; ++i) {</p><p> myStepperY.onestep(sy,STEP);</p><p> over+=dx;</p><p> if (over>=dy) {</p><p> over-=dy;</p><p> myStepperX.onestep(sx,STEP);</p><p> }</p><p> delay(StepDelay);</p><p> } </p><p> }</p><p></p><p> if (verbose)</p><p> {</p><p> Serial.print("dx, dy:");</p><p> Serial.print(dx);</p><p> Serial.print(",");</p><p> Serial.print(dy);</p><p> Serial.println("");</p><p> }</p><p></p><p> if (verbose)</p><p> {</p><p> Serial.print("Going to (");</p><p> Serial.print(x0);</p><p> Serial.print(",");</p><p> Serial.print(y0);</p><p> Serial.println(")");</p><p> }</p><p></p><p> // Delay before any next lines are submitted</p><p> delay(LineDelay);</p><p> // Update the positions</p><p> Xpos = x1;</p><p> Ypos = y1;</p><p>}</p><p></p><p>// Raises pen</p><p>void penUp() { </p><p> penServo.write(penZUp); </p><p> delay(penDelay); </p><p> Zpos=Zmax; </p><p> digitalWrite(15, LOW);</p><p> digitalWrite(16, HIGH);</p><p> if (verbose) { </p><p> Serial.println("Pen up!"); </p><p> </p><p> } </p><p>}</p><p>// Lowers pen</p><p>void penDown() { </p><p> penServo.write(penZDown); </p><p> delay(penDelay); </p><p> Zpos=Zmin; </p><p> digitalWrite(15, HIGH);</p><p> digitalWrite(16, LOW);</p><p> if (verbose) { </p><p> Serial.println("Pen down."); </p><p> </p><p> </p><p> } </p><p>}</p></blockquote><p></p>
[QUOTE="iPissa, post: 21680456, member: 562804"] Machn Code eka PM karanna baa diga wadi kiyanawa. me tiyenn code eka machan. /* Mini CNC Plotter firmware, based in TinyCNC [url]https://github.com/MakerBlock/TinyCNC-Sketches[/url] Send GCODE to this Sketch using gctrl.pde [url]https://github.com/damellis/gctrl[/url] Convert SVG to GCODE with MakerBot Unicorn plugin for Inkscape available here [url]https://github.com/martymcguire/inkscape-unicorn[/url] More information about the Mini CNC Plotter here (german, sorry): [url]http://www.makerblog.at/2015/02/projekt-mini-cnc-plotter-aus-alten-cddvd-laufwerken/[/url] */ #include <Servo.h> #include <AFMotor.h> #define LINE_BUFFER_LENGTH 512 char STEP = MICROSTEP ; // Servo position for Up and Down const int penZUp = 95; const int penZDown = 83; // Servo on PWM pin 10 const int penServoPin =10 ; // Should be right for DVD steppers, but is not too important here const int stepsPerRevolution = 100; // create servo object to control a servo Servo penServo; // Initialize steppers for X- and Y-axis using this Arduino pins for the L293D H-bridge AF_Stepper myStepperY(stepsPerRevolution,1); AF_Stepper myStepperX(stepsPerRevolution,2); /* Structures, global variables */ struct point { float x; float y; float z; }; // Current position of plothead struct point actuatorPos; // Drawing settings, should be OK float StepInc = 1; int StepDelay = 0; int LineDelay =0; int penDelay = 50; // Motor steps to go 1 millimeter. // Use test sketch to go 100 steps. Measure the length of line. // Calculate steps per mm. Enter here. float StepsPerMillimeterX = 100.0; float StepsPerMillimeterY = 100.0; // Drawing robot limits, in mm // OK to start with. Could go up to 50 mm if calibrated well. float Xmin = 0; float Xmax = 40; float Ymin = 0; float Ymax = 40; float Zmin = 0; float Zmax = 1; float Xpos = Xmin; float Ypos = Ymin; float Zpos = Zmax; // Set to true to get debug output. boolean verbose = false; // Needs to interpret // G1 for moving // G4 P300 (wait 150ms) // M300 S30 (pen down) // M300 S50 (pen up) // Discard anything with a ( // Discard any other command! /********************** * void setup() - Initialisations ***********************/ void setup() { // Setup Serial.begin( 9600 ); penServo.attach(penServoPin); penServo.write(penZUp); delay(100); // Decrease if necessary myStepperX.setSpeed(600); myStepperY.setSpeed(600); // Set & move to initial default position // TBD // Notifications!!! Serial.println("Mini CNC Plotter alive and kicking!"); Serial.print("X range is from "); Serial.print(Xmin); Serial.print(" to "); Serial.print(Xmax); Serial.println(" mm."); Serial.print("Y range is from "); Serial.print(Ymin); Serial.print(" to "); Serial.print(Ymax); Serial.println(" mm."); } /********************** * void loop() - Main loop ***********************/ void loop() { delay(100); char line[ LINE_BUFFER_LENGTH ]; char c; int lineIndex; bool lineIsComment, lineSemiColon; lineIndex = 0; lineSemiColon = false; lineIsComment = false; while (1) { // Serial reception - Mostly from Grbl, added semicolon support while ( Serial.available()>0 ) { c = Serial.read(); if (( c == '\n') || (c == '\r') ) { // End of line reached if ( lineIndex > 0 ) { // Line is complete. Then execute! line[ lineIndex ] = '\0'; // Terminate string if (verbose) { Serial.print( "Received : "); Serial.println( line ); } processIncomingLine( line, lineIndex ); lineIndex = 0; } else { // Empty or comment line. Skip block. } lineIsComment = false; lineSemiColon = false; Serial.println("ok"); } else { if ( (lineIsComment) || (lineSemiColon) ) { // Throw away all comment characters if ( c == ')' ) lineIsComment = false; // End of comment. Resume line. } else { if ( c <= ' ' ) { // Throw away whitepace and control characters } else if ( c == '/' ) { // Block delete not supported. Ignore character. } else if ( c == '(' ) { // Enable comments flag and ignore all characters until ')' or EOL. 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; char buffer[ 64 ]; // Hope that 64 is enough for 1 parameter struct point newPos; newPos.x = 0.0; newPos.y = 0.0; // Needs to interpret // G1 for moving // G4 P300 (wait 150ms) // G1 X60 Y30 // G1 X30 Y50 // M300 S30 (pen down) // M300 S50 (pen up) // Discard anything with a ( // Discard any other command! while( currentIndex < charNB ) { switch ( line[ currentIndex++ ] ) { // Select command, if any case 'U': penUp(); break; case 'D': penDown(); break; case 'G': buffer[0] = line[ currentIndex++ ]; // /!\ Dirty - Only works with 2 digit commands // buffer[1] = line[ currentIndex++ ]; // buffer[2] = '\0'; buffer[1] = '\0'; switch ( atoi( buffer ) ){ // Select G command case 0: // G00 & G01 - Movement or fast movement. Same here case 1: // /!\ Dirty - Suppose that X is before Y char* indexX = strchr( line+currentIndex, 'X' ); // Get X/Y position in the string (if any) char* indexY = strchr( line+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; } break; case 'M': buffer[0] = line[ currentIndex++ ]; // /!\ Dirty - Only works with 3 digit commands buffer[1] = line[ currentIndex++ ]; buffer[2] = line[ currentIndex++ ]; buffer[3] = '\0'; switch ( atoi( buffer ) ){ case 300: { char* indexS = strchr( line+currentIndex, 'S' ); float Spos = atof( indexS + 1); // Serial.println("ok"); if (Spos == 30) { penDown(); } if (Spos == 50) { penUp(); } break; } case 114: // M114 - Repport position Serial.print( "Absolute position : X = " ); Serial.print( actuatorPos.x ); Serial.print( " - Y = " ); Serial.println( actuatorPos.y ); break; default: Serial.print( "Command not recognized : M"); Serial.println( buffer ); } } } } /********************************* * Draw a line from (x0;y0) to (x1;y1). * Bresenham algo from [url]https://www.marginallyclever.com/blog/2013/08/how-to-build-an-2-axis-arduino-cnc-gcode-interpreter/[/url] * int (x1;y1) : Starting coordinates * int (x2;y2) : Ending coordinates **********************************/ void drawLine(float x1, float y1) { if (verbose) { Serial.print("fx1, fy1: "); Serial.print(x1); Serial.print(","); Serial.print(y1); Serial.println(""); } // Bring instructions within limits if (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(""); } // Convert coordinates to steps x1 = (int)(x1*StepsPerMillimeterX); y1 = (int)(y1*StepsPerMillimeterY); float x0 = Xpos; float y0 = Ypos; // Let's find out the change for the coordinates long dx = abs(x1-x0); long dy = abs(y1-y0); int sx = x0<x1 ? StepInc : -StepInc; int sy = y0<y1 ? StepInc : -StepInc; long i; long over = 0; if (dx > dy) { for (i=0; i<dx; ++i) { myStepperX.onestep(sx,STEP); over+=dy; if (over>=dx) { over-=dx; myStepperY.onestep(sy,STEP); } delay(StepDelay); } } else { for (i=0; i<dy; ++i) { myStepperY.onestep(sy,STEP); over+=dx; if (over>=dy) { over-=dy; myStepperX.onestep(sx,STEP); } delay(StepDelay); } } if (verbose) { Serial.print("dx, dy:"); Serial.print(dx); Serial.print(","); Serial.print(dy); Serial.println(""); } if (verbose) { Serial.print("Going to ("); Serial.print(x0); Serial.print(","); Serial.print(y0); Serial.println(")"); } // Delay before any next lines are submitted delay(LineDelay); // Update the positions Xpos = x1; Ypos = y1; } // Raises pen void penUp() { penServo.write(penZUp); delay(penDelay); Zpos=Zmax; digitalWrite(15, LOW); digitalWrite(16, HIGH); if (verbose) { Serial.println("Pen up!"); } } // Lowers pen void penDown() { penServo.write(penZDown); delay(penDelay); Zpos=Zmin; digitalWrite(15, HIGH); digitalWrite(16, LOW); if (verbose) { Serial.println("Pen down."); } } [/QUOTE]
Insert quotes…
Verification
Dawasata paya keeyak thibeda?
Post reply
Top
Bottom