Closed oraherb closed 4 years ago
is this gcode is correct i cant see the image all i can see is green line??
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.
@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 ?
Please make screenshots of Setup-graphics-import tabs
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?
here is path import
heres g code generation
here g code modification
use cases
You should switch off all checkboxes, but at least the marked:
I would use this settings:
@svenhb bro do u know a website were i can read and understand all the setting and values of gbrl plotter program?
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?
@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
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.
@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
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."); } }
@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
Just click here and apply offset
@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
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...
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
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...
@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
@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 "
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"
Question is answered, I think.
why my gcode that i created is like this did i do anything wrong?