Mobiel platform besturen aan de hand van sensoren en een xbox controller

Dependencies:   USBHost USBHostXpad mbed-rtos mbed

Files at this revision

API Documentation at this revision

Comitter:
347467
Date:
Wed Feb 25 08:25:16 2015 +0000
Commit message:
Nog niet kloar;

Changed in this revision

Audio.h Show annotated file Show diff for this revision Revisions of this file
Speaker.h Show annotated file Show diff for this revision Revisions of this file
Traxster.cpp Show annotated file Show diff for this revision Revisions of this file
Traxster.h Show annotated file Show diff for this revision Revisions of this file
USBHost.lib Show annotated file Show diff for this revision Revisions of this file
USBHostXpad.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-rtos.lib Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
ultrasoon.h Show annotated file Show diff for this revision Revisions of this file
utils.cpp Show annotated file Show diff for this revision Revisions of this file
utils.h Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 345f76c72b9a Audio.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Audio.h	Wed Feb 25 08:25:16 2015 +0000
@@ -0,0 +1,418 @@
+
+#include "Speaker.h"
+#include <vector>
+
+//This needs work to get threading working
+
+class Audio{
+private:
+    Mutex mutex;
+    Speaker& speaker;
+    bool playing;
+    int code;       //sound code
+    
+    bool getplaying(){
+        bool b;
+        mutex.lock();
+        b = playing;
+        mutex.unlock();
+        return b;
+    }
+    int getcode(){
+        int c;
+        mutex.lock();
+        c = code;
+        mutex.unlock();   
+        return c;
+    }
+public:
+    Audio(Speaker& ao) : speaker(ao)
+    {   
+    }
+    void play(int code){
+        mutex.lock();
+        this->code = code;
+        this->playing = true;
+        mutex.unlock();
+    }
+    void stop(){
+        mutex.lock();
+        this->playing = false;
+        mutex.unlock();   
+    }
+    
+    void run(){
+        while(true){    //service audio requests...
+            
+            //if not playing, wait fast
+            if(!getplaying()){
+                Thread::wait(1);
+                continue;   
+            }
+            
+            
+            int code = getcode();
+            
+            switch(code){
+                case 0: // up
+                    speaker.PlayNote(500.0, 0.05, 1.0);
+                    speaker.PlayNote(600.0, 0.05, 1.0);
+                    speaker.PlayNote(700.0, 0.05, 1.0);
+                    break;
+                case 1: // down
+                    speaker.PlayNote(500.0, 0.05, 1.0);
+                    speaker.PlayNote(550.0, 0.05, 1.0);
+                    break;
+                case 2: //left
+                    speaker.PlayNote(400.0, 0.1, 1.0);
+                    speaker.PlayNote(500.0, 0.1, 1.0);
+                    break;
+                case 3:  // right
+                    speaker.PlayNote(600.0, 0.05, 1.0);
+                    speaker.PlayNote(500.0, 0.05, 1.0);
+                    break;
+                    
+                // trigger sound
+                case 4:
+                
+                    speaker.PlayNote(500.0, 0.05, 1.0);
+                    speaker.PlayNote(600.0, 0.05, 1.0);
+                    speaker.PlayNote(700.0, 0.05, 1.0);
+                    break;
+                    
+                // mario!
+                case 5:
+                    playMario();
+                    break;
+                default: break; 
+            }
+            
+            
+            //Thread::wait(10);
+        }
+    }
+    
+    
+    void playNote(float a, float b, float c){
+        speaker.PlayNote(a,b,c);
+    }
+    
+public:
+    
+    void playMario(){
+          
+        playNote(660.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(660.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(660.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(510.0, 0.08, 1.0);
+        Thread::wait(75);
+        playNote(660.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(770.0, 0.08, 1.0);
+        Thread::wait(413);
+        playNote(380.0, 0.08, 1.0);
+        Thread::wait(431);
+        playNote(510.0, 0.08, 1.0);
+        Thread::wait(338);
+        playNote(380.0, 0.08, 1.0);
+        Thread::wait(300);
+        playNote(320.0, 0.08, 1.0);
+        Thread::wait(375);
+        playNote(440.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(480.0, 0.06, 1.0);
+        Thread::wait(248);
+        playNote(450.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(430.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(380.0, 0.08, 1.0);
+        Thread::wait(150);
+        playNote(660.0, 0.06, 1.0);
+        Thread::wait(150);
+        playNote(760.0, 0.04, 1.0);
+        Thread::wait(113);
+        playNote(860.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(700.0, 0.06, 1.0);
+        Thread::wait(113);
+        playNote(760.0, 0.04, 1.0);
+        Thread::wait(263);
+        playNote(660.0, 0.06, 1.0);
+        Thread::wait(225);
+        playNote(520.0, 0.06, 1.0);
+        Thread::wait(113);
+        playNote(580.0, 0.06, 1.0);
+        Thread::wait(113);
+        playNote(480.0, 0.06, 1.0);
+        Thread::wait(375);
+        playNote(510.0, 0.08, 1.0);
+        Thread::wait(338);
+        playNote(380.0, 0.08, 1.0);
+        Thread::wait(300);
+        playNote(320.0, 0.08, 1.0);
+        Thread::wait(375);
+        playNote(440.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(480.0, 0.06, 1.0);
+        Thread::wait(248);
+        playNote(450.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(430.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(380.0, 0.08, 1.0);
+        Thread::wait(150);
+        playNote(660.0, 0.06, 1.0);
+        Thread::wait(150);
+        playNote(760.0, 0.04, 1.0);
+        Thread::wait(113);
+        playNote(860.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(700.0, 0.06, 1.0);
+        Thread::wait(113);
+        playNote(760.0, 0.04, 1.0);
+        Thread::wait(263);
+        playNote(660.0, 0.06, 1.0);
+        Thread::wait(225);
+        playNote(520.0, 0.06, 1.0);
+        Thread::wait(113);
+        playNote(580.0, 0.06, 1.0);
+        Thread::wait(113);
+        playNote(480.0, 0.06, 1.0);
+        Thread::wait(375);
+        playNote(500.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(760.0, 0.08, 1.0);
+        Thread::wait(75);
+        playNote(720.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(680.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(620.0, 0.11, 1.0);
+        Thread::wait(225);
+        playNote(650.0, 0.11, 1.0);
+        Thread::wait(225);
+        playNote(380.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(430.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(500.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(430.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(500.0, 0.08, 1.0);
+        Thread::wait(75);
+        playNote(570.0, 0.08, 1.0);
+        Thread::wait(165);
+        playNote(500.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(760.0, 0.08, 1.0);
+        Thread::wait(75);
+        playNote(720.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(680.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(620.0, 0.11, 1.0);
+        Thread::wait(225);
+        playNote(650.0, 0.15, 1.0);
+        Thread::wait(225);
+        playNote(1020.0, 0.06, 1.0);
+        Thread::wait(225);
+        playNote(1020.0, 0.06, 1.0);
+        Thread::wait(113);
+        playNote(1020.0, 0.06, 1.0);
+        Thread::wait(225);
+        playNote(380.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(500.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(760.0, 0.08, 1.0);
+        Thread::wait(75);
+        playNote(720.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(680.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(620.0, 0.11, 1.0);
+        Thread::wait(225);
+        playNote(650.0, 0.11, 1.0);
+        Thread::wait(225);
+        playNote(380.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(430.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(500.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(430.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(500.0, 0.08, 1.0);
+        Thread::wait(75);
+        playNote(570.0, 0.08, 1.0);
+        Thread::wait(315);
+        playNote(585.0, 0.08, 1.0);
+        Thread::wait(338);
+        playNote(550.0, 0.08, 1.0);
+        Thread::wait(315);
+        playNote(500.0, 0.08, 1.0);
+        Thread::wait(270);
+        playNote(380.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(500.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(500.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(500.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(500.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(760.0, 0.08, 1.0);
+        Thread::wait(75);
+        playNote(720.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(680.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(620.0, 0.11, 1.0);
+        Thread::wait(225);
+        playNote(650.0, 0.11, 1.0);
+        Thread::wait(225);
+        playNote(380.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(430.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(500.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(430.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(500.0, 0.08, 1.0);
+        Thread::wait(75);
+        playNote(570.0, 0.08, 1.0);
+        Thread::wait(165);
+        playNote(500.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(760.0, 0.08, 1.0);
+        Thread::wait(75);
+        playNote(720.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(680.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(620.0, 0.11, 1.0);
+        Thread::wait(225);
+        playNote(650.0, 0.15, 1.0);
+        Thread::wait(225);
+        playNote(1020.0, 0.06, 1.0);
+        Thread::wait(225);
+        playNote(1020.0, 0.06, 1.0);
+        Thread::wait(113);
+        playNote(1020.0, 0.06, 1.0);
+        Thread::wait(225);
+        playNote(380.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(500.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(760.0, 0.08, 1.0);
+        Thread::wait(75);
+        playNote(720.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(680.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(620.0, 0.11, 1.0);
+        Thread::wait(225);
+        playNote(650.0, 0.11, 1.0);
+        Thread::wait(225);
+        playNote(380.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(430.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(500.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(430.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(500.0, 0.08, 1.0);
+        Thread::wait(75);
+        playNote(570.0, 0.08, 1.0);
+        Thread::wait(315);
+        playNote(585.0, 0.08, 1.0);
+        Thread::wait(338);
+        playNote(550.0, 0.08, 1.0);
+        Thread::wait(315);
+        playNote(500.0, 0.08, 1.0);
+        Thread::wait(270);
+        playNote(380.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(500.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(500.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(500.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(500.0, 0.04, 1.0);
+        Thread::wait(113);
+        playNote(500.0, 0.06, 1.0);
+        Thread::wait(225);
+        playNote(500.0, 0.04, 1.0);
+        Thread::wait(263);
+        playNote(500.0, 0.06, 1.0);
+        Thread::wait(113);
+        playNote(580.0, 0.06, 1.0);
+        Thread::wait(263);
+        playNote(660.0, 0.06, 1.0);
+        Thread::wait(113);
+        playNote(500.0, 0.06, 1.0);
+        Thread::wait(225);
+        playNote(430.0, 0.06, 1.0);
+        Thread::wait(113);
+        playNote(380.0, 0.06, 1.0);
+        Thread::wait(450);
+        playNote(500.0, 0.04, 1.0);
+        Thread::wait(113);
+        playNote(500.0, 0.06, 1.0);
+        Thread::wait(225);
+        playNote(500.0, 0.04, 1.0);
+        Thread::wait(263);
+        playNote(500.0, 0.06, 1.0);
+        Thread::wait(113);
+        playNote(580.0, 0.06, 1.0);
+        Thread::wait(113);
+        playNote(660.0, 0.06, 1.0);
+        Thread::wait(413);
+        playNote(870.0, 0.06, 1.0);
+        Thread::wait(244);
+        playNote(760.0, 0.06, 1.0);
+        Thread::wait(450);
+        playNote(500.0, 0.04, 1.0);
+        Thread::wait(113);
+        playNote(500.0, 0.06, 1.0);
+        Thread::wait(225);
+        playNote(500.0, 0.04, 1.0);
+        Thread::wait(263);
+        playNote(500.0, 0.06, 1.0);
+        Thread::wait(113);
+        playNote(580.0, 0.06, 1.0);
+        Thread::wait(263);
+        playNote(660.0, 0.06, 1.0);
+        Thread::wait(113);
+        playNote(500.0, 0.06, 1.0);
+        Thread::wait(225);
+        playNote(430.0, 0.06, 1.0);
+        Thread::wait(113);
+        playNote(380.0, 0.06, 1.0);
+        Thread::wait(450);
+        playNote(660.0, 0.08, 1.0);
+        Thread::wait(113);
+        playNote(660.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(660.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(510.0, 0.08, 1.0);
+        Thread::wait(75);
+        playNote(660.0, 0.08, 1.0);
+        Thread::wait(225);
+        playNote(770.0, 0.08, 1.0);
+        Thread::wait(413);
+        playNote(380.0, 0.08, 1.0);
+        Thread::wait(431);
+   
+    }
+};
\ No newline at end of file
diff -r 000000000000 -r 345f76c72b9a Speaker.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Speaker.h	Wed Feb 25 08:25:16 2015 +0000
@@ -0,0 +1,52 @@
+class Speaker
+{
+public:
+    Speaker(PinName pin) : _pin(pin) {
+// _pin(pin) means pass pin to the Speaker Constructor
+// precompute 64 sample points on one sine wave cycle
+// used for continuous sine wave output later
+        for(int k=0; k<64; k++) {
+            Analog_out_data[k] = int (65536.0 * ((1.0 + sin((float(k)/64.0*6.28318530717959)))/2.0));
+            // scale the sine wave to 16-bits - as needed for AnalogOut write_u16 arg
+        }
+
+    }
+// class method to play a note based on AnalogOut class
+    void PlayNote(float frequency, float duration, float volume) {
+        // scale samples using current volume level arg
+        for(int k=0; k<64; k++) {
+            Analog_scaled_data[k] = Analog_out_data[k] * volume;
+        }
+        // reset to start of sample array
+        i=0;
+        // turn on timer interrupts to start sine wave output
+        Sample_Period.attach(this, &Speaker::Sample_timer_interrupt, 1.0/(frequency*64.0));
+        // play note for specified time
+        wait(duration);
+        // turns off timer interrupts
+        Sample_Period.detach();
+        // sets output to mid range - analog zero
+        this->_pin.write_u16(32768);
+
+    }
+private:
+// sets up specified pin for analog using AnalogOut class
+    AnalogOut _pin;
+    // set up a timer to be used for sample rate interrupts
+    Ticker Sample_Period;
+
+    //variables used by interrupt routine and PlayNote
+    volatile int i;
+    short unsigned Analog_out_data[64];
+    short unsigned Analog_scaled_data[64];
+
+// Interrupt routine
+// used to output next analog sample whenever a timer interrupt occurs
+    void Sample_timer_interrupt(void) {
+        // send next analog sample out to D to A
+        this->_pin.write_u16(Analog_scaled_data[i]);
+        // increment pointer and wrap around back to 0 at 64
+        i = (i+1) & 0x03F;
+    }
+};
+
diff -r 000000000000 -r 345f76c72b9a Traxster.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Traxster.cpp	Wed Feb 25 08:25:16 2015 +0000
@@ -0,0 +1,46 @@
+
+#include "Traxster.h"
+#include "utils.h"
+#include "rtos.h"
+
+//extern Serial pc;
+//extern Mutex m;
+
+int getMotorSpeedInt(float f){
+    
+    int max = 40;
+    
+    if(f > 1.0)
+        f = 1.0;
+
+    if(f < -1.0)
+        f = -1.0;
+    
+    return   (int)round( (float)max * f );
+}
+
+void Traxster::SetMotors(float fm1, float fm2)
+{
+    int m1 = getMotorSpeedInt(fm1);
+    int m2 = getMotorSpeedInt(fm2);
+    
+    //clear robot msgs
+    while (rob.readable())
+        rob.getc();
+        
+    if (m1 == 0 && m2 == 0)
+    {
+        rob.puts("stop\r");
+    }
+    else
+    {
+        //m.lock();
+        //pc.printf("mogo 1:%d 2:%d\r\n", m1, m2);
+        //m.unlock();
+        rob.printf("mogo 1:%d 2:%d\r", m1, m2);
+    }
+    
+    //clear robot msgs
+    while (rob.readable())
+        rob.getc();
+}
diff -r 000000000000 -r 345f76c72b9a Traxster.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Traxster.h	Wed Feb 25 08:25:16 2015 +0000
@@ -0,0 +1,16 @@
+#include "mbed.h"
+
+class Traxster { 
+private:
+    Serial& rob;
+public:   
+    Traxster(Serial& robotComm  /* and other controls or sensors...*/)
+    : rob(robotComm)
+    {
+        rob.baud(19200);
+    };
+    
+    // Set motor speeds. [-1, +1] of max speed for motor.
+    void SetMotors(float m1, float m2);
+    
+};
\ No newline at end of file
diff -r 000000000000 -r 345f76c72b9a USBHost.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBHost.lib	Wed Feb 25 08:25:16 2015 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/hotwheelharry/code/USBHost/#8e7d225f2fd7
diff -r 000000000000 -r 345f76c72b9a USBHostXpad.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBHostXpad.lib	Wed Feb 25 08:25:16 2015 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/hotwheelharry/code/USBHostXpad/#bbbbd88de858
diff -r 000000000000 -r 345f76c72b9a main.cpp
--- /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
diff -r 000000000000 -r 345f76c72b9a mbed-rtos.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-rtos.lib	Wed Feb 25 08:25:16 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed-rtos/#318e02f48146
diff -r 000000000000 -r 345f76c72b9a mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed Feb 25 08:25:16 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/9ad691361fac
\ No newline at end of file
diff -r 000000000000 -r 345f76c72b9a ultrasoon.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ultrasoon.h	Wed Feb 25 08:25:16 2015 +0000
@@ -0,0 +1,85 @@
+//#include "mbed.h"
+
+I2C i2cMod(p28, p27);
+//Serial PC(USBTX, USBRX);       //Debug port to PC
+
+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 setAddress(int address) {
+                     //Send address change sequence
+                     //    char command[] = {0x00, 0xA0};
+                    //   i2cMod.write(i2cAddress, command, 2);
+                    //   command[1] = 0xAA;
+                    //   i2cMod.write(i2cAddress, command, 2);
+                     //   command[1] = 0xA5;
+                     //   i2cMod.write(i2cAddress, command, 2);
+                     //   command[1] = address;
+                    //   i2cMod.write(i2cAddress, command, 2);
+                    // }
+
+    //int main() {
+      //      //Read software version
+    //const char command[]  = {0x00};           //Address of swversion register
+    //char response[] = {0x00, 0x00};
+    //i2cMod.write(i2cAddress1, command, 1, 1);  //Send command
+    //i2cMod.read(i2cAddress1, response, 2);     //Read 16bits result
+    //int swversion = (response[0]<<8)+response[1]; //Shift two bytes into int
+    //PC.printf(" Software version1: %i", swversion);
+    //PC.printf("\n\r");
+    
+                          //Read software version
+                            //const char command[]  = {0x00};           //Address of swversion register
+                            // char response[] = {0x00, 0x00};
+                            // i2cMod.write(i2cAddress2, command, 1, 1);  //Send command
+                            // i2cMod.read(i2cAddress2, response, 2);     //Read 16bits result
+                            // int swversion = (response[0]<<8)+response[1]; //Shift two bytes into int
+                            // PC.printf(" Software version2: %i", swversion);
+                            // PC.printf("\n\r");
+    
+    
+    //setAddress(0xF2) ;
+        
+    //while(true){
+     //   sendStartRangingCommand1();
+     //   wait(0.07);
+     //   int range1 = readRange1();
+     //   PC.printf(" Range1: %i", range1);
+     //   PC.printf("\n\r");
+     //   wait (0.2);
+     
+    // sendStartRangingCommand2();
+    //    wait(0.07);
+    //    int range2 = readRange2();
+    //    PC.printf(" Range2: %i", range2);
+    //    PC.printf("\n\r");
+    //    wait(1.0);
+     //}
+//}
\ No newline at end of file
diff -r 000000000000 -r 345f76c72b9a utils.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/utils.cpp	Wed Feb 25 08:25:16 2015 +0000
@@ -0,0 +1,23 @@
+#include "utils.h"
+
+double ghettoFloor(double d){
+    return double((long long)d);
+}
+double round(double d)
+{
+  return ghettoFloor(d + 0.5);
+}
+
+float xpadNormalizeAnalog(int x){
+    float res = 0;
+    if(x > 0){
+        res = (float)x/32767.0;
+    }else{
+        res = (float)x/32768.0;
+    }   
+    return res;
+}
+float xpadNormalizeTrigger(int x){
+    float res = (float)x / (float)0xff;
+    return res;
+}
diff -r 000000000000 -r 345f76c72b9a utils.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/utils.h	Wed Feb 25 08:25:16 2015 +0000
@@ -0,0 +1,26 @@
+
+#ifndef utilshhh
+#define utilshhh
+
+
+double ghettoFloor(double d);
+double round(double d);
+
+float xpadNormalizeAnalog(int x);
+float xpadNormalizeTrigger(int x);
+struct Xbox360ControllerState{
+    int buttons;
+    int analogLeftX;
+    int analogLeftY;
+    int analogRightX;
+    int analogRightY;
+    int triggerLeft;
+    int triggerRight;
+    Xbox360ControllerState(){};
+    Xbox360ControllerState(int buttons, int stick_lx, int stick_ly, int stick_rx, int stick_ry, int trigger_l, int trigger_r)
+    : buttons(buttons), analogLeftX(stick_lx), analogLeftY(stick_ly), analogRightX(stick_rx), analogRightY(stick_ry), triggerLeft(trigger_l), triggerRight(trigger_r)
+    {}
+};
+
+
+#endif
\ No newline at end of file