Localization

Dependencies:   BNO055_fusion mbed

main.cpp

Committer:
12104404
Date:
2016-03-23
Revision:
9:4fc5d70c3bab
Parent:
8:b36be08c44f8
Child:
10:cf44f4387bc7

File content as of revision 9:4fc5d70c3bab:

#include "LOCALIZE.h"
#include "LOCOMOTION.h"
#include "WATCHDOG.h"

#define SPEED_TURN_MIN  0.15
#define SPEED_TURN_MAX  0.35
#define SPEED_FB_MIN    0.15
#define SPEED_FB_MAX    0.50

Serial pc(p13, p14);
//Serial pc(USBTX, USBRX);

Watchdog wdt;

I2C i2c1(p28, p27);
I2C i2c2(p9, p10);
LOCALIZE loc(i2c1, i2c2, p26);
LOCALIZE_xya xya;

DigitalIn sw1(p20);
DigitalIn sw2(p19);
DigitalIn sw3(p18);
DigitalIn sw4(p17);
DigitalOut dir1(p15);
DigitalOut dir2(p16);

PwmOut motor1F(p21);
PwmOut motor1B(p22);
PwmOut motor2F(p23);
PwmOut motor2B(p24);

DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);

Ticker t;
bool flag=false;

void send();
void turn(int angle);

int main()
{
    wdt.kick(5);
    pc.baud(9600);
    dir1=0;
    dir2=0;
    motor1F=0;
    motor1B=0;
    motor2F=0;
    motor2B=0;
    //pc.printf("Initialized Localization: %d\n",loc.init());
    t.attach(&send,1);
    sw1.mode(PullUp);
    sw2.mode(PullUp);
    sw3.mode(PullUp);
    sw4.mode(PullUp);
    while(1) {
        led1=!sw1;
        led2=!sw2;
        led3=!sw3;
        led4=!sw4;
        //loc.get_angle(&xya);
        loc.get_xy(&xya);
        //loc.get_raw_xy();
        //pc.printf("X: %3d\tY: %3d\tP: %3d\n",xya.x,xya.y,xya.a);
        wdt.kick();
    }
}

void send()
{
    pc.printf("%c%c%c%c\n",(char)xya.x,(char)xya.y,xya.a/10,xya.a%10);
}

void turn(int angle)
{
    float s = 0;
    if(angle==180) {
        if(abs(xya.a-angle)<=5)
            s=SPEED_TURN_MIN;
        else
            s=(SPEED_TURN_MAX*abs(xya.a-angle)/180)+SPEED_TURN_MIN;
        motor1F=s;
        motor1B=s;
        motor2F=s;
        motor2B=s;
        if(xya.a>angle+5) {
            dir1=1;
            dir2=0;
        } else if(xya.a<angle-5) {
            dir1=0;
            dir2=1;
        } else {
            motor1F=0;
            motor1B=0;
            motor2F=0;
            motor2B=0;
        }
    } else if(angle==0) {
        if(xya.a>angle+5 && xya.a<180) {
            s=(SPEED_TURN_MAX*abs(xya.a-angle)/180)+SPEED_TURN_MIN;
            motor1F=s;
            motor1B=s;
            motor2F=s;
            motor2B=s;
            dir1=1;
            dir2=0;
        } else if(xya.a>180 && xya.a<355) {
            s=(SPEED_TURN_MAX*abs(xya.a-359)/180)+SPEED_TURN_MIN;
            motor1F=s;
            motor1B=s;
            motor2F=s;
            motor2B=s;
            dir1=0;
            dir2=1;
        } else {
            motor1F=0;
            motor1B=0;
            motor2F=0;
            motor2B=0;
        }
    }
}