Trabalho Prático 03 - Sensores

1. Introdução

O trabalho prático 3 consiste em montar uma estrutura em lego para comportar motores (atuadores), leds e sensores tal que, em conjunto com programas embarcados na Handy Board, formem um robô móvel capaz de fazer reconhecimento de cores. As tarefas a serem realizadas foram implementadas utilizando um LDR e 3 LEDs (RGB) para identificar blocos posicionados à frente do sensor. Neste trabalho também foi praticado o conceito de programação paralela, ao colocar dois programas (duas tarefas) a serem executados paralelamente. A programação paralela consiste na utilização de threads, as quais compartilham o tempo de execução de um mesmo processador, para realização de tarefas distintas de forma virtualmente simultânea.

2. Objetivo

O objetivo deste projeto foi a construção de um robô móvel terrestre para realização de algumas tarefas específicas. Dentre as tarefas foi requisitada uma tarefa de Caracterização do sensor, uma de Identificação de cor e uma de Line following. Além disso, foi solicitado um menu que comporte as tarefas. Deve-se utilizar somente dois motores e no máximo dois sensores. Portanto, a aplicação de conceitos de controle em malha aberta foi utilizada para avaliar experimentalmente a locomoção do robô em diferentes percursos. Além disto, computacionalmente, buscou-se introduzir a utilização de métodos de programação paralela para execução de tarefas “simultâneas” e a utilização de saídas digitais.

3. Metodologia

Foi baseada no código sugerido pelo professor para o mesmo. Já as funções responsáveis pela manipulação do LDR para o reconhecimento de cores, foi inteiramente criado pelo grupo.

Fig. 1Fig. 2

Usando o LDR:

Função void lerCor(): Esta função é responsável por emitir as luzes RGB dos leds separadamente, coletar os valores retornados pelo LDR, para então enviá-los para a função definirCor(r,g,b) que analisa os dados e decida qual cor está presente em frente ao robô.

Para a função lerCor() usamos uma função auxiliar que se chama temporizador(t), que sera rodada em uma thread separada, para que a função sleep() não bloqueie o processo principal. A temporizador(t) ira rodar um sleep() pelo tempo “t” a então acionar um flag, sinalizando que terminou. Este intervalo de tempo t, será caracterizado pelo acionamento de um dos leds, e coleta de dados, durante todo o período.

No trabalho prático, um intervalo de 2 segundos, geralmente rodava um laço while(1), com a função analog (LDR) dentro, cerca de 1145 vezes. Nos dando este número de amostras para trabalhar. Tiramos a média desta amostra antes de passar o valor para a função que definirá qual cor foi lida.

Após as leituras fazemos os seguintes cálculos:

Vermelho: Pelo menos 20% maior que as outras duas cores. Verde: Pelo menos 15% maior que as outras duas cores. Azul: Pelo menos 15% maior que as outras duas cores. Amarelo: Caso não seja nenhuma das opções acima, e os valores são acima de um valor arbitrário (calibragem) Preto: Caso não seja nenhuma das opções acima, e os valores são abaixo de um valor arbitrário (calibragem). Caso contrário: Cor indefinida.

As funções para movimentação, como dito anteriormente, foram sugeridas pelos professor, com algumas modificações baseadas em experimentos, como tentativa e erro:

Calibrate(): Pega valores relacionados, à linha preta e ao chão branco, para definir padrões de leitura

lineFollow(): Alterna entre os motores da esquerda e direita, com as funções waddle_left() e waddle_right() quando detectam que saíram da linha preta, com o auxílio do sensor ótico.

Waituntil_on_the_line() e Waituntil_off_the_line(): Ficam ligadas até perceber uma mudança de estado. Sair da linha e entrar na linha, com o auxílio da função linesensor().

Fora estas funções, temos um conjunto de funções auxiliares, que envolvem limpar e configurar as portas da handyboard, receber os valores da saída analógica dos sensores óticos, menu etc.

4. Vídeos

Testando cor amarela:


Testando cor preta:


Testando cor verde:


Testando cor azul: