├── README.md ├── mini_cnc_plotter_firmware.ino └── owl.gcode /README.md: -------------------------------------------------------------------------------- 1 | # mini_cnc_plotter_firmware 2 | 3 | Firmware for Mini CNC Plotter using Arduino. 4 | See it in action here: https://www.youtube.com/watch?v=s_W0cPu5Gqs 5 | 6 | Look here for more videos and detailed description (German only, sorry): 7 | http://www.makerblog.at/2015/02/projekt-mini-cnc-plotter-aus-alten-cddvd-laufwerken/ 8 | 9 | Mini CNC Plotter firmware, based in TinyCNC https://github.com/MakerBlock/TinyCNC-Sketches 10 | 11 | Send GCODE to this Sketch using gctrl.pde https://github.com/damellis/gctrl 12 | 13 | Convert SVG to GCODE with MakerBot Unicorn plugin for Inkscape available here https://github.com/martymcguire/inkscape-unicorn 14 | 15 | Beware: Can parse only very basic GCODE. Many dirty hacks in there. 16 | -------------------------------------------------------------------------------- /mini_cnc_plotter_firmware.ino: -------------------------------------------------------------------------------- 1 | /* 2 | Mini CNC Plotter firmware, based in TinyCNC https://github.com/MakerBlock/TinyCNC-Sketches 3 | Send GCODE to this Sketch using gctrl.pde https://github.com/damellis/gctrl 4 | Convert SVG to GCODE with MakerBot Unicorn plugin for Inkscape available here https://github.com/martymcguire/inkscape-unicorn 5 | 6 | More information about the Mini CNC Plotter here (german, sorry): http://www.makerblog.at/2015/02/projekt-mini-cnc-plotter-aus-alten-cddvd-laufwerken/ 7 | */ 8 | 9 | #include 10 | #include 11 | 12 | #define LINE_BUFFER_LENGTH 512 13 | 14 | // Servo position for Up and Down 15 | const int penZUp = 40; 16 | const int penZDown = 85; 17 | 18 | // Servo on PWM pin 6 19 | const int penServoPin = 6; 20 | 21 | // Should be right for DVD steppers, but is not too important here 22 | const int stepsPerRevolution = 20; 23 | 24 | // create servo object to control a servo 25 | Servo penServo; 26 | 27 | // Initialize steppers for X- and Y-axis using this Arduino pins for the L293D H-bridge 28 | Stepper myStepperY(stepsPerRevolution, 2,3,4,5); 29 | Stepper myStepperX(stepsPerRevolution, 8,9,10,11); 30 | 31 | /* Structures, global variables */ 32 | struct point { 33 | float x; 34 | float y; 35 | float z; 36 | }; 37 | 38 | // Current position of plothead 39 | struct point actuatorPos; 40 | 41 | // Drawing settings, should be OK 42 | float StepInc = 1; 43 | int StepDelay = 0; 44 | int LineDelay = 50; 45 | int penDelay = 50; 46 | 47 | // Motor steps to go 1 millimeter. 48 | // Use test sketch to go 100 steps. Measure the length of line. 49 | // Calculate steps per mm. Enter here. 50 | float StepsPerMillimeterX = 6.0; 51 | float StepsPerMillimeterY = 6.0; 52 | 53 | // Drawing robot limits, in mm 54 | // OK to start with. Could go up to 50 mm if calibrated well. 55 | float Xmin = 0; 56 | float Xmax = 40; 57 | float Ymin = 0; 58 | float Ymax = 40; 59 | float Zmin = 0; 60 | float Zmax = 1; 61 | 62 | float Xpos = Xmin; 63 | float Ypos = Ymin; 64 | float Zpos = Zmax; 65 | 66 | // Set to true to get debug output. 67 | boolean verbose = false; 68 | 69 | // Needs to interpret 70 | // G1 for moving 71 | // G4 P300 (wait 150ms) 72 | // M300 S30 (pen down) 73 | // M300 S50 (pen up) 74 | // Discard anything with a ( 75 | // Discard any other command! 76 | 77 | /********************** 78 | * void setup() - Initialisations 79 | ***********************/ 80 | void setup() { 81 | // Setup 82 | Serial.begin( 9600 ); 83 | 84 | penServo.attach(penServoPin); 85 | penServo.write(penZUp); 86 | delay(200); 87 | 88 | // Decrease if necessary 89 | myStepperX.setSpeed(250); 90 | myStepperY.setSpeed(250); 91 | 92 | // Set & move to initial default position 93 | // TBD 94 | 95 | // Notifications!!! 96 | Serial.println("Mini CNC Plotter alive and kicking!"); 97 | Serial.print("X range is from "); 98 | Serial.print(Xmin); 99 | Serial.print(" to "); 100 | Serial.print(Xmax); 101 | Serial.println(" mm."); 102 | Serial.print("Y range is from "); 103 | Serial.print(Ymin); 104 | Serial.print(" to "); 105 | Serial.print(Ymax); 106 | Serial.println(" mm."); 107 | } 108 | 109 | /********************** 110 | * void loop() - Main loop 111 | ***********************/ 112 | void loop() 113 | { 114 | delay(200); 115 | char line[ LINE_BUFFER_LENGTH ]; 116 | char c; 117 | int lineIndex; 118 | bool lineIsComment, lineSemiColon; 119 | 120 | lineIndex = 0; 121 | lineSemiColon = false; 122 | lineIsComment = false; 123 | 124 | while (1) { 125 | 126 | // Serial reception - Mostly from Grbl, added semicolon support 127 | while ( Serial.available()>0 ) { 128 | c = Serial.read(); 129 | if (( c == '\n') || (c == '\r') ) { // End of line reached 130 | if ( lineIndex > 0 ) { // Line is complete. Then execute! 131 | line[ lineIndex ] = '\0'; // Terminate string 132 | if (verbose) { 133 | Serial.print( "Received : "); 134 | Serial.println( line ); 135 | } 136 | processIncomingLine( line, lineIndex ); 137 | lineIndex = 0; 138 | } 139 | else { 140 | // Empty or comment line. Skip block. 141 | } 142 | lineIsComment = false; 143 | lineSemiColon = false; 144 | Serial.println("ok"); 145 | } 146 | else { 147 | if ( (lineIsComment) || (lineSemiColon) ) { // Throw away all comment characters 148 | if ( c == ')' ) lineIsComment = false; // End of comment. Resume line. 149 | } 150 | else { 151 | if ( c <= ' ' ) { // Throw away whitepace and control characters 152 | } 153 | else if ( c == '/' ) { // Block delete not supported. Ignore character. 154 | } 155 | else if ( c == '(' ) { // Enable comments flag and ignore all characters until ')' or EOL. 156 | lineIsComment = true; 157 | } 158 | else if ( c == ';' ) { 159 | lineSemiColon = true; 160 | } 161 | else if ( lineIndex >= LINE_BUFFER_LENGTH-1 ) { 162 | Serial.println( "ERROR - lineBuffer overflow" ); 163 | lineIsComment = false; 164 | lineSemiColon = false; 165 | } 166 | else if ( c >= 'a' && c <= 'z' ) { // Upcase lowercase 167 | line[ lineIndex++ ] = c-'a'+'A'; 168 | } 169 | else { 170 | line[ lineIndex++ ] = c; 171 | } 172 | } 173 | } 174 | } 175 | } 176 | } 177 | 178 | void processIncomingLine( char* line, int charNB ) { 179 | int currentIndex = 0; 180 | char buffer[ 64 ]; // Hope that 64 is enough for 1 parameter 181 | struct point newPos; 182 | 183 | newPos.x = 0.0; 184 | newPos.y = 0.0; 185 | 186 | // Needs to interpret 187 | // G1 for moving 188 | // G4 P300 (wait 150ms) 189 | // G1 X60 Y30 190 | // G1 X30 Y50 191 | // M300 S30 (pen down) 192 | // M300 S50 (pen up) 193 | // Discard anything with a ( 194 | // Discard any other command! 195 | 196 | while( currentIndex < charNB ) { 197 | switch ( line[ currentIndex++ ] ) { // Select command, if any 198 | case 'U': 199 | penUp(); 200 | break; 201 | case 'D': 202 | penDown(); 203 | break; 204 | case 'G': 205 | buffer[0] = line[ currentIndex++ ]; // /!\ Dirty - Only works with 2 digit commands 206 | // buffer[1] = line[ currentIndex++ ]; 207 | // buffer[2] = '\0'; 208 | buffer[1] = '\0'; 209 | 210 | switch ( atoi( buffer ) ){ // Select G command 211 | case 0: // G00 & G01 - Movement or fast movement. Same here 212 | case 1: 213 | // /!\ Dirty - Suppose that X is before Y 214 | char* indexX = strchr( line+currentIndex, 'X' ); // Get X/Y position in the string (if any) 215 | char* indexY = strchr( line+currentIndex, 'Y' ); 216 | if ( indexY <= 0 ) { 217 | newPos.x = atof( indexX + 1); 218 | newPos.y = actuatorPos.y; 219 | } 220 | else if ( indexX <= 0 ) { 221 | newPos.y = atof( indexY + 1); 222 | newPos.x = actuatorPos.x; 223 | } 224 | else { 225 | newPos.y = atof( indexY + 1); 226 | indexY = '\0'; 227 | newPos.x = atof( indexX + 1); 228 | } 229 | drawLine(newPos.x, newPos.y ); 230 | // Serial.println("ok"); 231 | actuatorPos.x = newPos.x; 232 | actuatorPos.y = newPos.y; 233 | break; 234 | } 235 | break; 236 | case 'M': 237 | buffer[0] = line[ currentIndex++ ]; // /!\ Dirty - Only works with 3 digit commands 238 | buffer[1] = line[ currentIndex++ ]; 239 | buffer[2] = line[ currentIndex++ ]; 240 | buffer[3] = '\0'; 241 | switch ( atoi( buffer ) ){ 242 | case 300: 243 | { 244 | char* indexS = strchr( line+currentIndex, 'S' ); 245 | float Spos = atof( indexS + 1); 246 | // Serial.println("ok"); 247 | if (Spos == 30) { 248 | penDown(); 249 | } 250 | if (Spos == 50) { 251 | penUp(); 252 | } 253 | break; 254 | } 255 | case 114: // M114 - Repport position 256 | Serial.print( "Absolute position : X = " ); 257 | Serial.print( actuatorPos.x ); 258 | Serial.print( " - Y = " ); 259 | Serial.println( actuatorPos.y ); 260 | break; 261 | default: 262 | Serial.print( "Command not recognized : M"); 263 | Serial.println( buffer ); 264 | } 265 | } 266 | } 267 | 268 | 269 | 270 | } 271 | 272 | 273 | /********************************* 274 | * Draw a line from (x0;y0) to (x1;y1). 275 | * Bresenham algo from https://www.marginallyclever.com/blog/2013/08/how-to-build-an-2-axis-arduino-cnc-gcode-interpreter/ 276 | * int (x1;y1) : Starting coordinates 277 | * int (x2;y2) : Ending coordinates 278 | **********************************/ 279 | void drawLine(float x1, float y1) { 280 | 281 | if (verbose) 282 | { 283 | Serial.print("fx1, fy1: "); 284 | Serial.print(x1); 285 | Serial.print(","); 286 | Serial.print(y1); 287 | Serial.println(""); 288 | } 289 | 290 | // Bring instructions within limits 291 | if (x1 >= Xmax) { 292 | x1 = Xmax; 293 | } 294 | if (x1 <= Xmin) { 295 | x1 = Xmin; 296 | } 297 | if (y1 >= Ymax) { 298 | y1 = Ymax; 299 | } 300 | if (y1 <= Ymin) { 301 | y1 = Ymin; 302 | } 303 | 304 | if (verbose) 305 | { 306 | Serial.print("Xpos, Ypos: "); 307 | Serial.print(Xpos); 308 | Serial.print(","); 309 | Serial.print(Ypos); 310 | Serial.println(""); 311 | } 312 | 313 | if (verbose) 314 | { 315 | Serial.print("x1, y1: "); 316 | Serial.print(x1); 317 | Serial.print(","); 318 | Serial.print(y1); 319 | Serial.println(""); 320 | } 321 | 322 | // Convert coordinates to steps 323 | x1 = (int)(x1*StepsPerMillimeterX); 324 | y1 = (int)(y1*StepsPerMillimeterY); 325 | float x0 = Xpos; 326 | float y0 = Ypos; 327 | 328 | // Let's find out the change for the coordinates 329 | long dx = abs(x1-x0); 330 | long dy = abs(y1-y0); 331 | int sx = x0 dy) { 338 | for (i=0; i=dx) { 342 | over-=dx; 343 | myStepperY.step(sy); 344 | } 345 | delay(StepDelay); 346 | } 347 | } 348 | else { 349 | for (i=0; i=dy) { 353 | over-=dy; 354 | myStepperX.step(sx); 355 | } 356 | delay(StepDelay); 357 | } 358 | } 359 | 360 | if (verbose) 361 | { 362 | Serial.print("dx, dy:"); 363 | Serial.print(dx); 364 | Serial.print(","); 365 | Serial.print(dy); 366 | Serial.println(""); 367 | } 368 | 369 | if (verbose) 370 | { 371 | Serial.print("Going to ("); 372 | Serial.print(x0); 373 | Serial.print(","); 374 | Serial.print(y0); 375 | Serial.println(")"); 376 | } 377 | 378 | // Delay before any next lines are submitted 379 | delay(LineDelay); 380 | // Update the positions 381 | Xpos = x1; 382 | Ypos = y1; 383 | } 384 | 385 | // Raises pen 386 | void penUp() { 387 | penServo.write(penZUp); 388 | delay(LineDelay); 389 | Zpos=Zmax; 390 | if (verbose) { 391 | Serial.println("Pen up!"); 392 | } 393 | } 394 | // Lowers pen 395 | void penDown() { 396 | penServo.write(penZDown); 397 | delay(LineDelay); 398 | Zpos=Zmin; 399 | if (verbose) { 400 | Serial.println("Pen down."); 401 | } 402 | } 403 | -------------------------------------------------------------------------------- /owl.gcode: -------------------------------------------------------------------------------- 1 | (Scribbled version of /var/folders/68/2wcbvftn27n3g8gpftv3cnfh0000gn/T/ink_ext_XXXXXX.svgPUJZSX @ 3500.00) 2 | ( unicorn.py --tab="plotter_setup" --pen-up-angle=50 --pen-down-angle=30 --start-delay=150 --stop-delay=150 --xy-feedrate=3500 --z-feedrate=150 --z-height=0 --finished-height=0 --register-pen=true --x-home=0 --y-home=0 --num-copies=1 --continuous=false --pause-on-layer-change=false /var/folders/68/2wcbvftn27n3g8gpftv3cnfh0000gn/T/ink_ext_XXXXXX.svgPUJZSX ) 3 | G21 (metric ftw) 4 | G90 (absolute mode) 5 | G92 X0.00 Y0.00 Z0.00 (you are here) 6 | 7 | M300 S30 (pen down) 8 | G4 P150 (wait 150ms) 9 | M300 S50 (pen up) 10 | G4 P150 (wait 150ms) 11 | M18 (disengage drives) 12 | M01 (Was registration test successful?) 13 | M17 (engage drives if YES, and continue) 14 | 15 | (Polyline consisting of 1 segments.) 16 | G1 X19.58 Y4.65 F3500.00 17 | M300 S30.00 (pen down) 18 | G4 P150 (wait 150ms) 19 | G1 X19.39 Y3.52 F3500.00 20 | G1 X18.88 Y2.70 F3500.00 21 | G1 X18.18 Y2.40 F3500.00 22 | G1 X17.48 Y2.70 F3500.00 23 | G1 X16.97 Y3.52 F3500.00 24 | G1 X16.79 Y4.65 F3500.00 25 | G1 X16.97 Y5.77 F3500.00 26 | G1 X17.48 Y6.59 F3500.00 27 | G1 X18.18 Y6.89 F3500.00 28 | G1 X18.88 Y6.59 F3500.00 29 | G1 X19.39 Y5.77 F3500.00 30 | G1 X19.58 Y4.65 F3500.00 31 | M300 S50.00 (pen up) 32 | G4 P150 (wait 150ms) 33 | 34 | (Polyline consisting of 1 segments.) 35 | G1 X16.20 Y4.65 F3500.00 36 | M300 S30.00 (pen down) 37 | G4 P150 (wait 150ms) 38 | G1 X16.01 Y3.52 F3500.00 39 | G1 X15.50 Y2.70 F3500.00 40 | G1 X14.80 Y2.40 F3500.00 41 | G1 X14.11 Y2.70 F3500.00 42 | G1 X13.60 Y3.52 F3500.00 43 | G1 X13.41 Y4.65 F3500.00 44 | G1 X13.60 Y5.77 F3500.00 45 | G1 X14.11 Y6.59 F3500.00 46 | G1 X14.80 Y6.89 F3500.00 47 | G1 X15.50 Y6.59 F3500.00 48 | G1 X16.01 Y5.77 F3500.00 49 | G1 X16.20 Y4.65 F3500.00 50 | M300 S50.00 (pen up) 51 | G4 P150 (wait 150ms) 52 | 53 | (Polyline consisting of 1 segments.) 54 | G1 X17.86 Y4.65 F3500.00 55 | M300 S30.00 (pen down) 56 | G4 P150 (wait 150ms) 57 | G1 X17.68 Y3.52 F3500.00 58 | G1 X17.17 Y2.70 F3500.00 59 | G1 X16.47 Y2.40 F3500.00 60 | G1 X15.77 Y2.70 F3500.00 61 | G1 X15.26 Y3.52 F3500.00 62 | G1 X15.07 Y4.65 F3500.00 63 | G1 X15.26 Y5.77 F3500.00 64 | G1 X15.77 Y6.59 F3500.00 65 | G1 X16.47 Y6.89 F3500.00 66 | G1 X17.17 Y6.59 F3500.00 67 | G1 X17.68 Y5.77 F3500.00 68 | G1 X17.86 Y4.65 F3500.00 69 | M300 S50.00 (pen up) 70 | G4 P150 (wait 150ms) 71 | 72 | (Polyline consisting of 1 segments.) 73 | G1 X27.12 Y4.65 F3500.00 74 | M300 S30.00 (pen down) 75 | G4 P150 (wait 150ms) 76 | G1 X26.93 Y3.52 F3500.00 77 | G1 X26.42 Y2.70 F3500.00 78 | G1 X25.72 Y2.40 F3500.00 79 | G1 X25.02 Y2.70 F3500.00 80 | G1 X24.51 Y3.52 F3500.00 81 | G1 X24.33 Y4.65 F3500.00 82 | G1 X24.51 Y5.77 F3500.00 83 | G1 X25.02 Y6.59 F3500.00 84 | G1 X25.72 Y6.89 F3500.00 85 | G1 X26.42 Y6.59 F3500.00 86 | G1 X26.93 Y5.77 F3500.00 87 | G1 X27.12 Y4.65 F3500.00 88 | M300 S50.00 (pen up) 89 | G4 P150 (wait 150ms) 90 | 91 | (Polyline consisting of 1 segments.) 92 | G1 X23.74 Y4.65 F3500.00 93 | M300 S30.00 (pen down) 94 | G4 P150 (wait 150ms) 95 | G1 X23.55 Y3.52 F3500.00 96 | G1 X23.04 Y2.70 F3500.00 97 | G1 X22.34 Y2.40 F3500.00 98 | G1 X21.65 Y2.70 F3500.00 99 | G1 X21.13 Y3.52 F3500.00 100 | G1 X20.95 Y4.65 F3500.00 101 | G1 X21.13 Y5.77 F3500.00 102 | G1 X21.65 Y6.59 F3500.00 103 | G1 X22.34 Y6.89 F3500.00 104 | G1 X23.04 Y6.59 F3500.00 105 | G1 X23.55 Y5.77 F3500.00 106 | G1 X23.74 Y4.65 F3500.00 107 | M300 S50.00 (pen up) 108 | G4 P150 (wait 150ms) 109 | 110 | (Polyline consisting of 1 segments.) 111 | G1 X25.40 Y4.65 F3500.00 112 | M300 S30.00 (pen down) 113 | G4 P150 (wait 150ms) 114 | G1 X25.22 Y3.52 F3500.00 115 | G1 X24.71 Y2.70 F3500.00 116 | G1 X24.01 Y2.40 F3500.00 117 | G1 X23.31 Y2.70 F3500.00 118 | G1 X22.80 Y3.52 F3500.00 119 | G1 X22.61 Y4.65 F3500.00 120 | G1 X22.80 Y5.77 F3500.00 121 | G1 X23.31 Y6.59 F3500.00 122 | G1 X24.01 Y6.89 F3500.00 123 | G1 X24.71 Y6.59 F3500.00 124 | G1 X25.22 Y5.77 F3500.00 125 | G1 X25.40 Y4.65 F3500.00 126 | M300 S50.00 (pen up) 127 | G4 P150 (wait 150ms) 128 | 129 | (Polyline consisting of 2 segments.) 130 | G1 X14.80 Y6.89 F3500.00 131 | M300 S30.00 (pen down) 132 | G4 P150 (wait 150ms) 133 | G1 X14.04 Y6.52 F3500.00 134 | G1 X13.53 Y5.56 F3500.00 135 | G1 X16.45 Y4.97 F3500.00 136 | G1 X19.57 Y4.73 F3500.00 137 | G1 X19.15 Y6.26 F3500.00 138 | G1 X18.71 Y6.72 F3500.00 139 | G1 X18.18 Y6.89 F3500.00 140 | G1 X17.33 Y6.42 F3500.00 141 | G1 X16.47 Y6.89 F3500.00 142 | G1 X15.64 Y6.45 F3500.00 143 | G1 X14.80 Y6.89 F3500.00 144 | M300 S50.00 (pen up) 145 | G4 P150 (wait 150ms) 146 | 147 | (Polyline consisting of 2 segments.) 148 | G1 X22.34 Y6.89 F3500.00 149 | M300 S30.00 (pen down) 150 | G4 P150 (wait 150ms) 151 | G1 X21.81 Y6.72 F3500.00 152 | G1 X21.38 Y6.26 F3500.00 153 | G1 X20.95 Y4.74 F3500.00 154 | G1 X24.07 Y5.03 F3500.00 155 | G1 X26.97 Y5.65 F3500.00 156 | G1 X26.46 Y6.55 F3500.00 157 | G1 X25.72 Y6.89 F3500.00 158 | G1 X24.86 Y6.42 F3500.00 159 | G1 X24.01 Y6.89 F3500.00 160 | G1 X23.18 Y6.45 F3500.00 161 | G1 X22.34 Y6.89 F3500.00 162 | M300 S50.00 (pen up) 163 | G4 P150 (wait 150ms) 164 | 165 | (Polyline consisting of 1 segments.) 166 | G1 X36.29 Y21.83 F3500.00 167 | M300 S30.00 (pen down) 168 | G4 P150 (wait 150ms) 169 | G1 X35.72 Y17.61 F3500.00 170 | G1 X34.11 Y13.75 F3500.00 171 | G1 X31.56 Y10.43 F3500.00 172 | G1 X28.18 Y7.84 F3500.00 173 | G1 X24.24 Y6.21 F3500.00 174 | G1 X20.08 Y5.67 F3500.00 175 | G1 X15.91 Y6.21 F3500.00 176 | G1 X11.97 Y7.84 F3500.00 177 | G1 X8.59 Y10.43 F3500.00 178 | G1 X6.04 Y13.75 F3500.00 179 | G1 X4.43 Y17.61 F3500.00 180 | G1 X3.87 Y21.83 F3500.00 181 | G1 X4.43 Y26.04 F3500.00 182 | G1 X6.04 Y29.90 F3500.00 183 | G1 X8.59 Y33.22 F3500.00 184 | G1 X11.97 Y35.82 F3500.00 185 | G1 X15.91 Y37.44 F3500.00 186 | G1 X20.08 Y37.98 F3500.00 187 | G1 X24.24 Y37.44 F3500.00 188 | G1 X28.18 Y35.82 F3500.00 189 | G1 X31.56 Y33.22 F3500.00 190 | G1 X34.11 Y29.90 F3500.00 191 | G1 X35.72 Y26.04 F3500.00 192 | G1 X36.29 Y21.83 F3500.00 193 | M300 S50.00 (pen up) 194 | G4 P150 (wait 150ms) 195 | 196 | (Polyline consisting of 1 segments.) 197 | G1 X28.09 Y13.75 F3500.00 198 | M300 S30.00 (pen down) 199 | G4 P150 (wait 150ms) 200 | G1 X26.95 Y13.61 F3500.00 201 | G1 X26.96 Y12.76 F3500.00 202 | G1 X27.37 Y11.64 F3500.00 203 | G1 X27.47 Y10.70 F3500.00 204 | G1 X26.64 Y10.74 F3500.00 205 | G1 X26.31 Y10.01 F3500.00 206 | G1 X26.13 Y9.01 F3500.00 207 | G1 X25.79 Y8.21 F3500.00 208 | G1 X24.96 Y8.04 F3500.00 209 | G1 X24.38 Y7.55 F3500.00 210 | G1 X23.29 Y6.53 F3500.00 211 | G1 X22.48 Y6.70 F3500.00 212 | G1 X21.74 Y6.46 F3500.00 213 | G1 X20.23 Y5.92 F3500.00 214 | G1 X18.79 Y6.44 F3500.00 215 | G1 X18.06 Y6.68 F3500.00 216 | G1 X17.17 Y6.53 F3500.00 217 | G1 X16.08 Y7.53 F3500.00 218 | G1 X15.50 Y8.02 F3500.00 219 | G1 X14.67 Y8.21 F3500.00 220 | G1 X14.26 Y9.03 F3500.00 221 | G1 X13.97 Y10.07 F3500.00 222 | G1 X13.61 Y10.80 F3500.00 223 | G1 X12.99 Y10.70 F3500.00 224 | G1 X13.01 Y11.67 F3500.00 225 | G1 X13.30 Y12.83 F3500.00 226 | G1 X13.28 Y13.69 F3500.00 227 | G1 X12.97 Y13.85 F3500.00 228 | G1 X12.37 Y13.75 F3500.00 229 | G1 X12.69 Y14.69 F3500.00 230 | G1 X13.27 Y15.69 F3500.00 231 | G1 X13.55 Y16.49 F3500.00 232 | G1 X12.99 Y16.80 F3500.00 233 | G1 X14.25 Y18.07 F3500.00 234 | G1 X14.77 Y18.67 F3500.00 235 | G1 X14.67 Y19.29 F3500.00 236 | G1 X17.17 Y20.96 F3500.00 237 | G1 X18.65 Y21.42 F3500.00 238 | G1 X20.23 Y21.58 F3500.00 239 | G1 X21.81 Y21.42 F3500.00 240 | G1 X23.29 Y20.96 F3500.00 241 | G1 X25.79 Y19.29 F3500.00 242 | G1 X25.55 Y18.81 F3500.00 243 | G1 X26.08 Y18.20 F3500.00 244 | G1 X27.47 Y16.80 F3500.00 245 | G1 X26.83 Y16.51 F3500.00 246 | G1 X27.12 Y15.71 F3500.00 247 | G1 X27.74 Y14.69 F3500.00 248 | G1 X28.09 Y13.75 F3500.00 249 | M300 S50.00 (pen up) 250 | G4 P150 (wait 150ms) 251 | 252 | (Polyline consisting of 1 segments.) 253 | G1 X34.40 Y29.39 F3500.00 254 | M300 S30.00 (pen down) 255 | G4 P150 (wait 150ms) 256 | G1 X34.69 Y26.31 F3500.00 257 | G1 X34.66 Y25.23 F3500.00 258 | G1 X33.51 Y25.17 F3500.00 259 | G1 X32.43 Y24.73 F3500.00 260 | G1 X31.73 Y24.00 F3500.00 261 | G1 X31.11 Y21.81 F3500.00 262 | G1 X30.98 Y18.91 F3500.00 263 | G1 X30.63 Y15.62 F3500.00 264 | G1 X28.16 Y13.35 F3500.00 265 | G1 X25.26 Y11.63 F3500.00 266 | G1 X22.01 Y10.54 F3500.00 267 | G1 X18.49 Y10.16 F3500.00 268 | G1 X14.19 Y10.73 F3500.00 269 | G1 X10.33 Y12.35 F3500.00 270 | G1 X9.69 Y14.39 F3500.00 271 | G1 X9.41 Y16.41 F3500.00 272 | G1 X9.34 Y20.15 F3500.00 273 | G1 X9.26 Y21.74 F3500.00 274 | G1 X8.95 Y23.06 F3500.00 275 | G1 X8.25 Y24.05 F3500.00 276 | G1 X7.03 Y24.65 F3500.00 277 | G1 X5.47 Y24.73 F3500.00 278 | G1 X4.20 Y24.37 F3500.00 279 | G1 X3.22 Y23.62 F3500.00 280 | G1 X2.57 Y22.49 F3500.00 281 | G1 X2.27 Y21.04 F3500.00 282 | G1 X2.35 Y19.29 F3500.00 283 | G1 X2.81 Y17.28 F3500.00 284 | G1 X3.69 Y15.04 F3500.00 285 | G1 X5.07 Y12.76 F3500.00 286 | G1 X6.68 Y11.08 F3500.00 287 | G1 X8.36 Y9.93 F3500.00 288 | G1 X9.93 Y9.23 F3500.00 289 | G1 X12.15 Y7.73 F3500.00 290 | G1 X14.61 Y6.62 F3500.00 291 | G1 X17.26 Y5.91 F3500.00 292 | G1 X20.08 Y5.67 F3500.00 293 | G1 X23.36 Y6.00 F3500.00 294 | G1 X26.42 Y6.96 F3500.00 295 | G1 X29.18 Y8.46 F3500.00 296 | G1 X31.59 Y10.45 F3500.00 297 | G1 X34.20 Y12.30 F3500.00 298 | G1 X35.43 Y13.69 F3500.00 299 | G1 X36.51 Y15.44 F3500.00 300 | G1 X37.83 Y18.83 F3500.00 301 | G1 X38.12 Y21.64 F3500.00 302 | G1 X37.48 Y23.72 F3500.00 303 | G1 X36.83 Y24.45 F3500.00 304 | G1 X35.98 Y24.95 F3500.00 305 | G1 X35.35 Y27.25 F3500.00 306 | G1 X34.40 Y29.39 F3500.00 307 | M300 S50.00 (pen up) 308 | G4 P150 (wait 150ms) 309 | 310 | (Polyline consisting of 1 segments.) 311 | G1 X7.02 Y25.44 F3500.00 312 | M300 S30.00 (pen down) 313 | G4 P150 (wait 150ms) 314 | G1 X8.32 Y24.55 F3500.00 315 | G1 X8.87 Y23.19 F3500.00 316 | G1 X8.92 Y21.44 F3500.00 317 | G1 X8.73 Y19.39 F3500.00 318 | G1 X8.56 Y17.12 F3500.00 319 | G1 X8.66 Y14.69 F3500.00 320 | G1 X9.30 Y12.20 F3500.00 321 | G1 X10.72 Y9.71 F3500.00 322 | G1 X10.74 Y9.37 F3500.00 323 | G1 X10.20 Y9.27 F3500.00 324 | G1 X7.95 Y9.99 F3500.00 325 | G1 X6.53 Y10.89 F3500.00 326 | G1 X5.09 Y12.20 F3500.00 327 | G1 X3.77 Y13.95 F3500.00 328 | G1 X2.72 Y16.21 F3500.00 329 | G1 X2.07 Y18.53 F3500.00 330 | G1 X1.82 Y20.58 F3500.00 331 | G1 X1.92 Y22.32 F3500.00 332 | G1 X2.37 Y23.74 F3500.00 333 | G1 X3.12 Y24.79 F3500.00 334 | G1 X4.17 Y25.44 F3500.00 335 | G1 X5.48 Y25.67 F3500.00 336 | G1 X7.02 Y25.44 F3500.00 337 | G1 X7.02 Y25.44 F3500.00 338 | M300 S50.00 (pen up) 339 | G4 P150 (wait 150ms) 340 | 341 | (Polyline consisting of 1 segments.) 342 | G1 X33.11 Y25.44 F3500.00 343 | M300 S30.00 (pen down) 344 | G4 P150 (wait 150ms) 345 | G1 X31.80 Y24.55 F3500.00 346 | G1 X31.26 Y23.19 F3500.00 347 | G1 X31.21 Y21.44 F3500.00 348 | G1 X31.40 Y19.39 F3500.00 349 | G1 X31.57 Y17.12 F3500.00 350 | G1 X31.47 Y14.69 F3500.00 351 | G1 X30.83 Y12.20 F3500.00 352 | G1 X29.40 Y9.71 F3500.00 353 | G1 X29.38 Y9.37 F3500.00 354 | G1 X29.93 Y9.27 F3500.00 355 | G1 X32.17 Y9.99 F3500.00 356 | G1 X33.60 Y10.89 F3500.00 357 | G1 X35.04 Y12.20 F3500.00 358 | G1 X36.35 Y13.95 F3500.00 359 | G1 X37.40 Y16.21 F3500.00 360 | G1 X38.05 Y18.53 F3500.00 361 | G1 X38.31 Y20.58 F3500.00 362 | G1 X38.20 Y22.32 F3500.00 363 | G1 X37.76 Y23.74 F3500.00 364 | G1 X37.00 Y24.79 F3500.00 365 | G1 X35.96 Y25.44 F3500.00 366 | G1 X34.65 Y25.67 F3500.00 367 | G1 X33.11 Y25.44 F3500.00 368 | G1 X33.11 Y25.44 F3500.00 369 | M300 S50.00 (pen up) 370 | G4 P150 (wait 150ms) 371 | 372 | (Polyline consisting of 1 segments.) 373 | G1 X31.38 Y26.32 F3500.00 374 | M300 S30.00 (pen down) 375 | G4 P150 (wait 150ms) 376 | G1 X32.35 Y26.38 F3500.00 377 | G1 X33.23 Y26.04 F3500.00 378 | G1 X34.30 Y24.94 F3500.00 379 | G1 X32.79 Y25.24 F3500.00 380 | G1 X32.03 Y25.07 F3500.00 381 | G1 X32.99 Y24.35 F3500.00 382 | G1 X33.69 Y23.56 F3500.00 383 | G1 X34.21 Y22.25 F3500.00 384 | G1 X32.62 Y23.43 F3500.00 385 | G1 X32.04 Y23.73 F3500.00 386 | G1 X31.64 Y23.67 F3500.00 387 | G1 X32.02 Y22.66 F3500.00 388 | G1 X32.03 Y21.34 F3500.00 389 | G1 X30.98 Y22.63 F3500.00 390 | G1 X29.96 Y23.25 F3500.00 391 | M300 S50.00 (pen up) 392 | G4 P150 (wait 150ms) 393 | 394 | (Polyline consisting of 1 segments.) 395 | G1 X15.58 Y34.29 F3500.00 396 | M300 S30.00 (pen down) 397 | G4 P150 (wait 150ms) 398 | G1 X13.42 Y33.79 F3500.00 399 | G1 X11.66 Y32.42 F3500.00 400 | G1 X10.47 Y30.39 F3500.00 401 | G1 X10.04 Y27.91 F3500.00 402 | G1 X10.47 Y25.42 F3500.00 403 | G1 X11.66 Y23.39 F3500.00 404 | G1 X13.42 Y22.02 F3500.00 405 | G1 X15.58 Y21.52 F3500.00 406 | G1 X16.88 Y21.70 F3500.00 407 | G1 X18.07 Y22.21 F3500.00 408 | G1 X19.12 Y23.00 F3500.00 409 | G1 X19.98 Y24.04 F3500.00 410 | G1 X20.84 Y23.00 F3500.00 411 | G1 X21.89 Y22.20 F3500.00 412 | G1 X23.08 Y21.70 F3500.00 413 | G1 X24.39 Y21.52 F3500.00 414 | G1 X26.55 Y22.02 F3500.00 415 | G1 X28.31 Y23.39 F3500.00 416 | G1 X29.50 Y25.42 F3500.00 417 | G1 X29.93 Y27.91 F3500.00 418 | G1 X29.50 Y30.39 F3500.00 419 | G1 X28.31 Y32.42 F3500.00 420 | G1 X26.55 Y33.79 F3500.00 421 | G1 X24.39 Y34.29 F3500.00 422 | G1 X23.09 Y34.12 F3500.00 423 | G1 X21.89 Y33.61 F3500.00 424 | G1 X20.84 Y32.81 F3500.00 425 | G1 X19.98 Y31.77 F3500.00 426 | G1 X19.12 Y32.81 F3500.00 427 | G1 X18.07 Y33.61 F3500.00 428 | G1 X16.88 Y34.12 F3500.00 429 | G1 X15.58 Y34.29 F3500.00 430 | G1 X15.58 Y34.29 F3500.00 431 | M300 S50.00 (pen up) 432 | G4 P150 (wait 150ms) 433 | 434 | (Polyline consisting of 1 segments.) 435 | G1 X20.15 Y23.47 F3500.00 436 | M300 S30.00 (pen down) 437 | G4 P150 (wait 150ms) 438 | G1 X18.86 Y22.89 F3500.00 439 | G1 X18.29 Y21.83 F3500.00 440 | G1 X19.16 Y19.95 F3500.00 441 | G1 X20.27 Y18.54 F3500.00 442 | G1 X21.27 Y19.93 F3500.00 443 | G1 X21.97 Y21.88 F3500.00 444 | G1 X21.27 Y22.98 F3500.00 445 | G1 X20.15 Y23.47 F3500.00 446 | M300 S50.00 (pen up) 447 | G4 P150 (wait 150ms) 448 | 449 | (Polyline consisting of 1 segments.) 450 | G1 X19.94 Y24.51 F3500.00 451 | M300 S30.00 (pen down) 452 | G4 P150 (wait 150ms) 453 | G1 X18.66 Y23.98 F3500.00 454 | G1 X18.08 Y23.03 F3500.00 455 | G1 X18.95 Y21.33 F3500.00 456 | G1 X20.06 Y20.06 F3500.00 457 | G1 X21.06 Y21.32 F3500.00 458 | G1 X21.76 Y23.08 F3500.00 459 | G1 X21.06 Y24.06 F3500.00 460 | G1 X19.94 Y24.51 F3500.00 461 | G1 X19.94 Y24.51 F3500.00 462 | M300 S50.00 (pen up) 463 | G4 P150 (wait 150ms) 464 | 465 | (Polyline consisting of 1 segments.) 466 | G1 X19.63 Y27.47 F3500.00 467 | M300 S30.00 (pen down) 468 | G4 P150 (wait 150ms) 469 | G1 X19.42 Y26.68 F3500.00 470 | G1 X18.83 Y26.09 F3500.00 471 | G1 X18.03 Y25.88 F3500.00 472 | G1 X17.22 Y26.09 F3500.00 473 | G1 X16.64 Y26.68 F3500.00 474 | G1 X16.42 Y27.47 F3500.00 475 | G1 X16.64 Y28.27 F3500.00 476 | G1 X17.22 Y28.86 F3500.00 477 | G1 X18.03 Y29.07 F3500.00 478 | G1 X18.83 Y28.86 F3500.00 479 | G1 X19.42 Y28.27 F3500.00 480 | G1 X19.63 Y27.47 F3500.00 481 | G1 X19.63 Y27.47 F3500.00 482 | M300 S50.00 (pen up) 483 | G4 P150 (wait 150ms) 484 | 485 | (Polyline consisting of 1 segments.) 486 | G1 X8.72 Y26.32 F3500.00 487 | M300 S30.00 (pen down) 488 | G4 P150 (wait 150ms) 489 | G1 X7.75 Y26.38 F3500.00 490 | G1 X6.87 Y26.04 F3500.00 491 | G1 X5.80 Y24.94 F3500.00 492 | G1 X7.30 Y25.24 F3500.00 493 | G1 X8.07 Y25.07 F3500.00 494 | G1 X7.11 Y24.35 F3500.00 495 | G1 X6.41 Y23.56 F3500.00 496 | G1 X5.89 Y22.25 F3500.00 497 | G1 X7.48 Y23.43 F3500.00 498 | G1 X8.06 Y23.73 F3500.00 499 | G1 X8.46 Y23.67 F3500.00 500 | G1 X8.08 Y22.66 F3500.00 501 | G1 X8.07 Y21.34 F3500.00 502 | G1 X9.12 Y22.63 F3500.00 503 | G1 X10.14 Y23.25 F3500.00 504 | M300 S50.00 (pen up) 505 | G4 P150 (wait 150ms) 506 | 507 | (Polyline consisting of 1 segments.) 508 | G1 X21.34 Y33.22 F3500.00 509 | M300 S30.00 (pen down) 510 | G4 P150 (wait 150ms) 511 | G1 X22.43 Y35.10 F3500.00 512 | G1 X23.57 Y36.18 F3500.00 513 | G1 X24.83 Y36.78 F3500.00 514 | G1 X24.36 Y36.02 F3500.00 515 | G1 X24.27 Y35.59 F3500.00 516 | G1 X24.71 Y35.60 F3500.00 517 | G1 X26.55 Y35.66 F3500.00 518 | G1 X28.93 Y35.11 F3500.00 519 | G1 X31.86 Y34.10 F3500.00 520 | G1 X27.84 Y34.61 F3500.00 521 | G1 X24.38 Y34.43 F3500.00 522 | G1 X22.74 Y33.99 F3500.00 523 | G1 X21.34 Y33.22 F3500.00 524 | M300 S50.00 (pen up) 525 | G4 P150 (wait 150ms) 526 | 527 | (Polyline consisting of 1 segments.) 528 | G1 X18.36 Y33.51 F3500.00 529 | M300 S30.00 (pen down) 530 | G4 P150 (wait 150ms) 531 | G1 X17.26 Y35.39 F3500.00 532 | G1 X16.12 Y36.47 F3500.00 533 | G1 X14.86 Y37.08 F3500.00 534 | G1 X15.34 Y36.31 F3500.00 535 | G1 X15.43 Y35.89 F3500.00 536 | G1 X14.98 Y35.89 F3500.00 537 | G1 X13.14 Y35.96 F3500.00 538 | G1 X10.77 Y35.41 F3500.00 539 | G1 X7.83 Y34.39 F3500.00 540 | G1 X11.85 Y34.91 F3500.00 541 | G1 X15.31 Y34.72 F3500.00 542 | G1 X16.95 Y34.28 F3500.00 543 | G1 X18.36 Y33.51 F3500.00 544 | G1 X18.36 Y33.51 F3500.00 545 | M300 S50.00 (pen up) 546 | G4 P150 (wait 150ms) 547 | 548 | (Polyline consisting of 1 segments.) 549 | G1 X23.69 Y27.47 F3500.00 550 | M300 S30.00 (pen down) 551 | G4 P150 (wait 150ms) 552 | G1 X23.48 Y26.68 F3500.00 553 | G1 X22.89 Y26.09 F3500.00 554 | G1 X22.09 Y25.88 F3500.00 555 | G1 X21.29 Y26.09 F3500.00 556 | G1 X20.70 Y26.68 F3500.00 557 | G1 X20.49 Y27.47 F3500.00 558 | G1 X20.70 Y28.27 F3500.00 559 | G1 X21.29 Y28.86 F3500.00 560 | G1 X22.09 Y29.07 F3500.00 561 | G1 X22.89 Y28.86 F3500.00 562 | G1 X23.48 Y28.27 F3500.00 563 | G1 X23.69 Y27.47 F3500.00 564 | G1 X23.69 Y27.47 F3500.00 565 | M300 S50.00 (pen up) 566 | G4 P150 (wait 150ms) 567 | 568 | (Polyline consisting of 1 segments.) 569 | G1 X17.86 Y28.03 F3500.00 570 | M300 S30.00 (pen down) 571 | G4 P150 (wait 150ms) 572 | G1 X17.66 Y27.68 F3500.00 573 | G1 X17.24 Y27.68 F3500.00 574 | G1 X17.03 Y28.03 F3500.00 575 | G1 X17.24 Y28.39 F3500.00 576 | G1 X17.66 Y28.39 F3500.00 577 | G1 X17.86 Y28.03 F3500.00 578 | M300 S50.00 (pen up) 579 | G4 P150 (wait 150ms) 580 | 581 | (Polyline consisting of 1 segments.) 582 | G1 X21.93 Y28.03 F3500.00 583 | M300 S30.00 (pen down) 584 | G4 P150 (wait 150ms) 585 | G1 X21.72 Y27.68 F3500.00 586 | G1 X21.30 Y27.68 F3500.00 587 | G1 X21.09 Y28.03 F3500.00 588 | G1 X21.30 Y28.39 F3500.00 589 | G1 X21.72 Y28.39 F3500.00 590 | G1 X21.93 Y28.03 F3500.00 591 | M300 S50.00 (pen up) 592 | G4 P150 (wait 150ms) 593 | 594 | (Polyline consisting of 1 segments.) 595 | G1 X34.65 Y25.67 F3500.00 596 | M300 S30.00 (pen down) 597 | G4 P150 (wait 150ms) 598 | G1 X34.53 Y25.67 F3500.00 599 | G1 X35.54 Y24.41 F3500.00 600 | G1 X36.15 Y22.56 F3500.00 601 | G1 X36.31 Y20.19 F3500.00 602 | G1 X35.97 Y17.34 F3500.00 603 | G1 X35.44 Y15.44 F3500.00 604 | G1 X34.68 Y13.82 F3500.00 605 | G1 X32.77 Y11.38 F3500.00 606 | G1 X30.81 Y9.93 F3500.00 607 | G1 X29.34 Y9.41 F3500.00 608 | G1 X30.50 Y9.36 F3500.00 609 | G1 X32.76 Y10.32 F3500.00 610 | G1 X34.05 Y11.25 F3500.00 611 | G1 X35.33 Y12.52 F3500.00 612 | G1 X36.48 Y14.16 F3500.00 613 | G1 X37.40 Y16.21 F3500.00 614 | G1 X38.28 Y20.09 F3500.00 615 | G1 X38.02 Y23.07 F3500.00 616 | G1 X37.51 Y24.18 F3500.00 617 | G1 X36.77 Y24.99 F3500.00 618 | G1 X35.81 Y25.50 F3500.00 619 | G1 X34.65 Y25.67 F3500.00 620 | G1 X34.65 Y25.67 F3500.00 621 | M300 S50.00 (pen up) 622 | G4 P150 (wait 150ms) 623 | 624 | (Polyline consisting of 2 segments.) 625 | G1 X1.96 Y22.53 F3500.00 626 | M300 S30.00 (pen down) 627 | G4 P150 (wait 150ms) 628 | G1 X1.88 Y19.72 F3500.00 629 | G1 X2.72 Y16.21 F3500.00 630 | G1 X3.78 Y13.95 F3500.00 631 | G1 X5.09 Y12.19 F3500.00 632 | G1 X6.53 Y10.89 F3500.00 633 | G1 X7.95 Y9.99 F3500.00 634 | G1 X10.20 Y9.27 F3500.00 635 | G1 X10.75 Y9.37 F3500.00 636 | G1 X10.72 Y9.71 F3500.00 637 | G1 X9.71 Y11.28 F3500.00 638 | G1 X8.08 Y11.90 F3500.00 639 | G1 X6.18 Y13.19 F3500.00 640 | G1 X4.33 Y15.22 F3500.00 641 | G1 X2.87 Y18.11 F3500.00 642 | G1 X2.22 Y20.46 F3500.00 643 | G1 X1.96 Y22.53 F3500.00 644 | M300 S50.00 (pen up) 645 | G4 P150 (wait 150ms) 646 | 647 | (Polyline consisting of 2 segments.) 648 | G1 X8.94 Y21.91 F3500.00 649 | M300 S30.00 (pen down) 650 | G4 P150 (wait 150ms) 651 | G1 X8.72 Y19.26 F3500.00 652 | G1 X8.94 Y21.91 F3500.00 653 | M300 S50.00 (pen up) 654 | G4 P150 (wait 150ms) 655 | 656 | 657 | (end of print job) 658 | M300 S50.00 (pen up) 659 | G4 P150 (wait 150ms) 660 | M300 S255 (turn off servo) 661 | G1 X0 Y0 F3500.00 662 | G1 Z0.00 F150.00 (go up to finished level) 663 | G1 X0.00 Y0.00 F3500.00 (go home) 664 | M18 (drives off) 665 | --------------------------------------------------------------------------------