Raj Patel / Mbed 2 deprecated 4180_Lab_4_Basic

Dependencies:   Motor Servo mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /*
00002 
00003 @Authors: Raj Patel, David Ehrlich
00004 @Project: Bluetooth Controlled Robot with Dual Servo Sensor Actuated by Mobile Phone Accelerometer
00005 @Date: 03/09/2016
00006 
00007 */
00008 
00009 //include necessary header files for functionality. Specifically, need servo handlers.
00010 
00011 #include "mbed.h"
00012 #include "Servo.h"
00013 
00014 Serial bluemod(p9,p10);     // Serial hookup for Bluetooth module
00015 PwmOut left_led(LED3);      // PWM output for left robot direction signal
00016 PwmOut right_led(LED4);     // PWM output for right robot direction signal
00017 PwmOut forward_led(LED1);   // PWM output for forward robot direction signal
00018 PwmOut reverse_led(LED2);   // PWM output for reverse robot direction signal
00019 Servo myservolr(p21);       // Signal for left/right servo
00020 Servo myservoud(p22);       // Signal for up/down servo
00021 AnalogIn sensor(p15);       // Signal for Sharp IR Sensor
00022 
00023  PwmOut speedA(p23);        // PWM Speed pin for Motor A
00024  DigitalOut fwdA(p17);      // Digital out signal for forward direction for Motor A
00025  DigitalOut revA(p18);      // Digital out signal for reverse direction for Motor A
00026  
00027  PwmOut speedB(p24);        // PWM Speed pin for Motor B
00028  DigitalOut fwdB(p20);      // Digital out signal for forward direction for Motor B
00029  DigitalOut revB(p19);      // Digital out signal for reverse direction for Motor B
00030  
00031  
00032  volatile char exc;     // Variable to keep track of ! when seen in BT stream
00033  volatile char letter;  // Varibale to keep track of character after ! in BT stream (A for accelerometer, B for buttons)
00034  
00035 //C union can convert 4 chars to a float - puts them in same location in memory
00036 //trick to pack the 4 bytes from Bluetooth serial port back into a 32-bit float
00037 union f_or_char {
00038     float f;
00039     char  c[4];
00040 };
00041  
00042 int main()
00043 {
00044     char bchecksum=0;   // Checksum variable
00045     char temp=0;        // Temporary variable to hold BT stream data
00046     union f_or_char x,y,z;  // Templatized containers for x, y, and z accelerometer readings
00047     float adjlr = 0;        // Servo position variable for left/right servo
00048     float adjud = 0;        // Servo position variable for up/down servo
00049     while(1) {
00050         float sensorValue = sensor.read();
00051         //printf("Sensor: %2.2f\n\r", sensorValue);
00052         bchecksum=0;
00053         exc = bluemod.getc();       // Get the first character in the bluetooth packet
00054         if (exc=='!'){              // First character was ! meaning it could be !A or !B
00055             letter = bluemod.getc();    // Get the next character in the bluetooth packet after the !
00056             switch (letter) { 
00057             case 'A':{  // If the next character is A, it is an Accelerometer data packet
00058                 for (int i=0; i<4; i++) {
00059                     temp = bluemod.getc();
00060                     x.c[i] = temp;              // Get x direction Accelerometer data
00061                     bchecksum = bchecksum + temp;   
00062                 }
00063                 for (int i=0; i<4; i++) {
00064                     temp = bluemod.getc();
00065                     y.c[i] = temp;              // Get y direction Accelerometer data
00066                     bchecksum = bchecksum + temp;
00067                 }
00068                 for (int i=0; i<4; i++) {
00069                     temp = bluemod.getc();
00070                     z.c[i] = temp;              // Get z direction Accelerometer data
00071                     bchecksum = bchecksum + temp;
00072                 }
00073                 if (bluemod.getc()==char(~('!' + 'A' + bchecksum))) { //checksum OK? Then proceed.                    
00074                     
00075                     // Both segments of the below code in this 'if' statement handle actuating the dual servo setup
00076                     
00077                     // Below code segment handles left/right movement
00078                     if (y.f < -0.05 && y.f >= -0.10){
00079                         adjlr += 0.01;          // If the y direction shows a small negative value, move left slowly
00080                     }
00081                     if (y.f < -0.10 && y.f >= -0.25){
00082                         adjlr += 0.05;          // If the y direction shows a medium negative value, move left faster
00083                     }
00084                     if (y.f < -0.25){
00085                         adjlr += 0.09;          // If the y direction shows a large negative value, move left fastest
00086                     }
00087                     if (y.f > 0.05 && y.f <= 0.10){
00088                         adjlr += -0.01;         // If the y direction shows a small positive value, move right slowly
00089                     }
00090                     if (y.f > 0.10 && y.f <= 0.25){
00091                         adjlr += -0.05;         // If the y direction shows a  medium positive value, move right faster
00092                     }
00093                     if (y.f > 0.25){
00094                         adjlr += -0.09;         // If the y direction shows a large positive value, move right fastest
00095                     }
00096                     if (adjlr < 0){
00097                         adjlr = 0;          // If the value becomes less than 0, cap at 0
00098                     }else{
00099                         if (adjlr > 1){
00100                             adjlr = 1;      // If the value becomes greater than 1, cap at 1
00101                         }
00102                     }
00103                     
00104                     // Below code handles up/down movement                    
00105                     if (x.f < -0.05 && x.f >= -0.2){
00106                         adjud += -0.01;     // If the x direction shows a small negative value, move up slowly
00107                     }
00108                     if (x.f < -0.2 && x.f >= -0.40){
00109                         adjud += -0.05;     // If the x direction shows a medium negative value, move up faster
00110                     }
00111                     if (x.f < -0.4){
00112                         adjud += -0.09;     // If the x direction shows a large negative value, move up fastest
00113                     }
00114                     if (x.f > 0.05 && x.f <= 0.2){
00115                         adjud += 0.01;      // If the x direction shows a small positive value, move down slowly
00116                     }   
00117                     if (x.f > 0.2 && x.f <= 0.40){
00118                         adjud += 0.05;      // If the x direction shows a medium positive value, move down faster
00119                     }
00120                     if (x.f > 0.40){
00121                         adjud += 0.09;      // If the x direction shows a large positive value, move down fastest
00122                     }
00123                     if (adjud < 0){
00124                         adjud = 0;          // If the value becomes less than 0, cap at 0
00125                     }else{
00126                         if (adjud > 1){
00127                             adjud = 1;      // If the value becomes greater than 1, cap at 1
00128                         }
00129                     }
00130                     
00131                     myservolr = adjlr;      // Send adjusted left/right signal to left/right servo
00132                     myservoud = adjud;      // Send adjusted up/down signal to up/down servo
00133                     
00134                     
00135                 }
00136                 break;
00137             }
00138             char bnum;  //Initialize variables to use below
00139             char bhit;  //Initialize variables to use below
00140             
00141             case 'B':{  // If the next character is B, it is a Button data packet
00142             
00143                 bnum = bluemod.getc(); //button number
00144                 bhit = bluemod.getc(); //1=hit, 0=release
00145                 if (bluemod.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK?
00146                     //myled = bnum - '0'; //current button number will appear on LEDs
00147                     switch (bnum) {
00148                         case '1': //number button 1
00149                             if (bhit=='1') {
00150                                 // nop
00151                             } else {
00152                                 // nop
00153                             }
00154                             break;
00155                         case '2': //number button 2
00156                             if (bhit=='1') {
00157                                 // nop
00158                             } else {
00159                                 // nop
00160                             }
00161                             break;
00162                         case '3': //number button 3
00163                             if (bhit=='1') {
00164                                 // nop
00165                             } else {
00166                                 // nop
00167                             }
00168                             break;
00169                         case '4': //number button 4
00170                             if (bhit=='1') {
00171                                 // nop
00172                             } else {
00173                                 // nop
00174                             }
00175                             break;
00176                         case '5': //button 5 up arrow
00177                             if (bhit=='1' && sensorValue <= 0.6) {
00178                                 //forward                            
00179                                 //hit button
00180                                 forward_led=1;  //Set forward LED on MBED
00181                                 fwdA = 1;       //Assert MotorA forward
00182                                 revA = 0;       //Deassert MotorA reverse
00183                                 speedA = 1;     //Set SpeedA to full
00184                                 fwdB = 1;       //Assert MotorB forward
00185                                 revB = 0;       //Deassert MotorB reverse
00186                                 speedB = 1;     //Set SpeedB to full
00187                             } else {
00188                                 //Let go of button
00189                                 forward_led = 0;    //Turn off forward LED
00190                                 speedA = 0;     // Turn off MotorA
00191                                 speedB = 0;     // Turn off MotorB
00192                             }
00193                             break;
00194                         case '6': //button 6 down arrow
00195                             if (bhit=='1') {
00196                                 //reverse
00197                                 //hit button
00198                                 reverse_led=1;  //Turn reverse LED on
00199                                 fwdA = 0;       //Deassert MotorA forward   
00200                                 revA = 1;       //Assert MotorA reverse
00201                                 speedA = 1;     //MotorA full speed
00202                                 fwdB = 0;       //Deassert MotorB forward
00203                                 revB = 1;       //Assert MotorB reverse
00204                                 speedB = 1;     //MotorB full speed
00205                                 
00206                                 
00207                             } else {
00208                                 //let go of button
00209                                 reverse_led=0;  //Turn reverse LED off
00210                                 speedA = 0;     //Turn off MotorA
00211                                 speedB = 0;     //Turn off MotorB
00212                             }
00213                             break;
00214                     case '7': //button 7 left arrow
00215                             if (bhit=='1') {
00216                                 //ccw
00217                                 //hit button
00218                                left_led=1;      //Turn left LED on
00219                                 fwdA = 1;       //Assert MotorA forward
00220                                 revA = 0;       //Deassert MotorA reverse
00221                                 speedA = 1;     //MotorA full speed
00222                                 fwdB = 0;       //Deassert MotorB forward
00223                                 revB = 1;       //Assert MotorB reverse
00224                                 speedB = 1;     //MotorB full speed
00225                                 
00226                                 
00227                             } else {
00228                                 //let go of button
00229                                 left_led=0;     //Turn left LED off
00230                                 speedA = 0;     // Turn MotorA off
00231                                 speedB = 0;     // Turn MotorB off
00232                             }
00233                             break;
00234                         case '8': //button 8 right arrow
00235                             if (bhit=='1') {
00236                                 //cw
00237                                 //hit button
00238                                 right_led=1;    //Turn right LED on
00239                                 fwdA = 0;       //Deassert MotorA forward
00240                                 revA = 1;       //Assert MotorA reverse
00241                                 speedA = 1;     //MotorA full speed
00242                                 fwdB = 1;       //Assert MotorB forward
00243                                 revB = 0;       //Deassert MotorB reverse
00244                                 speedB = 1;     //MotorB full speed
00245                                 
00246                             } else {
00247                                 //let go of button
00248                                 right_led=0;    //Turn right LED off
00249                                 speedA = 0;     //Turn MotorA off
00250                                 speedB = 0;     //Turn MotorB off
00251                             }
00252                             break;
00253                         default:
00254                             break;
00255                     }
00256                 }                  
00257                 break;
00258             }
00259             
00260             }
00261             
00262         }
00263     }
00264 }