Codigo do aldebaran com headers e dip switch

aldebaran_semiauto.cpp

Committer:
pedro_velozo
Date:
2021-03-19
Revision:
0:2228de67a3ef

File content as of revision 0:2228de67a3ef:

#include "aldebaran_semiauto.h"
#include "mbed.h"

#define MAX_PPM 2000       // Valor indicando que o motor deve ir para frente com 100% de acordo com o ppm
#define MED_PPM 1500       // Valor indicando que o motor deve ficar parado de acordo com o ppm
#define MIN_PPM 1000       // Valor indicando que o motor deve ir para tras com 100% de acordo com o ppm
#define REVERSE_LEFT 1550  //Signal to make the robot go reverse with the left wheels.
#define FORWARD_LEFT 1550  //Signal to make the robot go forward with the left wheels.
#define REVERSE_RIGHT 1550 //Signal to make the robot go reverse with the left wheels.
#define FORWARD_RIGHT 1550 //Signal to make the robot go forward with the left wheels.
#define BACKWARDS 10

Timer timer;
InterruptIn ST(p15);
InterruptIn TH(p14);

PwmOut Right(p21);
PwmOut Left(p22);

int ch1_start;
int ch2_start;
int ch1_in;
int ch2_in;

void ST_High() { ch1_start = timer.read_us(); } //start the time
void ST_Low() { ch1_in = timer.read_us() - ch1_start; }

void TH_High() { ch2_start = timer.read_us(); } //start the time
void TH_Low() { ch2_in = timer.read_us() - ch2_start; }
//================================================================================
//=====================  FAILSAFE - ==============================================
//================================================================================
InterruptIn Failsafe(p12);
DigitalOut Led4(LED4);
int RC_value;
int RC_start;
int failsafe = 0;
#define FAILSAFE_SIGNAL 1400
void intHigh()
{
    RC_start = timer.read_us();
}
void intLow()
{
    RC_value = timer.read_us() - RC_start;
    if (RC_value > FAILSAFE_SIGNAL)
    {
        failsafe = 0;
    } //failsafe não ativado
    else
    {
        failsafe = 1;
    } //failsafe ativado
}
//================================================================================
//=====================  LINE  SENSORS - =========================================
//================================================================================
DigitalOut led1(LED1);
DigitalOut led2(LED2);

#define RightSensor p18
#define LeftSensor p20
#define PARAMETER 0.9

AnalogIn RightRead(RightSensor);
AnalogIn LeftRead(LeftSensor);
float sensor_right;
float sensor_left;
int right_line;
int left_line;
int line;
int READ_SENSORS()
{
    sensor_right = RightRead;
    sensor_left = LeftRead;
    if (sensor_right > PARAMETER)
    {
        right_line = 1;
    } //black
    else
    {
        right_line = 0;
    } //white
    if (sensor_left > PARAMETER)
    {
        left_line = 1;
    }
    else
    {
        left_line = 0;
    }
    if (right_line)
    {
        led1 = 0;
    }
    else
    {
        led1 = 1;
    }
    if (left_line)
    {
        led2 = 0;
    }
    else
    {
        led2 = 1;
    }
    line = left_line * 10 + right_line;
    if (line != 11)
    {
        return 1;
    } //Sensors read something
    else
    {
        return 0;
    } //Sensors read nothing
}
void Drive(int LeftSpeed, int RightSpeed)
{
    Left.pulsewidth_us(LeftSpeed);
    Right.pulsewidth_us(RightSpeed);
}
void calibrate()
{
    Left.period_ms(16);
    Left.pulsewidth(MAX_PPM);

    Right.period_ms(16);
    Right.pulsewidth(MAX_PPM);

    wait(3);

    Drive(MED_PPM, MED_PPM);
    wait(3);
}

void semiauto()
{
    Drive(MED_PPM, MED_PPM); //Stop motors
    for (int i = 0; i < BACKWARDS; i++)
    {
        Drive(1550, 1450);
    }
}

void radio()
{
    Drive(ch1_in, ch2_in);
}

void SEMIAUTO_mode()
{
    timer.start();
    calibrate();
    Failsafe.fall(&intLow);
    Failsafe.rise(&intHigh);
    ST.fall(&ST_Low);
    ST.rise(&ST_High);
    TH.fall(&TH_Low);
    TH.rise(&TH_High);
    while (1)
    {
        if (!failsafe) //Failsafe não ativado
        {
            Led4 = 1;
            if (READ_SENSORS())
            {
                semiauto(); //line sensors read something
            }
            else
            {
                radio();
            }
        }
        else // Failsafe ativado
        {
            Led4 = 0;
            Drive(MED_PPM, MED_PPM);
        }
    }
}