Final Version.

Dependencies:   Motor Servo mbed

main.cpp

Committer:
raj1995
Date:
2016-03-11
Revision:
0:8eae572f6d20

File content as of revision 0:8eae572f6d20:

/*

@Authors: Raj Patel, David Ehrlich
@Project: Bluetooth Controlled Robot with Dual Servo Sensor Actuated by Mobile Phone Accelerometer
@Date: 03/09/2016

*/

//include necessary header files for functionality. Specifically, need servo handlers.

#include "mbed.h"
#include "Servo.h"

Serial bluemod(p9,p10);     // Serial hookup for Bluetooth module
PwmOut left_led(LED3);      // PWM output for left robot direction signal
PwmOut right_led(LED4);     // PWM output for right robot direction signal
PwmOut forward_led(LED1);   // PWM output for forward robot direction signal
PwmOut reverse_led(LED2);   // PWM output for reverse robot direction signal
Servo myservolr(p21);       // Signal for left/right servo
Servo myservoud(p22);       // Signal for up/down servo
AnalogIn sensor(p15);       // Signal for Sharp IR Sensor

 PwmOut speedA(p23);        // PWM Speed pin for Motor A
 DigitalOut fwdA(p17);      // Digital out signal for forward direction for Motor A
 DigitalOut revA(p18);      // Digital out signal for reverse direction for Motor A
 
 PwmOut speedB(p24);        // PWM Speed pin for Motor B
 DigitalOut fwdB(p20);      // Digital out signal for forward direction for Motor B
 DigitalOut revB(p19);      // Digital out signal for reverse direction for Motor B
 
 
 volatile char exc;     // Variable to keep track of ! when seen in BT stream
 volatile char letter;  // Varibale to keep track of character after ! in BT stream (A for accelerometer, B for buttons)
 
//C union can convert 4 chars to a float - puts them in same location in memory
//trick to pack the 4 bytes from Bluetooth serial port back into a 32-bit float
union f_or_char {
    float f;
    char  c[4];
};
 
int main()
{
    char bchecksum=0;   // Checksum variable
    char temp=0;        // Temporary variable to hold BT stream data
    union f_or_char x,y,z;  // Templatized containers for x, y, and z accelerometer readings
    float adjlr = 0;        // Servo position variable for left/right servo
    float adjud = 0;        // Servo position variable for up/down servo
    while(1) {
        float sensorValue = sensor.read();
        //printf("Sensor: %2.2f\n\r", sensorValue);
        bchecksum=0;
        exc = bluemod.getc();       // Get the first character in the bluetooth packet
        if (exc=='!'){              // First character was ! meaning it could be !A or !B
            letter = bluemod.getc();    // Get the next character in the bluetooth packet after the !
            switch (letter) { 
            case 'A':{  // If the next character is A, it is an Accelerometer data packet
                for (int i=0; i<4; i++) {
                    temp = bluemod.getc();
                    x.c[i] = temp;              // Get x direction Accelerometer data
                    bchecksum = bchecksum + temp;   
                }
                for (int i=0; i<4; i++) {
                    temp = bluemod.getc();
                    y.c[i] = temp;              // Get y direction Accelerometer data
                    bchecksum = bchecksum + temp;
                }
                for (int i=0; i<4; i++) {
                    temp = bluemod.getc();
                    z.c[i] = temp;              // Get z direction Accelerometer data
                    bchecksum = bchecksum + temp;
                }
                if (bluemod.getc()==char(~('!' + 'A' + bchecksum))) { //checksum OK? Then proceed.                    
                    
                    // Both segments of the below code in this 'if' statement handle actuating the dual servo setup
                    
                    // Below code segment handles left/right movement
                    if (y.f < -0.05 && y.f >= -0.10){
                        adjlr += 0.01;          // If the y direction shows a small negative value, move left slowly
                    }
                    if (y.f < -0.10 && y.f >= -0.25){
                        adjlr += 0.05;          // If the y direction shows a medium negative value, move left faster
                    }
                    if (y.f < -0.25){
                        adjlr += 0.09;          // If the y direction shows a large negative value, move left fastest
                    }
                    if (y.f > 0.05 && y.f <= 0.10){
                        adjlr += -0.01;         // If the y direction shows a small positive value, move right slowly
                    }
                    if (y.f > 0.10 && y.f <= 0.25){
                        adjlr += -0.05;         // If the y direction shows a  medium positive value, move right faster
                    }
                    if (y.f > 0.25){
                        adjlr += -0.09;         // If the y direction shows a large positive value, move right fastest
                    }
                    if (adjlr < 0){
                        adjlr = 0;          // If the value becomes less than 0, cap at 0
                    }else{
                        if (adjlr > 1){
                            adjlr = 1;      // If the value becomes greater than 1, cap at 1
                        }
                    }
                    
                    // Below code handles up/down movement                    
                    if (x.f < -0.05 && x.f >= -0.2){
                        adjud += -0.01;     // If the x direction shows a small negative value, move up slowly
                    }
                    if (x.f < -0.2 && x.f >= -0.40){
                        adjud += -0.05;     // If the x direction shows a medium negative value, move up faster
                    }
                    if (x.f < -0.4){
                        adjud += -0.09;     // If the x direction shows a large negative value, move up fastest
                    }
                    if (x.f > 0.05 && x.f <= 0.2){
                        adjud += 0.01;      // If the x direction shows a small positive value, move down slowly
                    }   
                    if (x.f > 0.2 && x.f <= 0.40){
                        adjud += 0.05;      // If the x direction shows a medium positive value, move down faster
                    }
                    if (x.f > 0.40){
                        adjud += 0.09;      // If the x direction shows a large positive value, move down fastest
                    }
                    if (adjud < 0){
                        adjud = 0;          // If the value becomes less than 0, cap at 0
                    }else{
                        if (adjud > 1){
                            adjud = 1;      // If the value becomes greater than 1, cap at 1
                        }
                    }
                    
                    myservolr = adjlr;      // Send adjusted left/right signal to left/right servo
                    myservoud = adjud;      // Send adjusted up/down signal to up/down servo
                    
                    
                }
                break;
            }
            char bnum;  //Initialize variables to use below
            char bhit;  //Initialize variables to use below
            
            case 'B':{  // If the next character is B, it is a Button data packet
            
                bnum = bluemod.getc(); //button number
                bhit = bluemod.getc(); //1=hit, 0=release
                if (bluemod.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK?
                    //myled = bnum - '0'; //current button number will appear on LEDs
                    switch (bnum) {
                        case '1': //number button 1
                            if (bhit=='1') {
                                // nop
                            } else {
                                // nop
                            }
                            break;
                        case '2': //number button 2
                            if (bhit=='1') {
                                // nop
                            } else {
                                // nop
                            }
                            break;
                        case '3': //number button 3
                            if (bhit=='1') {
                                // nop
                            } else {
                                // nop
                            }
                            break;
                        case '4': //number button 4
                            if (bhit=='1') {
                                // nop
                            } else {
                                // nop
                            }
                            break;
                        case '5': //button 5 up arrow
                            if (bhit=='1' && sensorValue <= 0.6) {
                                //forward                            
                                //hit button
                                forward_led=1;  //Set forward LED on MBED
                                fwdA = 1;       //Assert MotorA forward
                                revA = 0;       //Deassert MotorA reverse
                                speedA = 1;     //Set SpeedA to full
                                fwdB = 1;       //Assert MotorB forward
                                revB = 0;       //Deassert MotorB reverse
                                speedB = 1;     //Set SpeedB to full
                            } else {
                                //Let go of button
                                forward_led = 0;    //Turn off forward LED
                                speedA = 0;     // Turn off MotorA
                                speedB = 0;     // Turn off MotorB
                            }
                            break;
                        case '6': //button 6 down arrow
                            if (bhit=='1') {
                                //reverse
                                //hit button
                                reverse_led=1;  //Turn reverse LED on
                                fwdA = 0;       //Deassert MotorA forward   
                                revA = 1;       //Assert MotorA reverse
                                speedA = 1;     //MotorA full speed
                                fwdB = 0;       //Deassert MotorB forward
                                revB = 1;       //Assert MotorB reverse
                                speedB = 1;     //MotorB full speed
                                
                                
                            } else {
                                //let go of button
                                reverse_led=0;  //Turn reverse LED off
                                speedA = 0;     //Turn off MotorA
                                speedB = 0;     //Turn off MotorB
                            }
                            break;
                    case '7': //button 7 left arrow
                            if (bhit=='1') {
                                //ccw
                                //hit button
                               left_led=1;      //Turn left LED on
                                fwdA = 1;       //Assert MotorA forward
                                revA = 0;       //Deassert MotorA reverse
                                speedA = 1;     //MotorA full speed
                                fwdB = 0;       //Deassert MotorB forward
                                revB = 1;       //Assert MotorB reverse
                                speedB = 1;     //MotorB full speed
                                
                                
                            } else {
                                //let go of button
                                left_led=0;     //Turn left LED off
                                speedA = 0;     // Turn MotorA off
                                speedB = 0;     // Turn MotorB off
                            }
                            break;
                        case '8': //button 8 right arrow
                            if (bhit=='1') {
                                //cw
                                //hit button
                                right_led=1;    //Turn right LED on
                                fwdA = 0;       //Deassert MotorA forward
                                revA = 1;       //Assert MotorA reverse
                                speedA = 1;     //MotorA full speed
                                fwdB = 1;       //Assert MotorB forward
                                revB = 0;       //Deassert MotorB reverse
                                speedB = 1;     //MotorB full speed
                                
                            } else {
                                //let go of button
                                right_led=0;    //Turn right LED off
                                speedA = 0;     //Turn MotorA off
                                speedB = 0;     //Turn MotorB off
                            }
                            break;
                        default:
                            break;
                    }
                }                  
                break;
            }
            
            }
            
        }
    }
}