A program which uses twin DC motors and a lidar to drive a robot controlled by a gamepad through an mbed.
Test
This is a test of the repository
main.cpp@17:54dec877b815, 2019-11-26 (annotated)
- Committer:
- lballard9
- Date:
- Tue Nov 26 21:23:39 2019 +0000
- Revision:
- 17:54dec877b815
- Parent:
- 16:73a8f1db6f76
1st
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
lballard9 | 12:4f635df5b368 | 1 | // Sweep the motor speed from full-speed reverse (-1.0) to full speed forwards (1.0) |
lballard9 | 12:4f635df5b368 | 2 | |
johnAlexander | 0:ce8359133ae6 | 3 | #include "mbed.h" |
lballard9 | 12:4f635df5b368 | 4 | #include "Motor.h" |
Davidroid | 10:891e10d3b4a6 | 5 | #include "XNucleo53L0A1.h" |
lballard9 | 12:4f635df5b368 | 6 | |
lballard9 | 12:4f635df5b368 | 7 | #define VL53L0_I2C_SDA p28 // To be changed based on Pins |
lballard9 | 12:4f635df5b368 | 8 | #define VL53L0_I2C_SCL p27 // To be changed based on Pins |
4180_1 | 11:5186cc367be0 | 9 | DigitalOut shdn(p26); |
johnAlexander | 0:ce8359133ae6 | 10 | |
lballard9 | 12:4f635df5b368 | 11 | Motor lm(p21, p7, p8); // pwm, fwd, rev |
lballard9 | 12:4f635df5b368 | 12 | Motor rm(p22, p6, p10); // pwm, fwd, rev |
lballard9 | 12:4f635df5b368 | 13 | //BusOut myled(LED1,LED2,LED3,LED4); |
lballard9 | 12:4f635df5b368 | 14 | Serial BT(p13,p14); |
lballard9 | 12:4f635df5b368 | 15 | Serial pc(USBTX,USBRX); |
lballard9 | 14:6f3985a23eeb | 16 | BusOut led(p15,p16,p19,p18); |
lballard9 | 16:73a8f1db6f76 | 17 | PwmOut spkr(p23); |
lballard9 | 16:73a8f1db6f76 | 18 | DigitalOut spkrenable(p5); |
johnAlexander | 0:ce8359133ae6 | 19 | |
Davidroid | 10:891e10d3b4a6 | 20 | static XNucleo53L0A1 *board=NULL; |
lballard9 | 12:4f635df5b368 | 21 | bool stopMotor = false; |
lballard9 | 13:1b31916de79e | 22 | bool turbo = false; |
johnAlexander | 1:3483e701ec59 | 23 | |
lballard9 | 12:4f635df5b368 | 24 | float getSpeed(char& value) { |
lballard9 | 12:4f635df5b368 | 25 | |
lballard9 | 12:4f635df5b368 | 26 | float ones, tens = 0, hundreds, n2, n3, dot; |
lballard9 | 12:4f635df5b368 | 27 | |
lballard9 | 12:4f635df5b368 | 28 | dot = BT.getc(); |
lballard9 | 12:4f635df5b368 | 29 | n2 = BT.getc(); |
lballard9 | 12:4f635df5b368 | 30 | n3 = BT.getc(); |
lballard9 | 12:4f635df5b368 | 31 | |
lballard9 | 12:4f635df5b368 | 32 | ones = (float)(value -'0'); |
lballard9 | 12:4f635df5b368 | 33 | |
lballard9 | 12:4f635df5b368 | 34 | tens = (float)(n2 -'0'); |
lballard9 | 12:4f635df5b368 | 35 | tens = tens / 10.00; |
lballard9 | 12:4f635df5b368 | 36 | |
lballard9 | 12:4f635df5b368 | 37 | hundreds = (float)(n3 - '0'); |
lballard9 | 12:4f635df5b368 | 38 | hundreds = hundreds/100.00; |
lballard9 | 12:4f635df5b368 | 39 | |
lballard9 | 12:4f635df5b368 | 40 | return (ones + tens + hundreds); |
lballard9 | 12:4f635df5b368 | 41 | } |
lballard9 | 12:4f635df5b368 | 42 | |
lballard9 | 12:4f635df5b368 | 43 | void setMotorSpeed(Motor* motor, float mspeed) { |
lballard9 | 12:4f635df5b368 | 44 | if(mspeed <= 1.0){ |
lballard9 | 12:4f635df5b368 | 45 | if(abs(mspeed) > 0.2 && !stopMotor || mspeed > .2){ |
lballard9 | 12:4f635df5b368 | 46 | pc.printf("%0.2f is the motor speed\n\r", mspeed); |
lballard9 | 13:1b31916de79e | 47 | if(turbo) |
lballard9 | 12:4f635df5b368 | 48 | motor->speed(mspeed); |
lballard9 | 13:1b31916de79e | 49 | if(!turbo) |
lballard9 | 16:73a8f1db6f76 | 50 | motor->speed(mspeed/1.25); |
lballard9 | 12:4f635df5b368 | 51 | } |
lballard9 | 12:4f635df5b368 | 52 | else |
lballard9 | 12:4f635df5b368 | 53 | motor->speed(0); |
lballard9 | 12:4f635df5b368 | 54 | } |
lballard9 | 12:4f635df5b368 | 55 | } |
lballard9 | 12:4f635df5b368 | 56 | void btMotorUpdate(Motor* motor) { |
lballard9 | 12:4f635df5b368 | 57 | |
lballard9 | 12:4f635df5b368 | 58 | char PlusMinus = BT.getc(); |
lballard9 | 12:4f635df5b368 | 59 | |
lballard9 | 12:4f635df5b368 | 60 | if(PlusMinus == '-'){ |
lballard9 | 12:4f635df5b368 | 61 | char n1 = BT.getc(); |
lballard9 | 12:4f635df5b368 | 62 | setMotorSpeed(motor, -(getSpeed(n1))); |
lballard9 | 12:4f635df5b368 | 63 | |
lballard9 | 12:4f635df5b368 | 64 | } else { |
lballard9 | 12:4f635df5b368 | 65 | setMotorSpeed(motor, getSpeed(PlusMinus)); |
lballard9 | 12:4f635df5b368 | 66 | |
lballard9 | 12:4f635df5b368 | 67 | } |
lballard9 | 12:4f635df5b368 | 68 | } |
lballard9 | 12:4f635df5b368 | 69 | |
lballard9 | 12:4f635df5b368 | 70 | void btSerialInterrupt() { |
lballard9 | 12:4f635df5b368 | 71 | |
lballard9 | 12:4f635df5b368 | 72 | char LRABYX = BT.getc(); |
lballard9 | 12:4f635df5b368 | 73 | |
lballard9 | 12:4f635df5b368 | 74 | if(LRABYX == 'L'){ |
lballard9 | 12:4f635df5b368 | 75 | btMotorUpdate(&lm); |
lballard9 | 12:4f635df5b368 | 76 | } |
lballard9 | 12:4f635df5b368 | 77 | if(LRABYX == 'R') { |
lballard9 | 12:4f635df5b368 | 78 | btMotorUpdate(&rm); |
lballard9 | 12:4f635df5b368 | 79 | } |
lballard9 | 13:1b31916de79e | 80 | if(LRABYX == 'A') { |
lballard9 | 15:e012856b3a61 | 81 | turbo = true; |
lballard9 | 13:1b31916de79e | 82 | } |
lballard9 | 15:e012856b3a61 | 83 | if(LRABYX == 'B') { |
lballard9 | 15:e012856b3a61 | 84 | turbo = false; |
lballard9 | 15:e012856b3a61 | 85 | } |
lballard9 | 15:e012856b3a61 | 86 | |
lballard9 | 12:4f635df5b368 | 87 | } |
lballard9 | 12:4f635df5b368 | 88 | |
lballard9 | 12:4f635df5b368 | 89 | |
lballard9 | 12:4f635df5b368 | 90 | int main() { |
lballard9 | 12:4f635df5b368 | 91 | |
lballard9 | 12:4f635df5b368 | 92 | DevI2C *device_i2c = new DevI2C(VL53L0_I2C_SDA, VL53L0_I2C_SCL); |
lballard9 | 12:4f635df5b368 | 93 | board = XNucleo53L0A1::instance(device_i2c, A2, D8, D2); |
lballard9 | 12:4f635df5b368 | 94 | uint32_t distance; |
lballard9 | 12:4f635df5b368 | 95 | shdn = 0; //must reset sensor for an mbed reset to work |
lballard9 | 12:4f635df5b368 | 96 | wait(0.1); |
lballard9 | 12:4f635df5b368 | 97 | shdn = 1; |
lballard9 | 12:4f635df5b368 | 98 | wait(0.1); |
lballard9 | 12:4f635df5b368 | 99 | |
4180_1 | 11:5186cc367be0 | 100 | /* init the 53L0A1 board with default values */ |
lballard9 | 12:4f635df5b368 | 101 | int status = board->init_board(); |
4180_1 | 11:5186cc367be0 | 102 | while (status) { |
4180_1 | 11:5186cc367be0 | 103 | status = board->init_board(); |
johnAlexander | 7:c8087e7333b8 | 104 | } |
lballard9 | 12:4f635df5b368 | 105 | |
lballard9 | 12:4f635df5b368 | 106 | BT.attach(&btSerialInterrupt); |
lballard9 | 12:4f635df5b368 | 107 | lm.speed(0); |
lballard9 | 12:4f635df5b368 | 108 | rm.speed(0); |
lballard9 | 14:6f3985a23eeb | 109 | led.write(0); |
lballard9 | 16:73a8f1db6f76 | 110 | spkrenable = 0; |
lballard9 | 16:73a8f1db6f76 | 111 | |
lballard9 | 12:4f635df5b368 | 112 | |
4180_1 | 11:5186cc367be0 | 113 | while (1) { |
johnAlexander | 7:c8087e7333b8 | 114 | status = board->sensor_centre->get_distance(&distance); |
johnAlexander | 9:9733cfdb0a18 | 115 | if (status == VL53L0X_ERROR_NONE) { |
lballard9 | 12:4f635df5b368 | 116 | pc.printf("%d\n\r",distance); |
lballard9 | 12:4f635df5b368 | 117 | |
lballard9 | 13:1b31916de79e | 118 | if (distance < 300) { // Distance might need to be adjusted |
lballard9 | 12:4f635df5b368 | 119 | stopMotor = true; |
lballard9 | 14:6f3985a23eeb | 120 | led.write(15*!led.read()); |
lballard9 | 16:73a8f1db6f76 | 121 | spkrenable = 1; |
lballard9 | 16:73a8f1db6f76 | 122 | spkr = .5; |
lballard9 | 16:73a8f1db6f76 | 123 | wait(.1); |
lballard9 | 16:73a8f1db6f76 | 124 | spkr = 0; |
lballard9 | 16:73a8f1db6f76 | 125 | spkrenable = 0; |
lballard9 | 12:4f635df5b368 | 126 | } |
lballard9 | 12:4f635df5b368 | 127 | else{ |
lballard9 | 12:4f635df5b368 | 128 | stopMotor = false; |
lballard9 | 15:e012856b3a61 | 129 | |
lballard9 | 14:6f3985a23eeb | 130 | led.write(0); |
lballard9 | 12:4f635df5b368 | 131 | } |
lballard9 | 12:4f635df5b368 | 132 | |
lballard9 | 12:4f635df5b368 | 133 | |
lballard9 | 12:4f635df5b368 | 134 | // Any Lighting or Sound Effects for Crash Detection |
lballard9 | 12:4f635df5b368 | 135 | |
johnAlexander | 7:c8087e7333b8 | 136 | } |
4180_1 | 11:5186cc367be0 | 137 | } |
lballard9 | 12:4f635df5b368 | 138 | |
lballard9 | 12:4f635df5b368 | 139 | } |