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
- Committer:
- rmadisetti3
- Date:
- 2020-11-19
- Revision:
- 3:4956cc0efdf3
- Parent:
- 2:5c9526ccb055
- Child:
- 4:29839de66eae
File content as of revision 3:4956cc0efdf3:
#include "mbed.h" #include "XNucleo53L0A1.h" #include "Servo.h" #include "motordriver.h" #include <stdio.h> Serial pc(USBTX,USBRX); Serial blue(p9,p10); DigitalOut shdn(p26); DigitalOut myled(LED1); #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() { //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); shdn = 0; //must reset sensor for an mbed reset to work wait(0.1); shdn = 1; wait(0.1); /* init the 53L0A1 board with default values */ status = board->init_board(); while (status) { pc.printf("Failed to init board! \r\n"); status = board->init_board(); } 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); } } }