GT ECE 4180 Lab Team - Raj Madisetti and Arjun Sonti
Dependencies: mbed Servo Motordriver X_NUCLEO_53L0A1 HC_SR04_Ultrasonic_Library
Remote Control Car
Georgia Tech ECE 4180 Embedded Systems Design Final Project
Team Members
Raj Madisetti Arjun Sonti
main.cpp@5:b1b250500440, 2020-11-27 (annotated)
- Committer:
- rmadisetti3
- Date:
- Fri Nov 27 20:45:42 2020 +0000
- Revision:
- 5:b1b250500440
- Parent:
- 4:29839de66eae
Final
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rmadisetti3 | 0:20a8dfc396cb | 1 | #include "mbed.h" |
rmadisetti3 | 0:20a8dfc396cb | 2 | #include "Servo.h" |
rmadisetti3 | 0:20a8dfc396cb | 3 | #include "motordriver.h" |
rmadisetti3 | 4:29839de66eae | 4 | #include "ultrasonic.h" |
rmadisetti3 | 0:20a8dfc396cb | 5 | #include <stdio.h> |
rmadisetti3 | 1:1c1ad0c1c260 | 6 | Serial pc(USBTX,USBRX); |
rmadisetti3 | 4:29839de66eae | 7 | Serial blue(p13,p14); |
rmadisetti3 | 0:20a8dfc396cb | 8 | DigitalOut myled(LED1); |
rmadisetti3 | 0:20a8dfc396cb | 9 | |
rmadisetti3 | 0:20a8dfc396cb | 10 | |
rmadisetti3 | 3:4956cc0efdf3 | 11 | #define AUTOPILOT 10 |
rmadisetti3 | 3:4956cc0efdf3 | 12 | #define FORWARD 1 |
rmadisetti3 | 3:4956cc0efdf3 | 13 | #define REVERSE -1 |
rmadisetti3 | 3:4956cc0efdf3 | 14 | #define STOP 0 |
rmadisetti3 | 3:4956cc0efdf3 | 15 | |
rmadisetti3 | 4:29839de66eae | 16 | int state = 0; //global variable stop state |
rmadisetti3 | 4:29839de66eae | 17 | int status1; |
rmadisetti3 | 4:29839de66eae | 18 | int status2; |
rmadisetti3 | 5:b1b250500440 | 19 | int autoPilotLock; |
rmadisetti3 | 4:29839de66eae | 20 | int distanceCenter; |
rmadisetti3 | 4:29839de66eae | 21 | int distanceLeft; |
rmadisetti3 | 4:29839de66eae | 22 | int distanceRight; |
rmadisetti3 | 0:20a8dfc396cb | 23 | Motor M(p21, p22, p23, 1); // pwm, fwd, rev, can brake |
rmadisetti3 | 1:1c1ad0c1c260 | 24 | Servo S(p24); |
rmadisetti3 | 4:29839de66eae | 25 | |
rmadisetti3 | 3:4956cc0efdf3 | 26 | |
rmadisetti3 | 3:4956cc0efdf3 | 27 | void getNewState() { |
rmadisetti3 | 3:4956cc0efdf3 | 28 | //Logic for AdaFruit App |
rmadisetti3 | 3:4956cc0efdf3 | 29 | char bnum=0; |
rmadisetti3 | 3:4956cc0efdf3 | 30 | char bhit=0; |
rmadisetti3 | 3:4956cc0efdf3 | 31 | if (blue.readable()) { |
rmadisetti3 | 3:4956cc0efdf3 | 32 | if (blue.getc()=='!') { |
rmadisetti3 | 3:4956cc0efdf3 | 33 | if (blue.getc()=='B') { //button data packet |
rmadisetti3 | 3:4956cc0efdf3 | 34 | bnum = blue.getc(); //button number |
rmadisetti3 | 3:4956cc0efdf3 | 35 | bhit = blue.getc(); //1=hit, 0=release |
rmadisetti3 | 3:4956cc0efdf3 | 36 | if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK? |
rmadisetti3 | 3:4956cc0efdf3 | 37 | myled = bnum - '0'; //current button number will appear on LEDs |
rmadisetti3 | 3:4956cc0efdf3 | 38 | switch (bnum) { |
rmadisetti3 | 3:4956cc0efdf3 | 39 | case '1': //AutoPilot Mode |
rmadisetti3 | 3:4956cc0efdf3 | 40 | if (bhit=='1') { |
rmadisetti3 | 3:4956cc0efdf3 | 41 | state = 10; //autopilot state |
rmadisetti3 | 3:4956cc0efdf3 | 42 | } |
rmadisetti3 | 3:4956cc0efdf3 | 43 | break; |
rmadisetti3 | 3:4956cc0efdf3 | 44 | case '5': //forward |
rmadisetti3 | 3:4956cc0efdf3 | 45 | if (bhit=='1') { |
rmadisetti3 | 3:4956cc0efdf3 | 46 | state = 1; //forward state |
rmadisetti3 | 3:4956cc0efdf3 | 47 | } else { |
rmadisetti3 | 3:4956cc0efdf3 | 48 | state = 0; //stop state |
rmadisetti3 | 3:4956cc0efdf3 | 49 | } |
rmadisetti3 | 3:4956cc0efdf3 | 50 | break; |
rmadisetti3 | 3:4956cc0efdf3 | 51 | case '6': //reverse |
rmadisetti3 | 3:4956cc0efdf3 | 52 | if (bhit=='1') { |
rmadisetti3 | 3:4956cc0efdf3 | 53 | state = -1; //reverse state |
rmadisetti3 | 3:4956cc0efdf3 | 54 | } else { |
rmadisetti3 | 3:4956cc0efdf3 | 55 | state = 0; //stop state |
rmadisetti3 | 3:4956cc0efdf3 | 56 | } |
rmadisetti3 | 3:4956cc0efdf3 | 57 | break; |
rmadisetti3 | 3:4956cc0efdf3 | 58 | case '7': //left |
rmadisetti3 | 3:4956cc0efdf3 | 59 | if (bhit=='1') { |
rmadisetti3 | 5:b1b250500440 | 60 | S = S + 0.5; //turn left |
rmadisetti3 | 3:4956cc0efdf3 | 61 | } |
rmadisetti3 | 3:4956cc0efdf3 | 62 | break; |
rmadisetti3 | 3:4956cc0efdf3 | 63 | case '8': //right |
rmadisetti3 | 3:4956cc0efdf3 | 64 | if (bhit=='1') { |
rmadisetti3 | 5:b1b250500440 | 65 | S = S - 0.5; //turn right |
rmadisetti3 | 3:4956cc0efdf3 | 66 | } |
rmadisetti3 | 3:4956cc0efdf3 | 67 | break; |
rmadisetti3 | 3:4956cc0efdf3 | 68 | } |
rmadisetti3 | 3:4956cc0efdf3 | 69 | } |
rmadisetti3 | 3:4956cc0efdf3 | 70 | } |
rmadisetti3 | 3:4956cc0efdf3 | 71 | } |
rmadisetti3 | 3:4956cc0efdf3 | 72 | } |
rmadisetti3 | 3:4956cc0efdf3 | 73 | } |
rmadisetti3 | 3:4956cc0efdf3 | 74 | |
rmadisetti3 | 3:4956cc0efdf3 | 75 | void autoPilot() { |
rmadisetti3 | 5:b1b250500440 | 76 | autoPilotLock = 0; |
rmadisetti3 | 5:b1b250500440 | 77 | if (distanceCenter >= 200 && autoPilotLock == 0) { |
rmadisetti3 | 3:4956cc0efdf3 | 78 | M.speed(1.0); |
rmadisetti3 | 3:4956cc0efdf3 | 79 | S = 0.5; |
rmadisetti3 | 3:4956cc0efdf3 | 80 | } |
rmadisetti3 | 3:4956cc0efdf3 | 81 | else if (distanceRight > distanceLeft) { //More space on right so turn right |
rmadisetti3 | 5:b1b250500440 | 82 | autoPilotLock = 1; |
rmadisetti3 | 5:b1b250500440 | 83 | M.speed(-1.0); |
rmadisetti3 | 5:b1b250500440 | 84 | S = 0; |
rmadisetti3 | 5:b1b250500440 | 85 | wait_ms(1000); |
rmadisetti3 | 5:b1b250500440 | 86 | autoPilotLock = 0; |
rmadisetti3 | 3:4956cc0efdf3 | 87 | } |
rmadisetti3 | 3:4956cc0efdf3 | 88 | else { //or turn left |
rmadisetti3 | 5:b1b250500440 | 89 | autoPilotLock = 1; |
rmadisetti3 | 5:b1b250500440 | 90 | M.speed(-1.0); |
rmadisetti3 | 5:b1b250500440 | 91 | S = 1.0; |
rmadisetti3 | 5:b1b250500440 | 92 | wait_ms(1000); |
rmadisetti3 | 5:b1b250500440 | 93 | autoPilotLock = 0; |
rmadisetti3 | 3:4956cc0efdf3 | 94 | } |
rmadisetti3 | 3:4956cc0efdf3 | 95 | } |
rmadisetti3 | 0:20a8dfc396cb | 96 | |
rmadisetti3 | 4:29839de66eae | 97 | void dist1(int distance) |
rmadisetti3 | 4:29839de66eae | 98 | { |
rmadisetti3 | 4:29839de66eae | 99 | distanceCenter = distance; |
rmadisetti3 | 4:29839de66eae | 100 | } |
rmadisetti3 | 4:29839de66eae | 101 | |
rmadisetti3 | 4:29839de66eae | 102 | void dist2(int distance) |
rmadisetti3 | 4:29839de66eae | 103 | { |
rmadisetti3 | 4:29839de66eae | 104 | distanceLeft = distance; |
rmadisetti3 | 4:29839de66eae | 105 | } |
rmadisetti3 | 4:29839de66eae | 106 | |
rmadisetti3 | 4:29839de66eae | 107 | void dist3(int distance) |
rmadisetti3 | 4:29839de66eae | 108 | { |
rmadisetti3 | 4:29839de66eae | 109 | distanceRight = distance; |
rmadisetti3 | 4:29839de66eae | 110 | } |
rmadisetti3 | 4:29839de66eae | 111 | |
rmadisetti3 | 4:29839de66eae | 112 | ultrasonic muCenter(p6, p7, .1, 1, &dist1); //sonar 1 initialization |
rmadisetti3 | 4:29839de66eae | 113 | ultrasonic muLeft(p17, p18, .1, 1, &dist2); //sonar 2 initialization |
rmadisetti3 | 4:29839de66eae | 114 | ultrasonic muRight(p15, p16, .1, 1, &dist3); //sonar 3 initialization |
rmadisetti3 | 4:29839de66eae | 115 | |
rmadisetti3 | 4:29839de66eae | 116 | |
rmadisetti3 | 0:20a8dfc396cb | 117 | |
rmadisetti3 | 0:20a8dfc396cb | 118 | int main() { |
rmadisetti3 | 4:29839de66eae | 119 | //SONAR Initializations |
rmadisetti3 | 4:29839de66eae | 120 | muCenter.startUpdates();//SONAR 1 starts measuring the distance |
rmadisetti3 | 4:29839de66eae | 121 | muLeft.startUpdates();//SONAR 2 starts measuring the distance |
rmadisetti3 | 4:29839de66eae | 122 | muRight.startUpdates();//SONAR 3 starts measuring the distance |
rmadisetti3 | 3:4956cc0efdf3 | 123 | while(1) { //main loop for motor control |
rmadisetti3 | 4:29839de66eae | 124 | pc.printf("Center D=%ld mm\r\n", distanceCenter); |
rmadisetti3 | 4:29839de66eae | 125 | pc.printf("Right D=%ld mm\r\n", distanceRight); |
rmadisetti3 | 4:29839de66eae | 126 | pc.printf("Left D=%ld mm\r\n", distanceLeft); |
rmadisetti3 | 4:29839de66eae | 127 | muCenter.checkDistance(); //SONAR measuring starts |
rmadisetti3 | 4:29839de66eae | 128 | muLeft.checkDistance(); |
rmadisetti3 | 4:29839de66eae | 129 | muRight.checkDistance(); |
rmadisetti3 | 3:4956cc0efdf3 | 130 | getNewState(); |
rmadisetti3 | 4:29839de66eae | 131 | if (distanceCenter >= 250 && state == FORWARD) { |
rmadisetti3 | 3:4956cc0efdf3 | 132 | M.speed(1.0); |
rmadisetti3 | 3:4956cc0efdf3 | 133 | } |
rmadisetti3 | 3:4956cc0efdf3 | 134 | else if (state == REVERSE) { |
rmadisetti3 | 3:4956cc0efdf3 | 135 | M.speed(-1.0); |
rmadisetti3 | 3:4956cc0efdf3 | 136 | } |
rmadisetti3 | 3:4956cc0efdf3 | 137 | else if (state == AUTOPILOT) { |
rmadisetti3 | 3:4956cc0efdf3 | 138 | autoPilot(); |
rmadisetti3 | 3:4956cc0efdf3 | 139 | } |
rmadisetti3 | 3:4956cc0efdf3 | 140 | else { |
rmadisetti3 | 3:4956cc0efdf3 | 141 | M.speed(0); |
rmadisetti3 | 2:5c9526ccb055 | 142 | } |
rmadisetti3 | 2:5c9526ccb055 | 143 | } |
rmadisetti3 | 3:4956cc0efdf3 | 144 | |
rmadisetti3 | 0:20a8dfc396cb | 145 | } |