Twin Motor Spybot using Mbed with bluetooth connection to a PC

Dependencies:   mbed Motor X_NUCLEO_53L0A1

General Information

This code allows an mbed LPC1768 to be wirelessly controlled from a PC. The PC sends serial chars over Bluetooth to control motors connected to an H-Bridge. This code works via interrupt driven functions which receive the incoming chars over a serial Bluetooth connection. The chars are sent in the format "0.00" with a - sign if it is negative. The functions parse the strings out and convert them into float values before then writing them into the Motor API. This all works while the LIDAR polls readings to ensure that it is not to close to any objects.

The serial chars are generated on the PC by a C# application which reads gamepad inputs. (Motors are controlled via float values from the analog sticks).

Committer:
lballard9
Date:
Tue Nov 26 22:00:43 2019 +0000
Revision:
0:df04be478939
This is the First Revision

Who changed what in which revision?

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