XY Plotter/CNC style interpolation project. Need great deal of help

Hey, ok so I will be rewiring my switches tomorrow and will see how it all works out.

I was wondering if you guys could help me in advance with two things:

1- Using the code I have posted so far, where I pulse the stepper motors in order to make the head move in specific directions, how do I make sure that the code changes xPos and yPos only when the motors actually spin? Sometimes, I send a signal through the serial window in Arduino, and Arduino does the math of adding 200 to the xPos, but sometimes it seems that the motor skips signals: I have to hit 'E' and ENTER a few times before the thing moves. I am not sure if the Serial.read happens in cycles or with some kind of delay?

/* Stepper Motor Controller ;  language: Wiring/Arduino
 This program drives a unipolar or bipolar stepper motor.  by Tom Igoe 
 and the Spline library by Kerinin
 */

/* significant help from arduino forum superstars: sirbow2, stimmer
 */
#include <spline.h>
#include <Stepper.h>

#define motorSteps 200     // change this depending on the number of steps
#define motor2Steps 200     // change this depending on the number of steps
// per revolution of your motor


#define motorPin1 2
#define motorPin2 3
#define motorPin3 4
#define motorPin4 5
#define motorPin6 8
#define motorPin7 9
#define motorPin8 10
#define motorPin9 11


int reading = 0;
int previous = LOW;
long time = 0;         // the last time the output pin was toggled
long debounce = 50;   // the debounce time, increase if the output flickers
int state = HIGH;    

//set pin numbers

int xStopMax = A1;
int xStopMin = A0;
int yStopMin = A3;
int yStopMax = A2;



int xPos;
int yPos;
boolean xIs0;
boolean xIsMax;
boolean yIs0;
boolean yIsMax;


// initialize of the Stepper library:
Stepper yAxis(motorSteps, motorPin1,motorPin2, motorPin3, motorPin4); 
Stepper xAxis(motor2Steps, motorPin6,motorPin7, motorPin8, motorPin9); 




void setup() {

  // set the motor speed at 60 RPMS:
  xAxis.setSpeed(60); //x
  yAxis.setSpeed(60); //y

  //set limit switches to analog inputs
  pinMode(xStopMin, INPUT);
  pinMode(xStopMax, INPUT);
  pinMode(yStopMin, INPUT); 
  pinMode(yStopMax, INPUT);

  xPos = 0;
  yPos = 0;

  // Initialize the Serial port:
  Serial.begin(9600);
}

void loop() {
  //check limit switches
if(digitalRead(xStopMin) == HIGH){
    xIs0 = true;  
    xPos = 0;
    Serial.println("xMin");
  }
  else xIs0 = false;



  if(digitalRead(xStopMax) == HIGH){
    xIsMax = true;  
    Serial.println("xMax");
  }
  else xIsMax = false;

  if(digitalRead(yStopMin) == HIGH){
    yIs0 = true;  
    Serial.println("yMin");
    yPos = 0;

  }
  else yIs0 = false;

  if(digitalRead(yStopMax) == HIGH){
    yIsMax = true;  
    Serial.println("yMax");
  }
  else yIsMax = false;


  char val=0;
  if(Serial.available()) val = Serial.read();

  //keyboard control  
  switch(val){
  case 'N':
    Serial.read();
    moveN(200);
    break;

  case 'S':
    Serial.read();
    moveS(200);
    break;

  case 'E':
    Serial.read();
    moveE(200);
    break;

  case 'W':
    Serial.read();
    moveW(200);
    break; 



    //diagonal (moving motors almost at the same time)      
  case 'J': //NE
    Serial.read();
    moveNE(200);
    break;
  case 'H': //NW
    Serial.read();
    moveNW(200);
    break;

  case 'X': //SE
    Serial.read();
    moveSE(200);
    break;
  case 'Z': //SW
    Serial.read();
    moveSW(200);
    break;

  case 'C': //SW
    Serial.read();
    moveCirc();
    break;


    //resets
  case 'Q': //reset to 0,0 
    Serial.read();
    moveN(100);
    moveE(100);
    break;



    //debugs
  case 'P':
    Serial.read();
    Serial.print("x position: ");
    Serial.println(xPos);
    Serial.println("y position: ");
    Serial.println(yPos);
    break;

  default:
    Serial.read();
    delay(10);
    break;
  }
}
//movement functions

//first, str  aight up down left right
void moveE(int numSteps){
  int s = 0;
  while(!digitalRead(xStopMax)&& s<numSteps)//checks the button each step, also checks to see if it has moved s amount of steps
  {
    xAxis.step(1);
    s++;
  }  
  //delay(100);    

  xPos += numSteps;

  //check where we are
  Serial.print("x position: ");
  Serial.println(xPos);
  Serial.print("y position: ");
  Serial.println(yPos);
}


void moveW(int numSteps){
  int s = 0;
  while(!digitalRead(xStopMin)&& s<numSteps)//checks the button each step, also checks to see if it has moved s amount of steps
  {
    xAxis.step(-1);
    s++;
  }  
  //delay(100);    
  xPos -= numSteps;

  //check where we are
  Serial.print("x position: ");
  Serial.println(xPos);
  Serial.print("y position: ");
  Serial.println(yPos);
}

void moveN(int numSteps){
  int s = 0;
  while(!digitalRead(yStopMax)&& s<numSteps)//checks the button each step, also checks to see if it has moved s amount of steps
  {
    yAxis.step(-1);
    s++;
  }  
  //delay(100);    
  yPos += numSteps;

  //check where we are
  Serial.print("x position: ");
  Serial.println(xPos);
  Serial.print("y position: ");
  Serial.println(yPos);
}  

void moveS(int numSteps){
  int s = 0;
  while(!digitalRead(yStopMin)&& s<numSteps)//checks the button each step, also checks to see if it has moved s amount of steps
  {
    yAxis.step(1);
    s++;
  }  
  //delay(100);    
  yPos -= numSteps;

  //check where we are
  Serial.print("x position: ");
  Serial.println(xPos);
  Serial.print("y position: ");
  Serial.println(yPos);
}    

//diagonals
void moveNE(int numSteps){    
  int s=0; 
  while(!digitalRead(xStopMax) && !digitalRead(yStopMin) && s<numSteps); 
  for(int s=0; s<numSteps; s++)
  {
    yAxis.step(-1);
    xAxis.step(1);
  }
  xPos += numSteps;
  yPos -= numSteps;

  //check where we are
  Serial.print("x position: ");
  Serial.println(xPos);
  Serial.print("y position: ");
  Serial.println(yPos);
}  


void moveSE(int numSteps){
  int s=0; 
  while(!digitalRead(xStopMax) && !digitalRead(yStopMax) && s<numSteps); 
  for(int s=0; s<numSteps; s++)
  {
    yAxis.step(1);
    xAxis.step(1);
  }
  xPos += numSteps;
  yPos += numSteps;

  //check where we are
  Serial.print("x position: ");
  Serial.println(xPos);
  Serial.print("y position: ");
  Serial.println(yPos);
}  


void moveSW(int numSteps){
  int s=0; 
  while(!digitalRead(xStopMin) && !digitalRead(yStopMax) && s<numSteps); 
  for(int s=0; s<numSteps; s++)
  {
    yAxis.step(1);
    xAxis.step(-1);
  }
  xPos -= numSteps;
  yPos += numSteps;

  //check where we are
  Serial.print("x position: ");
  Serial.println(xPos);
  Serial.print("y position: ");
  Serial.println(yPos);

}  


void moveNW(int numSteps){
  int s=0; 
  while(!digitalRead(xStopMin) && !digitalRead(yStopMin) && s<numSteps); 
  for(int s=0; s<numSteps; s++)
  {
    yAxis.step(-1);
    xAxis.step(-1);
  }
  xPos -= numSteps;
  yPos -= numSteps;

  //check where we are
  Serial.print("x position: ");
  Serial.println(xPos);
  Serial.print("y position: ");
  Serial.println(yPos);
}  

void moveCirc(){
  //draw circle at x,y 50,50
  int CircleXCenter = 2;
  int CircleYCenter = 2; 
  int CurXPos = xPos; //where the platform currently is in X
  int CurYPos = yPos; //where the platform currently is in Y
  int Rad = 1;




  for (int i = 0; i < 360; i++)
  {
    //it does this for each point of the circle, so you dont have to run them at the same time
    float 
      angle = i*2*3.14/360;
    xPos = CircleXCenter + (cos(angle) * Rad);
    yPos = CircleYCenter + (sin(angle) * Rad);
    if(CurXPos < xPos)
    {

      xAxis.step(xPos - CurXPos);
      //movexnow = Xpos - CurXPos;
    }
    else
    {
      xAxis.step(xPos - CurXPos); 
      //MoveXNow = CurXPos - Xpos; 
    }

    if(CurYPos < yPos)
    {
      yAxis.step(yPos - CurYPos); 
      //   MoveYNow = Ypos - CurYPos;
    }
    else
    {
      yAxis.step(yPos - CurYPos
        ); 
      //MoveYNow = CurYPos - Ypos; 
    }

    // step(xAxis);
    //step(yAxis);

    //<100, so -1 
    if(i == (360-1)) //we are at end of for loop, save current position.
    {
      CurYPos = yPos;
      
      CurXPos = xPos ; 
    }

  }

}
  1. I am thinking of using Spline's library to plot points for the program to follow and have the points sent to Arduino by Processing. Problem is, I looked at the Arduino example code, but really don't know how I am going to make it work. Any advice of how to approach this?

You guys rock so hard!
Thanks!