A program which uses twin DC motors and a lidar to drive a robot controlled by a gamepad through an mbed.

Dependencies:   mbed Motor

Test

This is a test of the repository

Committer:
lballard9
Date:
Tue Nov 26 21:23:39 2019 +0000
Revision:
17:54dec877b815
Parent:
16:73a8f1db6f76
1st

Who changed what in which revision?

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