Receiver Code:
// Movement of Optical encoder is translated to moving stepper
#include <AccelStepper.h>
//encoder/motor/driver setup
int easyDriverMicroSteps = 2;
int rotaryEncoderSteps = 75;
int motorStepsPerRev = 200;
int MinPulseWidth = 50; //too low and the motor will stall, too high and it will slow it down
int easyDriverStepPin = 4;
int easyDriverDirPin = 5;
int enablePin = 6;
volatile long encoderValue = 0;
int dataReceive = 0;
long lastencoderValue = 0;
//Values for focus points
int inPoint;
int outPoint;
//value for variable speed
int speedValue = 1000;
int mappedSpeed;
int mode;
#define Rewind 1
#define Play 2
// Stop mode is meant to enable Xbee receive changes in speed
// in values 0-255, remap to 200-100 and reyrn to Play/Rewind.
// currently not working.
#define Stop 3
AccelStepper stepper(1, easyDriverStepPin, easyDriverDirPin);
//Sleep Function - to diable ED when not active
long previousMillis = 0;
int sleepTimer = 5000;
void setup(){
Serial.begin(115200);
stepper.setMinPulseWidth(MinPulseWidth);
stepper.setMaxSpeed(speedValue); //variable to later determine speed play/rewind
stepper.setAcceleration(100000);
stepper.setSpeed(50000);
pinMode(enablePin, OUTPUT);
}
void loop(){
stepper.run();
if (Serial.available()>0)
{
digitalWrite (enablePin, LOW);
previousMillis = millis();
dataReceive = Serial.read();
//function to sort data reveived and action.
dataSort ();
//take care of variable speed
speedValue = 1000;
stepper.setMaxSpeed(speedValue);
int stepsPerRotaryStep = (motorStepsPerRev * easyDriverMicroSteps) / rotaryEncoderSteps;
stepper.moveTo(encoderValue * stepsPerRotaryStep);
}
else
{
//Stepper sleep after 5sec of no data
unsigned long currentMillis = millis ();
if (currentMillis - previousMillis>sleepTimer)
{
digitalWrite (enablePin, HIGH);
}
}
switch (mode)
{
case Stop:
/* if (Serial.available()>0)
dataSort(); */
break;
case Rewind:
//take care of variable speed
stepper.setMaxSpeed(speedValue);
stepper.moveTo(inPoint);
stepper.run();
//Serial.println ("Rcase");
if(stepper.currentPosition()==inPoint)
{
Serial.write (1);
mode=Stop;
}
break;
case Play:
//take care of variable speed
stepper.setMaxSpeed(speedValue);
stepper.moveTo(outPoint);
stepper.run();
//Serial.println ("Pcase");
if(stepper.currentPosition()==outPoint)
{
Serial.write (1);
mode=Stop;
}
break;
}
}
//Sort the received data and decide action
void dataSort()
{
if (dataReceive == 3)
{
inPoint = stepper.currentPosition();
Serial.print ("inpoint = ");
Serial.println (inPoint);
}
else if (dataReceive == 5)
{
outPoint = stepper.currentPosition();
Serial.print ("outpoint = ");
Serial.println (outPoint);
}
else if (dataReceive == 1)
{
encoderValue ++;
Serial.println(dataReceive);
}
else if (dataReceive == 2)
{
encoderValue --;
Serial.println(dataReceive);
}
else if (dataReceive == 4)
{
//function to make Play or Rewind
defineDirection();
}
else
//Checking is data can be received indeed for changing speed.
//currently after some revolutions of encoder Xbees stop communicating until reset.
Serial.println (dataReceive);
}
void defineDirection()
{
if (stepper.currentPosition()!=inPoint)
{
Serial.println ("REWIND");
mode = Rewind;
}
else if (stepper.currentPosition() == inPoint)
{
Serial.println ("PLAY");
mode = Play;
}
}
void stepperMove ()
{
stepper.run();
int stepsPerRotaryStep = (motorStepsPerRev * easyDriverMicroSteps) / rotaryEncoderSteps;
stepper.moveTo(encoderValue * stepsPerRotaryStep);
}