Having built my own midTbot I was interested in generating my own gcode as a fun way to learn how it works. By far the best I've found is the quick gcode tutorials on cnc cookbook. I played a bit, then wrote a Python script that generates the gcode to draw the Seed of LIfe.
Seed of Life is a pretty good exercise to start with. It uses arcs, and gcode has an arc option based on where the pen is currently located, where the ending point is, and the location of the center of the arc. Seed of Life sets centers defined by a triangle that has the radius as the hypotenus, and 1/2 the radius as the short leg. So calculate the long leg and you have all the info needed for the gocde.
Code is pretty simple:
- G0Z[0..5] lifts and drops the pen
- G0X#Y# moves the pen
- G2X#Y#I#J# draws an ark with:
- Current pen position as starting point
- X#Y# as ending point
- I#J# as pivot point of arc (center of circle) relative to the current pen position.
This is the gcode that drew the image:
G90 G0Z5 F400 G0X70Y90 F4000 G0Z0 F400 G2X70Y90I10J0 F4000 G0Z5 F400 G0X80Y90 F4000 G0Z0 F400 G2X80Y90I10J0 F4000 G0Z5 F400 G0X80Y90 F4000 G0Z0 F400 G2X80Y90I5J8 F4000 G0Z5 F400 G0X80Y90 F4000 G0Z0 F400 G2X80Y90I-5J8 F4000 G0Z5 F400 G0X80Y90 F4000 G0Z0 F400 G2X80Y90I-10J0 F4000 G0Z5 F400 G0X80Y90 F4000 G0Z0 F400 G2X80Y90I-5J-8 F4000 G0Z5 F400 G0X80Y90 F4000 G0Z0 F400 G2X80Y90I5J-8 F4000 G0Z5 G0X0Y0
This is the Python that generated that gcode:
import math def triangleLongLeg(r): #Solve for the long leg of the triangle return math.sqrt( (r**2) - ((r/2)**2) ) def circleGcode(penx,peny,centerx,centery): print("G0Z5 F%i" % zfeed) print("G0X%iY%i F%i" % (penx, peny, xyfeed)) print("G0Z0 F%i" % zfeed) print("G2X%iY%iI%iJ%i F%i" % (penx, peny, centerx, centery, xyfeed)) print("") x = 80 y = 90 r = 10 zfeed = 400 xyfeed = 4000 #Calculate Centers: centers = list() longleg = triangleLongLeg(r) centers.append([x,y]) centers.append([r,0]) centers.append([(r/2),longleg]) centers.append([0-(r/2),longleg]) centers.append([0-r,0]) centers.append([0-(r/2),0-longleg]) centers.append([(r/2),0-longleg]) #Generate the gcode print("G90") #Set absolute mode points = centers circleGcode(points-r,points,r,0) for points in centers[1:]: circleGcode(centers,centers,points,points) print("G0Z5") print("G0X0Y0")