Complete Build

Dependencies:   4DGL-uLCD-SE1 Motor SDFileSystem X_NUCLEO_53L0A1 mbed-rtos mbed BotwithWavePlayerLevel

Fork of BotWithBluetoothLIDARV2 by Brandon Weiner and Carlos Tallard

Committer:
bdragon52
Date:
Fri Dec 01 03:22:56 2017 +0000
Revision:
19:f854f09cf1ab
Parent:
18:aa7f48962bdb
Final Build

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bdragon52 16:61e88b0e3689 1
emilmont 1:491820ee784d 2 #include "mbed.h"
bdragon52 16:61e88b0e3689 3 #include "Motor.h"
mbed_official 11:0309bef74ba8 4 #include "rtos.h"
bdragon52 12:af37c8938aaf 5
ctallardc 17:2c6549be1ecb 6 #define SD_DBG 1
ctallardc 17:2c6549be1ecb 7
bdragon52 16:61e88b0e3689 8 #include "SDFileSystem.h"
bdragon52 16:61e88b0e3689 9 SDFileSystem sd(p5, p6, p7, p29, "sd");
bdragon52 12:af37c8938aaf 10
bdragon52 16:61e88b0e3689 11
bdragon52 16:61e88b0e3689 12 #include "wave_player.h"
bdragon52 12:af37c8938aaf 13 AnalogOut DACout(p18);
bdragon52 12:af37c8938aaf 14 wave_player waver(&DACout);
bdragon52 16:61e88b0e3689 15
bdragon52 16:61e88b0e3689 16 #include "XNucleo53L0A1.h"
bdragon52 16:61e88b0e3689 17 #include <stdio.h>
bdragon52 16:61e88b0e3689 18 Serial pc(USBTX,USBRX);
bdragon52 16:61e88b0e3689 19 DigitalOut shdn(p26);
bdragon52 18:aa7f48962bdb 20
bdragon52 16:61e88b0e3689 21 //I2C sensor pins
bdragon52 16:61e88b0e3689 22 #define VL53L0_I2C_SDA p28
bdragon52 16:61e88b0e3689 23 #define VL53L0_I2C_SCL p27
bdragon52 16:61e88b0e3689 24 static XNucleo53L0A1 *board=NULL;
bdragon52 16:61e88b0e3689 25 DigitalOut myled (LED2);
bdragon52 16:61e88b0e3689 26 Serial blue(p9,p10);
bdragon52 16:61e88b0e3689 27 Motor RW(p22, p13, p12); // pwm, fwd, rev
bdragon52 16:61e88b0e3689 28 Motor LW(p21, p8, p11); // pwm, fwd, rev
bdragon52 16:61e88b0e3689 29 Thread lidar;
bdragon52 16:61e88b0e3689 30 Thread siren;
bdragon52 16:61e88b0e3689 31 uint32_t distance;
ctallardc 17:2c6549be1ecb 32 int level = 8; //Volume level is turned off
ctallardc 17:2c6549be1ecb 33
cjtallu 14:cc2e4fbaffd8 34
bdragon52 18:aa7f48962bdb 35 //speaker thread
bdragon52 16:61e88b0e3689 36 void t3(){
bdragon52 18:aa7f48962bdb 37
bdragon52 16:61e88b0e3689 38 while(1){
bdragon52 18:aa7f48962bdb 39
ctallardc 17:2c6549be1ecb 40 FILE *wave_file=fopen("/sd/LoudSound.wav","r");
bdragon52 16:61e88b0e3689 41 waver.play(wave_file);
bdragon52 18:aa7f48962bdb 42 fclose(wave_file);
ctallardc 17:2c6549be1ecb 43
bdragon52 12:af37c8938aaf 44 }
cjtallu 14:cc2e4fbaffd8 45 }
cjtallu 14:cc2e4fbaffd8 46
bdragon52 18:aa7f48962bdb 47 //lidar thread
bdragon52 16:61e88b0e3689 48 void t2() {
bdragon52 16:61e88b0e3689 49
bdragon52 16:61e88b0e3689 50 int status;
bdragon52 16:61e88b0e3689 51 DevI2C *device_i2c = new DevI2C(VL53L0_I2C_SDA, VL53L0_I2C_SCL);
bdragon52 16:61e88b0e3689 52 /* creates the 53L0A1 expansion board singleton obj */
bdragon52 16:61e88b0e3689 53 board = XNucleo53L0A1::instance(device_i2c, A2, D8, D2);
bdragon52 16:61e88b0e3689 54 shdn = 0; //must reset sensor for an mbed reset to work
bdragon52 16:61e88b0e3689 55 Thread::wait(100);
ctallardc 17:2c6549be1ecb 56 //lidar power off
bdragon52 16:61e88b0e3689 57 shdn = 1;
bdragon52 16:61e88b0e3689 58 Thread::wait(100);
bdragon52 16:61e88b0e3689 59 /* init the 53L0A1 board with default values */
bdragon52 16:61e88b0e3689 60 status = board->init_board();
bdragon52 16:61e88b0e3689 61 while (status) {
bdragon52 16:61e88b0e3689 62 pc.printf("Failed to init board! \r\n");
bdragon52 16:61e88b0e3689 63 status = board->init_board();
emilmont 1:491820ee784d 64 }
bdragon52 16:61e88b0e3689 65 //loop taking and printing distance
bdragon52 16:61e88b0e3689 66 while (1) {
bdragon52 16:61e88b0e3689 67 status = board->sensor_centre->get_distance(&distance);
bdragon52 16:61e88b0e3689 68 if (status == VL53L0X_ERROR_NONE) {
ctallardc 17:2c6549be1ecb 69 pc.printf("D=%ld mm\r\n", distance);
ctallardc 17:2c6549be1ecb 70 if(distance > 240) level = 8;
ctallardc 17:2c6549be1ecb 71 if(distance < 90) level = 0;
ctallardc 17:2c6549be1ecb 72 if (distance >=90 && distance <=240){
ctallardc 17:2c6549be1ecb 73 int value=floor(static_cast<double>(8*(distance-90)/150));
ctallardc 17:2c6549be1ecb 74 if(value >=0 && value<=8){
ctallardc 17:2c6549be1ecb 75 level=value;
ctallardc 17:2c6549be1ecb 76 }
ctallardc 17:2c6549be1ecb 77 }
bdragon52 16:61e88b0e3689 78 }
bdragon52 16:61e88b0e3689 79 myled=!myled;
bdragon52 16:61e88b0e3689 80 Thread::wait(500);
bdragon52 16:61e88b0e3689 81 }
bdragon52 13:ab6bbdd2447a 82
bdragon52 13:ab6bbdd2447a 83 }
bdragon52 13:ab6bbdd2447a 84
bdragon52 13:ab6bbdd2447a 85
bdragon52 19:f854f09cf1ab 86 //bot movement using bluetooth thread
bdragon52 16:61e88b0e3689 87 int main()
bdragon52 16:61e88b0e3689 88 {
ctallardc 17:2c6549be1ecb 89 char previousButton='0';
ctallardc 17:2c6549be1ecb 90 char current;
bdragon52 16:61e88b0e3689 91 myled=0;
ctallardc 17:2c6549be1ecb 92 pc.printf("in main\n\r");
ctallardc 17:2c6549be1ecb 93 lidar.start(t2);
ctallardc 17:2c6549be1ecb 94 siren.start(t3);
bdragon52 16:61e88b0e3689 95 char bnum=0;
bdragon52 16:61e88b0e3689 96 char bhit=0;
bdragon52 12:af37c8938aaf 97 while(1) {
bdragon52 16:61e88b0e3689 98
bdragon52 16:61e88b0e3689 99 if(blue.readable()==1){
bdragon52 16:61e88b0e3689 100 if (blue.getc()=='!') {
bdragon52 16:61e88b0e3689 101 if (blue.getc()=='B') { //button data packet
bdragon52 16:61e88b0e3689 102 bnum = blue.getc(); //button number
bdragon52 16:61e88b0e3689 103 bhit = blue.getc(); //1=hit, 0=release
ctallardc 17:2c6549be1ecb 104 current=bnum;
ctallardc 17:2c6549be1ecb 105 previousButton = current;
bdragon52 18:aa7f48962bdb 106 if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) {
bdragon52 16:61e88b0e3689 107 switch (bnum) {
bdragon52 16:61e88b0e3689 108 case '1': //number button 1
bdragon52 16:61e88b0e3689 109 if (bhit=='1') {
bdragon52 16:61e88b0e3689 110 RW.speed(1);
bdragon52 16:61e88b0e3689 111 } else {
bdragon52 16:61e88b0e3689 112 //add release code here
bdragon52 16:61e88b0e3689 113 break;
bdragon52 16:61e88b0e3689 114 case '2': //number button 2
bdragon52 16:61e88b0e3689 115 if (bhit=='1') {
bdragon52 16:61e88b0e3689 116 RW.speed(0);
bdragon52 16:61e88b0e3689 117 LW.speed(0);
bdragon52 16:61e88b0e3689 118 //add hit code here
bdragon52 16:61e88b0e3689 119 } else {
bdragon52 16:61e88b0e3689 120 //add release code here
bdragon52 16:61e88b0e3689 121 }
bdragon52 16:61e88b0e3689 122 break;
bdragon52 16:61e88b0e3689 123 case '3': //number button 3
bdragon52 16:61e88b0e3689 124 if (bhit=='1') {
bdragon52 16:61e88b0e3689 125 //add hit code here
bdragon52 16:61e88b0e3689 126 } else {
bdragon52 16:61e88b0e3689 127 //add release code here
bdragon52 16:61e88b0e3689 128 }
bdragon52 16:61e88b0e3689 129 break;
bdragon52 16:61e88b0e3689 130 case '4': //number button 4
bdragon52 16:61e88b0e3689 131 if (bhit=='1') {
bdragon52 16:61e88b0e3689 132 //add hit code here
bdragon52 16:61e88b0e3689 133 } else {
bdragon52 16:61e88b0e3689 134 //add release code here
bdragon52 16:61e88b0e3689 135 }
bdragon52 16:61e88b0e3689 136 break;
bdragon52 16:61e88b0e3689 137 case '5': //button 5 up arrow
bdragon52 16:61e88b0e3689 138 if (bhit=='1') {
bdragon52 18:aa7f48962bdb 139 RW.speed(1.0);
bdragon52 18:aa7f48962bdb 140 LW.speed(1.0);
bdragon52 16:61e88b0e3689 141 } else {
bdragon52 18:aa7f48962bdb 142 RW.speed(0);
bdragon52 18:aa7f48962bdb 143 LW.speed(0);
bdragon52 16:61e88b0e3689 144 }
bdragon52 16:61e88b0e3689 145 break;
bdragon52 16:61e88b0e3689 146 case '6': //button 6 down arrow
bdragon52 16:61e88b0e3689 147 if (bhit=='1') {
bdragon52 18:aa7f48962bdb 148 RW.speed(-1.0);
bdragon52 18:aa7f48962bdb 149 LW.speed(-1.0);
bdragon52 16:61e88b0e3689 150 //add hit code here
bdragon52 16:61e88b0e3689 151 } else {
bdragon52 16:61e88b0e3689 152 RW.speed(0);
bdragon52 18:aa7f48962bdb 153 LW.speed(0);
bdragon52 16:61e88b0e3689 154 }
bdragon52 16:61e88b0e3689 155 break;
bdragon52 16:61e88b0e3689 156 case '7': //button 7 left arrow
bdragon52 16:61e88b0e3689 157 if (bhit=='1') {
ctallardc 17:2c6549be1ecb 158 RW.speed(-1.0);
bdragon52 18:aa7f48962bdb 159 LW.speed(1.0);
bdragon52 16:61e88b0e3689 160 } else {
bdragon52 16:61e88b0e3689 161 RW.speed(0);
bdragon52 18:aa7f48962bdb 162 LW.speed(0);
bdragon52 16:61e88b0e3689 163 }
bdragon52 16:61e88b0e3689 164 break;
bdragon52 16:61e88b0e3689 165 case '8': //button 8 right arrow
bdragon52 16:61e88b0e3689 166 if (bhit=='1') {
ctallardc 17:2c6549be1ecb 167 RW.speed(1.0);
bdragon52 18:aa7f48962bdb 168 LW.speed(-1.0);
bdragon52 16:61e88b0e3689 169 } else {
bdragon52 16:61e88b0e3689 170 RW.speed(0);
bdragon52 18:aa7f48962bdb 171 LW.speed(0);
bdragon52 16:61e88b0e3689 172 }
bdragon52 16:61e88b0e3689 173 break;
bdragon52 16:61e88b0e3689 174 default:
bdragon52 16:61e88b0e3689 175 break;
bdragon52 16:61e88b0e3689 176 }
bdragon52 16:61e88b0e3689 177 }
bdragon52 16:61e88b0e3689 178 }
bdragon52 16:61e88b0e3689 179 }
bdragon52 16:61e88b0e3689 180
bdragon52 16:61e88b0e3689 181 }
bdragon52 16:61e88b0e3689 182
bdragon52 16:61e88b0e3689 183 Thread::yield();
bdragon52 16:61e88b0e3689 184
bdragon52 12:af37c8938aaf 185 }
bdragon52 18:aa7f48962bdb 186 }
bdragon52 16:61e88b0e3689 187 }