Here is the code for the rover:
#include <Servo.h>
#include <EasyTransfer.h>
//create two objects
EasyTransfer ETin, ETout;
//create servo
Servo pan;
Servo tilt;
int E1 = 6; //M1 Speed Control
int E2 = 5; //M2 Speed Control
int M1 = 8; //M1 Direction Control
int M2 = 7; //M2 Direction Control
const int light1 = 3;
const int light12 = 2;
const int camera1 = 12;
const int camera12 = 4;
const int motionSensorReceive=13;
const int sonarPin=11;
int leftspeed = 255;//Motor speed settings
int rightspeed = 255;//255 is maximum speed
int light=HIGH;
int manual=HIGH;
int camera=HIGH;
int alarmState=0;
int inches=0;
char drive;
unsigned long value=0;
struct RECEIVE_DATA_STRUCTURE{
//put your variable definitions here for the data you want to receive
//THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO
int cameraOn;
int lightOn;
int manualDrive;
int pan;
int tilt;
char drFR;
int count;
};
struct SEND_DATA_STRUCTURE{
//put your variable definitions here for the data you want to receive
//THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO
int alarm;
};
//give a name to the group of data
RECEIVE_DATA_STRUCTURE rxdata;
SEND_DATA_STRUCTURE txdata;
void setup(){
Serial.begin(9600);
//start the library, pass in the data details and the name of the serial port. Can be Serial, Serial1, Serial2, etc.
ETin.begin(details(rxdata), &Serial);
ETout.begin(details(txdata), &Serial);
pinMode(5, OUTPUT);//Motor pin setup
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(light1,OUTPUT);
pinMode(light12,OUTPUT);
pinMode(camera1, OUTPUT);
pinMode(camera12, OUTPUT);
pinMode(sonarPin,INPUT);
pinMode(motionSensorReceive, INPUT);
digitalWrite(motionSensorReceive,HIGH);//pullup
pan.attach(9);
tilt.attach(10);
//setup rover to all off and servos centered
pan.write(10);
tilt.write(30);
digitalWrite(camera1,HIGH);
delay(4);
digitalWrite(camera1,LOW);
delay(100);
digitalWrite(light1,HIGH);
delay(4);
digitalWrite(light1,LOW);
}
void loop(){
value=pulseIn(sonarPin, HIGH);
ETin.receiveData();
while(Serial.available()<0){
stop();
break;
}
while(Serial.available()>0){
manual=rxdata.manualDrive;
light=rxdata.lightOn;
camera=rxdata.cameraOn;
drive=rxdata.drFR;
pan.write(map(rxdata.pan, 0, 1023, 0, 179));
tilt.write(map(rxdata.tilt, 0, 1023, 0, 100));
while(camera==HIGH){//only turns light on when camera is on
digitalWrite(camera12,HIGH);
delay(2);
digitalWrite(camera12,LOW);
break;
}//end camera on
while(camera==LOW){//turns light off
digitalWrite(camera1,HIGH);
delay(2);
digitalWrite(camera1,LOW);
break;
}//end camera off
while(light==HIGH){//only turns light on when camera is on
digitalWrite(light12,HIGH);
delay(2);
digitalWrite(light12,LOW);
break;
}//end light on
while(light==LOW){//turns light off
digitalWrite(light1,HIGH);
delay(2);
digitalWrite(light1,LOW);
break;
}//end light off
while(manual==HIGH){
switch(drive) // Perform an action depending on the command
{
case 'w'://Move Forward
forward (leftspeed,rightspeed);
break;
case 's'://Move Backwards
reverse (leftspeed,rightspeed);
break;
case 'a'://Turn Left
left (leftspeed,rightspeed);
break;
case 'd'://Turn Right
right (leftspeed,rightspeed);
break;
case 'x':
stop();
default:
stop();
break;
} //end drive switch
break;
}//end manual drive high
while(manual==LOW){
stop();
while(rxdata.count==HIGH){
stop();
alarmState=digitalRead(motionSensorReceive);
if (alarmState==LOW)
txdata.alarm=HIGH;
else
txdata.alarm=LOW;
break;
}
while(rxdata.count==LOW){
txdata.alarm=LOW;
measureDistance(value);
autonomous (leftspeed,rightspeed,inches);
break;
}
break;
}//end manual drive low
ETout.sendData();
break;
}//end serial available
delay(50);//receive delay
}//end loop
void measureDistance(char b){
inches=value/147;
}
void autonomous(char a, char b, char c)
{
forward(leftspeed,rightspeed);
if(inches<=12)
right(leftspeed,rightspeed);
if(inches<=8)
reverse(leftspeed,rightspeed);
}//end autonomous
//drive functions taken from WASD file.
void stop(void) //Stop
{
digitalWrite(E1,LOW);
digitalWrite(E2,LOW);
}
void forward(char a,char b)
{
analogWrite (E1,a);
digitalWrite(M1,LOW);
analogWrite (E2,b);
digitalWrite(M2,LOW);
}
void reverse (char a,char b)
{
analogWrite (E1,a);
digitalWrite(M1,HIGH);
analogWrite (E2,b);
digitalWrite(M2,HIGH);
}
void left (char a,char b)
{
analogWrite (E1,a);
digitalWrite(M1,HIGH);
analogWrite (E2,b);
digitalWrite(M2,LOW);
}
void right (char a,char b)
{
analogWrite (E1,a);
digitalWrite(M1,LOW);
analogWrite (E2,b);
digitalWrite(M2,HIGH);
}