#include <DS3231.h>
#include <Wire.h>
#include <AccelStepper.h>
#include <MultiStepper.h>
// The Y Stepper pins
#define STEPPERY_DIR_PIN 2
#define STEPPERY_EN_PIN 4
#define STEPPERY_STEP_PIN 9
// The X stepper pins
#define STEPPERX_DIR_PIN 5
#define STEPPERX_EN_PIN 8
#define STEPPERX_STEP_PIN 6
#define ISENS_UP 14 //A0
#define ISENS_DOWN 15 //A1
#define ISENS_LEFT 16 //A2
#define ISENS_RIGHT 17 //A3
#define dirPinStepper 2
#define enablePinStepper 4
#define stepPinStepper 9
//calibration of X and Y
long sx=0;
long sy=0;
bool bCal = false;//true - calibration is going
bool cX = false; //not used yet
bool cY = false; //true means clockwise goes up
DS3231 clock;
// Define some steppers and the pins the will use
AccelStepper stepperY(AccelStepper::DRIVER, STEPPERY_STEP_PIN, STEPPERY_DIR_PIN);
AccelStepper stepperX(AccelStepper::DRIVER, STEPPERX_STEP_PIN, STEPPERX_DIR_PIN);
void setup() {
// put your setup code here, to run once:
Wire.begin();
clock.setClockMode(false); // set to 24h
//setClockMode(true); // set to 12h
if(!clock.oscillatorCheck())
{
clock.setYear(21);
clock.setMonth(9);
clock.setDate(9);
clock.setDoW(4);
clock.setHour(18);
clock.setMinute(43);
clock.setSecond(30);
}
bCal = true;
pinMode(ISENS_UP, INPUT);
pinMode(ISENS_DOWN, INPUT);
pinMode(ISENS_LEFT, INPUT);
pinMode(ISENS_RIGHT, INPUT);
}
void loop() {
if(bCal)
calibr();
else
movel();
}
//range of steps
#define RANGE 4000.0f
#define MAX_SPEED (RANGE/20.0f)
#define MAX_ACCEL (MAX_SPEED/10.0f)
void calibr(void)
{
stepperY.setCurrentPosition(0);
stepperY.setMaxSpeed(MAX_SPEED);
stepperY.setAcceleration(MAX_ACCEL);
stepperX.setCurrentPosition(0);
stepperX.setMaxSpeed(MAX_SPEED);
stepperX.setAcceleration(MAX_ACCEL);
calibrUp();
stepperY.setCurrentPosition(0);
calibrDown();
sy = stepperY.currentPosition()+1;
calibrLeft();
stepperX.setCurrentPosition(0);
calibrRight();
sx = stepperX.currentPosition()+1;
bCal = false;
stepperY.setCurrentPosition(sy/2);
stepperX.setCurrentPosition(sx/2);
moveToZero();
//decrease range to do not touch endstops
sx*=90;sx/=100;
sy*=90;sy/=100;
//first turn counter-clockwise
sx = -sx/2;
sy = -sy/2;
stepperX.moveTo(sx);
stepperY.moveTo(sy);
}
void moveToZero()
{
stepperY.setMaxSpeed(MAX_SPEED);
stepperY.setAcceleration(MAX_ACCEL);
stepperY.moveTo(0);
stepperX.setMaxSpeed(MAX_SPEED);
stepperX.setAcceleration(MAX_ACCEL);
stepperX.moveTo(0);
do
{
stepperY.run();
stepperX.run();
}while(stepperY.isRunning() || stepperX.isRunning());
}
bool calibrUp()
{
stepperY.moveTo(-RANGE);
byte b=1;
do
{
b = digitalRead(ISENS_UP);
if(!b)break;
stepperY.run();
}while(stepperY.isRunning());
if(b)
{
stepperY.moveTo(RANGE);
do
{
b = digitalRead(ISENS_UP);
if(!b)break;
stepperY.run();
}while(stepperY.isRunning());
cY = true; //clockwise is up
}else
cY = false; //counter-clockwise is up
stepperY.stop();
return (!b);
}
void calibrDown()
{
stepperY.moveTo(RANGE);
byte b = 1;
do
{
b = digitalRead(ISENS_DOWN);
if(!b)break;
stepperY.run();
}while(stepperY.isRunning());
if(b)
{
stepperY.moveTo(-RANGE);
do
{
b = digitalRead(ISENS_DOWN);
if(!b)break;
stepperY.run();
}while(stepperY.isRunning());
}
stepperY.stop();
}
void calibrLeft()
{
stepperX.moveTo(-RANGE);
do
{
byte b = digitalRead(ISENS_LEFT);
if(!b)break;
stepperX.run();
}while(1);
cX = true;
stepperX.stop();
}
void calibrRight()
{
stepperX.moveTo(RANGE);
do
{
byte b = digitalRead(ISENS_RIGHT);
if(!b)break;
stepperX.run();
}while(1);
stepperX.stop();