![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
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@2:5c9526ccb055, 2020-11-17 (annotated)
- Committer:
- rmadisetti3
- Date:
- Tue Nov 17 18:27:13 2020 +0000
- Revision:
- 2:5c9526ccb055
- Parent:
- 1:1c1ad0c1c260
- Child:
- 3:4956cc0efdf3
Bluetooth functionality implemented and motors operational
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 "XNucleo53L0A1.h" |
rmadisetti3 | 0:20a8dfc396cb | 3 | #include "Servo.h" |
rmadisetti3 | 0:20a8dfc396cb | 4 | #include "motordriver.h" |
rmadisetti3 | 0:20a8dfc396cb | 5 | #include <stdio.h> |
rmadisetti3 | 1:1c1ad0c1c260 | 6 | Serial pc(USBTX,USBRX); |
rmadisetti3 | 2:5c9526ccb055 | 7 | Serial blue(p9,p10); |
rmadisetti3 | 1:1c1ad0c1c260 | 8 | DigitalOut shdn(p26); |
rmadisetti3 | 0:20a8dfc396cb | 9 | DigitalOut myled(LED1); |
rmadisetti3 | 0:20a8dfc396cb | 10 | |
rmadisetti3 | 1:1c1ad0c1c260 | 11 | #define VL53L0_I2C_SDA p28 |
rmadisetti3 | 1:1c1ad0c1c260 | 12 | #define VL53L0_I2C_SCL p27 |
rmadisetti3 | 0:20a8dfc396cb | 13 | |
rmadisetti3 | 1:1c1ad0c1c260 | 14 | static XNucleo53L0A1 *board=NULL; |
rmadisetti3 | 0:20a8dfc396cb | 15 | Motor M(p21, p22, p23, 1); // pwm, fwd, rev, can brake |
rmadisetti3 | 1:1c1ad0c1c260 | 16 | Servo S(p24); |
rmadisetti3 | 0:20a8dfc396cb | 17 | |
rmadisetti3 | 0:20a8dfc396cb | 18 | |
rmadisetti3 | 0:20a8dfc396cb | 19 | int main() { |
rmadisetti3 | 1:1c1ad0c1c260 | 20 | int status; |
rmadisetti3 | 1:1c1ad0c1c260 | 21 | uint32_t distance; |
rmadisetti3 | 1:1c1ad0c1c260 | 22 | DevI2C *device_i2c = new DevI2C(VL53L0_I2C_SDA, VL53L0_I2C_SCL); |
rmadisetti3 | 1:1c1ad0c1c260 | 23 | /* creates the 53L0A1 expansion board singleton obj */ |
rmadisetti3 | 1:1c1ad0c1c260 | 24 | board = XNucleo53L0A1::instance(device_i2c, A2, D8, D2); |
rmadisetti3 | 1:1c1ad0c1c260 | 25 | shdn = 0; //must reset sensor for an mbed reset to work |
rmadisetti3 | 1:1c1ad0c1c260 | 26 | wait(0.1); |
rmadisetti3 | 1:1c1ad0c1c260 | 27 | shdn = 1; |
rmadisetti3 | 1:1c1ad0c1c260 | 28 | wait(0.1); |
rmadisetti3 | 1:1c1ad0c1c260 | 29 | /* init the 53L0A1 board with default values */ |
rmadisetti3 | 1:1c1ad0c1c260 | 30 | status = board->init_board(); |
rmadisetti3 | 1:1c1ad0c1c260 | 31 | while (status) { |
rmadisetti3 | 1:1c1ad0c1c260 | 32 | pc.printf("Failed to init board! \r\n"); |
rmadisetti3 | 1:1c1ad0c1c260 | 33 | status = board->init_board(); |
rmadisetti3 | 1:1c1ad0c1c260 | 34 | } |
rmadisetti3 | 1:1c1ad0c1c260 | 35 | |
rmadisetti3 | 1:1c1ad0c1c260 | 36 | |
rmadisetti3 | 1:1c1ad0c1c260 | 37 | //Logic for AdaFruit App |
rmadisetti3 | 1:1c1ad0c1c260 | 38 | char bnum=0; |
rmadisetti3 | 1:1c1ad0c1c260 | 39 | char bhit=0; |
rmadisetti3 | 1:1c1ad0c1c260 | 40 | while(1) { |
rmadisetti3 | 1:1c1ad0c1c260 | 41 | if (blue.getc()=='!') { |
rmadisetti3 | 1:1c1ad0c1c260 | 42 | if (blue.getc()=='B') { //button data packet |
rmadisetti3 | 1:1c1ad0c1c260 | 43 | bnum = blue.getc(); //button number |
rmadisetti3 | 1:1c1ad0c1c260 | 44 | bhit = blue.getc(); //1=hit, 0=release |
rmadisetti3 | 1:1c1ad0c1c260 | 45 | if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK? |
rmadisetti3 | 1:1c1ad0c1c260 | 46 | myled = bnum - '0'; //current button number will appear on LEDs |
rmadisetti3 | 1:1c1ad0c1c260 | 47 | switch (bnum) { |
rmadisetti3 | 2:5c9526ccb055 | 48 | //case '1': //AutoPilot Mode |
rmadisetti3 | 2:5c9526ccb055 | 49 | // if (bhit=='1') { |
rmadisetti3 | 2:5c9526ccb055 | 50 | // M.speed(1.0); |
rmadisetti3 | 2:5c9526ccb055 | 51 | // //loop taking and printing distance |
rmadisetti3 | 2:5c9526ccb055 | 52 | // status = board->sensor_centre->get_distance(&distance); |
rmadisetti3 | 2:5c9526ccb055 | 53 | // if (distance <= 50) { |
rmadisetti3 | 2:5c9526ccb055 | 54 | // //turn left or right depending on location of sensor |
rmadisetti3 | 2:5c9526ccb055 | 55 | // M.speed(0); |
rmadisetti3 | 2:5c9526ccb055 | 56 | // } |
rmadisetti3 | 2:5c9526ccb055 | 57 | // } |
rmadisetti3 | 2:5c9526ccb055 | 58 | // break; |
rmadisetti3 | 1:1c1ad0c1c260 | 59 | case '5': //forward |
rmadisetti3 | 1:1c1ad0c1c260 | 60 | if (bhit=='1') { |
rmadisetti3 | 2:5c9526ccb055 | 61 | status = board->sensor_centre->get_distance(&distance); |
rmadisetti3 | 2:5c9526ccb055 | 62 | if (distance <= 50) { |
rmadisetti3 | 2:5c9526ccb055 | 63 | M.speed(1.0); //drive forward |
rmadisetti3 | 2:5c9526ccb055 | 64 | } else { |
rmadisetti3 | 2:5c9526ccb055 | 65 | M.speed(0.0); //stop |
rmadisetti3 | 2:5c9526ccb055 | 66 | } |
rmadisetti3 | 1:1c1ad0c1c260 | 67 | } else { |
rmadisetti3 | 1:1c1ad0c1c260 | 68 | M.speed(0.0); //stop |
rmadisetti3 | 2:5c9526ccb055 | 69 | } |
rmadisetti3 | 1:1c1ad0c1c260 | 70 | break; |
rmadisetti3 | 1:1c1ad0c1c260 | 71 | case '6': //reverse |
rmadisetti3 | 1:1c1ad0c1c260 | 72 | if (bhit=='1') { |
rmadisetti3 | 1:1c1ad0c1c260 | 73 | M.speed(-1.0); //reverse |
rmadisetti3 | 1:1c1ad0c1c260 | 74 | } else { |
rmadisetti3 | 1:1c1ad0c1c260 | 75 | M.speed(0.0); //stop |
rmadisetti3 | 1:1c1ad0c1c260 | 76 | } |
rmadisetti3 | 1:1c1ad0c1c260 | 77 | break; |
rmadisetti3 | 1:1c1ad0c1c260 | 78 | case '7': //left |
rmadisetti3 | 1:1c1ad0c1c260 | 79 | if (bhit=='1') { |
rmadisetti3 | 1:1c1ad0c1c260 | 80 | S = S - 0.5; //turn left |
rmadisetti3 | 1:1c1ad0c1c260 | 81 | } |
rmadisetti3 | 1:1c1ad0c1c260 | 82 | break; |
rmadisetti3 | 1:1c1ad0c1c260 | 83 | case '8': //right |
rmadisetti3 | 1:1c1ad0c1c260 | 84 | if (bhit=='1') { |
rmadisetti3 | 1:1c1ad0c1c260 | 85 | S = S + 0.5; //turn right |
rmadisetti3 | 1:1c1ad0c1c260 | 86 | } |
rmadisetti3 | 1:1c1ad0c1c260 | 87 | break; |
rmadisetti3 | 2:5c9526ccb055 | 88 | } |
rmadisetti3 | 2:5c9526ccb055 | 89 | } |
rmadisetti3 | 2:5c9526ccb055 | 90 | } |
rmadisetti3 | 2:5c9526ccb055 | 91 | } |
rmadisetti3 | 2:5c9526ccb055 | 92 | } |
rmadisetti3 | 0:20a8dfc396cb | 93 | } |