This will give your separate ranges
/*
Arduino code for dynamic playseat 2DOF
Created 24 May 2011 by Jim Lindblom SparkFun Electronics https://www.sparkfun.com/products/10182 "Example Code"
Created 24 Apr 2012 by Jean David SEDRUE Version betatest26 - 24042012 http://www.gamoover.net/Forums/index.php?topic=25907
Updated 20 May 2013 by RacingMat in english http://www.x-sim.de/forum/posting.php?mode=edit&f=37&t=943&p=8481 in french : http://www.gamoover.net/Forums/index.php?topic=27617
Updated 30 April 2014 by RacingMat (bug for value below 16 corrected)
*/
#define BRAKEVCC 0
#define RV 2 //beware it's depending on your hardware wiring
#define FW 1 //beware it's depending on your hardware wiring
#define STOP 0
#define BRAKEGND 3
////////////////////////////////////////////////////////////////////////////////
#define pwmMax 255 // or less, if you want to lower the maximum motor's speed
// defining the range of potentiometer's rotation
const int potMini = 208;
const int potMaxi = 815;
////////////////////////////////////////////////////////////////////////////////
#define motLeft 0
#define motRight 1
#define potL A0
#define potR A1
////////////////////////////////////////////////////////////////////////////////
// DECLARATIONS
////////////////////////////////////////////////////////////////////////////////
/* VNH2SP30 pin definitions*/
int inApin[2] = {
51, 52
}; // INA: Clockwise input
int inBpin[2] = {
53, 54
}; // INB: Counter-clockwise input
int pwmpin[2] = {
5, 6
}; // PWM input
int cspin[2] = {
2, 3
}; // CS: Current sense ANALOG input
int enpin[2] = {
0, 1
}; // EN: Status of switches output (Analog pin)
int statpin = 13; //not explained by Sparkfun
/* init position value*/
int DataValueL = 512; //middle position 0-1024
int DataValueR = 512; //middle position 0-1024
int speedpin1 = 42;
int speedpin2 = 43;
const byte gapSteps = 5;
// max values for OFF, Speed 1, Speed 2, ...
const int gapRangeL[gapSteps] = { 50, 75, 150, 175, 200 };
const int gapRangeR[gapSteps] = { 50, 75, 150, 175, 200 };
////////////////////////////////////////////////////////////////////////////////
// INITIALIZATION
////////////////////////////////////////////////////////////////////////////////
void setup()
{
pinMode(speedpin1, OUTPUT);
pinMode(speedpin2, OUTPUT);
// serial initialization
Serial.begin(115200);
// initialization of Arduino's pins
pinMode(statpin, OUTPUT); //not explained by Sparkfun
digitalWrite(statpin, LOW);
for (int i = 0; i < 2; i++)
{
pinMode(inApin[i], OUTPUT);
pinMode(inBpin[i], OUTPUT);
pinMode(pwmpin[i], OUTPUT);
}
// Initialize braked for motor
for (int i = 0; i < 2; i++)
{
digitalWrite(inApin[i], LOW);
digitalWrite(inBpin[i], LOW);
digitalWrite(speedpin1, LOW);
digitalWrite(speedpin2, LOW);
}
}
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////// Main Loop ////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void loop()
{
readSerialData(); // DataValueR & L contain the last order received (if there is no newer received, the last is kept)
// the previous order will still be used by the PID regulation MotorMotion Function
int sensorR = analogRead(potR); // range 0-1023
int sensorL = analogRead(potL); // range 0-1023
motorMotion(motRight, sensorR, DataValueR, gapRangeR);
motorMotion(motLeft, sensorL, DataValueL, gapRangeL);
}
////////////////////////////////////////////////////////////////////////////////
// Procedure: wait for complete trame
////////////////////////////////////////////////////////////////////////////////
void readSerialData()
{
byte Data[3] = {
'0', '0', '0'
};
// keep this function short, because the loop has to be short to keep the control over the motors
if (Serial.available() > 2) {
//parse the buffer : test if the byte is the first of the order "R"
Data[0] = Serial.read();
if (Data[0] == 'L') {
Data[1] = Serial.read();
Data[2] = Serial.read();
// call the function that converts the hexa in decimal and that maps the range
DataValueR = NormalizeData(Data);
}
if (Data[0] == 'R') {
Data[1] = Serial.read();
Data[2] = Serial.read();
// call the function that converts the hexa in decimal and maps the range
DataValueL = NormalizeData(Data);
}
}
if (Serial.available() > 16) Serial.flush();
}
////////////////////////////////////////////////////////
void motorMotion(int numMot, int actualPos, int targetPos, const int gapRange[gapSteps])
////////////////////////////////////////////////////////
{
int Tol = gapRange[0]; // no order to move will be sent to the motor if the target is close to the actual position
// this prevents short jittering moves
//could be a parameter read from a pot on an analogic pin
// the highest value, the calmest the simulator would be (less moves)
int pwm = 128;
int brakingDistance = 0;
// security concern : targetPos has to be within the mechanically authorized range
targetPos = constrain(targetPos, potMini + brakingDistance, potMaxi - brakingDistance);
int gap = abs(targetPos - actualPos);
if (gap <= Tol) {
Serial.print("Gap <= "); Serial.println(gapRange[0]);
motorOff(numMot); //too near to move
}
else {
// PID : calculates speed according to distance
if (gap > gapRange[4]) {
Serial.print("Gap > "); Serial.println(gapRange[4]);
digitalWrite(speedpin1, LOW);
digitalWrite(speedpin2, LOW);
}
else if (gap > gapRange[3]) {
Serial.print("Gap > "); Serial.println(gapRange[3]);
digitalWrite(speedpin1, LOW);
digitalWrite(speedpin2, HIGH);
}
else if (gap > gapRange[2]) {
Serial.print("Gap > "); Serial.println(gapRange[2]);
digitalWrite(speedpin1, HIGH);
digitalWrite(speedpin2, LOW);
}
else if (gap > gapRange[1]) {
Serial.print("Gap > "); Serial.println(gapRange[1]);
digitalWrite(speedpin1, HIGH);
digitalWrite(speedpin2, HIGH);
}
// if motor is outside from the range, send motor back to the limit !
// go forward (up)
if ((actualPos < potMini) || (actualPos < targetPos)) {
Serial.print("Go forward");
motorGo(numMot, FW, pwm);
}
// go reverse (down)
else if ((actualPos > potMaxi) || (actualPos > targetPos)) {
Serial.print("Go reverse");
motorGo(numMot, RV, pwm);
}
}
}
////////////////////////////////////////////////////////////////////////////////
void motorOff(int motor) { //Brake Ground : free wheel actually
////////////////////////////////////////////////////////////////////////////////
digitalWrite(inApin[motor], LOW);
digitalWrite(inBpin[motor], LOW);
analogWrite(pwmpin[motor], 0);
}
////////////////////////////////////////////////////////////////////////////////
void motorOffBraked(int motor) { // "brake VCC" : short-circuit inducing electromagnetic brake
////////////////////////////////////////////////////////////////////////////////
digitalWrite(inApin[motor], HIGH);
digitalWrite(inBpin[motor], HIGH);
analogWrite(pwmpin[motor], 0);
}
////////////////////////////////////////////////////////////////////////////////
void motorGo(uint8_t motor, uint8_t direct, uint8_t pwm)
////////////////////////////////////////////////////////////////////////////////
{
if (motor <= 1)
{
if (direct <= 4)
{
// Set inA[motor]
if (direct <= 1)
digitalWrite(inApin[motor], HIGH);
else
digitalWrite(inApin[motor], LOW);
// Set inB[motor]
if ((direct == 0) || (direct == 2))
digitalWrite(inBpin[motor], HIGH);
else
digitalWrite(inBpin[motor], LOW);
analogWrite(pwmpin[motor], pwm);
}
}
}
////////////////////////////////////////////////////////////////////////////////
void motorDrive(uint8_t motor, uint8_t direct, uint8_t pwm)
////////////////////////////////////////////////////////////////////////////////
{
// more readable function than Jim's (for educational purpose)
// but 50 octets heavier -> unused
if (motor <= 1 && direct <= 4)
{
switch (direct) {
case 0: //electromagnetic brake : brake VCC
digitalWrite(inApin[motor], HIGH);
digitalWrite(inBpin[motor], HIGH);
break;
case 3: //Brake Ground (free wheel)
digitalWrite(inApin[motor], LOW);
digitalWrite(inBpin[motor], LOW);
break;
case 1: // forward : beware it's depending on your hardware wiring
digitalWrite(inApin[motor], HIGH);
digitalWrite(inBpin[motor], LOW);
break;
case 2: // Reverse : beware it's depending on your hardware wiring
digitalWrite(inApin[motor], LOW);
digitalWrite(inBpin[motor], HIGH);
break;
}
analogWrite(pwmpin[motor], pwm);
}
}
////////////////////////////////////////////////////////////////////////////////
// testPot
////////////////////////////////////////////////////////////////////////////////
void testPot() {
}
////////////////////////////////////////////////////////////////////////////////
void testpulse() {
int pw = 120;
while (true) {
motorGo(motLeft, FW, pw);
delay(250);
motorOff(motLeft);
delay(250);
motorGo(motLeft, RV, pw);
delay(250);
motorOff(motLeft);
delay(500);
motorGo(motRight, FW, pw);
delay(250);
motorOff(motRight);
delay(250);
motorGo(motRight, RV, pw);
delay(250);
motorOff(motRight);
Serial.println("testpulse pwm:80");
delay(500);
}
}
////////////////////////////////////////////////////////////////////////////////
// Function: convert Hex to Dec
////////////////////////////////////////////////////////////////////////////////
int NormalizeData(byte x[3])
////////////////////////////////////////////////////////////////////////////////
{
int result;
if ((x[2] == 13) || (x[2] == 'R') || (x[2] == 'L')) //only a LSB and Carrier Return or 'L' or 'R' in case of value below 16 (ie one CHAR and not 2)
{
x[2] = x[1]; //move MSB to LSB
x[1] = '0'; //clear MSB
}
for (int i = 1; i < 3; i++)
{
if (x[i] > 47 && x[i] < 58 ) { //for x0 to x9
x[i] = x[i] - 48;
}
if (x[i] > 64 && x[i] < 71 ) { //for xA to xF
x[i] = (x[i] - 65) + 10;
}
}
// map the range from Xsim (0 <-> 255) to the mechanically authorized range (potMini <-> potMaxi)
result = map((x[1] * 16 + x[2]), 0, 255, potMini, potMaxi);
return result;
}
but your code still has lots of other issues. For example Serial.flush()
isn't doing what you think.