O ROBÔ RESOLVEDOR DE LABIRINTO
Por: Salezio.Francisco • 12/12/2018 • 1.161 Palavras (5 Páginas) • 377 Visualizações
...
Durante o desenvolvimento da lógica, foi determinada a seguinte estratégia, seguir em frente, até encontrar uma parede a uma distância mínima, e esta seria sua referência até encontrar outra parede a frente, seguindo a parede da seguinte forma: virar à direita, e parar assim que o sensor frontal estivesse com uma leitura superior a distância mínima pré-determinada, após esta ação este iria seguir a parede com o sensor esquerdo, se distanciando da parede acionando apenas o motor esquerdo até atingir a distância máxima, e posteriormente se aproximando da parede até atingir a distância mínima, e desta forma seguiria a parede, até que o sensor frontal obtivesse uma leitura menor que a distância mínima indicando o fim desta parede, então o processo se repete.
---------------------------------------------------------------
3 Resultados e Discussão
Realizando testes e aperfeiçoando o código em uso no robô, os resultados foram variados requerendo diversas alterações na montagem do robô e alterações no código, e um fator que dificultou a execução do trabalho, foi a imprecisão dos sensores ultrassom, que em vários casos falham em realizar leituras precisas, e com a utilização da biblioteca NewPing, em ambientes abertos se torna inviável a utilização da uma distância máxima de leitura.
Com a criação do ambiente controlado, no qual foi utilizado um labirinto e método anteriormente planejado foi perfeitamente viável e não houve problemas no funcionamento do robô.
O código foi aprimorado para um sistema de estados, fazendo uso do switch() foi possível organizar e otimizar o código com maior facilidade, todas as ações que envolvem leitura de sensores e acionamento dos motores foram transferidas para funções.
Software do robô
void loop()
{
leitura();
switch (estado)
{
case 1: //perdido
if (sfrente > dist_min)
{
va_frente();
}
else
{
estado = 2; //estado vai para obstrução em caso de codigo completo, ou parede a esquerda
}
break;
/*
case 2: //obstrução
if (sdireita > sesquerda && sdireita > dist_max)
{ //se caminho a direita maior que caminho a esquerda ir para a direita
estado = 3; //vai para parede a esquerda
}
else if (sesquerda > sdireita && sesquerda > dist_max)
{ //se caminho a esquerda maior que caminho a direita ir para a equerda
estado = 4;
}else{
vira_direita();
}
*/
break;
case 2: //parede a esquerda
vira_direita();
segue_esquerda();
if (sfrente
{
estado = 2;// estado vai para obstrução, caso desejar ambos os meios de acompanhar a parede baseado na maior distância disponível.
}
break;
/* nao em uso, faz o robô seguir por um sentido contrario.
case 4: //parede a direita
vira_esquerda();
segue_direita();
if (sfrente
{
estado = 2;// estado vai para obstrução
}
break;
*/
default:
estado = 1; //estado padrão será perdido.
break;
}
/* primeiro código utilizado.
if (sfrente > dist_min)
{
va_frente();
} else
{
vira_direita();
segue_esquerda();
}
*/
}
As funções e o setup não estão presentes, apenas o loop principal.
---------------------------------------------------------------
4 Conclusão
O desenvolvimento de um robô capaz de se locomover de forma autônoma é um processo simples dentro de um ambiente controlado, quando este ambiente não é controlado, diversos objetos até mesmo a perna de uma cadeira, se torna um grande problema para ser detectado pelos sensores, que se demonstraram a maior limitação imposta a locomoção do robô, através da elaboração de uma estratégia viável e a criação de uma máquina de estados, o processo é bem simples e não requer muita tentativa e erro.
...