// // Bot // // handles GCode communicationw with the plotter // class Bot extends PApplet { Serial myPort; //declare serial port int prevZ = -1; int LF = 10; // Linefeed in ASCII int CR = 13; String myString = null; boolean writeToFile=true; PrintWriter writer; Bot(PApplet p) { //constructor if (serialOn) { if(printToConsole)println(Serial.list()); String portName = Serial.list()[0]; // Change this Value to fit which Serial Port it is on. myPort = new Serial(p, portName, 19200); } if (writeToFile) { } } void setupWriting(PrintWriter _writer) { writer=_writer; } void stop() { if (writeToFile) { writer.flush(); // Write the remaining data writer.close(); // Finish the file } } float xyToA(float inx, float iny) { float lenA; lenA = sqrt(pow(PAGE0X+inx, 2)+pow(PAGE0Y+iny, 2)); return lenA; } float xyToB(float inx, float iny) { float lenB; lenB = sqrt(pow(MOTORSEP-(PAGE0X+inx), 2)+pow(PAGE0Y+iny, 2)); return lenB; } void sendVal(float inx, float iny, float upDown) { String xsend; String ysend; String feedRate; String xy; // calc A and B string lengths from x,y coords (in inches) xsend=str(xyToA(inx, iny)); ysend=str(xyToB(inx, iny)); feedRate=""; if (upDown==1.0) feedRate="F"+SLOWFEED; // pen is on, drawing else feedRate="F"+FASTFEED; // pen is off, jogging // print("point: "); // print((inx/PPI) + "," +(iny/PPI)); // print(" ("); // if (upDown==1) print("*"); // println(")"); DirectCommand("G1 X"+xsend+" Y"+ysend+" "+feedRate); atPoint=false; } void DirectCommand(String j) { if (serialOn) { myPort.write(j+'\n'); //println("sent: "+j); } if (writeToFile) { //println("writing "+j); //println(j); writer.write(j+"\n"); writer.flush(); } } void penDown() { // DirectCommand("G100 S255"); //moves servo, push pen off page DirectCommand("G100 S100"); //moves servo, push pen on page waitForOk(); } void penUp() { //DirectCommand("G100 S100"); //moves servo, push pen off page //DirectCommand("G100 S130"); //moves servo, push pen off page DirectCommand("G100 S255"); //moves servo, lift pen off page waitForOk(); } void storeHome() { if(printToConsole) println("(switching machine to ABSOLUTE positioning)"); DirectCommand("G90"); if (serialOn) waitForOk(); if(printToConsole)println("(storing current position as home position)"); DirectCommand("G92 X"+HOMEA+" Y"+HOMEB+" Z0.0"); if (serialOn) waitForOk(); } void goHome() { penUp(); if(printToConsole)println("(going to stored home position)"); DirectCommand("G1 X"+HOMEA+" Y"+HOMEB+" Z0.0 F"+FASTFEED); } void waitForOk() { if (serialOn) { boolean okd=false; //print("waiting..."); while (!okd) { myString = myPort.readStringUntil(LF); if (myString != null) { //print("RX: "+myString); if (myString.startsWith("ok")) { okd = true; // when drawbot stops at point, it sends "ok" and triggers atPoint } else { //println("received something not ok"); } } else { //print("."); } } //println("done."); } } void waitForStart() { boolean started=false; if (serialOn) { while (true) { if (myPort.available() > 0) break; } while ( (myPort.available () > 0) && (!started)) { myString = myPort.readStringUntil(LF); if (myString != null) { print("RX: "+myString); if (myString.startsWith("start")) { started = true; // when drawbot stops at point, it sends "ok" and triggers atPoint } else { //println("received something not ok"); } } } } } }