Trabalho Prático 4

Introdução

Neste trabalho prático devemos implementar um robô para a competição “Robôs Antibombas” cuja descrição e regras podem ser vistas no link: Competição.

Os passos de projeto e ideias iniciais, bem como o desenvolvimento no decorrer da construção do robô estão documentados num diário de competição do grupo, que pode ser visitado pelo link: Diário

Abaixo, discutiremos alguns aspectos finais do nosso robô.

Aspectos construtivos e funcionamento

Nosso robô final conta com os seguintes elementos motores/sensores:

3 motores - 2 para as rodas de modo a comandar os movimentos do robô e 1 para a garra que irá pegar os blocos;

1 sensor de cor - constituído de um led RGB mais um LDR para identificar as cores dos blocos;

1 sensor polarizador - LDR diferencial com filtro polarizador para guiar o robô na arena de competição;

1 sensor óptico-reflexivo para medir a distância do robô ao bloco;

1 LDR para detectar a luz de partida.

A estratégia do grupo consiste em pegar os blocos das laterais da arena e retornar rapidamente à base, repetindo o processo durante a partida e tentando pegar o maior número de blocos possível, com exceção dos blocos pretos.

A dinâmica esperada para uma partida é a seguinte: o robô inicia em modo de espera e aguarda a detecção da luz de partida pelo LDR localizado na parte central e de baixo do robô. O próximo passo é a localização através das fontes de luz polarizadas localizadas nos extremos da arena de competição, utilizando o LDR diferencial polarizador na parte de cima do robô. Feito isto, o robô segue em frente à procura de um bloco, pegando o mesmo se for verde, vermelho ou azul e retornando à base, ou descartando-o se for preto.

Dificuldades

A saída de um dos integrantes do grupo e o pouco tempo para construir o robô deste último trabalho prático foram as maiores dificuldades encontradas pelo grupo.Tivemos problemas sérios na apresentação prévia da competição, na qual o robô apresentou um comportamento errático e ainda tivemos um problema com a nossa handyboard que nos impediu de implementar a lógica a tempo. Remontamos o robô e testamos os sensores na handyboard novamente, conseguindo um bom progresso até o dia da competição, com todos os sensores funcionais. Nosso desempenho, entretanto, não foi satisfatório devido a um erro inesperado do nosso robô: ao detectar a luz de partida e se alinhar com a luz polarizada para sair da base, ele avançava em direcão à arena mas rapidamente desviava sua trajetória e seguia em direção à parede mais próxima devido a algum problema de calibração, algo que não acontecia nos testes prévios à competição. Este, aliás, foi um problema comum a outros grupos, porém saímos cedo demais da competição e não conseguimos consertar o erro a tempo.

Fotos do robô

Código

#define Itens_Menu 3

int vermelho=0;
int verde=0;
int azul=0;

int velocidade = 80;

float tempoinicial=0.0;
float tempofinal=0.0;
float segundo_muda = 0.0;

int dar_partida = 0;

int s_optico=0;
int s_ldr=0;
int s_ldr1=0;
int s_opt = 0;
int sensor=0;

int pego = 0;

/*************************************/

int port_or=3; //optico-reflexivo

int port_ldr=6; //ldr
int port_ldr1=2; //ldr
int port_optico = 0;//optico


int port_bb_right=7; //encoder 0
//int port_bb_left=8; // enconder 1
int position=0;  //Ctrl
int refposition=0;
int error=0;
int lastError=0;
int kp=5;
int kd=1;
int pv=0;
int vel_right=50;
int vel_left=50;


int motor_right=0; //Motores
int motor_left=1;
int motor_garra=2;

int azulreal = 150;
int verdereal = 150;
int vermelhoreal = 150;



char Menu[Itens_Menu][30] = {"Competition Mode", "Calibracao", "Motor test"};

void start_menu()
{
    int i = 0;
    int option;
    
    while(1)
      {
        while((!start_button()) || (!stop_button()))
          {
            printf("%s\n",Menu[i]);
            msleep(100L);
            
            if ( start_button() )
              {
                executeItem(i);
                while (start_button());
            }
            if ( stop_button() )
              {
                i = (i + 1)% Itens_Menu;
                while (stop_button());
            }
        }
        
    }
    
}

void cores(){
    ///////// LED RGB / LDR - DETECO DE CORES/////////////
    
    poke(0x1008, 0x04);              //bit miso vermelho
    sleep(0.3);
    vermelho = analog(6);
    printf("\n%d vermelho",vermelho);
    
    poke(0x1008,0x08);               // bit verde
    sleep(0.3);
    verde = analog(6);
    printf("\n%d verde",verde);
    
    poke(0x1008,0x20);               // bit SS azul
    sleep(0.3);
    azul = analog(6);
    printf("\n%d azul",azul);
    poke(0x1008,0x00);
    sleep(0.1);
    
    
    if(vermelho<azul && vermelho<verde && vermelho>vermelhoreal)
      {
        printf("\n bloco vermelho");
        motor(2,30);
        sleep(0.3);
        alloff();
        motor(0,-50);
        motor(1,-50);
        sleep(10.0);
        alloff();
        pego = 1;
        
    }
    
    else{
        if (verde<azul && verde>verdereal)
          {
            printf("\n bloco verde");
            motor(2,15);
            sleep(0.3);
            alloff();
            motor(0,-50);
            motor(1,-50);
            sleep(10.0);
            alloff();
            pego = 1;
        }
        else
          {
            if (azul>250)
              {
                printf("\n bloco azul");
                motor(0,-50);
                motor(1,-50);
                sleep(10.0);
                alloff();
                pego = 1;
            }
        } 
    }
}

void orienta(){
    int sentido;
    int old;
    int new = analog(5);
    float tempogiro = seconds();
    
    printf("\nOrientando");
    motor(0,40);
    motor(1,-40);
    sleep(0.2);
    while(1){
        if(new>old){
            old=new;
            tempogiro = seconds() - 6.0;
        }
        else{
            if(seconds() - tempogiro > 0.0){
                motor(0,-40);
                motor(1,40);
                sleep(tempogiro);
                break;
            }
        }
        sleep(2.0);
    }
}

void executeItem(int MenuOption)
{
    poke(0x1009,0x3c); // seta os pinos como saida digital
    
    if(MenuOption == 0)
      {
        while(start_button());
        while(!start_button());
        
        while(start_button());
        while(!start_button()){
            
        }
        while(1){
            //Detecao de partida
            if(seconds()>segundo_muda+1.0)
              {
                segundo_muda = seconds();
                s_ldr=analog(port_ldr);
                printf("%d\n", s_ldr);
                if(s_ldr<3)
                  dar_partida = 1;
                
            }
            if(dar_partida == 1){
                printf("COMECOU!\n");
                break;    
            }
        }
        orienta();
        
        while(1){
            tempoinicial = seconds();
            tempofinal = seconds();
            if((tempofinal - tempoinicial) >55.0){
                break;
            }
            printf("\nAndando para a frente");
            motor(0,40);
            motor(1,-40);
            sleep(4.0);
            alloff();
            motor(0,80);
            motor(1,80);
            sleep(5.0);            
            cores();
            if(pego){
                motor(0,40);
                motor(1,-40);
                sleep(6.0);
                alloff();
                motor(2,20);
                sleep(0.3);
                alloff();
                motor(0,-40);
                motor(1,-40);
                sleep(2.0);
                orienta();
            }
            
            
            sleep(0.3);
        }
        alloff();
        
    }
    
    if(MenuOption == 1)
      {
        
        while(!start_button());
        while(start_button());
        s_ldr=analog(port_ldr);
        printf("%d\n", s_ldr);
        while(!start_button());
        while(start_button());
        
    }
    
    if(MenuOption == 2)
      {
        
        while(start_button());
        while(!start_button())
          {
            //Detecao de partida
            if(seconds()>segundo_muda+1.0)
              {
                segundo_muda = seconds();
                s_ldr=analog(port_ldr);
                printf("%d\n", s_ldr);
                if(s_ldr<3)
                  printf("%d\n", segundo_muda);
                sleep(1.0);
                dar_partida = 1;
                
            }
        }
        
        /*s_ldr1=analog(port_ldr);

        if(s_ldr1>s_ldr)
        {
            printf("%d %d\n", s_ldr, s_ldr1);
            alloff();
        }

        if(s_ldr1<=s_ldr)
        {
            printf("%d %d\n", s_ldr, s_ldr1);
            motor(0,velocidade);
        }


        while(!start_button());
        while(start_button());
        //motor(3,velocidade);
        sleep(7.0);
                motor(0,-velocidade);
                motor(1,-velocidade);
                sleep(7.0);
                enable_encoder(0);
                enable_encoder(1);
                sleep(3.0);*/
    }
}