The project is not done yet
Dependencies: USBHost USBHostXpad mbed-rtos mbed
Fork of Totaleprogramma by
Diff: main.cpp
- Revision:
- 0:345f76c72b9a
- Child:
- 1:da390b3b1330
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Feb 25 08:25:16 2015 +0000 @@ -0,0 +1,540 @@ +#define DEBUG 0 +#include "mbed.h" +#include "rtos.h" +#include "Traxster.h" +#include "USBHostXpad.h" +#include "utils.h" +#include "Audio.h" +#include <cmath> + + +Serial pc(USBTX, USBRX); +I2C i2cMod(p28, p27); + +Serial robotCom(p13, p14); +AnalogIn ir(p20); +Speaker speaker(p18); // the pin must be the AnalogOut pin - p18 + +DigitalIn DI1(p5); +DigitalIn DI2(p6); +DigitalIn DI3(p7); +DigitalIn DI4(p8); +DigitalOut DQ1(p9); //motor lv +PwmOut PWM1(p21); //motor lv +DigitalOut DQ2(p10); //MOTOR rv +PwmOut PWM2 (p22); //Motor rv +DigitalOut DQ3(p11); //motor la +PwmOut PWM3(p23); //motor la +DigitalOut DQ4(p12); //MOTOR ra +PwmOut PWM4 (p24); //Motor ra +AnalogIn pot(p19); //potmeter +//I2C U1(p27,p28); //Ultrasoonsensorwaarde lv1 +//I2C U2(p27,p28); //Ultrasoonsensorwaarde rv1 +AnalogIn lslv(p15); //lasersensorwaarde lv2 +AnalogIn lsrv(p16); //lasersensorwaarde rv2 +DigitalOut led1(LED1); //shows trigger +DigitalOut led2(LED2); //shows collision prevention +DigitalOut led3(LED3); //shows laser pointer active +DigitalOut led4(LED4); //shows cpu activity +DigitalOut fire(p8); +DigitalOut laser(p27); +Audio audio (speaker); + +Xbox360ControllerState controlState; +Traxster tank(robotCom); + +int i2cAddress1 = 0xF2; +int i2cAddress2 = 0xE0; + +void sendStartRangingCommand1(void){ + const char command[] = {0x00, 0x51}; + i2cMod.write(i2cAddress1, command, 2); +} +void sendStartRangingCommand2(void){ + const char command[] = {0x00, 0x51}; + i2cMod.write(i2cAddress2, command, 2); +} +int readRange1(void){ + const char command[] = {0x02}; //Address of range register + char response[] = {0x00, 0x00}; + i2cMod.write(i2cAddress1, command, 1, 1); //Send command + i2cMod.read(i2cAddress1, response, 2); //Read 16bits result + int range = (response[0]<<8)+response[1]; //Shift two bytes into int + return range; +} + +int readRange2(void){ + const char command[] = {0x02}; //Address of range register + char response[] = {0x00, 0x00}; + i2cMod.write(i2cAddress2, command, 1, 1); //Send command + i2cMod.read(i2cAddress2, response, 2); //Read 16bits result + int range = (response[0]<<8)+response[1]; //Shift two bytes into int + return range; +} +void onControlInput(int buttons, int stick_lx, int stick_ly, int stick_rx, int stick_ry, int trigger_l, int trigger_r){ + //pc.printf("buttons: %04x Lstick X,Y: %-5d, %-5d Rstick X,Y: %-5d, %-5d LTrig: %02x (%d) RTrig: %02x (%d)\r\n", buttons, stick_lx, stick_ly, stick_rx, stick_ry, trigger_l,trigger_l, trigger_r,trigger_r); + controlState = Xbox360ControllerState(buttons, stick_lx, stick_ly, stick_rx, stick_ry, trigger_l, trigger_r); +}; + +void thread_audio_run(void const* arg){ + audio.run(); +} + +float tank_L(float x, float y){ + float scale = 0.0; + + + + if(x >= 0.0 && y <= 0){ //LBA bottom right + pc.printf("1\r\n"); + + + + + if(y == 0){ scale = 1.0; goto End;} + if(x == 0){ scale = -1.0; goto End;} + float theta = atan(y/x) / 3.14159; + scale = theta * 4.0 + 1.0; + + + } else if(x <= 0.0 && y <= 0){ //LBA bottom left + pc.printf("2\r\n"); + + + + scale = -1.0; + + } else if(x <= 0.0 && y >= 0){ //top left + + + if(y == 0){ scale = -1.0; goto End;} + if(x == 0){ scale = 1.0; goto End;} + float theta = atan(y/x) / 3.14159; + scale = -theta * 4.0 - 1.0; + + } else { //top-right + + + scale = 1.0; + } + + End: + scale *= sqrt(x*x + y*y); + return scale; +} +float tank_R(float x, float y){ + float scale = 0.0; + + if(x >= 0.0 && y <= 0){ //bottom right + + scale = -1.0; + + } else if(x <= 0.0 && y <= 0){ //bottom left + if(y == 0){ scale = 1.0; goto End;} + if(x == 0){ scale = -1.0; goto End;} + float theta = atan(y/x) / 3.14159; + scale = -theta*4.0 + 1.0; + + } else if(x <= 0.0 && y >= 0){ //top left + scale = 1.0; + + } else { //top-right + if(y == 0){ scale = -1.0; goto End;} + if(x == 0){ scale = 1.0; goto End;} + float theta = atan(y/x) / 3.14159; + scale = theta*4.0 - 1.0; + } + + End: + scale *= sqrt(x*x + y*y); + return scale; +} +void thread_controller(void const* arg){ + + tank.SetMotors(0,0); + USBHostXpad controller; + controller.attachEvent(&onControlInput); + + while(1){ + tank.SetMotors(0,0); + bool wasdisconnected = true; + //acts as a failsafe + while(controller.connected()) { + if(wasdisconnected){ + //pc.printf("Controller Status >> Connected!\r\n"); + controller.led( USBHostXpad::LED1_ON ); + tank.SetMotors(0.0,0.0); //stop, wait for controller to reconnect for a second. + wasdisconnected = false; + } + + // left bumper disables auto-reverse + bool collisionAvoidance = !((bool)(controlState.buttons & USBHostXpad::XPAD_PAD_LB)); + bool trigger = false; + + // trigger rely - airsoft gun + + float AS = 1.0; // acutele snelheid + if(controlState.triggerRight > 0x80){ //Rechtdoor rijden + //controller.rumble(255,255); + fire = 1; + trigger = true; + + + }else{ + //controller.rumble(0,0); + fire = 0; + } + + //lazzzzeeer sight + if( controlState.buttons & USBHostXpad::XPAD_PAD_X){ //Knop X laser=DQ3 + //Stoppen + DQ1= 1; //lv + DQ2= 1; //rv + DQ3= 1; //la + DQ4= 1; //ra + PWM1 = AS*0; //lv in de vrij + PWM2 = AS*0; //rv in de vrij + PWM3 = AS*0; //la in de vrij + PWM4 = AS*0; //ra in de vrij + wait(2.0); + + laser = 1; + }else{ + laser = 0; + } + + + //dpad sounds + if(trigger || (controlState.buttons & (USBHostXpad::XPAD_HAT_UP | USBHostXpad::XPAD_HAT_DOWN | USBHostXpad::XPAD_HAT_LEFT | USBHostXpad::XPAD_HAT_RIGHT | USBHostXpad::XPAD_PAD_Y))){ + int code = 0; + + float z = 0.5; // persentage voor het draaien van de motoren + float j = 0.75; // persentage voor het draaien van de motoren + if(controlState.buttons & USBHostXpad::XPAD_HAT_UP){ //vooruit + + DQ1= 1; //lv + DQ2= 1; //rv + DQ3= 1; //la + DQ4= 1; //ra + PWM1 = AS*1.5; + PWM2 = AS*1.5; + PWM3 = AS*1.5; + PWM4 = AS*1.5; + } else if(controlState.buttons & USBHostXpad::XPAD_HAT_DOWN){ //Achteruit + DQ1= 0; //lv + DQ2= 0; //rv + DQ3= 0; //la + DQ4= 0; //ra + PWM1 = AS*1.5; + PWM2 = AS*1.5; + PWM3 = AS*1.5; + PWM4 = AS*1.5; + + } else if(controlState.buttons & USBHostXpad::XPAD_HAT_LEFT){ //links + led1=1; //links + DQ1 = 0; //lv + DQ2 = 1; //rv + DQ3 = 0; //La + DQ4 = 1; //Ra + PWM1 = AS*z; + PWM2 = AS*j; + PWM3 = AS*z; + PWM4 = AS*j; + } else if(controlState.buttons & USBHostXpad::XPAD_HAT_RIGHT){//rechts + led3=1; //rechts + + DQ1 = 1; //lv + DQ2 = 0; //rv + DQ3 = 1; //la + DQ4 = 0; //Ra + PWM1 = AS*j; + PWM2 = AS*z; + PWM3 = AS*j; + PWM4 = AS*z; + + } else if (trigger){ + code = 4; + }else if (controlState.buttons & USBHostXpad::XPAD_PAD_Y){ + code = 5; + } + + //pc.printf("Audio play: %d\r\n",code); + audio.play(code); + }else{ + //pc.printf("Audio Stop!\r\n"); + audio.stop(); + } + + + + //update output leds + led1= fire; + led2= collisionAvoidance; + led3= laser; + + // on collision, reverse tank + if(ir > 0.75 && collisionAvoidance){ + // controller.rumble(255,255); + tank.SetMotors(-0.5,-0.5); + continue; + }else{ + } + + // map joystick input to tracks - if joystick is being moved + float y = xpadNormalizeAnalog(controlState.analogLeftY); + float x = -1.0 * xpadNormalizeAnalog(controlState.analogLeftX); + //float x = -1.0 * y / abs(y) * xpadNormalizeAnalog(controlState.analogLeftX); //flips left/right when in reverse + if( sqrt(x*x + y*y) > 0.25 ) { + tank.SetMotors(tank_L(x,y), tank_R(x,y)); + //pc.printf("motors: %f, %f\r\n", tank_L(x,y), tank_R(x,y)); + } else { + tank.SetMotors(0.0,0.0); + } + + + + } + + //pc.printf("Controller Status >> DISCONNECTED! Reconnecting...\r\n"); + tank.SetMotors(0.0,0.0); //stop, wait for controller to reconnect for a second. + Thread::wait(500); + controller.connect(); + } +} +int main() { + + while(1) { + sendStartRangingCommand1(); + wait(0.07); + int U1 = readRange1(); + wait (0.2); + sendStartRangingCommand2(); + wait(0.07); + int U2 = readRange2(); + + + + if (DI2 == 1 && DI4 == 1){ + // sensoren + + float AS; // snelheid afhangelijk van + float Q; // De afstand vanaf waar de ultrasonesensor iets moet detecteren in CM. + float I; // de afstand vanaf waar de infraroodsensor iets moet detecteren. + float x; // persentage voor het draaien van de motoren + float y; // persentage voor het draaien van de motoren + x = 0.5; + y = 0.25; + Q = 300; // groter dan een waarde 300 = 3 meter detecteerd de sensor iets + I = 1.5; // groeten dan een waarde 300 = 3meter + AS =pot*3.3; + + if (U1<=Q && U2<=Q && lslv>=I && lsrv>=I)//alles iets detecteerd + { + DQ1= 1; //lv + DQ2= 1; //rv + DQ3= 1; //la + DQ4= 1; //ra + PWM1 = AS*0; //lv in de vrij + PWM2 = AS*0; //rv in de vrij + PWM3 = AS*0; //la in de vrij + PWM4 = AS*0; //ra in de vrij + wait(2.0); + + while(1) + { + DQ1= 1; //Lv + DQ2= 0; //Rv + DQ3= 1; //La + DQ4= 0; //Ra + PWM1 = AS*0.5; //LV 50% van AS + PWM2 = AS*0.5; //RV 50% van AS + PWM3 = AS*0.5; //LA 50% van AS + PWM4 = AS*0.5; //RA 50% van AS + + if(U1 >= Q && U2 >= Q) + { + break; + } + + } + } + + + else if (U1<=Q && U2<=Q && lslv<=I && lsrv>=I)//rv1 rv2 en lv1 iets gedetecteerd hebben, naar links draaien + { + while(1) + { + DQ1 = 1; //lv + DQ2 = 1; //rv + DQ3 = 1; //La + DQ4 = 1; //Ra + PWM1 = AS*x; + PWM2 = AS*y; + PWM3 = AS*x; + PWM4 = AS*y; + + if(U1 >= Q && U2 >= Q) + { + break;} + } + } + + else if (U1<=Q && U2<=Q && lslv>=I && lsrv<=I)//lv1 lv2 en rv1 iets gedetecteerd hebben, naar rechts draaien) + { + while(1) + { + DQ1 = 1; //lv + DQ2 = 1; //rv + DQ3 = 1; //la + DQ4 = 1; //Ra + PWM1 = AS*y; + PWM2 = AS*x; + PWM3 = AS*y; + PWM4 = AS*x; + + + if(U1 >= Q && U2 >= Q) + { + break;} + } + } + + else if (U1>Q && U2<Q && lslv<I && lsrv>I)//rv1 rv2 iets gedetecteerd hebben, naar links draaien) + { + while(1) + { + DQ1 = 1; //lv + DQ2 = 1; //rv + DQ3 = 1; //la + DQ4 = 1; //ra + PWM1 = AS*x; + PWM2 = AS*y; + PWM3 = AS*x; + PWM4 = AS*y; + + if(U1>Q && U2 > Q) + { + break;} + } + } + + + else if (U1<Q && U2>Q && lslv>I && lsrv<I)//lv1 lv2 iets gedetecteerd hebben, naar rechts draaien) + { + while(1) + { + DQ1 = 1; //lv + DQ2 = 1; //rv + DQ3 = 1; //La + DQ4 = 1; //Ra + PWM1 = AS*y; + PWM2 = AS*x; + PWM3 = AS*y; + PWM4 = AS*x; + + if(U1 > Q && U2 > Q) + { + break;} + } + } + + + else if (U1<Q && U2>Q && lslv<I && lsrv<I)//lv1 rv1 iets gedetecteerd hebben, naar links of rechts draaien) + { + if ( lslv>=lsrv) + { + while(1) + { + DQ1 = 1; //lv + DQ2 = 1; //rv + DQ3 = 1; //La + DQ4 = 1; //Ra + PWM1 = AS*y; + PWM2 = AS*x; + PWM3 = AS*y; + PWM4 = AS*x; + + if(U1<Q && U2 > Q) + { + break;} + } + } + + else if ( lslv<=lsrv ) + { + while(1) + { + DQ1 = 1; //lv + DQ2 = 1; //rv + DQ3 = 1; //la + DQ4 = 1; //Ra + PWM1 = AS*x; + PWM2 = AS*y; + PWM3 = AS*x; + PWM4 = AS*y; + + if( U1 > Q && U2 > Q) + { + break;} + } + } + + + else if (U1<Q && U2>Q && lslv<I && lsrv<I)//lv1 iets gedetecteerd heeft, naar rechts draaien) + { + while(1) + { + + DQ1 = 1; //lv + DQ2 = 1; //rv + DQ3 = 1; //la + DQ4 = 1; //ra + PWM1 = AS*y; + PWM2 = AS*x; + PWM3 = AS*y; + PWM4 = AS*x; + if(U1>Q && U2 > Q) + { + break;} + + } + } +////////////////////////////////////////////////////////////////////////////// + else if (DI1 == 1 && DI4 == 1) + { + // Handmatig + tank.SetMotors(0,0); + fire = 0; + laser = 1; + led1 = 1; + led2= 1; + + + //pc.baud(9600); + // pc.printf("TANK\r\n"); + + + + Thread t_controller(thread_controller); + Thread audio_thread(thread_audio_run); + + + + tank.SetMotors(1.0,-1.0); + Thread::wait(1000); + tank.SetMotors(-1.0,1.0); + Thread::wait(1000); + tank.SetMotors(0,0); + + while(1){ + led4= !DQ4; + fire = !fire; + Thread::wait(1000); + } + } + }}}} + + + + + \ No newline at end of file