stimmer, sirbow, wildbill --- thanks for all your help so far!
I am getting a readout for xpos and ypos, but now that I have fixed the xIs0 == true to xIs0 = true, the switches seem to be seriously misbehaving. I am not sure what's going on, but they seem to constantly read out high.
/* Stepper Motor Controller ; language: Wiring/Arduino
This program drives a unipolar or bipolar stepper motor. by Tom Igoe */
/* significant help from arduino forum superstars: sirbow2, stimmer
*/
#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;
Serial.println(xPos);
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;
}
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;
}
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;
}
//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;
}
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;
}
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;
}
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;
}
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 ;
}
}
}