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

Changing the speed did nothing :frowning:

BUT NOW I have a brand new problem that I dont know how to solve or how it happened.

I was using my motor with keyboard inputs.
I press W, the motors move in the direction theyre supposed to, same for N, W, and S.
These are the the directions that move straight lines.
However, if I give it "J" or "H" or any of the diagnoal keys two things happen

  1. Neither motor moves
  2. They key input stops responding.
    For example, if I hit "J", which should move in a diagonal direction, nothing happens. If I THEN hit W, the motors don't move; they stop responding altogether and will not move again until I restart either Processing (the keyboard input program) or Arduino's Serial output.

I looked at where those functions are or where they are called... and I have NO idea what happened! :frowning:

Any ideas?

/* 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 xStopMin = A0;
int xStopMax = A1;
int yStopMin = A2;
int yStopMax = A3;





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() {

  PMS:
  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 ; 
    }

  }

}