DualVNH5019MotorShield motors;
char LED1 = 5;
char LED2 = 3;
void setup()
{
Serial.begin(115200);
motors.init();
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
}
uint8_t ReceiveBuffer[64];
int AR_STATE = 0;
char unlock = 17;
char starter = 29;
char terminator = 30;
static const char arm_motorshield = 0;
static const char get_milliamps = 1;
static const char get_fault = 2;
static const char set_brakes = 3;
static const char set_speed = 4;
static const char set_brakes_A = 5;
static const char set_brakes_B = 6;
static const char set_speed_A = 7;
static const char set_speed_B = 8;
static const char echo_data = 9;
static const char set_max_speed = 10;
static const char I_AM_ALIVE = 111;
static const char CONNECTION_OK = 69;
static const char UN_ARM = 33;
class AliveTime
{
unsigned long LastAliveTick;
unsigned long ConnectionOk;
public:
AliveTime()
{
LastAliveTick = millis();
ConnectionOk = LastAliveTick;
}
void IAmAlive()
{
LastAliveTick = millis();
}
unsigned long GetElapsed()
{
return millis() - LastAliveTick;
}
void ConnectionCheck()
{
ConnectionOk = millis();
}
unsigned long ConnectionOkElapsed()
{
return millis() - ConnectionOk;
}
} AliveTimer;
//starter action data1 data2 data3 data4 terminator|7
char ACTION_TO_DO;
int Value_One;
int Value_Two;
#define MULTI_TO_INT(a,b) ((ReceiveBuffer[a] << 8) & ReceiveBuffer[b])
#define INT_TO_MULTI(a,b,c) {ReceiveBuffer[a] = ((c & 0xFF00) >> 8); ReceiveBuffer[b] = (c & 0xFF);}
void SafetyChecks()
{
if (motors.getM1CurrentMilliamps() > 13000)
{
motors.setM1Speed(0);
}
if (motors.getM2CurrentMilliamps() > 13000)
{
motors.setM2Speed(0);
}
if (AliveTimer.GetElapsed() > 1000)
{
motors.setBrakes(maximumspeed, maximumspeed);
}
if (AliveTimer.ConnectionOkElapsed() > 1000)
{
AliveTimer.ConnectionCheck();
ReceiveBuffer[0] = starter;
ReceiveBuffer[1] = CONNECTION_OK;
ReceiveBuffer[6] = terminator;
//Serial.write(ReceiveBuffer, 7);
Value_One = motors.getM1CurrentMilliamps();
Value_Two = motors.getM2CurrentMilliamps();
ReceiveBuffer[7] = starter;
ReceiveBuffer[8] = get_milliamps;
INT_TO_MULTI(9, 10, Value_One);
INT_TO_MULTI(11, 12, Value_Two);
ReceiveBuffer[13] = terminator;
//Serial.write(ReceiveBuffer, 7);
ReceiveBuffer[14] = starter;
ReceiveBuffer[15] = get_fault;
ReceiveBuffer[16] = motors.getM1Fault();
ReceiveBuffer[17] = motors.getM2Fault();
ReceiveBuffer[18] = 0;
ReceiveBuffer[19] = 0;
ReceiveBuffer[20] = terminator;
Serial.write(ReceiveBuffer, 21);
}
}
void Tick()
{
while (Serial.available() >= 7 && AR_STATE)
{
if (Serial.read() == starter)
{
Serial.readBytes((char*)&ReceiveBuffer[0], 6);
if (ReceiveBuffer[5] == terminator)
{
ACTION_TO_DO = ReceiveBuffer[0];
switch (ACTION_TO_DO)
{
case get_milliamps:
{
Value_One = motors.getM1CurrentMilliamps();
Value_Two = motors.getM2CurrentMilliamps();
ReceiveBuffer[0] = starter;
ReceiveBuffer[1] = ACTION_TO_DO;
INT_TO_MULTI(2, 3, Value_One);
INT_TO_MULTI(4, 5, Value_Two);
ReceiveBuffer[6] = terminator;
Serial.write(ReceiveBuffer, 7);
break;
}
case get_fault:
{
ReceiveBuffer[0] = starter;
ReceiveBuffer[1] = ACTION_TO_DO;
ReceiveBuffer[2] = motors.getM1Fault();
ReceiveBuffer[3] = motors.getM2Fault();
ReceiveBuffer[4] = 0;
ReceiveBuffer[5] = 0;
ReceiveBuffer[6] = terminator;
Serial.write(ReceiveBuffer, 7);
break;
}
case set_brakes:
{
Value_One = MULTI_TO_INT(1, 2);
Value_Two = MULTI_TO_INT(3, 4);
motors.setBrakes(Value_One, Value_Two);
break;
}
case set_speed:
{
Value_One = MULTI_TO_INT(1, 2);
Value_Two = MULTI_TO_INT(3, 4);
motors.setSpeeds(Value_One, Value_Two);
break;
}
case set_brakes_A:
{
Value_One = MULTI_TO_INT(1, 2);
motors.setM1Brake(Value_One);
break;
}
case set_brakes_B:
{
Value_One = MULTI_TO_INT(1, 2);
motors.setM2Brake(Value_One);
break;
}
case set_speed_A:
{
Value_One = MULTI_TO_INT(1, 2);
motors.setM1Speed(Value_One);
break;
}
case set_speed_B:
{
Value_One = MULTI_TO_INT(1, 2);
motors.setM2Speed(Value_One);
break;
}
case echo_data:
{
ReceiveBuffer[1] = ReceiveBuffer[0];
ReceiveBuffer[2] = ReceiveBuffer[1];
ReceiveBuffer[3] = ReceiveBuffer[2];
ReceiveBuffer[4] = ReceiveBuffer[3];
ReceiveBuffer[5] = ReceiveBuffer[4];
ReceiveBuffer[0] = starter;
ReceiveBuffer[6] = terminator;
Serial.write(ReceiveBuffer, 7);
break;
}
case I_AM_ALIVE:
{
AliveTimer.IAmAlive();
break;
}
case arm_motorshield:
{
Serial.print("UNLOCKOK-5AE3C2\0");
break;
}
case UN_ARM:
{
Value_One = MULTI_TO_INT(1, 2);
Value_Two = MULTI_TO_INT(3, 4);
if (Value_One == 5000 && Value_Two == 3333)
{
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
motors.setSpeeds(0, 0);
AR_STATE = 0;
}
}
case set_max_speed:
{
Value_One = MULTI_TO_INT(1, 2);
Value_Two = abs(Value_One);
if (Value_Two > 400)
{
Value_Two = 400;
}
maximumspeed = Value_Two;
}
default:
{
}
}
}
}
SafetyChecks();
}
SafetyChecks();
}
void loop()
{
if (AR_STATE)
{
Tick();
}
else
{
while (Serial.available() >= 7)
{
if (Serial.read() == starter)
{
char tempbuffer[6];
Serial.readBytes(&tempbuffer[0], 6);
if (tempbuffer[0] == arm_motorshield && (tempbuffer[1] == unlock || tempbuffer[2] == unlock || tempbuffer[3] == unlock || tempbuffer[4] == unlock) && tempbuffer[5] == terminator)
{
AR_STATE = 1;
Serial.print("UNLOCKOK-5AE3C2\0");
digitalWrite(LED1, LOW);
digitalWrite(LED2, HIGH);
}
else
{
Serial.print("ARDUINO IS LOCKED\r\n");
digitalWrite(LED1, LOW);
delay(50);
digitalWrite(LED1, HIGH);
delay(50);
digitalWrite(LED1, LOW);
delay(50);
digitalWrite(LED1, HIGH);
delay(50);
digitalWrite(LED1, LOW);
delay(50);
digitalWrite(LED1, HIGH);
}
}
}
}
}