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