====== Trabalho Prático 2 ====== ==== Objetivos ==== Familiarizar o aluno com sensores, pela construção, avaliação e processamento dos sinais medidos. Esses sinais, devidamente processados serão utilizados em algumas tarefas a serem realizadas pelo robô. \\ ------------ ==== Etapas de desenvolvimento ==== * **12 de outubro:** Primeira reunião: Na primeira reunião ocorreu a familiarização com os sensores. Fizemos diversas medidas para diferentes cores com os sensores opto reflexivo. E também testamos os sensores LDR. Foi programada a tarefa de seguir a linha e começado a programação da tarefa dos blocos, de seguir a luz e a calibração. * **19 de outubro:** Diversas medidas com os sensores foram realizadas no laboratório, utilizando os polarizadores. A lógica da tarefa de seguir a luz foi mudada, pois a demora no tempo de medida dos sensores atrapalhava o bom funcionamento do robô. Antes da modificação o robô ficava girando e medindo ao mesmo tempo. E quando a medida acusasse que o robô estava direcionado a luz, ele parava e andava continuando a medir até que se acusasse que ele não estava mais vendo a luz. Devido aos intervalos entre as medições mais o tempo gasto para a execução do algoritmo, esta lógica mostrou-se ineficiente, pois o robô poderia facilmente passar pela luz sem detectá-la. * **21 de outubro:** Foi terminada a programação da calibração. A programação da tarefa dos blocos foi continuada. * **23 de outubro:** A programação da tarefa da luz foi terminada. Os testes começaram a ser realizados no laboratório. Mas tiveram de ser terminados em outro local simulando a mesa do laboratório. Como não tínhamos nenhuma luz polarizada para testar, cobríamos a entrada de luminosidade do sensor de interesse para simular o efeito de escuridão causado pelo polarizador. Medimos novamente as cores dos blocos com o mesmo sensor opto-reflexivo para terminar a lógica do programa e nos deparamos com o problema de que desta vez todos os valores eram muito próximos. Pequenas mudanças na estrutura do robô foram feitas. * **26 de outubro:** Testamos o programa de seguir a linha que funcionou muito bem. O programa de seguir a luz também funcionou muito bem. A tarefa dos blocos continuou a ser o problema principal. Realizamos as diversas medidas necessárias para fazer os gráficos. ==== Estrutura Física ==== A estrutura física do robô foi adaptada para o uso de sensores. Foram inseridos 3 sensores ópticos ativos e dois sensores LDR. Dois sensores ópticos ativo foram colocados na parte inferior frontal do robô, direcionados para baixo, a fim de se detectar as linhas a serem seguidas na tarefa //follow the line// (Figura 1). {{cursos:introrobotica:2008-2:grupo7:0046-marked-lt.jpg|}} O outro sensor óptico ativo foi posicionado na parte frontal do robô e direcionado para frente, de modo a detectar a cor de blocos encontrados durante o seu percurso. (Figura 2) {{cursos:introrobotica:2008-2:grupo7:0049-marked-lt.jpg|}} Já os dois sensores LDR foram colocados na porção superior frontal e também direcionados para frente, com o intuito de se detectar as luzes polarizadas. Os sensores foram colocados bem próximos uns dos outros. Além disso, foi acoplado um polarizador na extremidade do conjunto que forma cada sensor. Estes polarizadores estão dispostos de maneira que cada um dos sensores consegue detectar somente uma das duas luzes existentes na mesa. {{cursos:introrobotica:2008-2:grupo7:0051-maked-lt.jpg|}} {{cursos:introrobotica:2008-2:grupo7:0046-maked-light-lt.jpg|}} Além disso, manteve-se a a estrutura do tp1 de modo que ele contêm 2 motores, cada um ligado a uma roda do eixo traseiro de forma independente. Também foi mantido o roll on na parte frontal. O piloto do Johnnie foi retirado para a colocação dos sensores. Utilizou-se a calibragem do trabalho anterior para determinar qual potência que cada motor deveria receber para que o mesmo andasse reto e fizesse uma rotação de 30, 60 e 90 graus em torno do próprio do eixo. A Handy Board foi colocada numa estrutura feita para acomodá-la no topo do Johnnie. \\ ------------ ===== Estrutura Lógica ===== === Estruturas de Dados === Utilizou-se as mesmas estruturas de dados do trabalho anterior, Motor e Config. A primeira, Motor, é a abstração de um motor, a qual armazena a porta a qual ele se encontra ligado, bem como sua potência atual. Já a segunda estrutura, Config, possui a configuração de uma trajetória qualquer. Ela armazena a potência desejada de cada motor, além do tempo em que essas potências devem ser mantidas. \\ === Módulos === O código do trabalho foi dividido em vários módulos, cada um relacionado a uma tarefa ou funcionalidade específica. O método main está contido no arquivo main_tp2.ic, bem como todos os "includes". **main_tp2.ic**: Além de conter o main, esse módulo é responsável pela impressão do menu principal, bem como pela interação com o usuário. Assim que uma opção do menu é escolhida, uma função do módulo correspondente é chamada. Essa função é sempre no formato "startX", sendo X a tarefa escolhida. **motor.ic**: Possui métodos associados aos motores. Foram criadas funções para ajustar uma nova potência de um motor e de dois de forma gradativa, assim como para desligar o mesmo. Dessa forma, evita-se mudanças abruptas de velocidade. Além disso, foi criada uma função execute(), a qual é responsável por executar uma tarefa com uma potência "x" para o motor direito, uma potência "y"para o esquerdo em um intervalo "t" de tempo. **followTheLine.ic**: Dentro deste, encontra-se a função de seguir linhas marcadas no campo de competição. Para isso foram utilizadas as medidas de dois sensores ópticos. É feito o controle de parada da tarefa via o botão "stop" **newfollowTheLight.ic**: Novamente, o módulo é responsável pela realização de uma tarefa, localizar e mover-se em direção à fonte de luz especificada no menu a partir de qualquer ponto do campo. Foram utilizadas as medidas de dois sensores LDR tampados com polarizadores. Também é feito o controle de parada da tarefa via o botão "stop". O algoritmo que procura pelas luzes funciona da seguinte forma: 1. O robô gira uma pequena angulação em torno do seu próprio eixo; 2. Várias medidas são realizadas 3. O fio da mediana é obtido. 4. Caso o resultado seja positivo, isto é, o robô esteja vendo a luz que ele procurava ele anda para frente e volta ao passo 1. 5. Caso o resultado seja negativo o robô volta ao passo. **sensors.ic**: O seguinte módulo contem todas as funções relacionadas aos sensores, como obtenção dos valores digitais e analógicos. Foi implementada a lógica da mediana para filtragem dos dados. **calibrateSensor.ic**: Esse módulo é responsável pelas tarefas de calibragem dos sensores. A partir de um tempo de amostragem determinado, ele armazena em variáveis persistentes os valores medidos. **blocksDance.ic**: Esse módulo é responsável pela tarefa de detecção dos blocos. Foi implementada a lógica do robô tomar as ações com base na cor do bloco identificado. **time.ic**: Possui uma função de sleep diferente da disponível pelo IC, a qual permite que o usuário aborte sua execução a qualquer momento. Para isso, realiza-se uma espera ocupada, ou seja, utiliza-se um while e, a cada interação, são feitos cálculos de quanto tempo já se passou desde o ínicio da chamada da função. Caso o tempo seja igual ou maior o passado, a função termina e o fluxo de controle volta para o método anterior. O mesmo ocorre caso o botão "stop" seja pressionado. Além disso, os menus de cada tarefa são gerenciados pelo módulos associados às mesmas. \\ \\ === Usabilidade === A interação do usuário com o robô foi ajustada para ser feita por meio de um menu, do potenciômetro e dos botões "stop" e "start". Cada botão tem as seguintes funções: .//start//: Sempre utilizado para confirmar/executar a opção impressa no display. .//stop//: Utilizado para alternar entre as opções quando no menu, para cancelar o ajuste de alguma variável durante a fase de calibragem e para abortar as tarefas a qualquer momento. .//potenciômetro//: Utilizado para setar os valores associados à variáveis no menu de configuração, tempo e potência. O menu inicial possui 6 opções: **0- Segue a Linha:** Inicia a tarefa de seguir a linha. **1- Segue a Luz:** Execução da tarefa de localizar e mover-se em direção à fonte de luz especificada no menu. **2- Leds:** Executa uma sequência de funcionamento aleatório dos leds. **3- Danca dos Blocos:** Inicia a tarefa tanto de seguir a linha, quanto o de detecção dos blocos e tomadas de ações com base na cor do bloco identificado. . **4- Calibrar Sensores:** Chama o menu de calibragem. Além do menu principal, a calibragem possui um menu auxiliar, com as seguintes opções escolhidas de forma sequencial: **0- Salvar amostras de dados:** Permite armazenar os valores medidos em uma variável persistente. **1- Exibir amostra de dados:** Permite visualizar os dados armazenados. **2- Verificar sensor:** Exibe de maneira contínua o valor medido do sensor de uma determinada porta. **0- Motor Desligado:** Define que as medições serão feitas com motor desligado, para seleção da variável persistente. **1- Motor Ligado:** Define que as medições serão feitas com motor ligado, para seleção da variável persistente. **0- Sem Luz:** Define que as medições serão feitas sem luz externa, para seleção da variável persistente. **1- Com Luz:** Define que as medições serão feitas com luz externa, para seleção da variável persistente. ------------ ==== Calibração ==== Foi utilizado o bloco vermelho para calibração. Foi plotado o gráfico dos dados adquirido por 10 segundo com tempo de amostragem de 0.5, constando o valor médio e o desvio padrão das medidas. {{cursos:introrobotica:2008-2:grupo7:calibracao.jpg|Dados de Calibração}} \\ ------------ ==== Desafios ==== Encontramos os seguintes desafios nesta etapa do trabalho: * A calibragem não era exata e a variação da carga da bateria contribuía para que esta variação se tornasse maior de maneira que uma calibragem que servia num determinado momento não serviria para um momento posterior. \\ ------------ ==== Conclusão ==== A tarefa de calibrar é difícil e trabalhosa. Várias medições devem ser feitas até ter certeza de que determinados valores são os adequados para uma determinada tarefa. Ainda assim, estes valores podem quando usados diversas vezes podem apresentar diversos resultados diferentes, com uma variação significativa entre os resultados extremos. Estes resultados também variam de acordo com a carga da bateria o que torna a tarefa ainda mais complicada. \\ ------------ ==== Relatório Final ==== * {{cursos:introrobotica:2008-2:grupo7:tp2_grupo7.pdf|Relatório Final}} * {{cursos:introrobotica:2008-2:grupo7:codigos_tp2.zip|Códigos do Programa}} \\ ------------