svenhb / GRBL-Plotter

A GCode sender (not only for lasers or plotters) for up to two GRBL controller. SVG, DXF, HPGL import. 6 axis DRO.
https://grbl-plotter.de/
GNU General Public License v3.0
659 stars 174 forks source link

is this normal in gcode? please help #72

Closed oraherb closed 4 years ago

oraherb commented 4 years ago

why my gcode that i created is like this did i do anything wrong?

oraherb commented 4 years ago

is this gcode is correct i cant see the image all i can see is green line?? Screenshot (19)

svenhb commented 4 years ago

You can click on the folded code '+', e.g. line 12 to see the real gcode. Send me your picture or graphics, then I can check.

oraherb commented 4 years ago

@svenhb hey bro nothing happen still like this and my hardware is not creating that image it just follow all that line no fry image was created what is wrong ?Screenshot (23)

svenhb commented 4 years ago

Please make screenshots of Setup-graphics-import tabs

svenhb commented 4 years ago

I have no time to watch video... In image-window, select use-case plotter, then restore your servo-pwm settings in setup-graphics import. What size and resolution you selected on imgage-correction?

oraherb commented 4 years ago

here is path import Screenshot (35)

oraherb commented 4 years ago

heres g code generation Screenshot (36)

oraherb commented 4 years ago

here g code modification Screenshot (37)

oraherb commented 4 years ago

use cases Screenshot (38)

svenhb commented 4 years ago

You should switch off all checkboxes, but at least the marked: image

svenhb commented 4 years ago

I would use this settings: image

oraherb commented 4 years ago

@svenhb bro do u know a website were i can read and understand all the setting and values of gbrl plotter program?

svenhb commented 4 years ago

I thought most of the checkboxes are self-explaining... Perhaps I can make a manual based on your questions... Which setting you are not understanding?

oraherb commented 4 years ago

@svenhb bro it work but i use modified grbl and i replace the drv8825 with L293D IC well im not satisfied because i didnt learn how to make the gbrl plotter work well i have to learn it to be satisfied Screenshot_20191008-230620

svenhb commented 4 years ago

Is this picture made with grbl-plotter? So finally you get it to work - very good! Yes hardware can be tricky, perhaps too weak powersupply for the drivers? Perhaps wrong calculation for "step/mm" and wrong calculation with microsteps, set at the driver... It should also work with the drv8825.

oraherb commented 4 years ago

@svenhb hey bro yes it my pen plotter who made that drawing in above picture but i have to use this modified gbrl to make it work and processing t3 to send gcode

include

include

define LINE_BUFFER_LENGTH 512

const int penZUp = 80; const int penZDown = 40;

const int penServoPin = 6;

const int stepsPerRevolution = 20;

Servo penServo;

Stepper myStepperY(stepsPerRevolution, 2,3,4,5);
Stepper myStepperX(stepsPerRevolution, 8,9,10,11);

struct point { float x; float y; float z; };

struct point actuatorPos;

float StepInc = 1; int StepDelay = 0; int LineDelay = 50; int penDelay = 50;

float StepsPerMillimeterX = 6.0; float StepsPerMillimeterY = 6.0;

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;

boolean verbose = false;

void setup() { Serial.begin( 9600 );

penServo.attach(penServoPin); penServo.write(penZUp); delay(200);

myStepperX.setSpeed(250); myStepperY.setSpeed(250);

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() { delay(200); char line[ LINE_BUFFER_LENGTH ]; char c; int lineIndex; bool lineIsComment, lineSemiColon;

lineIndex = 0; lineSemiColon = false; lineIsComment = false;

while (1) {

while ( Serial.available()>0 ) {
  c = Serial.read();
  if (( c == '\n') || (c == '\r') ) {             
    if ( lineIndex > 0 ) {                        
      line[ lineIndex ] = '\0';                   
      if (verbose) { 
        Serial.print( "Received : "); 
        Serial.println( line ); 
      }
      processIncomingLine( line, lineIndex );
      lineIndex = 0;
    } 
    else { 

    }
    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 );
  }
}

}

}

void drawLine(float x1, float y1) {

if (verbose) { Serial.print("fx1, fy1: "); Serial.print(x1); Serial.print(","); Serial.print(y1); Serial.println(""); }

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)(x1StepsPerMillimeterX); y1 = (int)(y1StepsPerMillimeterY); 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.step(sx); over+=dy; if (over>=dx) { over-=dx; myStepperY.step(sy); } delay(StepDelay); } } else { for (i=0; i<dy; ++i) { myStepperY.step(sy); over+=dx; if (over>=dy) { over-=dy; myStepperX.step(sx); } 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(LineDelay);

Xpos = x1; Ypos = y1; }

void penUp() { penServo.write(penZUp); delay(LineDelay); Zpos=Zmax; if (verbose) { Serial.println("Pen up!"); } } void penDown() { penServo.write(penZDown); delay(LineDelay); Zpos=Zmin; if (verbose) { Serial.println("Pen down."); } }

oraherb commented 4 years ago

@svenhb bro can you help me with this how can i set this gcode to 0 position because my plotter needs to run to far to start the drawing Screenshot (39)

svenhb commented 4 years ago

Just click here and apply offset image

oraherb commented 4 years ago

@svenhb bro is there any way that i can generate gcode other than inkscape and gbrl plotter or easel i mean gcode for pen plotter that have pen up and down

svenhb commented 4 years ago

is there any way that i can generate gcode other than inkscape and gbrl plotter No idea, did you ask google? GRBL-Plotter can generate GCode for pen-up/down from SVG, DXF, images, drill files. What else do you need? Or are you looking for templates? Did you check Setup - WWW-Links? I listed some sources...

oraherb commented 4 years ago

because gbrl plotter doesnt work im using processing t3 to send gcode to arduino i try making gcode in gbrl plotter then export the gcode and open it in processing T3 but it doesnt work and i try inkscape it doesnt work also thats why im trying to find something that will work on the modified gbrl that i use bro

svenhb commented 4 years ago

Very complicated... Why not using GRBL-Plotter to send the code? Use a 'normal' grbl firmware like https://github.com/svenhb/GRBL-Plotter/blob/master/grbl_v1.1f_Servo.hex I tested it with my egg-bot - it works...

oraherb commented 4 years ago

@svenhb because im using L293D ic i try normal grbl firmware in my setup with L293D but it doesnt work no feed back from my x and y thats why im using modified grbl so yes

oraherb commented 4 years ago

@svenhb bro can i ask (https://github.com/svenhb/GRBL-Plotter/blob/master/grbl_v1.1f_Servo.hex) in this grbl firmware what was the digital input pin for X and Y AXIS in arduino and servo pulse,, ......because in L293D ic im using 4 Digital pin for in put 2,3,4,5 for x axis and 8,9,10,11 Digital pin Y axis and use digital pin 6 for servo pulse trigger.. if i know what is the right pin for x and y ican rewire the adruino digital pin to L293D ic to have a feed back on my x and y "im not an expert im still learning bro "

svenhb commented 4 years ago

The grbl version I mentioned, uses step and dir signal for the A4988 (or similar) drivers. Why using L293 (is'nt it very outdated?), when you can get µC and drivers for 10€ - just check ebay for "Uno-R3 CNC-V3-0-shield-4x-A4988"

svenhb commented 4 years ago

Question is answered, I think.