The project is not done yet

Dependencies:   USBHost USBHostXpad mbed-rtos mbed

Fork of Totaleprogramma by jordy morsinkhof

main.cpp

Committer:
juliandekker
Date:
2015-03-02
Revision:
1:da390b3b1330
Parent:
0:345f76c72b9a

File content as of revision 1:da390b3b1330:

#define DEBUG 0
#include "mbed.h"
#include "rtos.h"
#include "USBHostXpad.h"
#include "utils.h"
#include <cmath>

Serial pc   (USBTX, USBRX);
I2C i2cMod  (p28, p27);
DigitalOut  handmode(p5);                   // hand moet 1 worden (niet connected
DigitalIn   automode(p6);                   // auto
DigitalIn   externemode(p7);                // extern
DigitalIn   aanuit(p8);                     // aan uit
DigitalOut  motorLeftFrontDirAV(p9);       //motor lv 1= vooruit 
DigitalOut  motorRightFrontDirAV(p10);      //MOTOR rv 1= vooruit
DigitalOut  motorLeftRearDirAV(p11);        //motor la 1= vooruit
DigitalOut  motorRightRearDirAV(p12);       //MOTOR ra 1= vooruit        
PwmOut      motorLeftFrontVelAV(p21);       //motor lv
PwmOut      motorRightFrontVelAV (p22);      //Motor rv
PwmOut      motorLeftRearVelAV(p23);        //motor la
PwmOut      motorRightRearVelAV (p24);      //Motor ra
AnalogIn    pot(p19);                       //potmeter
AnalogIn    laserLeft(p15);                 //lasersensorwaarde lv2
AnalogIn    laserRight(p16);                //lasersensorwaarde rv2
DigitalOut  led1(LED1);      
DigitalOut  led2(LED2);      
DigitalOut  led3(LED3);      
DigitalOut  led4(LED4); 
     

float SonarLeft;               // afstandswaarde ultrasoon sensor 1(links?)
float SonarRight;               // afstandswaarde ultrasoon sensor 2 (rechts?)
float AS = 0.5;               // actuele snelheid
float z = 0.5;          // percentage voor het draaien van de motoren
float j = 0.75;         // persentage voor het draaien van de motoren
float Q = 300;          // De afstand vanaf waar de ultrasonesensor iets moet detecteren in CM. // groter dan een waarde 300 = 3 meter detecteerd de sensor iets
float I = 1.5;          // de afstand vanaf waar de infraroodsensor iets moet detecteren.
float x = 0.5;          // persentage voor het draaien van de motoren
float y = 0.25;         // persentage voor het draaien van de motoren
float motorAcc = 0.3;   // Motor versnelling    pwm per seconde
float motorDec = 0.5;   // Motor vertraging     pwm per seconde
bool motorLeftFrontDirSP = 0;       //motordirection leftfront setpoint
bool motorRightFrontDirSP = 0;      //motordirection leftfront setpoint
bool motorLeftRearDirSP = 0;        //motordirection leftfront setpoint
bool motorRightRearDirSP = 0;       //motordirection leftfront setpoint
float motorLeftFrontVelSP =0;       // motor snelheid leftfront setpoint
float motorRightFrontVelSP =0;       // motor snelheid leftfront setpoint
float motorLeftRearVelSP =0;       // motor snelheid leftfront setpoint
float motorRightRearVelSP =0;       // motor snelheid leftfront setpoint

Xbox360ControllerState controlState;

// Turn right program
void turnRight(){
    led3 = 1; //rechts        
    motorLeftFrontDirSP = 1; //lv
    motorRightFrontDirSP = 0; //rv
    motorLeftRearDirSP = 1; //la
    motorRightRearDirSP = 0; //Ra
    motorLeftFrontVelSP = AS*j;
    motorRightFrontVelSP = AS*z;
    motorLeftRearVelSP = AS*j;
    motorRightRearVelSP = AS*z;
    pc.printf("rechts\r\n");
}

// Turn Left program
void turnLeft(){
    motorLeftFrontDirSP = 1; //lv
    motorRightFrontDirSP = 1; //rv
    motorLeftRearDirSP = 1; //La
    motorRightRearDirSP = 1; //Ra
    motorLeftFrontVelSP = AS*x;
    motorRightFrontVelSP = AS*y;
    motorLeftRearVelSP = AS*x;
    motorRightRearVelSP = AS*y;
    pc.printf("links\r\n");
}

void forward (){
    motorLeftFrontDirSP = 1; //lv
    motorRightFrontDirSP = 1; //rv
    motorLeftRearDirSP = 1; //La
    motorRightRearDirSP = 1; //Ra
    motorLeftFrontVelSP = AS;
    motorRightFrontVelSP = AS;
    motorLeftRearVelSP = AS;
    motorRightRearVelSP = AS;
    pc.printf("rechtsvooruit\r\n");
} 

void reverse(){
    motorLeftFrontDirSP = 0; //lv
    motorRightFrontDirSP = 0; //rv
    motorLeftRearDirSP = 0; //La
    motorRightRearDirSP = 0; //Ra
    motorLeftFrontVelSP = AS;
    motorRightFrontVelSP = AS;
    motorLeftRearVelSP = AS;
    motorRightRearVelSP = AS;
    pc.printf("achteruit\r\n");   
}

void halt(){
    motorLeftFrontDirSP = 0; //lv
    motorRightFrontDirSP = 0; //rv
    motorLeftRearDirSP = 0; //La
    motorRightRearDirSP = 0; //Ra
    motorLeftFrontVelSP = 0;
    motorRightFrontVelSP = 0;
    motorLeftRearVelSP = 0;
    motorRightRearVelSP = 0;
    pc.printf("stop\r\n");   
}
                                                            ///todo nul moet nog stilstaan worden
//Thread MotorController    
void thread_motorControl(void const* arg){
    int controlInterval = 100;// was100
    while(1){
        Thread::wait(controlInterval);
        //MotorLeftFront
        if(motorLeftFrontDirSP == motorLeftFrontDirAV){
            if (motorLeftFrontVelSP > motorLeftFrontVelAV){
                motorLeftFrontVelAV=motorLeftFrontVelAV+(motorAcc/controlInterval*10);
            }
            else if(motorLeftFrontVelSP < motorLeftFrontVelAV){
                motorLeftFrontVelAV=motorLeftFrontVelAV-(motorAcc/controlInterval*10);
            }
        }
        else {
             //regel naar nul
            if ((motorLeftFrontVelAV-(motorDec/controlInterval*10))> 0){
                motorLeftFrontVelAV= motorLeftFrontVelAV-(motorDec/controlInterval*10);
            } 
            else{
                motorLeftFrontDirAV = not motorLeftFrontDirAV; 
            }
        } 
        //MotorRightFront
        if(motorRightFrontDirSP == motorRightFrontDirAV){
            if (motorRightFrontVelSP > motorRightFrontVelAV){
                motorRightFrontVelAV=motorRightFrontVelAV+(motorAcc/controlInterval*10);
            }
            else if(motorRightFrontVelSP < motorRightFrontVelAV){
                motorRightFrontVelAV=motorRightFrontVelAV-(motorAcc/controlInterval*10);
            }
        }
        else {
             //regel naar nul
            if ((motorRightFrontVelAV-(motorDec/controlInterval*10))> 0){
                motorRightFrontVelAV= motorRightFrontVelAV-(motorDec/controlInterval*10);
            } 
            else{
                motorRightFrontDirAV = not motorRightFrontDirAV; 
            }
        }
        //motorLeftRear
        if(motorLeftRearDirSP == motorLeftRearDirAV){
            if (motorLeftRearVelSP > motorLeftRearVelAV){
                motorLeftRearVelAV=motorLeftRearVelAV+(motorAcc/controlInterval*10);
            }
            else if(motorLeftRearVelSP < motorLeftRearVelAV){
                motorLeftRearVelAV=motorLeftRearVelAV-(motorAcc/controlInterval*10);
            }
        }
        else {
             //regel naar nul
            if ((motorLeftRearVelAV-(motorDec/controlInterval*10))> 0){
                motorLeftRearVelAV= motorLeftRearVelAV-(motorDec/controlInterval*10);
            } 
            else{
                motorLeftRearDirAV = not motorLeftRearDirAV; 
            }
        } 
        //motorRightRear
        if(motorRightRearDirSP == motorRightRearDirAV){
            if (motorRightRearVelSP > motorRightRearVelAV){
                motorRightRearVelAV=motorRightRearVelAV+(motorAcc/controlInterval*10);
            }
            else if(motorRightRearVelSP < motorRightRearVelAV){
                motorRightRearVelAV=motorRightRearVelAV-(motorAcc/controlInterval*10);
            }
        }
        else {
             //regel naar nul
            if ((motorRightRearVelAV-(motorDec/controlInterval*10))> 0){
                motorRightRearVelAV= motorRightRearVelAV-(motorDec/controlInterval*10);
            } 
            else{
                motorRightRearDirAV = not motorRightRearDirAV; 
            }
        }  
        pc.printf ("dirAV : %d ", motorLeftFrontDirAV.read());
        pc.printf ("velocityAV :%F", motorLeftFrontVelAV.read()); 
        pc.printf ("dirSP : %d ", motorLeftFrontDirSP);
        pc.printf ("velocitySP :%F\r\n", motorLeftFrontVelSP); 
    }
}    

// programma tbv uitlezen ultasoon sensoren
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; 
}

// Thread Sonar ranging
void thread_sonarControl(void const* arg){
    while (1){
         // sensoren automatisch     
        sendStartRangingCommand1();
        Thread::wait(0.07);
        SonarLeft = readRange1();
        Thread::wait (0.2);
        sendStartRangingCommand2();
        Thread::wait(0.07);
        SonarRight = readRange2();
    }
}

// Programm tbv xbox controller
void onControlInput(int buttons, int stick_lx, int stick_ly, int stick_rx, int stick_ry, int trigger_l, int trigger_r){
    controlState = Xbox360ControllerState(buttons, stick_lx, stick_ly, stick_rx, stick_ry, trigger_l, trigger_r);
}

// programma tbv xbox controller
void thread_controller(void const* arg){
    USBHostXpad controller;
    controller.attachEvent(&onControlInput);
    
    while(1){    
        // connect programma
        bool wasdisconnected = true;
        //acts as a failsafe
        while(controller.connected()){        
            if(wasdisconnected){            
                controller.led( USBHostXpad::LED1_ON );   
                //stop, wait for controller to reconnect for a second.
                wasdisconnected = false;
            }
            if( controlState.buttons & USBHostXpad::XPAD_PAD_X){ 
            //Stoppen
                halt();
            }        
            //dpad xbox controller
            if(controlState.buttons & (USBHostXpad::XPAD_HAT_UP | USBHostXpad::XPAD_HAT_DOWN | USBHostXpad::XPAD_HAT_LEFT | USBHostXpad::XPAD_HAT_RIGHT | USBHostXpad::XPAD_PAD_Y)& automode == 0  & externemode == 0 & aanuit == 1){                           
                //vooruit
                pc.printf (" handmatig \n  ");
                if(controlState.buttons & USBHostXpad::XPAD_HAT_UP){
                    forward();
                } 
                //Achteruit
                else if(controlState.buttons & USBHostXpad::XPAD_HAT_DOWN){ 
                    reverse();                    
                } 
                //links
                else if(controlState.buttons & USBHostXpad::XPAD_HAT_LEFT){ 
                    turnLeft();
                } 
                //rechts
                else if(controlState.buttons & USBHostXpad::XPAD_HAT_RIGHT){
                    turnRight();
                }
            }
        }
        //stop, wait for controller to reconnect for a second.
        Thread::wait(500); /// was 500
        controller.connect();
    }
}

//////////////////////////////////////////////////////////////////
int main() {    
    Thread t_controller(thread_controller);
    Thread t_motorControl(thread_motorControl);
    Thread t_sonarControl(thread_sonarControl);    
    while(1) {
        if (aanuit == 1 & automode == 0 & externemode == 0){
            handmode = 1;
            pc.printf (" handmode \r\n  ");
            
        }
        if(aanuit == 1 & automode ==1){   
            //AS =pot*3.3;                  aanzetten weer
            //alles iets detecteerd dus draaien
            if (SonarLeft<=Q && SonarRight<=Q && laserLeft>=I && laserRight>=I){                     
                turnRight();          
            }
            //rv1 rv2 en lv1 iets gedetecteerd hebben, naar links draaien 
            else if (SonarLeft<=Q && SonarRight<=Q && laserLeft<=I && laserRight>=I){       
                turnLeft();   
            }
            //lv1 lv2 en rv1 iets gedetecteerd hebben, naar rechts draaien)
            else if (SonarLeft<=Q && SonarRight<=Q && laserLeft>=I && laserRight<=I){ 
                turnRight();
            }
            //rv1 rv2 iets gedetecteerd hebben, naar links draaien)    
            else if (SonarLeft>Q && SonarRight<Q && laserLeft<I && laserRight>I){
                turnLeft();
            }      
            //lv1 lv2 iets gedetecteerd hebben, naar rechts draaien)
            else if (SonarLeft<Q && SonarRight>Q && laserLeft>I && laserRight<I){
                turnRight();
            }    
            //lv1 rv1 iets gedetecteerd hebben, naar links of rechts draaien)
            else if (SonarLeft<Q && SonarRight>Q && laserLeft<I && laserRight<I){
                if ( laserLeft>=laserRight){
                    turnLeft();
                }
                else if ( laserLeft<=laserRight ){
                    turnRight();
                }
            }
            //lv1 iets gedetecteerd heeft, naar rechts draaien)
            else if (SonarLeft<Q && SonarRight>Q && laserLeft<I && laserRight<I){
                turnRight();
            }
        }
        else if (externemode == 1 & aanuit == 1){
            halt(); ///still todo
        }
       /* else {
            pc.printf (" hallo \n  ");
            halt();
        }*/
    }
}