Tabela de conteúdos
Trabalho prático 4 - O projeto final
O TP4 teve como foco as preparações para a competição. Focamos em fazer melhorias no nosso robô, com relação aos TPs anteriores, além de adicionar um mecanismo para manipular os blocos coloridos da competição.
A competição
Na competição, o nosso robô falhou miseravelmente em coletar blocos. Basicamente, ele foi capaz de sair da base e de não coletar blocos pretos, resultando na maravilhosa pontuação de 0 pontos. Na análise do robô Auto-System que segue, explicaremos o que ele deveria fazer e os problemas que impediram seu funcionamento
Por dentro do Auto-System
Estrutura
- Base de locomoção: O Auto-System possui duas rodas pequenas do kit LEGO, com um motor LEGO para cada uma, além de uma roda esférica de plástico na frente.
- Corpo : o Auto-System possui estrutura de paralelepípedo. Dentro do corpo encontra-se as engrenagens de redução das rodas, e no topo encontra-se o Arduino.
- Componentes elétricos: O Auto- System conta com vários sensores para interagir com o ambiente: um sensor LDR diferencial caseiro, para orientar-se com luz polarizada; um sensor LDR comum para detectar a luz de partida; um sensor LDR para detectar as cores dos bloquinhos, além de um led 3 cores para auxiliar na medição; dois sensores óptico-reflexivos para a tarefa de seguir as linhas pretas demarcadas no campo; Dois sensores break-beam para odometria.
Tarefas, codificação e problemas encontrados
Em ordem de execução na competição, as tarefas:
Calibração
O modo de espera & não queimar a largada
Esse é um comportamento relativamente simples, e não gerou muitos problemas:
while(analogRead(ldr_st)<850){} \ \o loop sai depois que o valor do LDR sobe drasticamente
Alinhar-se com a luz polarizada
Aqui começam os problemas. A calibração funcionou como esperado, mas após a partida o robô apontava para a borda esquerda do campo ao invés de apontar para a frente.
''void orientacao(){
lcd.clear();//
lcd.print("Mapeando...");//
//
motorR->setSpeed(Gspeed);//
motorL->setSpeed(Gspeed);//
//
int Ttotal = 4*deg90;//
int ctrl = 0;//
int cont = 0;//
//
motorR->run(FORWARD);//
motorL->run(BACKWARD);//
//
while(ctrl == 0){//
//
cont = analogRead(ldr_dif);//
lcd.clear();//
lcd.print(cont);//
//
if(cont > tha){//
//
delay(20);//
cont = analogRead(ldr_dif);//
//
if(cont > tha){//
//
ctrl+=1;//
//
}//
}else if(cont <thb){//
//
delay(20);//
cont = analogRead(ldr_dif);//
//
if(cont < thb){//
//
ctrl+=1;//
//
}//
} //
}//
//
halt();//
//
}''
Verificamos que as funções avanco() e rotacao() causaram os problemas de alinhamento.
Andar pelo campo e identificar um bloco
Feita a calibragem corretamente, o robô guardou na memória alguns valores relativos à luminosidade do ambiente, além de alguns valores remetentes à cor preta. o Auto-System pisca constantemente o LED colorido nas cores verde, azul e vermelho, guardando os valores. Quando encontra um bloco, o led da cor correspondente refletirá a luz da mesma cor com mais intensidade. Compara-se os valores do LDR para cada LED que se acendeu; se algum valor estiver muito diferente dos outros, é computada a presença de um bloco da cor correspondente.
Infelizmente, nosso robô não teve a chance de identificar um bloco, pois estava puxando para a esquerda e constantemente batendo nas paredes.
Coletar um bloco
Adicionamos um motor novo ao robô para a competição. A coleta de blocos seria feita com uma garra simples, que segura o bloco prensando-o contra uma peça estática. Nenhum bloco foi coletado no dia da competição.
Encerrar as atividades após 60 segundos
Todo o processo da competição foi envelopado num loop, que inicia num tempo t0 = millis() e termina em t0 + 60000
Estratégia na competição
- Dada a partida, alinhar-se com a luz polarizada.
- andar para a frente, girar 90 graus para a direita/esquerda (a escolha é aleatória)
- Ao encontrar um bloco, coletar com a garra e encerrar as atividades (se for preto, o robô dá uma ré, gira 180 graus para o outro lado e anda para frente).
O que deu errado?
O principal problema do Auto-System foi a Rotação. Não conseguimos fazer com que o robô girasse na angulação correta na competição. Consideramos que esse controle da rotação não funcionou por causa da odometria. As rodas giram muito devagar para que o shaft-encoding funcionasse direito, e não conseguimos programar uma solução para manter a velocidade das rodas constante.

