Bluetooth Controlled Direction and Gripper Sketch
This Arduino sketch allows the robot to be controlled by a smartphone via bluetooth communication. In order to complete this challenge, the robot needed to be maneuvered to the end of an L shaped track in order to retrieve a rubber ball. The ball then needed to be returned to the starting area in order to drop the ball into a receptacle. This process needed to be completed three times in a row without touching the robot in order to complete this challenge.
Arduino Sketch
//********************************************SUMMARY************************************************
// This sketch is the program designed to control the robot to navigate the ball portion of the
// obsticle course. It will communicate with a bluetooth cell phone from which it will recieve input
// to control the speed, and direction of the robot as well as to minipulate the gripper at the front
// of the robot.
//******************************LIBRARIES THAT ARE TO BE INCLUDED************************************
#include <Adafruit_MotorShield.h>
#include <Gripper.h>
#include <MegaServo.h>
#include <motor.h>
#include <SoftwareSerial.h>
//*******************CREATE THE MOTOR SHIELD OBJECT WITH THE DEFAULT I2C ADDRESS*********************
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
//*****************************GLOBAL CONSTANTS ARE DECLARED HERE************************************
const int DELAY_TIME = 1000;
const float UNIT_CONVERSION = 0.003937; //Converts whatever unit pops out for the range finder to in
const byte rxPin = 18;
const byte txPin = 19;
//*****************************GLOBAL VARIABLES ARE DECLARED HERE************************************
char message[256];
int index = 0;
//**********************************POINTERS ARE DECLARED HERE***************************************
Gripper *openGrip;// = new Gripper(36);
MegaServo myGripper;
motor *RFMotor = new motor(&AFMS, 1, 0); //right front
motor *LFMotor = new motor(&AFMS, 2, 1); //left front
motor *LRMotor = new motor(&AFMS, 3, 1); //left rear
motor *RRMotor = new motor(&AFMS, 4, 0); //right rear
SoftwareSerial BTSerial(rxPin, txPin);
//===================================================================================================
//=========================================SETUP STARTS HERE=========================================
//===================================================================================================
void setup() {
pinMode(rxPin, INPUT);
pinMode(txPin, OUTPUT);
Serial.begin(38400); // Usually 9600 for BT mode, although it is sometimes 38400:
Serial1.begin(115200);
AFMS.begin();
Serial.println("test");
openGrip = new Gripper(36);
Gripper(22);
delay(1000); // delay for 1 second before moving on
openGrip -> close(); // call the close() function from the .cpp file to close the gripper.
}
//===================================================================================================
//==========================================LOOP STARTS HERE=========================================
//===================================================================================================
void loop() {
if (Serial1.available()) {
message[index] = (char)Serial1.read();
if (message[index] == 0x3F) //Checks for a ? character
{
switch (message[0]) { // was previously message[0]
case '1':
Serial.print("Button 1 Pressed");
LFMotor->setDrive(60.0, FORWARD);
LRMotor->setDrive(60.0, FORWARD);
RFMotor->setDrive(150.0, FORWARD);
RRMotor->setDrive(150.0, FORWARD);
break;
case '2':
Serial.print("Button 2 Pressed");
LFMotor->setDrive(125.0, FORWARD);
LRMotor->setDrive(125.0, FORWARD);
RFMotor->setDrive(132.0, FORWARD);
RRMotor->setDrive(132.0, FORWARD);
break;
case '3':
Serial.print("Button 3 Pressed");
LFMotor->setDrive(130.0, FORWARD);
LRMotor->setDrive(130.0, FORWARD);
RFMotor->setDrive(65.0, FORWARD);
RRMotor->setDrive(65.0, FORWARD);
break;
case '4':
Serial.print("Button 4 Pressed");
LFMotor->setDrive(60.0, BACKWARD);
LRMotor->setDrive(60.0, BACKWARD);
RFMotor->setDrive(60.0, FORWARD);
RRMotor->setDrive(60.0, FORWARD);
break;
case '5':
Serial.print("Button 5 Pressed");
if (openGrip->isOpen()) {
openGrip->close();
}
else {
openGrip->open();
}
break;
case '6':
Serial.print("Button 6 Pressed");
LFMotor->setDrive(60.0, FORWARD);
LRMotor->setDrive(60.0, FORWARD);
RFMotor->setDrive(60.0, BACKWARD);
RRMotor->setDrive(60.0, BACKWARD);
break;
case '7':
Serial.print("Button 7 Pressed");
LFMotor->setDrive(60.0, BACKWARD);
LRMotor->setDrive(60.0, BACKWARD);
RFMotor->setDrive(120.0, BACKWARD);
RRMotor->setDrive(120.0, BACKWARD);
break;
case '8':
Serial.print("Button 8 Pressed");
LFMotor->setDrive(130.0, BACKWARD);
LRMotor->setDrive(130.0, BACKWARD);
RFMotor->setDrive(120.0, BACKWARD);
RRMotor->setDrive(120.0, BACKWARD);
break;
case '9':
Serial.print("Button 9 Pressed");
LFMotor->setDrive(150.0, BACKWARD);
LRMotor->setDrive(150.0, BACKWARD);
RFMotor->setDrive(60.0, BACKWARD);
RRMotor->setDrive(60.0, BACKWARD);
break;
default :
Serial.print("BREAK");
break;
}
index = 0;
Serial.println();
}
else if (message[index] == 0x24) { //Checks for a $ character
switch (message[0]) {
case '1':
Serial.print("Button 1 Released");
LFMotor->stop();
LRMotor->stop();
RFMotor->stop();
RRMotor->stop();
break;
case '2':
Serial.print("Button 2 Released");
LFMotor->stop();
LRMotor->stop();
RFMotor->stop();
RRMotor->stop();
break;
case '3':
Serial.print("Button 3 Released");
LFMotor->stop();
LRMotor->stop();
RFMotor->stop();
RRMotor->stop();
break;
case '4':
Serial.print("Button 4 Released");
LFMotor->stop();
LRMotor->stop();
RFMotor->stop();
RRMotor->stop();
break;
case '5':
Serial.print("Button 5 Released");
break;
case '6':
Serial.print("Button 6 Released");
LFMotor->stop();
LRMotor->stop();
RFMotor->stop();
RRMotor->stop();
break;
case '7':
Serial.print("Button 7 Released");
LFMotor->stop();
LRMotor->stop();
RFMotor->stop();
RRMotor->stop();
break;
case '8':
Serial.print("Button 8 Released");
LFMotor->stop();
LRMotor->stop();
RFMotor->stop();
RRMotor->stop();
break;
case '9':
Serial.print("Button 9 Released");
LFMotor->stop();
LRMotor->stop();
RFMotor->stop();
RRMotor->stop();
break;
default:
Serial.print("BREAK");
break;
}
index = 0;
Serial.println();
}
else {
index++; //Increases the index counter by one if neither a ? or a $ was encountered.
}
}
}
//===================================================================================================
//=======================================COMMANDS CHEAT SHEET========================================
//===================================================================================================
//**********************************************ENCODER**********************************************
// encoder(unsigned int slots, unsigned int diameter, unsigned int pin)
// void updateTime(unsigned int time) //function to update the current time from the internal timer
// double getSpeed() //calculate the speed
// void zeroSpeed(); //set the speed to zero
//**********************************************GRIPPER**********************************************
// gripper(unsigned int pin); //Constructor, pin attached
// void open(); //no return
// void close(); //no return
// bool isOpen(); //returns what state the gripper is in
//********************************************LINECONTROL********************************************
// lineControl(linesensor *leftPTR, linesensor *rightPTR, speedcontrol *leftSpeed, speedcontrol *rightSpeed);
// void detectNone();
// void updateSpeed();
// void detectLeft();
// void detectRight();
//*********************************************LINESENSOR********************************************
// linesensor(unsigned in pin, byt sensornumber);
// bool linestatus();
//***********************************************MOTOR***********************************************
// motor(Adafruit_MotorShield*shieldPtr,byte motorNumber, boolean polarity);
// void setDrive(unsigned int dutyCycle, unsigned int command) // set the motor's direction
// void stop(); // emergency stop - Set speed to zero
// unsigned int getDrive(); // returns the speed
//**********************************************RANGE_ECHO*******************************************
// Range_Echo(int TP, int EP);
// long Timing(); // calculates the distance for which the object is from the sensor
// long Ranging(int sys); // sets the units, SYS for centameters, INC for inches
//*********************************************SPEEDCONTROL******************************************
// speedcontrol(HardwareSerial *port, encoder *encoderPtr, motor *motorPtr1, motor *motorPtr2,double sampleTime);
// void setDesiredSpeed(double speed); // sets the desired speed
// double getDesiredSpeed(); // returns the value of the desired speed
// void enable(); // sets the internal enable flag to 1
// void disable(); // sets the internal enable flag to 0
// void update(); // calculates the current speed
// void setPGain(double gain);
// void setIGain(double gain);
// void setDGain(double gain);
// void setILimit(double limit);