Made by Maor and Shai
Dependencies: DriveCommand HCSR04 Queue mbed-rtos mbed
Fork of Nucleo_UltrasonicHelloWorld by
main.cpp@2:9a4938a0475b, 2016-07-04 (annotated)
- Committer:
- Maor_T
- Date:
- Mon Jul 04 15:28:11 2016 +0000
- Revision:
- 2:9a4938a0475b
- Parent:
- 1:4a5586eb1765
SmartRobotCar;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ejteb | 0:1704ea055c4f | 1 | #include "mbed.h" |
Maor_T | 2:9a4938a0475b | 2 | #include "hcsr04.h" |
Maor_T | 2:9a4938a0475b | 3 | #include "rtos.h" |
Maor_T | 2:9a4938a0475b | 4 | #include <string> |
Maor_T | 2:9a4938a0475b | 5 | |
Maor_T | 2:9a4938a0475b | 6 | #include "DriveCommand.h" |
Maor_T | 2:9a4938a0475b | 7 | #include "queue.h" |
Maor_T | 2:9a4938a0475b | 8 | |
Maor_T | 2:9a4938a0475b | 9 | #define ULTRASONIC_TRIG_PIN p8 |
Maor_T | 2:9a4938a0475b | 10 | #define ULTRASONIC_ECHO_PIN p9 |
Maor_T | 2:9a4938a0475b | 11 | #define MOTOR_A_PIN1 p23 |
Maor_T | 2:9a4938a0475b | 12 | #define MOTOR_A_PIN2 p24 |
Maor_T | 2:9a4938a0475b | 13 | #define MOTOR_B_PIN1 p21 |
Maor_T | 2:9a4938a0475b | 14 | #define MOTOR_B_PIN2 p22 |
Maor_T | 2:9a4938a0475b | 15 | #define BLUETOOTH_RX p27 |
Maor_T | 2:9a4938a0475b | 16 | #define BLUETOOTH_TX p28 |
Maor_T | 2:9a4938a0475b | 17 | #define SERVO_PWM_PIN p25 |
Maor_T | 2:9a4938a0475b | 18 | |
Maor_T | 2:9a4938a0475b | 19 | #define BT_CHECK_DELAY_MS 50 |
Maor_T | 2:9a4938a0475b | 20 | |
Maor_T | 2:9a4938a0475b | 21 | #define ULTRASONIC_CHECK_DELAY_MS 50 |
Maor_T | 2:9a4938a0475b | 22 | #define ULTRASONIC_EMERGENCY_DELAY_MS 20 |
Maor_T | 2:9a4938a0475b | 23 | #define AUTODRIVE_CHECK_DELAY_MS 100 |
Maor_T | 2:9a4938a0475b | 24 | |
Maor_T | 2:9a4938a0475b | 25 | |
Maor_T | 2:9a4938a0475b | 26 | |
Maor_T | 2:9a4938a0475b | 27 | //------DEBUG OPTIONS ---------- |
Maor_T | 2:9a4938a0475b | 28 | //#define DEBUG_BT_COMMANDS |
Maor_T | 2:9a4938a0475b | 29 | #define DEBUG_ULTRASONICE |
Maor_T | 2:9a4938a0475b | 30 | |
Maor_T | 2:9a4938a0475b | 31 | //------------------------------ |
Maor_T | 2:9a4938a0475b | 32 | |
Maor_T | 2:9a4938a0475b | 33 | PwmOut motorA1(MOTOR_A_PIN2); //left motor |
Maor_T | 2:9a4938a0475b | 34 | PwmOut motorA2(MOTOR_A_PIN1); //left motor |
Maor_T | 2:9a4938a0475b | 35 | PwmOut motorB1(MOTOR_B_PIN1); //right motor |
Maor_T | 2:9a4938a0475b | 36 | PwmOut motorB2(MOTOR_B_PIN2); //right motor |
Maor_T | 2:9a4938a0475b | 37 | |
Maor_T | 2:9a4938a0475b | 38 | PwmOut servo(SERVO_PWM_PIN); |
Maor_T | 2:9a4938a0475b | 39 | Serial bt(BLUETOOTH_TX,BLUETOOTH_RX); |
Maor_T | 2:9a4938a0475b | 40 | Serial pc(USBTX,USBRX); |
Maor_T | 2:9a4938a0475b | 41 | |
Maor_T | 2:9a4938a0475b | 42 | HCSR04 usensor(p8,p9); |
Maor_T | 2:9a4938a0475b | 43 | float lastDistance = 0; // save the last ultrasonic val |
Maor_T | 2:9a4938a0475b | 44 | bool moveForward_flag = false; // determined when vehicle moving forward - using to stop and avoid obascales |
Maor_T | 2:9a4938a0475b | 45 | bool turnRight_Flag = false; |
Maor_T | 2:9a4938a0475b | 46 | bool turnLeft_Flag = false; |
Maor_T | 2:9a4938a0475b | 47 | bool obstacleAlert = false; |
Maor_T | 2:9a4938a0475b | 48 | float vehicleSpeed = 1; |
Maor_T | 2:9a4938a0475b | 49 | int rotateRightMillis = 650; |
Maor_T | 2:9a4938a0475b | 50 | int rotateLeftMillis = 650; |
Maor_T | 2:9a4938a0475b | 51 | float turnSpeed = 0.3; |
Maor_T | 2:9a4938a0475b | 52 | int obstacleDistance = 30; |
Maor_T | 2:9a4938a0475b | 53 | |
Maor_T | 2:9a4938a0475b | 54 | Timeout stopper; |
Maor_T | 2:9a4938a0475b | 55 | Queue autoDriverQueue(sizeof(DriveCommand),10); |
Maor_T | 2:9a4938a0475b | 56 | |
Maor_T | 2:9a4938a0475b | 57 | |
Maor_T | 2:9a4938a0475b | 58 | //string globalString =" "; |
Maor_T | 2:9a4938a0475b | 59 | char lastCommandChar ='x'; |
Maor_T | 2:9a4938a0475b | 60 | char incomingMsg[1024]; |
Maor_T | 2:9a4938a0475b | 61 | int incomingMsg_iter = 0; |
Maor_T | 2:9a4938a0475b | 62 | bool succesReadFlag = false; |
Maor_T | 2:9a4938a0475b | 63 | bool autoDriveFlag = false; |
Maor_T | 2:9a4938a0475b | 64 | bool autoDriveRun = false; |
Maor_T | 2:9a4938a0475b | 65 | int autoDriveCounter = 0; |
Maor_T | 2:9a4938a0475b | 66 | bool autoDrivePartOk = true; // check if every part of auto drive is whitout obstacles |
Maor_T | 2:9a4938a0475b | 67 | |
Maor_T | 2:9a4938a0475b | 68 | //Prototype |
Maor_T | 2:9a4938a0475b | 69 | void Drive_Stop(); |
Maor_T | 2:9a4938a0475b | 70 | void AutoDrive_Stop(); |
Maor_T | 2:9a4938a0475b | 71 | void ExecuteNextCommand(); |
Maor_T | 2:9a4938a0475b | 72 | void Rotate_Left(); |
Maor_T | 2:9a4938a0475b | 73 | void MotorRight_Run(float speedPercent,bool forwardDir); |
Maor_T | 2:9a4938a0475b | 74 | void MotorLeft_Run(float speedPercent,bool forwardDir); |
Maor_T | 2:9a4938a0475b | 75 | void Drive_Force_Stop(); |
Maor_T | 2:9a4938a0475b | 76 | int Get_Min_Distance(); |
Maor_T | 2:9a4938a0475b | 77 | void Servo_Look_Left(); |
Maor_T | 2:9a4938a0475b | 78 | void Servo_Look_Right(); |
Maor_T | 2:9a4938a0475b | 79 | void Servo_Look_Center(); |
Maor_T | 2:9a4938a0475b | 80 | |
Maor_T | 2:9a4938a0475b | 81 | |
Maor_T | 2:9a4938a0475b | 82 | void FlagController(char dir) |
Maor_T | 2:9a4938a0475b | 83 | { |
Maor_T | 2:9a4938a0475b | 84 | switch(dir) |
Maor_T | 2:9a4938a0475b | 85 | { |
Maor_T | 2:9a4938a0475b | 86 | case 'f': |
Maor_T | 2:9a4938a0475b | 87 | moveForward_flag = true; |
Maor_T | 2:9a4938a0475b | 88 | turnRight_Flag = false; |
Maor_T | 2:9a4938a0475b | 89 | turnLeft_Flag = false; |
Maor_T | 2:9a4938a0475b | 90 | break; |
Maor_T | 2:9a4938a0475b | 91 | case 'l': |
Maor_T | 2:9a4938a0475b | 92 | moveForward_flag = false; |
Maor_T | 2:9a4938a0475b | 93 | turnRight_Flag = false; |
Maor_T | 2:9a4938a0475b | 94 | turnLeft_Flag = true; |
Maor_T | 2:9a4938a0475b | 95 | break; |
Maor_T | 2:9a4938a0475b | 96 | case 'r': |
Maor_T | 2:9a4938a0475b | 97 | moveForward_flag = false; |
Maor_T | 2:9a4938a0475b | 98 | turnRight_Flag = true; |
Maor_T | 2:9a4938a0475b | 99 | turnLeft_Flag = false; |
Maor_T | 2:9a4938a0475b | 100 | break; |
Maor_T | 2:9a4938a0475b | 101 | case 'b': |
Maor_T | 2:9a4938a0475b | 102 | moveForward_flag = false; |
Maor_T | 2:9a4938a0475b | 103 | turnRight_Flag = false; |
Maor_T | 2:9a4938a0475b | 104 | turnLeft_Flag = false; |
Maor_T | 2:9a4938a0475b | 105 | break; |
Maor_T | 2:9a4938a0475b | 106 | } |
Maor_T | 2:9a4938a0475b | 107 | } |
Maor_T | 2:9a4938a0475b | 108 | |
Maor_T | 2:9a4938a0475b | 109 | void StopAfter(float sec) |
Maor_T | 2:9a4938a0475b | 110 | { |
Maor_T | 2:9a4938a0475b | 111 | // printf("StopAfter Got %f\n",sec); |
Maor_T | 2:9a4938a0475b | 112 | stopper.attach(&AutoDrive_Stop,sec); |
Maor_T | 2:9a4938a0475b | 113 | } |
Maor_T | 2:9a4938a0475b | 114 | |
Maor_T | 2:9a4938a0475b | 115 | float GetDistance() |
Maor_T | 2:9a4938a0475b | 116 | { |
Maor_T | 2:9a4938a0475b | 117 | float sum = 0; |
Maor_T | 2:9a4938a0475b | 118 | |
Maor_T | 2:9a4938a0475b | 119 | for(int i=i ; i< 7 ; i++) |
Maor_T | 2:9a4938a0475b | 120 | { |
Maor_T | 2:9a4938a0475b | 121 | sum += usensor.get_dist_cm(); |
Maor_T | 2:9a4938a0475b | 122 | } |
Maor_T | 2:9a4938a0475b | 123 | |
Maor_T | 2:9a4938a0475b | 124 | sum /= 7.0; |
Maor_T | 2:9a4938a0475b | 125 | return sum; |
Maor_T | 2:9a4938a0475b | 126 | } |
Maor_T | 2:9a4938a0475b | 127 | |
Maor_T | 2:9a4938a0475b | 128 | |
Maor_T | 2:9a4938a0475b | 129 | |
Maor_T | 2:9a4938a0475b | 130 | void Reset_IncomingMsg() |
Maor_T | 2:9a4938a0475b | 131 | { |
Maor_T | 2:9a4938a0475b | 132 | for(int i=0 ; i<1024 ; i++) |
Maor_T | 2:9a4938a0475b | 133 | incomingMsg[i] = '*'; |
Maor_T | 2:9a4938a0475b | 134 | incomingMsg_iter =0; |
Maor_T | 2:9a4938a0475b | 135 | } |
Maor_T | 2:9a4938a0475b | 136 | |
Maor_T | 2:9a4938a0475b | 137 | string Get_last_Msg() |
Maor_T | 2:9a4938a0475b | 138 | { |
Maor_T | 2:9a4938a0475b | 139 | int i=0; |
Maor_T | 2:9a4938a0475b | 140 | string temp = ""; |
Maor_T | 2:9a4938a0475b | 141 | while(incomingMsg[i] != '~' && incomingMsg[i] != '*') |
Maor_T | 2:9a4938a0475b | 142 | { |
Maor_T | 2:9a4938a0475b | 143 | temp+=incomingMsg[i++]; |
Maor_T | 2:9a4938a0475b | 144 | } |
Maor_T | 2:9a4938a0475b | 145 | |
Maor_T | 2:9a4938a0475b | 146 | if(incomingMsg[i] == '~') |
Maor_T | 2:9a4938a0475b | 147 | { |
Maor_T | 2:9a4938a0475b | 148 | succesReadFlag = true; |
Maor_T | 2:9a4938a0475b | 149 | Reset_IncomingMsg(); |
Maor_T | 2:9a4938a0475b | 150 | } |
Maor_T | 2:9a4938a0475b | 151 | |
Maor_T | 2:9a4938a0475b | 152 | else |
Maor_T | 2:9a4938a0475b | 153 | { |
Maor_T | 2:9a4938a0475b | 154 | succesReadFlag = false; |
Maor_T | 2:9a4938a0475b | 155 | } |
Maor_T | 2:9a4938a0475b | 156 | return temp; |
Maor_T | 2:9a4938a0475b | 157 | } |
Maor_T | 2:9a4938a0475b | 158 | |
Maor_T | 2:9a4938a0475b | 159 | float map(float x, float in_min, float in_max, float out_min, float out_max) |
Maor_T | 2:9a4938a0475b | 160 | { |
Maor_T | 2:9a4938a0475b | 161 | return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; |
Maor_T | 2:9a4938a0475b | 162 | } |
Maor_T | 2:9a4938a0475b | 163 | |
ejteb | 0:1704ea055c4f | 164 | |
ejteb | 0:1704ea055c4f | 165 | void dist(int distance) |
ejteb | 0:1704ea055c4f | 166 | { |
ejteb | 1:4a5586eb1765 | 167 | //put code here to happen when the distance is changed |
ejteb | 1:4a5586eb1765 | 168 | printf("Distance changed to %dmm\r\n", distance); |
ejteb | 0:1704ea055c4f | 169 | } |
ejteb | 0:1704ea055c4f | 170 | |
Maor_T | 2:9a4938a0475b | 171 | |
Maor_T | 2:9a4938a0475b | 172 | void MotorLeft_Run(float speedPercent,bool forwardDir) |
Maor_T | 2:9a4938a0475b | 173 | { |
Maor_T | 2:9a4938a0475b | 174 | if(forwardDir) |
Maor_T | 2:9a4938a0475b | 175 | { |
Maor_T | 2:9a4938a0475b | 176 | motorA1.write(0); |
Maor_T | 2:9a4938a0475b | 177 | motorA2.write(speedPercent); |
Maor_T | 2:9a4938a0475b | 178 | } |
Maor_T | 2:9a4938a0475b | 179 | else |
Maor_T | 2:9a4938a0475b | 180 | { |
Maor_T | 2:9a4938a0475b | 181 | motorA1.write(speedPercent); |
Maor_T | 2:9a4938a0475b | 182 | motorA2.write(0); |
Maor_T | 2:9a4938a0475b | 183 | } |
Maor_T | 2:9a4938a0475b | 184 | } |
Maor_T | 2:9a4938a0475b | 185 | |
Maor_T | 2:9a4938a0475b | 186 | void MotorLeft_Stop() |
Maor_T | 2:9a4938a0475b | 187 | { |
Maor_T | 2:9a4938a0475b | 188 | motorA1.write(0); |
Maor_T | 2:9a4938a0475b | 189 | motorA2.write(0); |
Maor_T | 2:9a4938a0475b | 190 | } |
Maor_T | 2:9a4938a0475b | 191 | |
Maor_T | 2:9a4938a0475b | 192 | void MotorRight_Run(float speedPercent,bool forwardDir) |
Maor_T | 2:9a4938a0475b | 193 | { |
Maor_T | 2:9a4938a0475b | 194 | if(forwardDir) |
Maor_T | 2:9a4938a0475b | 195 | { |
Maor_T | 2:9a4938a0475b | 196 | motorB1.write(0); |
Maor_T | 2:9a4938a0475b | 197 | motorB2.write(speedPercent); |
Maor_T | 2:9a4938a0475b | 198 | } |
Maor_T | 2:9a4938a0475b | 199 | else |
Maor_T | 2:9a4938a0475b | 200 | { |
Maor_T | 2:9a4938a0475b | 201 | motorB1.write(speedPercent); |
Maor_T | 2:9a4938a0475b | 202 | motorB2.write(0); |
Maor_T | 2:9a4938a0475b | 203 | } |
Maor_T | 2:9a4938a0475b | 204 | } |
Maor_T | 2:9a4938a0475b | 205 | |
Maor_T | 2:9a4938a0475b | 206 | void MotorRight_Stop() |
Maor_T | 2:9a4938a0475b | 207 | { |
Maor_T | 2:9a4938a0475b | 208 | motorB1.write(0); |
Maor_T | 2:9a4938a0475b | 209 | motorB2.write(0); |
Maor_T | 2:9a4938a0475b | 210 | } |
Maor_T | 2:9a4938a0475b | 211 | |
Maor_T | 2:9a4938a0475b | 212 | void Drive_Forward(float speedPercent) |
Maor_T | 2:9a4938a0475b | 213 | { |
Maor_T | 2:9a4938a0475b | 214 | FlagController('f'); |
Maor_T | 2:9a4938a0475b | 215 | MotorLeft_Run(speedPercent,true); |
Maor_T | 2:9a4938a0475b | 216 | MotorRight_Run(speedPercent,true) ; |
Maor_T | 2:9a4938a0475b | 217 | } |
Maor_T | 2:9a4938a0475b | 218 | |
Maor_T | 2:9a4938a0475b | 219 | void Drive_Left(float leftPercent) |
Maor_T | 2:9a4938a0475b | 220 | { |
Maor_T | 2:9a4938a0475b | 221 | FlagController('f'); |
Maor_T | 2:9a4938a0475b | 222 | MotorRight_Run(leftPercent,true); |
Maor_T | 2:9a4938a0475b | 223 | MotorLeft_Run(1-leftPercent,true) ; // left motor reversed |
Maor_T | 2:9a4938a0475b | 224 | } |
Maor_T | 2:9a4938a0475b | 225 | |
Maor_T | 2:9a4938a0475b | 226 | void Reverse_Left(float leftPercent) |
Maor_T | 2:9a4938a0475b | 227 | { |
Maor_T | 2:9a4938a0475b | 228 | MotorRight_Run(leftPercent,false); |
Maor_T | 2:9a4938a0475b | 229 | MotorLeft_Run(1-leftPercent,false) ; // left motor reversed |
Maor_T | 2:9a4938a0475b | 230 | } |
Maor_T | 2:9a4938a0475b | 231 | |
Maor_T | 2:9a4938a0475b | 232 | void Turn_Left(float leftPercent) |
Maor_T | 2:9a4938a0475b | 233 | { |
Maor_T | 2:9a4938a0475b | 234 | FlagController('l'); |
Maor_T | 2:9a4938a0475b | 235 | Servo_Look_Left(); |
Maor_T | 2:9a4938a0475b | 236 | wait_ms(100); |
Maor_T | 2:9a4938a0475b | 237 | MotorRight_Run(leftPercent,true); |
Maor_T | 2:9a4938a0475b | 238 | MotorLeft_Run(leftPercent,false) ; // left motor reversed |
Maor_T | 2:9a4938a0475b | 239 | } |
Maor_T | 2:9a4938a0475b | 240 | |
Maor_T | 2:9a4938a0475b | 241 | void Drive_Right(float rightPercent) |
Maor_T | 2:9a4938a0475b | 242 | { |
Maor_T | 2:9a4938a0475b | 243 | MotorLeft_Run(rightPercent,true) ; |
Maor_T | 2:9a4938a0475b | 244 | MotorRight_Run(1-rightPercent,true); // right motor reversed |
Maor_T | 2:9a4938a0475b | 245 | } |
Maor_T | 2:9a4938a0475b | 246 | |
Maor_T | 2:9a4938a0475b | 247 | void Reverse_Right(float rightPercent) |
Maor_T | 2:9a4938a0475b | 248 | { |
Maor_T | 2:9a4938a0475b | 249 | MotorLeft_Run(rightPercent,false) ; |
Maor_T | 2:9a4938a0475b | 250 | MotorRight_Run(1-rightPercent,false); // right motor reversed |
Maor_T | 2:9a4938a0475b | 251 | } |
Maor_T | 2:9a4938a0475b | 252 | |
Maor_T | 2:9a4938a0475b | 253 | void Turn_Right(float rightPercent) |
Maor_T | 2:9a4938a0475b | 254 | { |
Maor_T | 2:9a4938a0475b | 255 | FlagController('r'); |
Maor_T | 2:9a4938a0475b | 256 | Servo_Look_Right(); |
Maor_T | 2:9a4938a0475b | 257 | wait_ms(200); |
Maor_T | 2:9a4938a0475b | 258 | MotorLeft_Run(rightPercent,true) ; |
Maor_T | 2:9a4938a0475b | 259 | MotorRight_Run(rightPercent,false); // right motor reversed |
Maor_T | 2:9a4938a0475b | 260 | } |
Maor_T | 2:9a4938a0475b | 261 | |
Maor_T | 2:9a4938a0475b | 262 | void Drive_Backwards(float speedPercent) |
Maor_T | 2:9a4938a0475b | 263 | { |
Maor_T | 2:9a4938a0475b | 264 | FlagController('b'); |
Maor_T | 2:9a4938a0475b | 265 | MotorLeft_Run(speedPercent,false); |
Maor_T | 2:9a4938a0475b | 266 | MotorRight_Run(speedPercent,false) ; |
Maor_T | 2:9a4938a0475b | 267 | moveForward_flag = false; |
Maor_T | 2:9a4938a0475b | 268 | } |
Maor_T | 2:9a4938a0475b | 269 | |
Maor_T | 2:9a4938a0475b | 270 | |
Maor_T | 2:9a4938a0475b | 271 | void Drive_Stop() |
Maor_T | 2:9a4938a0475b | 272 | { |
Maor_T | 2:9a4938a0475b | 273 | FlagController('s'); |
Maor_T | 2:9a4938a0475b | 274 | MotorLeft_Stop(); |
Maor_T | 2:9a4938a0475b | 275 | MotorRight_Stop(); |
Maor_T | 2:9a4938a0475b | 276 | moveForward_flag = false; |
Maor_T | 2:9a4938a0475b | 277 | autoDriveRun = false; |
Maor_T | 2:9a4938a0475b | 278 | } |
Maor_T | 2:9a4938a0475b | 279 | void Drive_Force_Stop() |
Maor_T | 2:9a4938a0475b | 280 | { |
Maor_T | 2:9a4938a0475b | 281 | MotorRight_Run(turnSpeed,false); |
Maor_T | 2:9a4938a0475b | 282 | MotorLeft_Run(turnSpeed,false) ; |
Maor_T | 2:9a4938a0475b | 283 | wait_ms(500); |
Maor_T | 2:9a4938a0475b | 284 | MotorLeft_Stop(); |
Maor_T | 2:9a4938a0475b | 285 | MotorRight_Stop(); |
Maor_T | 2:9a4938a0475b | 286 | moveForward_flag = false; |
Maor_T | 2:9a4938a0475b | 287 | autoDriveRun = false; |
Maor_T | 2:9a4938a0475b | 288 | |
Maor_T | 2:9a4938a0475b | 289 | } |
Maor_T | 2:9a4938a0475b | 290 | |
Maor_T | 2:9a4938a0475b | 291 | |
Maor_T | 2:9a4938a0475b | 292 | void AutoDrive_Stop() |
Maor_T | 2:9a4938a0475b | 293 | { |
Maor_T | 2:9a4938a0475b | 294 | // if(autoDriveFlag) // stop only if autoDrive mode is running |
Maor_T | 2:9a4938a0475b | 295 | // { |
Maor_T | 2:9a4938a0475b | 296 | MotorLeft_Stop(); |
Maor_T | 2:9a4938a0475b | 297 | MotorRight_Stop(); |
Maor_T | 2:9a4938a0475b | 298 | moveForward_flag = false; |
Maor_T | 2:9a4938a0475b | 299 | // } |
Maor_T | 2:9a4938a0475b | 300 | autoDriveRun = false; |
Maor_T | 2:9a4938a0475b | 301 | } |
Maor_T | 2:9a4938a0475b | 302 | |
Maor_T | 2:9a4938a0475b | 303 | |
Maor_T | 2:9a4938a0475b | 304 | void Rotate_Left() |
Maor_T | 2:9a4938a0475b | 305 | { |
Maor_T | 2:9a4938a0475b | 306 | MotorRight_Run(turnSpeed,true); |
Maor_T | 2:9a4938a0475b | 307 | MotorLeft_Run(turnSpeed,false) ; // left motor reversed |
Maor_T | 2:9a4938a0475b | 308 | wait_ms(rotateLeftMillis); |
Maor_T | 2:9a4938a0475b | 309 | Drive_Stop(); |
Maor_T | 2:9a4938a0475b | 310 | } |
Maor_T | 2:9a4938a0475b | 311 | |
Maor_T | 2:9a4938a0475b | 312 | void Rotate_Right() |
Maor_T | 2:9a4938a0475b | 313 | { |
Maor_T | 2:9a4938a0475b | 314 | MotorRight_Run(turnSpeed,false); |
Maor_T | 2:9a4938a0475b | 315 | MotorLeft_Run(turnSpeed,true) ; // left motor reversed |
Maor_T | 2:9a4938a0475b | 316 | wait_ms(rotateRightMillis); |
Maor_T | 2:9a4938a0475b | 317 | Drive_Stop(); |
Maor_T | 2:9a4938a0475b | 318 | } |
Maor_T | 2:9a4938a0475b | 319 | |
Maor_T | 2:9a4938a0475b | 320 | |
Maor_T | 2:9a4938a0475b | 321 | void ServoMove(int pos) |
Maor_T | 2:9a4938a0475b | 322 | { |
Maor_T | 2:9a4938a0475b | 323 | if(pos < 0 || pos >180) |
Maor_T | 2:9a4938a0475b | 324 | return; |
Maor_T | 2:9a4938a0475b | 325 | float outVal = map(pos,0,180,1000,2000); |
Maor_T | 2:9a4938a0475b | 326 | servo.pulsewidth_us(outVal); |
Maor_T | 2:9a4938a0475b | 327 | } |
Maor_T | 2:9a4938a0475b | 328 | |
Maor_T | 2:9a4938a0475b | 329 | |
Maor_T | 2:9a4938a0475b | 330 | int Get_Min_Distance() |
Maor_T | 2:9a4938a0475b | 331 | { |
Maor_T | 2:9a4938a0475b | 332 | int min; |
Maor_T | 2:9a4938a0475b | 333 | |
Maor_T | 2:9a4938a0475b | 334 | Servo_Look_Left(); |
Maor_T | 2:9a4938a0475b | 335 | wait_ms(250); |
Maor_T | 2:9a4938a0475b | 336 | usensor.start(); |
Maor_T | 2:9a4938a0475b | 337 | int left = usensor.get_dist_cm(); |
Maor_T | 2:9a4938a0475b | 338 | min=left; |
Maor_T | 2:9a4938a0475b | 339 | |
Maor_T | 2:9a4938a0475b | 340 | if(min < obstacleDistance ) |
Maor_T | 2:9a4938a0475b | 341 | { |
Maor_T | 2:9a4938a0475b | 342 | autoDrivePartOk = false; |
Maor_T | 2:9a4938a0475b | 343 | return min; |
Maor_T | 2:9a4938a0475b | 344 | } |
Maor_T | 2:9a4938a0475b | 345 | |
Maor_T | 2:9a4938a0475b | 346 | Servo_Look_Right(); |
Maor_T | 2:9a4938a0475b | 347 | wait_ms(250); |
Maor_T | 2:9a4938a0475b | 348 | usensor.start(); |
Maor_T | 2:9a4938a0475b | 349 | int right = usensor.get_dist_cm(); |
Maor_T | 2:9a4938a0475b | 350 | if(right<min) |
Maor_T | 2:9a4938a0475b | 351 | min=right; |
Maor_T | 2:9a4938a0475b | 352 | |
Maor_T | 2:9a4938a0475b | 353 | if(min < obstacleDistance ) |
Maor_T | 2:9a4938a0475b | 354 | { |
Maor_T | 2:9a4938a0475b | 355 | autoDrivePartOk = false; |
Maor_T | 2:9a4938a0475b | 356 | return min; |
Maor_T | 2:9a4938a0475b | 357 | |
Maor_T | 2:9a4938a0475b | 358 | } |
Maor_T | 2:9a4938a0475b | 359 | |
Maor_T | 2:9a4938a0475b | 360 | Servo_Look_Center(); |
Maor_T | 2:9a4938a0475b | 361 | wait_ms(250); |
Maor_T | 2:9a4938a0475b | 362 | usensor.start(); |
Maor_T | 2:9a4938a0475b | 363 | int center = usensor.get_dist_cm(); |
Maor_T | 2:9a4938a0475b | 364 | if(center<min) |
Maor_T | 2:9a4938a0475b | 365 | min=center; |
Maor_T | 2:9a4938a0475b | 366 | |
Maor_T | 2:9a4938a0475b | 367 | if(min < obstacleDistance ) |
Maor_T | 2:9a4938a0475b | 368 | { |
Maor_T | 2:9a4938a0475b | 369 | autoDrivePartOk = false; |
Maor_T | 2:9a4938a0475b | 370 | return min; |
Maor_T | 2:9a4938a0475b | 371 | } |
Maor_T | 2:9a4938a0475b | 372 | // printf("Min Distance %d\n",min); |
Maor_T | 2:9a4938a0475b | 373 | |
Maor_T | 2:9a4938a0475b | 374 | return min; |
Maor_T | 2:9a4938a0475b | 375 | } |
Maor_T | 2:9a4938a0475b | 376 | |
Maor_T | 2:9a4938a0475b | 377 | |
Maor_T | 2:9a4938a0475b | 378 | |
Maor_T | 2:9a4938a0475b | 379 | void Servo_Look_Left() |
Maor_T | 2:9a4938a0475b | 380 | { |
Maor_T | 2:9a4938a0475b | 381 | servo.pulsewidth_us(2000); |
Maor_T | 2:9a4938a0475b | 382 | } |
Maor_T | 2:9a4938a0475b | 383 | |
Maor_T | 2:9a4938a0475b | 384 | void Servo_Look_Right() |
Maor_T | 2:9a4938a0475b | 385 | { |
Maor_T | 2:9a4938a0475b | 386 | servo.pulsewidth_us(1000); |
Maor_T | 2:9a4938a0475b | 387 | } |
Maor_T | 2:9a4938a0475b | 388 | |
Maor_T | 2:9a4938a0475b | 389 | void Servo_Look_Center() |
Maor_T | 2:9a4938a0475b | 390 | { |
Maor_T | 2:9a4938a0475b | 391 | servo.pulsewidth_us(1500); |
Maor_T | 2:9a4938a0475b | 392 | } |
Maor_T | 2:9a4938a0475b | 393 | |
Maor_T | 2:9a4938a0475b | 394 | void DataReceived_ISR(){ |
Maor_T | 2:9a4938a0475b | 395 | // char globalChar = LPC_UART2->RBR; |
Maor_T | 2:9a4938a0475b | 396 | // lastCommandChar = LPC_UART2->RBR; |
Maor_T | 2:9a4938a0475b | 397 | incomingMsg[incomingMsg_iter++] = LPC_UART2->RBR ; |
Maor_T | 2:9a4938a0475b | 398 | |
Maor_T | 2:9a4938a0475b | 399 | // globalString += globalChar; |
Maor_T | 2:9a4938a0475b | 400 | } |
Maor_T | 2:9a4938a0475b | 401 | |
Maor_T | 2:9a4938a0475b | 402 | void DataReceived_PCISR(){ |
Maor_T | 2:9a4938a0475b | 403 | // char globalChar = LPC_UART2->RBR; |
Maor_T | 2:9a4938a0475b | 404 | // lastCommandChar = LPC_UART2->RBR; |
Maor_T | 2:9a4938a0475b | 405 | incomingMsg[incomingMsg_iter++] = LPC_UART0->RBR ; |
Maor_T | 2:9a4938a0475b | 406 | |
Maor_T | 2:9a4938a0475b | 407 | // globalString += globalChar; |
Maor_T | 2:9a4938a0475b | 408 | } |
Maor_T | 2:9a4938a0475b | 409 | |
Maor_T | 2:9a4938a0475b | 410 | |
Maor_T | 2:9a4938a0475b | 411 | void Servo_NoNo(int count) |
Maor_T | 2:9a4938a0475b | 412 | { |
Maor_T | 2:9a4938a0475b | 413 | for(int i=0 ; i< count ; i++) { |
Maor_T | 2:9a4938a0475b | 414 | Servo_Look_Left(); |
Maor_T | 2:9a4938a0475b | 415 | wait(0.2); |
Maor_T | 2:9a4938a0475b | 416 | Servo_Look_Right(); |
Maor_T | 2:9a4938a0475b | 417 | wait(0.2); |
Maor_T | 2:9a4938a0475b | 418 | } |
Maor_T | 2:9a4938a0475b | 419 | Servo_Look_Center(); |
Maor_T | 2:9a4938a0475b | 420 | } |
Maor_T | 2:9a4938a0475b | 421 | |
Maor_T | 2:9a4938a0475b | 422 | float getCommandValue(string cmd){ |
Maor_T | 2:9a4938a0475b | 423 | string cmdValue; |
Maor_T | 2:9a4938a0475b | 424 | std::size_t sharpPosition = cmd.find("#"); |
Maor_T | 2:9a4938a0475b | 425 | cmdValue = cmd.substr(sharpPosition+1); |
Maor_T | 2:9a4938a0475b | 426 | // printf("cmdvalue %s\n",cmdValue); // - Print the incoming command |
Maor_T | 2:9a4938a0475b | 427 | return atof(cmdValue.c_str()); |
Maor_T | 2:9a4938a0475b | 428 | } |
Maor_T | 2:9a4938a0475b | 429 | |
Maor_T | 2:9a4938a0475b | 430 | |
Maor_T | 2:9a4938a0475b | 431 | |
Maor_T | 2:9a4938a0475b | 432 | |
Maor_T | 2:9a4938a0475b | 433 | void BTCommands(string cmd) |
Maor_T | 2:9a4938a0475b | 434 | { |
Maor_T | 2:9a4938a0475b | 435 | #ifdef DEBUG_BT_COMMANDS |
Maor_T | 2:9a4938a0475b | 436 | printf("Incoming BT command : %s\n",cmd); // - Print the incoming command |
Maor_T | 2:9a4938a0475b | 437 | #endif |
Maor_T | 2:9a4938a0475b | 438 | if (cmd.find("forward#")!= string::npos) |
Maor_T | 2:9a4938a0475b | 439 | { |
Maor_T | 2:9a4938a0475b | 440 | float time = getCommandValue(cmd); |
Maor_T | 2:9a4938a0475b | 441 | DriveCommand* dc; |
Maor_T | 2:9a4938a0475b | 442 | dc = (DriveCommand*)malloc(sizeof(DriveCommand)); |
Maor_T | 2:9a4938a0475b | 443 | dc->SetTime(time); |
Maor_T | 2:9a4938a0475b | 444 | dc->SetDir('f'); |
Maor_T | 2:9a4938a0475b | 445 | autoDriverQueue.Put(dc); |
Maor_T | 2:9a4938a0475b | 446 | } |
Maor_T | 2:9a4938a0475b | 447 | else if(cmd.find("backwards#")!= string::npos) |
Maor_T | 2:9a4938a0475b | 448 | { |
Maor_T | 2:9a4938a0475b | 449 | float time = getCommandValue(cmd); |
Maor_T | 2:9a4938a0475b | 450 | DriveCommand* dc; |
Maor_T | 2:9a4938a0475b | 451 | dc = (DriveCommand*)malloc(sizeof(DriveCommand)); |
Maor_T | 2:9a4938a0475b | 452 | dc->SetTime(time); |
Maor_T | 2:9a4938a0475b | 453 | dc->SetDir('b'); |
Maor_T | 2:9a4938a0475b | 454 | autoDriverQueue.Put(dc); |
Maor_T | 2:9a4938a0475b | 455 | } |
Maor_T | 2:9a4938a0475b | 456 | else if(cmd.find("obstacle#")!= string::npos) |
Maor_T | 2:9a4938a0475b | 457 | { |
Maor_T | 2:9a4938a0475b | 458 | obstacleDistance = getCommandValue(cmd); |
Maor_T | 2:9a4938a0475b | 459 | |
Maor_T | 2:9a4938a0475b | 460 | } |
Maor_T | 2:9a4938a0475b | 461 | |
Maor_T | 2:9a4938a0475b | 462 | else if (cmd.find("rotleftms#")!= string::npos) |
Maor_T | 2:9a4938a0475b | 463 | { |
Maor_T | 2:9a4938a0475b | 464 | rotateLeftMillis = getCommandValue(cmd); |
Maor_T | 2:9a4938a0475b | 465 | Rotate_Left(); // todo remove after testing |
Maor_T | 2:9a4938a0475b | 466 | |
Maor_T | 2:9a4938a0475b | 467 | } |
Maor_T | 2:9a4938a0475b | 468 | else if (cmd.find("rotrightms#")!= string::npos) |
Maor_T | 2:9a4938a0475b | 469 | { |
Maor_T | 2:9a4938a0475b | 470 | rotateRightMillis = getCommandValue(cmd); |
Maor_T | 2:9a4938a0475b | 471 | Rotate_Right(); // todo remove after testing |
Maor_T | 2:9a4938a0475b | 472 | } |
Maor_T | 2:9a4938a0475b | 473 | else if (cmd.find("turnspeed#")!= string::npos) |
Maor_T | 2:9a4938a0475b | 474 | { |
Maor_T | 2:9a4938a0475b | 475 | turnSpeed = getCommandValue(cmd); |
Maor_T | 2:9a4938a0475b | 476 | |
Maor_T | 2:9a4938a0475b | 477 | } |
Maor_T | 2:9a4938a0475b | 478 | else if(cmd.find("rotleft")!= string::npos) |
Maor_T | 2:9a4938a0475b | 479 | { |
Maor_T | 2:9a4938a0475b | 480 | Rotate_Left(); |
Maor_T | 2:9a4938a0475b | 481 | } |
Maor_T | 2:9a4938a0475b | 482 | else if(cmd.find("rotright")!= string::npos) |
Maor_T | 2:9a4938a0475b | 483 | { |
Maor_T | 2:9a4938a0475b | 484 | Rotate_Right(); |
Maor_T | 2:9a4938a0475b | 485 | } |
Maor_T | 2:9a4938a0475b | 486 | else if(cmd.find("left#")!= string::npos) |
Maor_T | 2:9a4938a0475b | 487 | { |
Maor_T | 2:9a4938a0475b | 488 | float time = getCommandValue(cmd); |
Maor_T | 2:9a4938a0475b | 489 | DriveCommand* dc; |
Maor_T | 2:9a4938a0475b | 490 | dc = (DriveCommand*)malloc(sizeof(DriveCommand)); |
Maor_T | 2:9a4938a0475b | 491 | dc->SetTime(time); |
Maor_T | 2:9a4938a0475b | 492 | dc->SetDir('l'); |
Maor_T | 2:9a4938a0475b | 493 | autoDriverQueue.Put(dc); |
Maor_T | 2:9a4938a0475b | 494 | } |
Maor_T | 2:9a4938a0475b | 495 | else if(cmd.find("right#")!= string::npos) |
Maor_T | 2:9a4938a0475b | 496 | { |
Maor_T | 2:9a4938a0475b | 497 | float time = getCommandValue(cmd); |
Maor_T | 2:9a4938a0475b | 498 | DriveCommand* dc; |
Maor_T | 2:9a4938a0475b | 499 | dc = (DriveCommand*)malloc(sizeof(DriveCommand)); |
Maor_T | 2:9a4938a0475b | 500 | dc->SetTime(time); |
Maor_T | 2:9a4938a0475b | 501 | dc->SetDir('r'); |
Maor_T | 2:9a4938a0475b | 502 | autoDriverQueue.Put(dc); |
Maor_T | 2:9a4938a0475b | 503 | } |
Maor_T | 2:9a4938a0475b | 504 | else if (cmd.find("autodrive")!= string::npos) |
Maor_T | 2:9a4938a0475b | 505 | { |
Maor_T | 2:9a4938a0475b | 506 | autoDriveFlag = true; |
Maor_T | 2:9a4938a0475b | 507 | |
Maor_T | 2:9a4938a0475b | 508 | } |
Maor_T | 2:9a4938a0475b | 509 | else if (cmd.find("forward")!= string::npos) |
Maor_T | 2:9a4938a0475b | 510 | { |
Maor_T | 2:9a4938a0475b | 511 | if(lastDistance < obstacleDistance) |
Maor_T | 2:9a4938a0475b | 512 | { |
Maor_T | 2:9a4938a0475b | 513 | Servo_NoNo(2); |
Maor_T | 2:9a4938a0475b | 514 | return; |
Maor_T | 2:9a4938a0475b | 515 | } |
Maor_T | 2:9a4938a0475b | 516 | Drive_Forward(vehicleSpeed); |
Maor_T | 2:9a4938a0475b | 517 | } |
Maor_T | 2:9a4938a0475b | 518 | else if (cmd.find("stop")!= string::npos) |
Maor_T | 2:9a4938a0475b | 519 | { |
Maor_T | 2:9a4938a0475b | 520 | Drive_Stop(); |
Maor_T | 2:9a4938a0475b | 521 | } |
Maor_T | 2:9a4938a0475b | 522 | else if (cmd.find("backwards")!= string::npos) |
Maor_T | 2:9a4938a0475b | 523 | { |
Maor_T | 2:9a4938a0475b | 524 | Drive_Backwards(vehicleSpeed); |
Maor_T | 2:9a4938a0475b | 525 | } |
Maor_T | 2:9a4938a0475b | 526 | else if (cmd.find("tleft")!= string::npos) |
Maor_T | 2:9a4938a0475b | 527 | { |
Maor_T | 2:9a4938a0475b | 528 | Turn_Left(vehicleSpeed); |
Maor_T | 2:9a4938a0475b | 529 | } |
Maor_T | 2:9a4938a0475b | 530 | else if (cmd.find("tright")!= string::npos) |
Maor_T | 2:9a4938a0475b | 531 | { |
Maor_T | 2:9a4938a0475b | 532 | Turn_Right(vehicleSpeed); |
Maor_T | 2:9a4938a0475b | 533 | } |
Maor_T | 2:9a4938a0475b | 534 | else if (cmd.find("dright")!= string::npos) |
Maor_T | 2:9a4938a0475b | 535 | { |
Maor_T | 2:9a4938a0475b | 536 | Drive_Right(vehicleSpeed); |
Maor_T | 2:9a4938a0475b | 537 | } |
Maor_T | 2:9a4938a0475b | 538 | else if (cmd.find("dleft")!= string::npos) |
Maor_T | 2:9a4938a0475b | 539 | { |
Maor_T | 2:9a4938a0475b | 540 | Drive_Left(vehicleSpeed); |
Maor_T | 2:9a4938a0475b | 541 | } |
Maor_T | 2:9a4938a0475b | 542 | else if (cmd.find("rleft")!= string::npos) |
Maor_T | 2:9a4938a0475b | 543 | { |
Maor_T | 2:9a4938a0475b | 544 | Reverse_Left(vehicleSpeed); |
Maor_T | 2:9a4938a0475b | 545 | } |
Maor_T | 2:9a4938a0475b | 546 | else if (cmd.find("rright")!= string::npos) |
Maor_T | 2:9a4938a0475b | 547 | { |
Maor_T | 2:9a4938a0475b | 548 | Reverse_Right(vehicleSpeed); |
Maor_T | 2:9a4938a0475b | 549 | } |
Maor_T | 2:9a4938a0475b | 550 | else if (cmd.find("speed1")!= string::npos) |
Maor_T | 2:9a4938a0475b | 551 | { |
Maor_T | 2:9a4938a0475b | 552 | vehicleSpeed = 0.25; |
Maor_T | 2:9a4938a0475b | 553 | |
Maor_T | 2:9a4938a0475b | 554 | } |
Maor_T | 2:9a4938a0475b | 555 | else if (cmd.find("speed2")!= string::npos) |
Maor_T | 2:9a4938a0475b | 556 | { |
Maor_T | 2:9a4938a0475b | 557 | vehicleSpeed = 0.50; |
Maor_T | 2:9a4938a0475b | 558 | |
Maor_T | 2:9a4938a0475b | 559 | } |
Maor_T | 2:9a4938a0475b | 560 | else if (cmd.find("speed3")!= string::npos) |
Maor_T | 2:9a4938a0475b | 561 | { |
Maor_T | 2:9a4938a0475b | 562 | vehicleSpeed = 0.75; |
Maor_T | 2:9a4938a0475b | 563 | |
Maor_T | 2:9a4938a0475b | 564 | } |
Maor_T | 2:9a4938a0475b | 565 | else if (cmd.find("speed4")!= string::npos) |
Maor_T | 2:9a4938a0475b | 566 | { |
Maor_T | 2:9a4938a0475b | 567 | vehicleSpeed = 1; |
Maor_T | 2:9a4938a0475b | 568 | |
Maor_T | 2:9a4938a0475b | 569 | } |
Maor_T | 2:9a4938a0475b | 570 | else |
Maor_T | 2:9a4938a0475b | 571 | { |
Maor_T | 2:9a4938a0475b | 572 | Drive_Stop(); |
Maor_T | 2:9a4938a0475b | 573 | } |
Maor_T | 2:9a4938a0475b | 574 | |
Maor_T | 2:9a4938a0475b | 575 | } |
Maor_T | 2:9a4938a0475b | 576 | |
Maor_T | 2:9a4938a0475b | 577 | void BTCommands2(char cmd) |
Maor_T | 2:9a4938a0475b | 578 | { |
Maor_T | 2:9a4938a0475b | 579 | #ifdef DEBUG_BT_COMMANDS |
Maor_T | 2:9a4938a0475b | 580 | printf("Incoming BT command : %c\n",cmd); // - Print the incoming command |
Maor_T | 2:9a4938a0475b | 581 | #endif |
Maor_T | 2:9a4938a0475b | 582 | |
Maor_T | 2:9a4938a0475b | 583 | switch(cmd) |
Maor_T | 2:9a4938a0475b | 584 | { |
Maor_T | 2:9a4938a0475b | 585 | case 'F' : Drive_Forward(1); break; |
Maor_T | 2:9a4938a0475b | 586 | case 'B' : Drive_Backwards(1); break; |
Maor_T | 2:9a4938a0475b | 587 | case 'S' : Drive_Stop(); break; |
Maor_T | 2:9a4938a0475b | 588 | case 'L' : Drive_Left(1); break; |
Maor_T | 2:9a4938a0475b | 589 | case 'R' : Drive_Right(1); break; |
Maor_T | 2:9a4938a0475b | 590 | } |
Maor_T | 2:9a4938a0475b | 591 | } |
Maor_T | 2:9a4938a0475b | 592 | |
Maor_T | 2:9a4938a0475b | 593 | |
Maor_T | 2:9a4938a0475b | 594 | void init() |
Maor_T | 2:9a4938a0475b | 595 | { |
Maor_T | 2:9a4938a0475b | 596 | bt.baud(115200); |
Maor_T | 2:9a4938a0475b | 597 | bt.attach(&DataReceived_ISR,Serial::RxIrq); |
Maor_T | 2:9a4938a0475b | 598 | pc.attach(&DataReceived_PCISR,Serial::RxIrq); |
Maor_T | 2:9a4938a0475b | 599 | Reset_IncomingMsg(); |
Maor_T | 2:9a4938a0475b | 600 | } |
Maor_T | 2:9a4938a0475b | 601 | |
Maor_T | 2:9a4938a0475b | 602 | |
Maor_T | 2:9a4938a0475b | 603 | void UltraSonic_Thread_Func(void const *args) |
Maor_T | 2:9a4938a0475b | 604 | { |
Maor_T | 2:9a4938a0475b | 605 | while(1) |
Maor_T | 2:9a4938a0475b | 606 | { |
Maor_T | 2:9a4938a0475b | 607 | |
Maor_T | 2:9a4938a0475b | 608 | // lastDistance = GetDistance(); |
Maor_T | 2:9a4938a0475b | 609 | usensor.start(); |
Maor_T | 2:9a4938a0475b | 610 | lastDistance = usensor.get_dist_cm(); |
Maor_T | 2:9a4938a0475b | 611 | |
Maor_T | 2:9a4938a0475b | 612 | if(moveForward_flag) |
Maor_T | 2:9a4938a0475b | 613 | { |
Maor_T | 2:9a4938a0475b | 614 | lastDistance = Get_Min_Distance(); |
Maor_T | 2:9a4938a0475b | 615 | } |
Maor_T | 2:9a4938a0475b | 616 | |
Maor_T | 2:9a4938a0475b | 617 | |
Maor_T | 2:9a4938a0475b | 618 | #ifdef DEBUG_ULTRASONICE |
Maor_T | 2:9a4938a0475b | 619 | pc.printf("Distance : %f\n",lastDistance ); |
Maor_T | 2:9a4938a0475b | 620 | #endif |
Maor_T | 2:9a4938a0475b | 621 | |
Maor_T | 2:9a4938a0475b | 622 | if(lastDistance < obstacleDistance && moveForward_flag ) { // todo : minimize code here |
Maor_T | 2:9a4938a0475b | 623 | autoDrivePartOk = false; |
Maor_T | 2:9a4938a0475b | 624 | Drive_Force_Stop(); |
Maor_T | 2:9a4938a0475b | 625 | moveForward_flag = false; |
Maor_T | 2:9a4938a0475b | 626 | Servo_NoNo(1); |
Maor_T | 2:9a4938a0475b | 627 | } |
Maor_T | 2:9a4938a0475b | 628 | else if((turnRight_Flag || turnLeft_Flag) && lastDistance < obstacleDistance ) { // todo : minimize code here |
Maor_T | 2:9a4938a0475b | 629 | autoDrivePartOk = false; |
Maor_T | 2:9a4938a0475b | 630 | Drive_Stop(); |
Maor_T | 2:9a4938a0475b | 631 | |
Maor_T | 2:9a4938a0475b | 632 | // moveForward_flag = false; |
Maor_T | 2:9a4938a0475b | 633 | } |
Maor_T | 2:9a4938a0475b | 634 | |
Maor_T | 2:9a4938a0475b | 635 | |
Maor_T | 2:9a4938a0475b | 636 | Thread::wait(ULTRASONIC_CHECK_DELAY_MS); |
Maor_T | 2:9a4938a0475b | 637 | } |
Maor_T | 2:9a4938a0475b | 638 | } |
Maor_T | 2:9a4938a0475b | 639 | |
Maor_T | 2:9a4938a0475b | 640 | void UltraSonic_Thread_Emergency(void const *args) |
Maor_T | 2:9a4938a0475b | 641 | { |
Maor_T | 2:9a4938a0475b | 642 | while(1) |
Maor_T | 2:9a4938a0475b | 643 | { |
Maor_T | 2:9a4938a0475b | 644 | usensor.start(); |
Maor_T | 2:9a4938a0475b | 645 | lastDistance = usensor.get_dist_cm(); |
Maor_T | 2:9a4938a0475b | 646 | |
Maor_T | 2:9a4938a0475b | 647 | #ifdef DEBUG_ULTRASONICE |
Maor_T | 2:9a4938a0475b | 648 | pc.printf("Distance : %f\n",lastDistance ); |
Maor_T | 2:9a4938a0475b | 649 | #endif |
Maor_T | 2:9a4938a0475b | 650 | |
Maor_T | 2:9a4938a0475b | 651 | if(lastDistance < obstacleDistance && moveForward_flag ) { // todo : minimize code here |
Maor_T | 2:9a4938a0475b | 652 | Drive_Force_Stop(); |
Maor_T | 2:9a4938a0475b | 653 | moveForward_flag = false; |
Maor_T | 2:9a4938a0475b | 654 | Servo_NoNo(1); |
Maor_T | 2:9a4938a0475b | 655 | } |
Maor_T | 2:9a4938a0475b | 656 | Thread::wait(ULTRASONIC_EMERGENCY_DELAY_MS); |
Maor_T | 2:9a4938a0475b | 657 | } |
Maor_T | 2:9a4938a0475b | 658 | } |
Maor_T | 2:9a4938a0475b | 659 | |
Maor_T | 2:9a4938a0475b | 660 | |
Maor_T | 2:9a4938a0475b | 661 | |
Maor_T | 2:9a4938a0475b | 662 | void ExecuteNextCommand() |
Maor_T | 2:9a4938a0475b | 663 | { |
Maor_T | 2:9a4938a0475b | 664 | DriveCommand* dc = (DriveCommand*)malloc(sizeof(DriveCommand)) ; |
Maor_T | 2:9a4938a0475b | 665 | // printf("Before get from queue\n"); |
Maor_T | 2:9a4938a0475b | 666 | autoDriverQueue.Get(dc); |
Maor_T | 2:9a4938a0475b | 667 | // printf("after get from queue\n"); |
Maor_T | 2:9a4938a0475b | 668 | float time = dc->GetTime(); |
Maor_T | 2:9a4938a0475b | 669 | char dir = dc->GetDir(); |
Maor_T | 2:9a4938a0475b | 670 | // printf("AutoDrive Runing at Dir:%c, Time:%d\n",dir,time); |
Maor_T | 2:9a4938a0475b | 671 | autoDriveRun = true; |
Maor_T | 2:9a4938a0475b | 672 | autoDrivePartOk = true; |
Maor_T | 2:9a4938a0475b | 673 | switch(dir) |
Maor_T | 2:9a4938a0475b | 674 | { |
Maor_T | 2:9a4938a0475b | 675 | case 'f': |
Maor_T | 2:9a4938a0475b | 676 | Drive_Forward(vehicleSpeed); |
Maor_T | 2:9a4938a0475b | 677 | break; |
Maor_T | 2:9a4938a0475b | 678 | case 'b': |
Maor_T | 2:9a4938a0475b | 679 | Drive_Backwards(vehicleSpeed); |
Maor_T | 2:9a4938a0475b | 680 | break; |
Maor_T | 2:9a4938a0475b | 681 | case 'l': |
Maor_T | 2:9a4938a0475b | 682 | Turn_Left(turnSpeed); |
Maor_T | 2:9a4938a0475b | 683 | wait_ms(rotateLeftMillis); |
Maor_T | 2:9a4938a0475b | 684 | Drive_Forward(vehicleSpeed); |
Maor_T | 2:9a4938a0475b | 685 | break; |
Maor_T | 2:9a4938a0475b | 686 | case 'r': |
Maor_T | 2:9a4938a0475b | 687 | Turn_Right(turnSpeed); |
Maor_T | 2:9a4938a0475b | 688 | wait_ms(rotateRightMillis); |
Maor_T | 2:9a4938a0475b | 689 | Drive_Forward(vehicleSpeed); |
Maor_T | 2:9a4938a0475b | 690 | break; |
Maor_T | 2:9a4938a0475b | 691 | } |
Maor_T | 2:9a4938a0475b | 692 | |
Maor_T | 2:9a4938a0475b | 693 | StopAfter(time); |
Maor_T | 2:9a4938a0475b | 694 | free(dc); |
Maor_T | 2:9a4938a0475b | 695 | |
Maor_T | 2:9a4938a0475b | 696 | while(autoDriveRun) |
Maor_T | 2:9a4938a0475b | 697 | wait_ms(50); |
Maor_T | 2:9a4938a0475b | 698 | |
Maor_T | 2:9a4938a0475b | 699 | if(autoDrivePartOk) |
Maor_T | 2:9a4938a0475b | 700 | bt.printf("ok%d~",autoDriveCounter); |
Maor_T | 2:9a4938a0475b | 701 | else |
Maor_T | 2:9a4938a0475b | 702 | bt.printf("fail%d~",autoDriveCounter); |
Maor_T | 2:9a4938a0475b | 703 | |
Maor_T | 2:9a4938a0475b | 704 | autoDriveCounter++; |
Maor_T | 2:9a4938a0475b | 705 | |
Maor_T | 2:9a4938a0475b | 706 | |
Maor_T | 2:9a4938a0475b | 707 | } |
Maor_T | 2:9a4938a0475b | 708 | |
Maor_T | 2:9a4938a0475b | 709 | |
Maor_T | 2:9a4938a0475b | 710 | |
Maor_T | 2:9a4938a0475b | 711 | |
Maor_T | 2:9a4938a0475b | 712 | |
Maor_T | 2:9a4938a0475b | 713 | void AutoDrive_Thread_Func(void const *args) |
Maor_T | 2:9a4938a0475b | 714 | { |
Maor_T | 2:9a4938a0475b | 715 | while(true) { |
Maor_T | 2:9a4938a0475b | 716 | |
Maor_T | 2:9a4938a0475b | 717 | // todo add check for autoDriveFlag |
Maor_T | 2:9a4938a0475b | 718 | if(autoDriveFlag && autoDriverQueue.GetNumberOfItems() >0 ) |
Maor_T | 2:9a4938a0475b | 719 | { |
Maor_T | 2:9a4938a0475b | 720 | // printf("Autodrive Commands before commit\n"); |
Maor_T | 2:9a4938a0475b | 721 | if(!autoDriveRun) //check that there is no running command right now |
Maor_T | 2:9a4938a0475b | 722 | ExecuteNextCommand(); |
Maor_T | 2:9a4938a0475b | 723 | // printf("Autodrive Commands after commit\n"); |
Maor_T | 2:9a4938a0475b | 724 | |
Maor_T | 2:9a4938a0475b | 725 | } |
Maor_T | 2:9a4938a0475b | 726 | else |
Maor_T | 2:9a4938a0475b | 727 | { |
Maor_T | 2:9a4938a0475b | 728 | autoDriveFlag = false; |
Maor_T | 2:9a4938a0475b | 729 | autoDriveCounter =0; |
Maor_T | 2:9a4938a0475b | 730 | } |
Maor_T | 2:9a4938a0475b | 731 | |
Maor_T | 2:9a4938a0475b | 732 | //printf("Checking for Autodrive Commands\n"); |
Maor_T | 2:9a4938a0475b | 733 | Thread::wait(AUTODRIVE_CHECK_DELAY_MS); |
Maor_T | 2:9a4938a0475b | 734 | } |
Maor_T | 2:9a4938a0475b | 735 | } |
Maor_T | 2:9a4938a0475b | 736 | |
Maor_T | 2:9a4938a0475b | 737 | |
Maor_T | 2:9a4938a0475b | 738 | |
Maor_T | 2:9a4938a0475b | 739 | |
Maor_T | 2:9a4938a0475b | 740 | void BT_Thread_Func(void const *args) |
Maor_T | 2:9a4938a0475b | 741 | { |
Maor_T | 2:9a4938a0475b | 742 | // while(true) { |
Maor_T | 2:9a4938a0475b | 743 | // if(globalString.length() > 0 ) |
Maor_T | 2:9a4938a0475b | 744 | // { |
Maor_T | 2:9a4938a0475b | 745 | // BTCommands(globalString); |
Maor_T | 2:9a4938a0475b | 746 | // globalString = ""; |
Maor_T | 2:9a4938a0475b | 747 | // } |
Maor_T | 2:9a4938a0475b | 748 | // Thread::wait(100); |
Maor_T | 2:9a4938a0475b | 749 | // } |
Maor_T | 2:9a4938a0475b | 750 | // |
Maor_T | 2:9a4938a0475b | 751 | while(true) { |
Maor_T | 2:9a4938a0475b | 752 | // if(lastCommandChar != 'x' ) |
Maor_T | 2:9a4938a0475b | 753 | // { |
Maor_T | 2:9a4938a0475b | 754 | // BTCommands2(lastCommandChar); |
Maor_T | 2:9a4938a0475b | 755 | // lastCommandChar = 'x'; |
Maor_T | 2:9a4938a0475b | 756 | // } |
Maor_T | 2:9a4938a0475b | 757 | |
Maor_T | 2:9a4938a0475b | 758 | string cmd = Get_last_Msg(); |
Maor_T | 2:9a4938a0475b | 759 | if(succesReadFlag) |
Maor_T | 2:9a4938a0475b | 760 | { |
Maor_T | 2:9a4938a0475b | 761 | |
Maor_T | 2:9a4938a0475b | 762 | BTCommands(cmd); |
Maor_T | 2:9a4938a0475b | 763 | succesReadFlag = false; |
Maor_T | 2:9a4938a0475b | 764 | } |
Maor_T | 2:9a4938a0475b | 765 | |
Maor_T | 2:9a4938a0475b | 766 | Thread::wait(BT_CHECK_DELAY_MS); |
Maor_T | 2:9a4938a0475b | 767 | } |
Maor_T | 2:9a4938a0475b | 768 | } |
Maor_T | 2:9a4938a0475b | 769 | |
ejteb | 0:1704ea055c4f | 770 | |
ejteb | 0:1704ea055c4f | 771 | int main() |
ejteb | 0:1704ea055c4f | 772 | { |
Maor_T | 2:9a4938a0475b | 773 | // mu.startUpdates();//start mesuring the distance |
Maor_T | 2:9a4938a0475b | 774 | |
Maor_T | 2:9a4938a0475b | 775 | init(); |
Maor_T | 2:9a4938a0475b | 776 | printf("Hello\n"); |
Maor_T | 2:9a4938a0475b | 777 | Thread btThread(BT_Thread_Func); |
Maor_T | 2:9a4938a0475b | 778 | btThread.set_priority(osPriorityNormal); |
Maor_T | 2:9a4938a0475b | 779 | Thread ultraSonicThread(UltraSonic_Thread_Func); |
Maor_T | 2:9a4938a0475b | 780 | ultraSonicThread.set_priority(osPriorityNormal); |
Maor_T | 2:9a4938a0475b | 781 | Thread ultraSonicEmergencyThread(UltraSonic_Thread_Emergency); |
Maor_T | 2:9a4938a0475b | 782 | ultraSonicEmergencyThread.set_priority(osPriorityNormal); |
Maor_T | 2:9a4938a0475b | 783 | Thread AutoDriveThread(AutoDrive_Thread_Func); |
Maor_T | 2:9a4938a0475b | 784 | AutoDriveThread.set_priority(osPriorityNormal); |
Maor_T | 2:9a4938a0475b | 785 | |
Maor_T | 2:9a4938a0475b | 786 | |
Maor_T | 2:9a4938a0475b | 787 | |
Maor_T | 2:9a4938a0475b | 788 | |
Maor_T | 2:9a4938a0475b | 789 | Servo_Look_Left(); |
Maor_T | 2:9a4938a0475b | 790 | wait(2); |
Maor_T | 2:9a4938a0475b | 791 | Servo_Look_Right(); |
Maor_T | 2:9a4938a0475b | 792 | wait(2); |
Maor_T | 2:9a4938a0475b | 793 | Servo_Look_Center(); |
Maor_T | 2:9a4938a0475b | 794 | |
Maor_T | 2:9a4938a0475b | 795 | |
Maor_T | 2:9a4938a0475b | 796 | // Drive_Forward(0.5); |
Maor_T | 2:9a4938a0475b | 797 | |
Maor_T | 2:9a4938a0475b | 798 | // StopAfter(3.0); |
Maor_T | 2:9a4938a0475b | 799 | |
Maor_T | 2:9a4938a0475b | 800 | |
Maor_T | 2:9a4938a0475b | 801 | // autoDriverQueue.Put(&DriveCommand('f',120)); |
Maor_T | 2:9a4938a0475b | 802 | |
ejteb | 0:1704ea055c4f | 803 | while(1) |
ejteb | 0:1704ea055c4f | 804 | { |
Maor_T | 2:9a4938a0475b | 805 | // mu._checkDistance(); |
ejteb | 1:4a5586eb1765 | 806 | //Do something else here |
Maor_T | 2:9a4938a0475b | 807 | // mu.checkDistance(); //call checkDistance() as much as possible, as this is where //the class checks if dist needs to be called. |
ejteb | 0:1704ea055c4f | 808 | } |
Maor_T | 2:9a4938a0475b | 809 | |
ejteb | 0:1704ea055c4f | 810 | } |
Maor_T | 2:9a4938a0475b | 811 | |
Maor_T | 2:9a4938a0475b | 812 | |
Maor_T | 2:9a4938a0475b | 813 |