Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@13:bdb92f041eca, 2016-11-30 (annotated)
- 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?
User | Revision | Line number | New 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 | } |