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