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);*/
}
}






