bluetooth robot
Dependencies: Motor ShiftBrite mbed-rtos mbed
main.cpp
- Committer:
- AlexFerrara
- Date:
- 2016-12-12
- Revision:
- 0:18550647a842
File content as of revision 0:18550647a842:
#include "mbed.h" #include "Motor.h" #include "rtos.h" #include "stdio.h" #include "ShiftBrite.h" #include "Speaker.h" // I/O Configurations // LEDS DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); // Motors Motor m_l(p21, p22, p23); // pwm, fwd, rev Motor m_r(p26, p30, p24); // pwm, fwd, rev //Shiftbrites SPI spi(p11, p12, p13); ShiftBrite myBrite(p15,p16,spi); //latch, enable, spi //Speaker Speaker mySpeaker(p25); // Serial ports RawSerial pc(USBTX, USBRX); RawSerial dev(p28, p27); char X; Mutex dev_mutex; DigitalOut rst1(p8); // IR AnalogIn IR(p20); float IR_distance; // Serial reading variables char building = '0'; int tVal = 0; int l_speed = 32767; int r_speed = 32767; int c; // Horn and Light flags bool horn = false; int lightMode = 0; int colorMode = 0; // Threads // Motor Thread // Uses thresholds for the Y-axis of the analog joysticks to set variable motor speed void thread_Motor(void const *args){ while (true) { m_r.speed(0); m_l.speed(0); // LEFT MOTOR CONTROL if(l_speed < 30000){ if(l_speed < 8000) m_l.speed(-1); else if(l_speed < 16000) m_l.speed(-0.8); else if(l_speed < 24000) m_l.speed(-0.6); else m_l.speed(-0.5); } else if(l_speed > 34000 & IR_distance < 0.9f){ if(l_speed > 56000) m_l.speed(1); else if(l_speed > 48000) m_l.speed(0.8); else if(l_speed > 40000) m_l.speed(0.6); else m_l.speed(0.5); } else m_l.speed(0); // RIGHT MOTOR CONTROL if(r_speed < 30000){ if(r_speed < 8000) m_r.speed(-1); else if(r_speed < 16000) m_r.speed(-0.8); else if(r_speed < 24000) m_r.speed(-0.6); else m_r.speed(-0.5); } else if(r_speed > 34000 & IR_distance < 0.9f){ if(r_speed > 56000) m_r.speed(1); else if(r_speed > 48000) m_r.speed(0.8); else if(r_speed > 40000) m_r.speed(0.6); else m_r.speed(0.5); } else m_r.speed(0); Thread::wait(10); } } // Serial Port Reading Interrupt void dev_recv(){ led1 = !led1; while(dev.readable()) { dev_mutex.lock(); X = dev.getc(); dev_mutex.unlock(); switch (X) { case 'L': //number button 1 building = 'L'; tVal = 0; break; case 'R': //number button 2 building = 'R'; tVal = 0; break; case ']': //number button 3 if(building == 'L') l_speed = tVal; else r_speed = tVal; building = '0'; break; case 'T': //number button 2 horn = true; break; case 't': //number button 2 horn = false; break; case 'S': //number button 2 lightMode++; break; case 'C': //number button 2 colorMode++; break; default: break; } c = (int)X - 48; if(building != '0' && c >= 0 && c <= 9) tVal = tVal*10 + c; } } // Shiftbrite Thread void thread_Lights(void const *args){ int r,g,b; r=g=b=0; int br = 0; int scale = 0; //myBrite.Brightness(1023,1023,1023); //myBrite.Write(0,0,0); while(1) { int mode = lightMode%3; int color = colorMode % 4; switch (color){ case 0: r=g=b=1; break; case 1: r = 1; g=b=0; break; case 2: g = 1; r=b=0; break; case 3: b = 1; r=g=0; break; default: break; } //pc.printf("%d,%d,%d\r\n",r,g,b); switch (mode){ case 0: scale = 0; br = 0; break; case 1: scale = 100; br = 600; break; case 2: scale= 255; br = 1023; break; default: break; } r = (int) (r * scale); b = (int) (b * scale); g = (int) (g * scale); myBrite.Write(r,g,b); myBrite.Brightness(br*r,br*g,br*b); Thread::wait(50); } } // Speaker Thread void thread_Speaker(void const *args){ while(1){ if (horn){ mySpeaker.PlayNote(400.0,0.2,0.5); } Thread::wait(10); } } // Main int main(){ pc.baud(9600); dev.attach(&dev_recv, Serial::RxIrq); Thread t2(thread_Motor); Thread t3(thread_Lights); Thread t4(thread_Speaker); while(1) { if(IR > 0.9f){ led1 = 1; led2 = 1; led3 = 1; led4 = 1; } else if(IR > 0.7f){ led1 = 1; led2 = 1; led3 = 1; led4 = 0; } else if(IR > 0.5f){ led1 = 1; led2 = 1; led3 = 0; led4 = 0; } else if(IR > 0.3f){ led1 = 1; led2 = 0; led3 = 0; led4 = 0; } else if(IR > 0.1f){ led1 = 0; led2 = 0; led3 = 0; led4 = 0; } IR_distance = IR; Thread::wait(50); // wait 0.5s } }