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:
Fri Nov 22 00:08:24 2019 +0000
Revision:
12:4f635df5b368
Parent:
11:5186cc367be0
Child:
13:1b31916de79e
flashing light is working going to attempt to add braking;

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 12:4f635df5b368 16 DigitalOut led(p15);
johnAlexander 0:ce8359133ae6 17
Davidroid 10:891e10d3b4a6 18 static XNucleo53L0A1 *board=NULL;
lballard9 12:4f635df5b368 19 bool stopMotor = false;
johnAlexander 1:3483e701ec59 20
lballard9 12:4f635df5b368 21 float getSpeed(char& value) {
lballard9 12:4f635df5b368 22
lballard9 12:4f635df5b368 23 float ones, tens = 0, hundreds, n2, n3, dot;
lballard9 12:4f635df5b368 24
lballard9 12:4f635df5b368 25 dot = BT.getc();
lballard9 12:4f635df5b368 26 n2 = BT.getc();
lballard9 12:4f635df5b368 27 n3 = BT.getc();
lballard9 12:4f635df5b368 28
lballard9 12:4f635df5b368 29 ones = (float)(value -'0');
lballard9 12:4f635df5b368 30
lballard9 12:4f635df5b368 31 tens = (float)(n2 -'0');
lballard9 12:4f635df5b368 32 tens = tens / 10.00;
lballard9 12:4f635df5b368 33
lballard9 12:4f635df5b368 34 hundreds = (float)(n3 - '0');
lballard9 12:4f635df5b368 35 hundreds = hundreds/100.00;
lballard9 12:4f635df5b368 36
lballard9 12:4f635df5b368 37 return (ones + tens + hundreds);
lballard9 12:4f635df5b368 38 }
lballard9 12:4f635df5b368 39
lballard9 12:4f635df5b368 40 void setMotorSpeed(Motor* motor, float mspeed) {
lballard9 12:4f635df5b368 41 if(mspeed <= 1.0){
lballard9 12:4f635df5b368 42 if(abs(mspeed) > 0.2 && !stopMotor || mspeed > .2){
lballard9 12:4f635df5b368 43 pc.printf("%0.2f is the motor speed\n\r", mspeed);
lballard9 12:4f635df5b368 44 motor->speed(mspeed);
lballard9 12:4f635df5b368 45 }
lballard9 12:4f635df5b368 46 else
lballard9 12:4f635df5b368 47 motor->speed(0);
lballard9 12:4f635df5b368 48 }
lballard9 12:4f635df5b368 49 }
lballard9 12:4f635df5b368 50 void btMotorUpdate(Motor* motor) {
lballard9 12:4f635df5b368 51
lballard9 12:4f635df5b368 52 char PlusMinus = BT.getc();
lballard9 12:4f635df5b368 53
lballard9 12:4f635df5b368 54 if(PlusMinus == '-'){
lballard9 12:4f635df5b368 55 char n1 = BT.getc();
lballard9 12:4f635df5b368 56 setMotorSpeed(motor, -(getSpeed(n1)));
lballard9 12:4f635df5b368 57
lballard9 12:4f635df5b368 58 } else {
lballard9 12:4f635df5b368 59 setMotorSpeed(motor, getSpeed(PlusMinus));
lballard9 12:4f635df5b368 60
lballard9 12:4f635df5b368 61 }
lballard9 12:4f635df5b368 62 }
lballard9 12:4f635df5b368 63
lballard9 12:4f635df5b368 64 void btSerialInterrupt() {
lballard9 12:4f635df5b368 65
lballard9 12:4f635df5b368 66 char LRABYX = BT.getc();
lballard9 12:4f635df5b368 67
lballard9 12:4f635df5b368 68 if(LRABYX == 'L'){
lballard9 12:4f635df5b368 69 btMotorUpdate(&lm);
lballard9 12:4f635df5b368 70 }
lballard9 12:4f635df5b368 71 if(LRABYX == 'R') {
lballard9 12:4f635df5b368 72 btMotorUpdate(&rm);
lballard9 12:4f635df5b368 73 }
lballard9 12:4f635df5b368 74
lballard9 12:4f635df5b368 75
lballard9 12:4f635df5b368 76 }
lballard9 12:4f635df5b368 77
lballard9 12:4f635df5b368 78
lballard9 12:4f635df5b368 79 int main() {
lballard9 12:4f635df5b368 80
lballard9 12:4f635df5b368 81 DevI2C *device_i2c = new DevI2C(VL53L0_I2C_SDA, VL53L0_I2C_SCL);
lballard9 12:4f635df5b368 82 board = XNucleo53L0A1::instance(device_i2c, A2, D8, D2);
lballard9 12:4f635df5b368 83 uint32_t distance;
lballard9 12:4f635df5b368 84 shdn = 0; //must reset sensor for an mbed reset to work
lballard9 12:4f635df5b368 85 wait(0.1);
lballard9 12:4f635df5b368 86 shdn = 1;
lballard9 12:4f635df5b368 87 wait(0.1);
lballard9 12:4f635df5b368 88
4180_1 11:5186cc367be0 89 /* init the 53L0A1 board with default values */
lballard9 12:4f635df5b368 90 int status = board->init_board();
4180_1 11:5186cc367be0 91 while (status) {
4180_1 11:5186cc367be0 92 status = board->init_board();
johnAlexander 7:c8087e7333b8 93 }
lballard9 12:4f635df5b368 94
lballard9 12:4f635df5b368 95 BT.attach(&btSerialInterrupt);
lballard9 12:4f635df5b368 96 lm.speed(0);
lballard9 12:4f635df5b368 97 rm.speed(0);
lballard9 12:4f635df5b368 98 led = 0;
lballard9 12:4f635df5b368 99
4180_1 11:5186cc367be0 100 while (1) {
johnAlexander 7:c8087e7333b8 101 status = board->sensor_centre->get_distance(&distance);
johnAlexander 9:9733cfdb0a18 102 if (status == VL53L0X_ERROR_NONE) {
lballard9 12:4f635df5b368 103 pc.printf("%d\n\r",distance);
lballard9 12:4f635df5b368 104
lballard9 12:4f635df5b368 105 if (distance < 250) { // Distance might need to be adjusted
lballard9 12:4f635df5b368 106 stopMotor = true;
lballard9 12:4f635df5b368 107 led = !led;
lballard9 12:4f635df5b368 108 wait(.1);
lballard9 12:4f635df5b368 109 }
lballard9 12:4f635df5b368 110 else{
lballard9 12:4f635df5b368 111 stopMotor = false;
lballard9 12:4f635df5b368 112 led = 0;
lballard9 12:4f635df5b368 113 }
lballard9 12:4f635df5b368 114
lballard9 12:4f635df5b368 115
lballard9 12:4f635df5b368 116 // Any Lighting or Sound Effects for Crash Detection
lballard9 12:4f635df5b368 117
johnAlexander 7:c8087e7333b8 118 }
4180_1 11:5186cc367be0 119 }
lballard9 12:4f635df5b368 120
lballard9 12:4f635df5b368 121 }