I am in the process to build a rover 5 with the SFE joystick remote, today i spent most of the day trying to get communication working between remote and rover and with the help op Paul and AWOL got that working but now i have another problem and need advice
the rover 5 has tracks so turning left or right is a combination of motors moving. ( my rover has 4 motors)
the problem is I had switch cases setup to switch bewteen left ,right,forward and back. but my problem was every time i entered one of the switch cases it would not exit after the joystick centered again. (confirmed the switch case trigger does go back to the stop position ) but the motors will keep on running in a a direction until i reset the board.
Now what i have noticed from debugging is that when the rover code enters a switch the communication stops. since then i have tried if statements but also with limited success. Receiver code below
#include <VirtualWire.h>
int RX_ID;
int TX_ID =3;
#define MDir1 2 // Direction ch1 front right motor
#define MDir2 8 // Direction ch2 front left motor
#define MDir3 4 // Direction ch3 back right motor
#define MDir4 7 // Direction ch4 back left motor
#define MSpeed1 3 //Speed Ch1
#define MSpeed2 5 //Speed Ch2
#define MSpeed3 6 //Speed Ch3
#define MSpeed4 9 //Speed Ch4
typedef struct roverRemoteData
{
int TX_ID;
int Speed;// The variable were the data from each sensor
int Direction;// will be stored
int Sensor3Data;
int Sensor4Data;
int Sensor5Data;// will be stored
int Sensor6Data;
};
int Led_Tx = 12;
int Led_Rx = 13;
void setup() {
Serial.begin(9600);
pinMode(Led_Tx,OUTPUT);
pinMode(Led_Rx,OUTPUT);
pinMode(MDir1,OUTPUT);
pinMode(MDir2,OUTPUT);
pinMode(MDir3,OUTPUT);
pinMode(MDir4,OUTPUT);
pinMode(MSpeed1,OUTPUT);
pinMode(MSpeed2,OUTPUT);
pinMode(MSpeed3,OUTPUT);
pinMode(MSpeed4,OUTPUT);
vw_setup(4000);
vw_set_rx_pin(11);
vw_rx_start();
}
void loop()
{
// struct roverRemoteData receivedData;
struct roverRemoteData receivedData;
uint8_t rcvdSize = sizeof(receivedData);
if (vw_get_message((uint8_t *)&receivedData, &rcvdSize))
{
if (receivedData.TX_ID == 3)
{
if(receivedData.Direction == 0)
{
Serial.println("Stopped");
digitalWrite(MDir1,0);
digitalWrite(MDir2,0);
analogWrite (MSpeed1,receivedData.Speed);
analogWrite (MSpeed2,receivedData.Speed);
digitalWrite(MDir3,0);
digitalWrite(MDir4,0);
analogWrite (MSpeed3,receivedData.Speed);
analogWrite (MSpeed4,receivedData.Speed);
}
if(receivedData.Direction == 2)
{
Serial.println("Forward");
digitalWrite(MDir1,0);
digitalWrite(MDir2,0);
digitalWrite(MDir3,1);
digitalWrite(MDir4,1);
analogWrite(MSpeed1,receivedData.Speed);
analogWrite(MSpeed2,receivedData.Speed);
analogWrite(MSpeed3,receivedData.Speed);
analogWrite(MSpeed4,receivedData.Speed);
}
if(receivedData.Direction == 3)
{
Serial.println("Left");
digitalWrite(MDir1,0);
digitalWrite(MDir2,1);
digitalWrite(MDir3,1);
digitalWrite(MDir4,0);
analogWrite (MSpeed1,receivedData.Speed);
analogWrite (MSpeed2,(receivedData.Speed-(receivedData.Speed/2)));
analogWrite (MSpeed3,receivedData.Speed);
analogWrite (MSpeed4,(receivedData.Speed-(receivedData.Speed/2)));
}
if(receivedData.Direction == 4)
{
Serial.println("Right");
Serial.println("Right");
digitalWrite(MDir1,1);
digitalWrite(MDir2,0);
digitalWrite(MDir3,0);
digitalWrite(MDir4,1);
analogWrite (MSpeed1,(receivedData.Speed-(receivedData.Speed/2)));
analogWrite (MSpeed2,receivedData.Speed);
analogWrite (MSpeed3,(receivedData.Speed-(receivedData.Speed/2)));
analogWrite (MSpeed4,receivedData.Speed);
}
if(receivedData.Direction == 1)
{
Serial.println("Back");
digitalWrite(MDir1,1);
digitalWrite(MDir2,1);
analogWrite(MSpeed1,receivedData.Speed);
analogWrite(MSpeed2,receivedData.Speed);
digitalWrite(MDir3,0);
digitalWrite(MDir4,0);
analogWrite(MSpeed3,receivedData.Speed);
analogWrite(MSpeed4,receivedData.Speed);
}
delay(50);
}
else
{
Serial.println(" ID Does not match waiting for next transmission ");
// memset( StringReceived, 0, sizeof( StringReceived));
}
//Serial.println(StringReceived);
// memset( StringReceived, 0, sizeof( StringReceived));
}
}
