Created
January 27, 2015 23:43
-
-
Save pingud98/894c9c5e40b4f1d066f6 to your computer and use it in GitHub Desktop.
Mr Beam raster scan script for JPG to Gcode conversion
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /** | |
| * Convert a JPG image to gcode for Mr Beam | |
| * To use, put the .jpg you want to use in the /data folder of your sketch and adjust the canvas size(x,y) to suit the image, | |
| * Use the feedrate, laserfloor and lasermax variables to determine how fast and how hard it burns. | |
| This program is free software: you can redistribute it and/or modify | |
| it under the terms of the GNU General Public License as published by | |
| the Free Software Foundation, either version 3 of the License, or | |
| (at your option) any later version. | |
| This program is distributed in the hope that it will be useful, | |
| but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| GNU General Public License for more details. | |
| You should have received a copy of the GNU General Public License | |
| along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| */ | |
| // The next line is needed if running in JavaScript Mode with Processing.js | |
| /* @pjs preload="bender.jpg"; */ | |
| PImage img; // Declare variable "a" of type PImage | |
| float xbed = 435; | |
| float ybed = 300; | |
| float feedrate = 800; | |
| float laserfloor = 90; //highest typical value | |
| float lasermax = 255; //laser scale factor | |
| float scale = 20; | |
| int plotthresh = 30; | |
| color c; | |
| int oldgrey = 0; | |
| PrintWriter output; | |
| void setup() { | |
| size(299, 616); | |
| // The image file must be in the data folder of the current sketch | |
| // to load successfully | |
| img = loadImage("input.jpg"); // Load the image into the program | |
| noLoop(); | |
| output = createWriter("output.gco"); //this is the name of the output file | |
| } | |
| void draw() { | |
| // Displays the image at its actual size at point (0,0) | |
| image(img, 0, 0); | |
| //set up the output file | |
| output.println("$H"); | |
| output.println("G92X0Y0Z0"); | |
| output.println("G90"); | |
| output.println("M08"); | |
| output.println("G21"); | |
| output.print("F"); | |
| output.println(feedrate); | |
| for (int x = 0; x < width; x = x+2) { //the X axis loop | |
| for (int y = 0; y < height; y++){ //the forward half of the y axis loop | |
| //y axis forward calculations | |
| float xpos = x; | |
| xpos = xpos/scale; | |
| float ypos = y; | |
| ypos = ypos/scale; | |
| color c = get(x,y); | |
| float red = red(c); | |
| float green = green(c); | |
| float blue = blue(c); | |
| int grey = (int)(red+green+blue)/3; | |
| color Color =color(grey,grey,grey); | |
| set(x,y,Color); | |
| grey = int(laserfloor-((float(grey)/256)*lasermax)); //this is where the laser scaling is done | |
| //when considering the scale values remember 0 is black on the screen and 255 is white, so we want the reverse. | |
| //if the value is worth plotting, plot it, threshold is set above. Might give odd behaviour at edge cases. | |
| if ((grey != oldgrey)&(grey>plotthresh)) { | |
| output.print("G1 "); | |
| output.print('X'); | |
| output.print(nf(xpos,3,4)); | |
| output.print(" "); | |
| output.print('Y'); | |
| output.print(nf(ypos,3,4)); | |
| output.print(" "); | |
| output.print("M03 S"); | |
| output.println(grey); | |
| } | |
| oldgrey=grey; //pass the last pixel value back, so that the laser just runs on through pixels of the same colour | |
| } | |
| for (int y = height-1; y > 0; y--){ //loop for negative Y axis, to optimise the raster scan pattern. | |
| //calculations for y axis negative cycle | |
| float xpos = x+1; | |
| xpos = xpos/scale; | |
| float ypos = y; | |
| ypos = ypos/scale; | |
| color c = get(x+1,y); | |
| float red = red(c); | |
| float green = green(c); | |
| float blue = blue(c); | |
| int grey = (int)(red+green+blue)/3; | |
| color Color =color(grey,grey,grey); | |
| set(x+1,y,Color); | |
| grey = int(laserfloor-((float(grey)/256)*lasermax)); | |
| if ((grey != oldgrey)&(grey>plotthresh)) { //switch to decide if pixel is worth plotting | |
| output.print("G1 "); | |
| output.print('X'); | |
| output.print(nf(xpos,3,4)); | |
| output.print(" "); | |
| output.print('Y'); | |
| output.print(nf(ypos,3,4)); | |
| output.print(" "); | |
| output.print("M03 S"); | |
| output.println(grey); | |
| } | |
| oldgrey = grey; //pass back the last pixel intensity value | |
| } | |
| } | |
| //close out the .gcode file by turning off the laser and the fan. | |
| output.println("M05"); | |
| output.println("M09"); | |
| output.flush(); // Writes the remaining data to the file | |
| output.close(); | |
| //exit(); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment