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

Committer:
rmadisetti3
Date:
Fri Nov 27 20:45:42 2020 +0000
Revision:
5:b1b250500440
Parent:
4:29839de66eae
Final

Who changed what in which revision?

UserRevisionLine numberNew 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 }