Curtis Sellier / Mbed 2 deprecated Project_Car_Curtis_Non_Tested

Dependencies:   Servo mbed

Committer:
csellier
Date:
Wed Nov 30 11:27:36 2016 +0000
Revision:
13:bdb92f041eca
Parent:
12:8ae6609a66bf
Almost Final Program non tested (Curtis version)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kmarangi 0:65fd20a989e9 1 #include "mbed.h"
kmarangi 0:65fd20a989e9 2 #include "Servo.h"
csellier 3:581d391d248c 3
csellier 3:581d391d248c 4 #define DISTANCE 0.45
csellier 12:8ae6609a66bf 5 #define VBORDER1 0.7 //VBORDER being the LDR voltage value when going from the black line to the white surface and vice versa, assume >0.7 is white surfce
csellier 12:8ae6609a66bf 6 #define VBORDER2 0.3 // assume black surface <0.3
csellier 11:055ee1a3cb75 7
csellier 3:581d391d248c 8
csellier 3:581d391d248c 9
csellier 2:0b86e6482e4b 10 Serial pc (USBTX, USBRX); // USB serial interface
csellier 3:581d391d248c 11
csellier 1:8c1e3382b4d7 12 Servo ServoRight(p21); // continuous rotation hobby servo right
csellier 1:8c1e3382b4d7 13 Servo ServoLeft(p22); // continuous rotation hobby servo left
csellier 3:581d391d248c 14
csellier 2:0b86e6482e4b 15 PwmOut LEDleft(p23);
csellier 2:0b86e6482e4b 16 PwmOut LEDright(p24);
csellier 3:581d391d248c 17
csellier 2:0b86e6482e4b 18 AnalogIn IRfront(p15);
csellier 2:0b86e6482e4b 19 AnalogIn IRleft(p16);
csellier 2:0b86e6482e4b 20 AnalogIn IRright(p17);
csellier 2:0b86e6482e4b 21 AnalogIn LDRleft(p18);
csellier 2:0b86e6482e4b 22 AnalogIn LDRright(p19);
kmarangi 0:65fd20a989e9 23
kmarangi 0:65fd20a989e9 24 void init_servo() {
csellier 3:581d391d248c 25 // calibrate the servos for +/-5ms over +/-45deg
csellier 3:581d391d248c 26 ServoRight.calibrate(0.0005,45);
csellier 3:581d391d248c 27 ServoLeft.calibrate(0.0005,45);
kmarangi 0:65fd20a989e9 28 }
kmarangi 0:65fd20a989e9 29
csellier 3:581d391d248c 30 int main() {
csellier 3:581d391d248c 31 float front;
csellier 3:581d391d248c 32 float left;
csellier 10:57a0c57cabac 33 // float right;
csellier 11:055ee1a3cb75 34 float LDRvalueleft;
csellier 11:055ee1a3cb75 35 float LDRvalueright;
kmarangi 0:65fd20a989e9 36
csellier 3:581d391d248c 37 // set the USB serial interface baud rate
csellier 3:581d391d248c 38 pc.baud(921600);
csellier 3:581d391d248c 39 init_servo();
kmarangi 0:65fd20a989e9 40
kmarangi 0:65fd20a989e9 41 while(1) {
csellier 3:581d391d248c 42
csellier 9:a543d0cdfce9 43 // Auto drive : the car will avoid all obstacles aroiund it and get away from them
csellier 3:581d391d248c 44 front = IRfront.read();
csellier 3:581d391d248c 45 left = IRleft.read();
csellier 10:57a0c57cabac 46 // right = IRright.read();
csellier 11:055ee1a3cb75 47 LDRvalueright = LDRright.read();
csellier 11:055ee1a3cb75 48 LDRvalueleft = LDRleft.read(); //output voltage of the LDR used for line following feature
csellier 3:581d391d248c 49
csellier 9:a543d0cdfce9 50 /*****************************************************************************
csellier 11:055ee1a3cb75 51 / if (front > DISTANCE) { Collision avoidance system only,the robot will move away from an obstacle/wall if getting to close to it, backup program if the following doesn't work
csellier 9:a543d0cdfce9 52 / if (left > DISTANCE) {
csellier 9:a543d0cdfce9 53 / ServoRight.write(0.5); //turn right
csellier 9:a543d0cdfce9 54 / ServoLeft.write(0.4);
csellier 9:a543d0cdfce9 55 / } else {
csellier 9:a543d0cdfce9 56 / ServoRight.write(0.6); // turn left
csellier 9:a543d0cdfce9 57 / ServoLeft.write(0.5);
csellier 9:a543d0cdfce9 58 / }
csellier 9:a543d0cdfce9 59 / } else if (left > DISTANCE) {
csellier 9:a543d0cdfce9 60 / if (right < DISTANCE) {
csellier 9:a543d0cdfce9 61 / ServoRight.write(0.5); // right
csellier 9:a543d0cdfce9 62 / ServoLeft.write(0.4);
csellier 9:a543d0cdfce9 63 / } else {
csellier 9:a543d0cdfce9 64 / ServoRight.write(0.6); // forward
csellier 9:a543d0cdfce9 65 / ServoLeft.write(0.4);
csellier 9:a543d0cdfce9 66 / }
csellier 9:a543d0cdfce9 67 / }
csellier 10:57a0c57cabac 68 *****************************************************************************/
csellier 10:57a0c57cabac 69
csellier 3:581d391d248c 70 //Turn both LED's on for the line following feature
csellier 3:581d391d248c 71 LEDleft=1;
csellier 3:581d391d248c 72 LEDright=1;
csellier 3:581d391d248c 73
csellier 6:550027985c6c 74 // send the servo command to the servos themselves
csellier 9:a543d0cdfce9 75 //ServoRight.write(0.6); // write to the continuous rotation servo1
csellier 9:a543d0cdfce9 76 // ServoLeft.write(0.4); // write to the continous servo2
csellier 9:a543d0cdfce9 77
csellier 9:a543d0cdfce9 78 if (front > DISTANCE) {
csellier 9:a543d0cdfce9 79 // turn right
csellier 9:a543d0cdfce9 80 ServoRight.write(0.5); // stop servoright
csellier 9:a543d0cdfce9 81 ServoLeft.write(0.4); // turn on servoleft
csellier 9:a543d0cdfce9 82 wait(2.0); //wait 2 seconds to allow the robot to turn approximately 90 degrees
csellier 10:57a0c57cabac 83 // go straight for a second to establish separation from the object
csellier 10:57a0c57cabac 84 ServoRight.write(0.6);
csellier 10:57a0c57cabac 85 ServoLeft.write(0.4);
csellier 10:57a0c57cabac 86 wait(1.0);
csellier 9:a543d0cdfce9 87 if (left > DISTANCE) {
csellier 9:a543d0cdfce9 88 // keep going straight for 1 second
csellier 9:a543d0cdfce9 89 ServoRight.write(0.6); // write to the continuous rotation servo1
csellier 9:a543d0cdfce9 90 ServoLeft.write(0.4); // write to the continous servo2
csellier 9:a543d0cdfce9 91 wait(1.0);
csellier 9:a543d0cdfce9 92 } else {
csellier 9:a543d0cdfce9 93 // turn left 90 degrees
csellier 9:a543d0cdfce9 94 ServoRight.write(0.5);
csellier 9:a543d0cdfce9 95 ServoLeft.write(0.4);
csellier 9:a543d0cdfce9 96 wait(2.0); // wait 2 seconds to allow the robot to turn approx. 90 degrees
csellier 9:a543d0cdfce9 97 ServoRight.write(0.6); //go straight for 1 second
csellier 9:a543d0cdfce9 98 ServoLeft.write(0.4);
csellier 9:a543d0cdfce9 99 if (left > DISTANCE) {
csellier 9:a543d0cdfce9 100 //keep going straight for 1 second
csellier 9:a543d0cdfce9 101 ServoRight.write(0.6);
csellier 9:a543d0cdfce9 102 ServoLeft.write(0.4);
csellier 9:a543d0cdfce9 103 wait(1.0); //wait for 1 second
csellier 9:a543d0cdfce9 104 } else {
csellier 9:a543d0cdfce9 105 // turn left 90 degrees
csellier 9:a543d0cdfce9 106 ServoRight.write(0.6);
csellier 9:a543d0cdfce9 107 ServoLeft.write(0.5);
csellier 9:a543d0cdfce9 108 wait(2.0); //wait 2 seconds to allow robot to turn 90 degrees
csellier 10:57a0c57cabac 109 ServoRight.write(0.6); //after turning 90 deg turn both servos on so the robot goes straight ahead
csellier 10:57a0c57cabac 110 ServoLeft.write(0.4);
csellier 9:a543d0cdfce9 111 }
csellier 9:a543d0cdfce9 112 }
csellier 10:57a0c57cabac 113 }
csellier 10:57a0c57cabac 114 else if (front < DISTANCE) {
csellier 10:57a0c57cabac 115 //follow line
csellier 12:8ae6609a66bf 116 if (LDRvalueright < VBORDER2 && LDRvalueleft > VBORDER1){ //ldr right is in the black and ldr left is in the white then turn right
csellier 11:055ee1a3cb75 117 // turn right
csellier 13:bdb92f041eca 118 ServoRight.write(0.5);
csellier 13:bdb92f041eca 119 ServoLeft.write(0.4);
csellier 11:055ee1a3cb75 120 }
csellier 12:8ae6609a66bf 121 if (LDRvalueright > VBORDER1 && LDRvalueleft < VBORDER2){ //ldr right is in the white and ldr left is in the black
csellier 13:bdb92f041eca 122 //turn left
csellier 13:bdb92f041eca 123 ServoRight.write(0.6);
csellier 13:bdb92f041eca 124 ServoLeft.write(0.5);
csellier 11:055ee1a3cb75 125 }
csellier 13:bdb92f041eca 126 if (LDRvalueright < VBORDER2 && LDRvalueleft < VBORDER2) { //both ldr right and ldr left are in the black, continue ahead
csellier 11:055ee1a3cb75 127 //go straight
csellier 13:bdb92f041eca 128 ServoRight.write(0.6);
csellier 13:bdb92f041eca 129 ServoLeft.write(0.4);
csellier 11:055ee1a3cb75 130 }
csellier 11:055ee1a3cb75 131
csellier 11:055ee1a3cb75 132
csellier 11:055ee1a3cb75 133
csellier 11:055ee1a3cb75 134
csellier 10:57a0c57cabac 135 }
kmarangi 0:65fd20a989e9 136 }
csellier 10:57a0c57cabac 137 }