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
Revision 3:4956cc0efdf3, committed 2020-11-19
- Comitter:
- rmadisetti3
- Date:
- Thu Nov 19 17:23:54 2020 +0000
- Parent:
- 2:5c9526ccb055
- Child:
- 4:29839de66eae
- Commit message:
- Added Autopilot function
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Tue Nov 17 18:27:13 2020 +0000
+++ b/main.cpp Thu Nov 19 17:23:54 2020 +0000
@@ -11,14 +11,84 @@
#define VL53L0_I2C_SDA p28
#define VL53L0_I2C_SCL p27
+#define AUTOPILOT 10
+#define FORWARD 1
+#define REVERSE -1
+#define STOP 0
+
static XNucleo53L0A1 *board=NULL;
Motor M(p21, p22, p23, 1); // pwm, fwd, rev, can brake
Servo S(p24);
+int state = 0; //global variable stop state
+int status;
+uint32_t distanceCenter;
+uint32_t distanceLeft;
+uint32_t distanceRight;
+
+void getNewState() {
+ //Logic for AdaFruit App
+ char bnum=0;
+ char bhit=0;
+ if (blue.readable()) {
+ if (blue.getc()=='!') {
+ if (blue.getc()=='B') { //button data packet
+ bnum = blue.getc(); //button number
+ bhit = blue.getc(); //1=hit, 0=release
+ if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK?
+ myled = bnum - '0'; //current button number will appear on LEDs
+ switch (bnum) {
+ case '1': //AutoPilot Mode
+ if (bhit=='1') {
+ state = 10; //autopilot state
+ }
+ break;
+ case '5': //forward
+ if (bhit=='1') {
+ state = 1; //forward state
+ } else {
+ state = 0; //stop state
+ }
+ break;
+ case '6': //reverse
+ if (bhit=='1') {
+ state = -1; //reverse state
+ } else {
+ state = 0; //stop state
+ }
+ break;
+ case '7': //left
+ if (bhit=='1') {
+ S = S - 0.5; //turn left
+ }
+ break;
+ case '8': //right
+ if (bhit=='1') {
+ S = S + 0.5; //turn right
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+}
+
+void autoPilot() {
+ if ((distanceCenter >= 250 || distanceCenter == 0)) {
+ M.speed(1.0);
+ S = 0.5;
+ }
+ else if (distanceRight > distanceLeft) { //More space on right so turn right
+ S = 1.0;
+ }
+ else { //or turn left
+ S = 0;
+ }
+}
int main() {
- int status;
- uint32_t distance;
+ //LIDAR Initialization
DevI2C *device_i2c = new DevI2C(VL53L0_I2C_SDA, VL53L0_I2C_SCL);
/* creates the 53L0A1 expansion board singleton obj */
board = XNucleo53L0A1::instance(device_i2c, A2, D8, D2);
@@ -33,61 +103,22 @@
status = board->init_board();
}
-
- //Logic for AdaFruit App
- char bnum=0;
- char bhit=0;
- while(1) {
- if (blue.getc()=='!') {
- if (blue.getc()=='B') { //button data packet
- bnum = blue.getc(); //button number
- bhit = blue.getc(); //1=hit, 0=release
- if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK?
- myled = bnum - '0'; //current button number will appear on LEDs
- switch (bnum) {
- //case '1': //AutoPilot Mode
-// if (bhit=='1') {
-// M.speed(1.0);
-// //loop taking and printing distance
-// status = board->sensor_centre->get_distance(&distance);
-// if (distance <= 50) {
-// //turn left or right depending on location of sensor
-// M.speed(0);
-// }
-// }
-// break;
- case '5': //forward
- if (bhit=='1') {
- status = board->sensor_centre->get_distance(&distance);
- if (distance <= 50) {
- M.speed(1.0); //drive forward
- } else {
- M.speed(0.0); //stop
- }
- } else {
- M.speed(0.0); //stop
- }
- break;
- case '6': //reverse
- if (bhit=='1') {
- M.speed(-1.0); //reverse
- } else {
- M.speed(0.0); //stop
- }
- break;
- case '7': //left
- if (bhit=='1') {
- S = S - 0.5; //turn left
- }
- break;
- case '8': //right
- if (bhit=='1') {
- S = S + 0.5; //turn right
- }
- break;
- }
- }
- }
+ while(1) { //main loop for motor control
+ status = board->sensor_centre->get_distance(&distanceCenter);
+ pc.printf("D=%ld mm\r\n", distanceCenter);
+ getNewState();
+ if ((distanceCenter >= 250 || distanceCenter == 0) && state == FORWARD) {
+ M.speed(1.0);
+ }
+ else if (state == REVERSE) {
+ M.speed(-1.0);
+ }
+ else if (state == AUTOPILOT) {
+ autoPilot();
+ }
+ else {
+ M.speed(0);
}
}
+
}
