Problem with sketch for mini CNC plotter

So I’m new with Arduino and don’t really know how to code. I’m doing mini CNC plotter using Arduino UNO R3 (one you can buy on aliexpress), Arduino Motor Shield L293D, TowerPro SG 90 servo and 2 motors from DVD drives.
I’m doing project from this site (I will post code and picture below so you don’t have to go in there) → https://electricdiylab.com/how-to-make-arduino-mini-cnc-plotter-machine/ (if it doesn’t open here’s less detailed video of it How to make Arduino Mini CNC plotter machine - YouTube)
Problem starts when I need to send code to Arduino. Code is too long so I’ll attach ino file.

Here’s wiring picture if it helps in anyway.

sketch_cnc_plotter.ino (9.98 KB)

Where did you download the sketch from as it seems to have errors ?
The first link is dead BTW.

Also note I removed your avatar so please select something else.

The sketch is mine, I copied code from this site (this site works only on phone for some reason). Like I mentioned before code is too long so I attached ino. If you go to this site on phone it should work fine.

Btw. It coppied my avatar automatically from my Google account, sorry about that.

you have setup at the top that should not be there.

Avatar again removed GRRR !

And as MissDrew states you have issues in the sketch itself that need to be fixed first.
Would you like this post moved to programming ?

Quite a few errors, if you copied this from a phone, then I can understand these, generally you had 2 setup() & 2 loop(), and a lot of [ instead of { . Here is an edited version (untested) , but it does compile.

#include <Servo.h>
#include <AFMotor.h>
#define LINE_BUFFER_LENGTH 512
char STEP = MICROSTEP ;
const int penZUp = 120;
const int penZDown = 50;
const int penServoPin = 10 ;
const int stepsPerRevolution = 48;
Servo penServo;
AF_Stepper myStepperY(stepsPerRevolution, 1);
AF_Stepper myStepperX(stepsPerRevolution, 2);
struct point {
  float x;
  float y;
  float z;
};
struct point actuatorPos;
float StepInc = 1;
int StepDelay = 1;
int LineDelay = 0;
int penDelay = 50;
float StepsPerMillimeterX = 100.0;
float StepsPerMillimeterY = 100.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(100);
  // Decrease if necessary
  myStepperX.setSpeed(600);
  myStepperY.setSpeed(600);
  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(100);
  char line[ LINE_BUFFER_LENGTH ];
  char c;
  int lineIndex;
  bool lineIsComment, lineSemiColon;
  lineIndex = 0;
  lineSemiColon = false;
  lineIsComment = false;

  while (1)
  {
    // Serial reception - Mostly from Grbl, added semicolon support
    while ( Serial.available() > 0 )
    {
      c = Serial.read();
      if (( c == '\n') || (c == '\r') )
      { // End of line reached
        if ( lineIndex > 0 )
        {
          line[ lineIndex ] = '\0';  
          if (verbose)
          {
            Serial.print( "Received : ");
            Serial.println( line );
          }
          processIncomingLine( line, lineIndex );
          lineIndex = 0;
        }
        lineIsComment = false;
        lineSemiColon = false;
        Serial.println("ok");
      }
      else
      {
        if ( (lineIsComment) || (lineSemiColon) )
        {
          if ( c == ')' )  lineIsComment = false;
        }
        else
        {
          if ( c <= ' ' )
          {}
          else if ( c == '/' )
          {}
          else if ( c == '(' )
          {
            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' )
          {
            line[ lineIndex++ ] = c - 'a' + 'A';
          }
          else
          {
            line[ lineIndex++ ] = c;
          }
        }
      }
    }
  }
}
void processIncomingLine( char* line, int charNB )
{
  int currentIndex = 0;
  char buffer[ 64 ];
  struct point newPos;
  newPos.x = 0.0;
  newPos.y = 0.0;

  while ( currentIndex < charNB )
  {
    switch ( line[ currentIndex++ ] )
{ 
      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("");
  }
  x1 = (int)(x1 * StepsPerMillimeterX);
  y1 = (int)(y1 * StepsPerMillimeterY);
  float x0 = Xpos;
  float y0 = Ypos;
  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.onestep(sx, STEP);
      over += dy;
      if (over >= dx)
      {
        over -= dx;
        myStepperY.onestep(sy, STEP);
      }
      delay(StepDelay);
    }
  }
  else
  {
    for (i = 0; i < dy; ++i)
    {
      myStepperY.onestep(sy, STEP);
      over += dx;
      if (over >= dy)
      {
        over -= dy;
        myStepperX.onestep(sx, STEP);
      }
      delay(StepDelay);
    }
  }
  if (verbose)
  {
    Serial.print("dx, dy:");
    Serial.print(dx);
    Serial.print(",");
    Serial.print(dy);
    Serial.println("");
    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(penDelay);
  Zpos = Zmax;
  digitalWrite(15, LOW);
  digitalWrite(16, HIGH);
  if (verbose) 
  {
    Serial.println("Pen up!");
  }
}
void penDown() 
{
  penServo.write(penZDown);
  delay(penDelay);
  Zpos = Zmin;
  digitalWrite(15, HIGH);
  digitalWrite(16, LOW);
  if (verbose) 
  {
    Serial.println("Pen down.");
  }
}

ballscrewbob:
Avatar again removed GRRR !

And as MissDrew states you have issues in the sketch itself that need to be fixed first.
Would you like this post moved to programming ?

I don't mind moving post to programming I just want script to be fixed. Don't know about avatar though, I didn't change it again (I'll just remove it myself).

missdrew:
Quite a few errors, if you copied this from a phone, then I can understand these, generally you had 2 setup() & 2 loop(), and a lot of [ instead of { . Here is an edited version (untested) , but it does compile.

I'll test it when I come back home, thanks in advance!

Also - update that Avatar! I find it offensive!

I just came home and tested updated version. It still has some errors.
Here's full list of them

Arduino:1.8.14 Hourly Build 2021/01/29 11:33 (Windows 10), Płytka:"Arduino Uno"

Alternatives for Servo.h: [Servo@1.1.6]

ResolveLibrary(Servo.h)

-> candidates: [Servo@1.1.6]

Alternatives for AFMotor.h: [Adafruit-Motor-Shield-library-master@1.0.1]

ResolveLibrary(AFMotor.h)

-> candidates: [Adafruit-Motor-Shield-library-master@1.0.1]

C:\Users\wikto\Desktop\Arduino\CNC plotter\sketch_cnc_plotter\sketch_cnc_plotter.ino: In function 'void setup()':

sketch_cnc_plotter:37:1: error: a function-definition is not allowed here before '{' token

{

^

sketch_cnc_plotter:59:1: error: a function-definition is not allowed here before '{' token

{

^

sketch_cnc_plotter:132:1: error: a function-definition is not allowed here before '{' token

{

^

sketch_cnc_plotter:214:1: error: a function-definition is not allowed here before '{' token

{

^

sketch_cnc_plotter:311:1: error: a function-definition is not allowed here before '{' token

{

^

sketch_cnc_plotter:323:1: error: a function-definition is not allowed here before '{' token

{

^

exit status 1

a function-definition is not allowed here before '{' token

Also I've changed my Avatar (again sorry for that, I didn't choose it)

Don't use hourly builds. Download 1.8.13

Multiple libraries were found for "Servo.h"
Used: C:\Users\drewa\Documents\Arduino\libraries\Servo
Not used: Z:\ArduinoCustom\arduino-1.8.13\libraries\Servo
Using library Servo at version 1.1.6 in folder: C:\Users\drewa\Documents\Arduino\libraries\Servo
Using library Adafruit_Motor_Shield_library at version 1.0.1 in folder: C:\Users\drewa\Documents\Arduino\libraries\Adafruit_Motor_Shield_library
"C:\Users\drewa\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino5/bin/avr-size" -A "C:\Users\drewa\AppData\Local\Temp\arduino_build_960921/sketch_mar02c.ino.elf"
Sketch uses 9330 bytes (28%) of program storage space. Maximum is 32256 bytes.
Global variables use 479 bytes (23%) of dynamic memory, leaving 1569 bytes for local variables. Maximum is 2048 bytes.

It compiled fine for me

Arduino:1.8.13 (Windows 10), Płytka:"Arduino Uno"

Alternatives for AFMotor.h: [Adafruit-Motor-Shield-library-master@1.0.1]

ResolveLibrary(AFMotor.h)

 -> candidates: [Adafruit-Motor-Shield-library-master@1.0.1]

sketch_mar03a:37:1: error: a function-definition is not allowed here before '{' token

{

^

sketch_mar03a:59:1: error: a function-definition is not allowed here before '{' token

{

^

sketch_mar03a:132:1: error: a function-definition is not allowed here before '{' token

{

^

sketch_mar03a:214:1: error: a function-definition is not allowed here before '{' token

{

^

sketch_mar03a:311:1: error: a function-definition is not allowed here before '{' token

{

^

sketch_mar03a:323:1: error: a function-definition is not allowed here before '{' token

{

^

sketch_mar03a:333:1: error: expected '}' at end of input

}

^
exit status 1

a function-definition is not allowed here before '{' token

So, I've installed Arduino 1.8.13 but still when I click verify/upload i get these errors.

@smoothg

Could you please take a few moments to Learn How To Use The Forum then you will know how to post error messages etc.

Other general help and troubleshooting advice can be found here.
It will help you get the best out of the forum in the future.

Post the code that you are trying to compile. Also, explain how you installed the libraries, because they look wrongly installed.

After all that.. Now I'm dying of curiosity to see the avatar.

-jim lee

missdrew:
Quite a few errors, if you copied this from a phone, then I can understand these, generally you had 2 setup() & 2 loop(), and a lot of [ instead of { . Here is an edited version (untested) , but it does compile.

#include <Servo.h>

#include <AFMotor.h>
#define LINE_BUFFER_LENGTH 512
char STEP = MICROSTEP ;
const int penZUp = 120;
const int penZDown = 50;
const int penServoPin = 10 ;
const int stepsPerRevolution = 48;
Servo penServo;
AF_Stepper myStepperY(stepsPerRevolution, 1);
AF_Stepper myStepperX(stepsPerRevolution, 2);
struct point {
 float x;
 float y;
 float z;
};
struct point actuatorPos;
float StepInc = 1;
int StepDelay = 1;
int LineDelay = 0;
int penDelay = 50;
float StepsPerMillimeterX = 100.0;
float StepsPerMillimeterY = 100.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(100);
 // Decrease if necessary
 myStepperX.setSpeed(600);
 myStepperY.setSpeed(600);
 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(100);
 char line[ LINE_BUFFER_LENGTH ];
 char c;
 int lineIndex;
 bool lineIsComment, lineSemiColon;
 lineIndex = 0;
 lineSemiColon = false;
 lineIsComment = false;

while (1)
 {
   // Serial reception - Mostly from Grbl, added semicolon support
   while ( Serial.available() > 0 )
   {
     c = Serial.read();
     if (( c == ‘\n’) || (c == ‘\r’) )
     { // End of line reached
       if ( lineIndex > 0 )
       {
         line[ lineIndex ] = ‘\0’;  
         if (verbose)
         {
           Serial.print( "Received : ");
           Serial.println( line );
         }
         processIncomingLine( line, lineIndex );
         lineIndex = 0;
       }
       lineIsComment = false;
       lineSemiColon = false;
       Serial.println(“ok”);
     }
     else
     {
       if ( (lineIsComment) || (lineSemiColon) )
       {
         if ( c == ‘)’ )  lineIsComment = false;
       }
       else
       {
         if ( c <= ’ ’ )
         {}
         else if ( c == ‘/’ )
         {}
         else if ( c == ‘(’ )
         {
           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’ )
         {
           line[ lineIndex++ ] = c - ‘a’ + ‘A’;
         }
         else
         {
           line[ lineIndex++ ] = c;
         }
       }
     }
   }
 }
}
void processIncomingLine( char* line, int charNB )
{
 int currentIndex = 0;
 char buffer[ 64 ];
 struct point newPos;
 newPos.x = 0.0;
 newPos.y = 0.0;

while ( currentIndex < charNB )
 {
   switch ( line[ currentIndex++ ] )
{
     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("");
 }
 x1 = (int)(x1 * StepsPerMillimeterX);
 y1 = (int)(y1 * StepsPerMillimeterY);
 float x0 = Xpos;
 float y0 = Ypos;
 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.onestep(sx, STEP);
     over += dy;
     if (over >= dx)
     {
       over -= dx;
       myStepperY.onestep(sy, STEP);
     }
     delay(StepDelay);
   }
 }
 else
 {
   for (i = 0; i < dy; ++i)
   {
     myStepperY.onestep(sy, STEP);
     over += dx;
     if (over >= dy)
     {
       over -= dy;
       myStepperX.onestep(sx, STEP);
     }
     delay(StepDelay);
   }
 }
 if (verbose)
 {
   Serial.print(“dx, dy:”);
   Serial.print(dx);
   Serial.print(",");
   Serial.print(dy);
   Serial.println("");
   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(penDelay);
 Zpos = Zmax;
 digitalWrite(15, LOW);
 digitalWrite(16, HIGH);
 if (verbose)
 {
   Serial.println(“Pen up!”);
 }
}
void penDown()
{
 penServo.write(penZDown);
 delay(penDelay);
 Zpos = Zmin;
 digitalWrite(15, HIGH);
 digitalWrite(16, LOW);
 if (verbose)
 {
   Serial.println(“Pen down.”);
 }
}

I’m trying to compile this code. I’ve installed libraries this way: Sketch->include library->add ZIP library

jimLee:
After all that… Now I’m dying of curiosity to see the avatar.

-jim lee

Google “potężny gej” if your curious

It doesn’t take much to update to the latest Adafruit_Motor_Shield_V2_Library:

#include <Adafruit_MotorShield.h>
// Create the motor shield object with the default I2C address
Adafruit_MotorShield AFMS = Adafruit_MotorShield();


#include <Servo.h>


#define LINE_BUFFER_LENGTH 512
char STEP = MICROSTEP ;
const int penZUp = 120;
const int penZDown = 50;
const int penServoPin = 10 ;
const int stepsPerRevolution = 48;
Servo penServo;
Adafruit_StepperMotor *myStepperY = AFMS.getStepper(stepsPerRevolution, 1);
Adafruit_StepperMotor *myStepperX = AFMS.getStepper(stepsPerRevolution, 2);
struct point
{
  float x;
  float y;
  float z;
};
struct point actuatorPos;
float StepInc = 1;
int StepDelay = 1;
int LineDelay = 0;
int penDelay = 50;
float StepsPerMillimeterX = 100.0;
float StepsPerMillimeterY = 100.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(100);
  // Decrease if necessary
  myStepperX->setSpeed(600);
  myStepperY->setSpeed(600);
  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(100);
  char line[ LINE_BUFFER_LENGTH ];
  char c;
  int lineIndex;
  bool lineIsComment, lineSemiColon;
  lineIndex = 0;
  lineSemiColon = false;
  lineIsComment = false;


  while (1)
  {
    // Serial reception - Mostly from Grbl, added semicolon support
    while ( Serial.available() > 0 )
    {
      c = Serial.read();
      if (( c == '\n') || (c == '\r') )
      {
        // End of line reached
        if ( lineIndex > 0 )
        {
          line[ lineIndex ] = '\0';
          if (verbose)
          {
            Serial.print( "Received : ");
            Serial.println( line );
          }
          processIncomingLine( line, lineIndex );
          lineIndex = 0;
        }
        lineIsComment = false;
        lineSemiColon = false;
        Serial.println("ok");
      }
      else
      {
        if ( (lineIsComment) || (lineSemiColon) )
        {
          if ( c == ')' )  lineIsComment = false;
        }
        else
        {
          if ( c <= ' ' )
          {}
          else if ( c == '/' )
          {}
          else if ( c == '(' )
          {
            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' )
          {
            line[ lineIndex++ ] = c - 'a' + 'A';
          }
          else
          {
            line[ lineIndex++ ] = c;
          }
        }
      }
    }
  }
}


void processIncomingLine( char* line, int charNB )
{
  int currentIndex = 0;
  char buffer[ 64 ];
  struct point newPos;
  newPos.x = 0.0;
  newPos.y = 0.0;


  while ( currentIndex < charNB )
  {
    switch ( line[ currentIndex++ ] )
    {
      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 == NULL )
              {
                newPos.x = atof( indexX + 1);
                newPos.y = actuatorPos.y;
              }
              else if ( indexX == NULL )
              {
                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("");
  }
  x1 = (int)(x1 * StepsPerMillimeterX);
  y1 = (int)(y1 * StepsPerMillimeterY);
  float x0 = Xpos;
  float y0 = Ypos;
  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->onestep(sx, STEP);
      over += dy;
      if (over >= dx)
      {
        over -= dx;
        myStepperY->onestep(sy, STEP);
      }
      delay(StepDelay);
    }
  }
  else
  {
    for (i = 0; i < dy; ++i)
    {
      myStepperY->onestep(sy, STEP);
      over += dx;
      if (over >= dy)
      {
        over -= dy;
        myStepperX->onestep(sx, STEP);
      }
      delay(StepDelay);
    }
  }
  if (verbose)
  {
    Serial.print("dx, dy:");
    Serial.print(dx);
    Serial.print(",");
    Serial.print(dy);
    Serial.println("");
    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(penDelay);
  Zpos = Zmax;
  digitalWrite(15, LOW);
  digitalWrite(16, HIGH);
  if (verbose)
  {
    Serial.println("Pen up!");
  }
}


void penDown()
{
  penServo.write(penZDown);
  delay(penDelay);
  Zpos = Zmin;
  digitalWrite(15, HIGH);
  digitalWrite(16, LOW);
  if (verbose)
  {
    Serial.println("Pen down.");
  }
}

I got similar errors even after updating library

Arduino:1.8.13 (Windows 10), Płytka:"Arduino Uno"

Using board 'uno' from platform in folder: C:\Program Files (x86)\Arduino\hardware\arduino\avr

Using core 'arduino' from platform in folder: C:\Program Files (x86)\Arduino\hardware\arduino\avr

Detecting libraries used...

Alternatives for Adafruit_MotorShield.h: [Adafruit_Motor_Shield_V2_Library-master@1.0.11]

ResolveLibrary(Adafruit_MotorShield.h)

  -> candidates: [Adafruit_Motor_Shield_V2_Library-master@1.0.11]

Alternatives for Wire.h: [Wire@1.0]

ResolveLibrary(Wire.h)

  -> candidates: [Wire@1.0]

Alternatives for Servo.h: [Servo@1.1.6 Servo@1.1.7]

ResolveLibrary(Servo.h)

  -> candidates: [Servo@1.1.6 Servo@1.1.7]

sketch_cnc_plotter:45:1: error: a function-definition is not allowed here before '{' token

 {

 ^

sketch_cnc_plotter:68:1: error: a function-definition is not allowed here before '{' token

 {

 ^

sketch_cnc_plotter:145:1: error: a function-definition is not allowed here before '{' token

 {

 ^

sketch_cnc_plotter:243:1: error: a function-definition is not allowed here before '{' token

 {

 ^

sketch_cnc_plotter:342:1: error: a function-definition is not allowed here before '{' token

 {

 ^

sketch_cnc_plotter:356:1: error: a function-definition is not allowed here before '{' token

 {

 ^

sketch_cnc_plotter:366:1: error: expected '}' at end of input

 }

 ^

exit status 1

a function-definition is not allowed here before '{' token

The errors you are getting are at the beginning of EVERY function. It sounds like you have an extra '{' or missing '}' near the top of the file.

@smoothg

Banned until you can confirm that avatar is fixed.

Please PM a moderator to get the ban lifted once it is done.