Complete Build
Dependencies: 4DGL-uLCD-SE1 Motor SDFileSystem X_NUCLEO_53L0A1 mbed-rtos mbed BotwithWavePlayerLevel
Fork of BotWithBluetoothLIDARV2 by
main.cpp
- Committer:
- ctallardc
- Date:
- 2017-11-20
- Revision:
- 17:2c6549be1ecb
- Parent:
- 16:61e88b0e3689
- Child:
- 18:aa7f48962bdb
File content as of revision 17:2c6549be1ecb:
#include "mbed.h" #include "Motor.h" #include "rtos.h" #define SD_DBG 1 #include "SDFileSystem.h" SDFileSystem sd(p5, p6, p7, p29, "sd"); #include "wave_player.h" AnalogOut DACout(p18); wave_player waver(&DACout); PwmOut speaker(p23); //BusOut myled(LED1,LED2,LED3,LED4); #include "XNucleo53L0A1.h" #include <stdio.h> Serial pc(USBTX,USBRX); DigitalOut shdn(p26); //I2C sensor pins #define VL53L0_I2C_SDA p28 #define VL53L0_I2C_SCL p27 static XNucleo53L0A1 *board=NULL; DigitalOut myled (LED2); Serial blue(p9,p10); Motor RW(p22, p13, p12); // pwm, fwd, rev Motor LW(p21, p8, p11); // pwm, fwd, rev Thread lidar; Thread siren; uint32_t distance; int level = 8; //Volume level is turned off //wave_file; void listdir(void) { DIR *d; struct dirent *p; d = opendir("/sd"); if (d != NULL) { while ((p = readdir(d)) != NULL) { pc.printf(" - %s\r\n", p->d_name); } } else { pc.printf("Could not open directory!\r\n"); } closedir(d); } void t3(){ // int i; pc.printf("Speaker\r\n"); listdir(); //waver.set_verbosity(1); // FILE *fp = fopen("/sd/myfile2.txt", "w"); // fprintf(fp, "Hello World 11/18\n"); // fclose(fp); while(1){ /* generate a 500Hz tone using PWM hardware output speaker.period(1.0/500.0); // 500hz period speaker =0.5; //50% duty cycle - max volume wait(3); speaker=0.0; // turn off audio wait(2); // generate a short 150Hz tone using PWM hardware output // something like this can be used for a button click effect for feedback for (i=0; i<10; i++) { speaker.period(1.0/150.0); // 500hz period speaker =0.25; //25% duty cycle - mid range volume wait(.02); speaker=0.0; // turn off audio wait(0.5); } */ while(1){ FILE *wave_file=fopen("/sd/LoudSound.wav","r"); waver.play(wave_file); fclose(wave_file); //Thread::wait(50); } } } void t2() { int status; DevI2C *device_i2c = new DevI2C(VL53L0_I2C_SDA, VL53L0_I2C_SCL); /* creates the 53L0A1 expansion board singleton obj */ board = XNucleo53L0A1::instance(device_i2c, A2, D8, D2); shdn = 0; //must reset sensor for an mbed reset to work Thread::wait(100); //lidar power off shdn = 1; Thread::wait(100); /* init the 53L0A1 board with default values */ status = board->init_board(); while (status) { pc.printf("Failed to init board! \r\n"); status = board->init_board(); } //loop taking and printing distance bool speakerOn=false; while (1) { status = board->sensor_centre->get_distance(&distance); if (status == VL53L0X_ERROR_NONE) { pc.printf("D=%ld mm\r\n", distance); if(distance > 240) level = 8; if(distance < 90) level = 0; if (distance >=90 && distance <=240){ int value=floor(static_cast<double>(8*(distance-90)/150)); if(value >=0 && value<=8){ level=value; } } } //LIDAR checks /* if(speakerOn==false && distance<=100) //thread start sound, speakerOn=true; if(speakerOn==true && distance<=100) //certain volume if(speakerOn==true && distance<50) //higher volume; if(distance>100) //thread stop, speakerOn==false; */ //siren.start(t3); myled=!myled; Thread::wait(500); } } int main() { char previousButton='0'; char current; myled=0; pc.printf("in main\n\r"); lidar.start(t2); siren.start(t3); char bnum=0; char bhit=0; while(1) { if(blue.readable()==1){ if (blue.getc()=='!') { if (blue.getc()=='B') { //button data packet bnum = blue.getc(); //button number bhit = blue.getc(); //1=hit, 0=release current=bnum; //Thread::wait(250); //pc.printf("Button Pressed %c bhit = %c PreviousButton = %c CurrentButton = %c\n\r", bnum, bhit, previousButton, current); previousButton = current; if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK? //myled = bnum - '0'; //current button number will appear on LEDs switch (bnum) { case '1': //number button 1 if (bhit=='1') { RW.speed(1); //add hit code here } else { //add release code here } break; case '2': //number button 2 if (bhit=='1') { RW.speed(0); LW.speed(0); //add hit code here } else { //add release code here } break; case '3': //number button 3 if (bhit=='1') { //add hit code here } else { //add release code here } break; case '4': //number button 4 if (bhit=='1') { //add hit code here } else { //add release code here } break; case '5': //button 5 up arrow if (bhit=='1') { //add hit code here RW.speed(1.0); LW.speed(1.0); } else { LW.speed(0); RW.speed(0); //add release code here } break; case '6': //button 6 down arrow if (bhit=='1') { RW.speed(-1.0); LW.speed(-1.0); //add hit code here } else { RW.speed(0); LW.speed(0); //add release code here } break; case '7': //button 7 left arrow if (bhit=='1') { RW.speed(-1.0); LW.speed(1.0); //add hit code here } else { RW.speed(0); LW.speed(0); //add release code here } break; case '8': //button 8 right arrow if (bhit=='1') { RW.speed(1.0); LW.speed(-1.0); //add hit code here } else { RW.speed(0); LW.speed(0); //add release code here } break; default: break; } } } } } Thread::yield(); } }