Este trabalho consiste na construção de um robô móvel, isto é, um dispositivo mecânico capaz de se movimentar. O primeiro objetivo é fazer com que o robô seja capaz de realizar três tipos de caminhos - uma linha reta, um triângulo retângulo isósceles e um quadrado. Usando uma cartolina, o dispositivo mecânico deve deixar demarcada a trajetória feita. O robô deve iniciar e terminar os trajetos nos pontos vermelhos indicados na figura 1 abaixo:

Figura 1: Caminhos que devem ser traçados pelo robô
O segundo objetivo consiste na execução de três tarefas simultâneas (usando o multitarefa do IC). Enquanto o robô caminha, ele deve ser capaz de acender e alternar as cores do LED (RGB) na sequência: azul, verde e vermelho, além de emitir diferentes sons.
Além dessas duas tarefas, o trabalho também tem por objetivo fazer uma Avaliação Experimental indicando os possíveis erros de Translação e Rotação do robô, e a criação de um Menu na placa Handyboard para realizar facilmente as tarefas descritas acima.
Conforme a especificação do trabalho, o robô construído deveria conter no máximo dois motores elétricos (DC) de 9V cada. A idéia inicial era usar uma configuração diferencial: um motor para cada roda. Contudo, tal configuração levaria à necessidade de se fazer uma calibração empírica, tanto do movimento de translação quanto do movimento de rotação, uma vez que os motores não têm a mesma velocidade para uma dada potência. Sendo assim, para eliminar a necessidade de calibrar o robô e aumentar sua precisão, foi decidido que um motor seria responsável pelo movimento de translação enquanto o outro faria a rotação através de um sistema mecânico conhecido como “Double Differential Tank Steering”. O sistema permite o desacoplamento dos movimentos de translação e rotação por meio de uma montagem com dois diferenciais em paralelo que é freqüentemente utilizada em veículos com esteiras. Esse sistema impede a utilização de toda a potência disponível, isto é, para cada tarefa individual, translação ou rotação, somente um motor pode estar ligado. Com isso, o robô se move com uma boa precisão ao custo de se mover com uma velocidade reduzida.
Devido à necessidade de se usar uma caneta para marcar o trajeto e do arranjo do sistema de transmissão, optou-se pelo uso de esteiras ao invés de rodas como elemento de locomoção. Com a utilização de rodas, como não existe deslizamento entre elas e a superfície, o eixo de rotação do robô se localizaria na metade da linha que conecta as duas rodas motoras do robô (pensando em um robô diferencial com duas rodas motoras e uma livre) e devido à transmissão, não seria possível posicionar a caneta nesse ponto. Com a utilização de esteiras o centro de rotação depende tanto da extensão do contato entre elas e a superfície, quanto do centro de gravidade do robô, de forma a permitir a mudança da posição da caneta para uma área onde houvesse espaço para sua fixação.
Vários motores e combinações de redução foram testados para que o robô operasse com torque e velocidade aceitáveis. A combinação mais eficiente foi resultado de uma transmissão inicial com polia-correia e pouca redução, fazendo uso de relativamente alto torque dos motores escolhidos.
Foi pedido que o robô acionasse três LEDs, um azul, um vermelho e um verde, porém o LED adquirido pelo grupo foi do tipo RGB, ou seja, capaz de emitir as três cores fundamentais (vermelho (R), verde (G) e azul (B)), assim como cores resultantes da combinação entre elas. Para emitir cada uma das cores requeridas é necessário “fechar o circuito elétrico” para cada um dos terminais do LED correspondente à cada cor. Tal circuito requer a conexão de resistores (com valores apropriados de resistências) entre a fonte de tensão da Handyboard e o LED, a fim de fornecer a corrente elétrica necessária para emitir cada cor fundamental e não queimá-lo. Assim, soldamos os resistores, fios e conectores de tal forma a garantir a confiabilidade e a robustez do circuito e permitir o encaixe adequado dos terminais do LED nos conectores e consequentemente nas saídas digitais da Handyboard. Portanto não foi necessário utilizar mais de um LED neste trabalho para cumprir a respectiva tarefa de acender e piscar as cores.
Várias dificuldades foram encontradas na realização deste Trabalho Prático. Controlar as saídas relativas aos LEDs não foi uma tarefa fácil, dado que suas localizações são de difícil acesso e a conexão de fios é prejudicada.
Em relação à programação utilizando o IC, foi desafiador usar funções de multitarefas não conhecidas, além da criação de uma configuração de menu intuitiva e boa.
Acreditamos que o maior desafio foi definir precisamente a trajetória (translação e rotação) que o robô Saci realizou. Como o sistema era em malha aberta, o robô realizava trajetórias diferentes sem quaisquer alterações no software ou no hardware, exceto pela descarga da bateria que diminuía a potência dos motores, dificultando assim uma calibragem precisa.
A escolha da redução apropriada também foi uma tarefa que levou algum tempo: se a redução for alta a velocidade fica muito baixa e tem-se um torque excedente desnecessário. Pouca redução e a velocidade do motor ficava muito baixa. Fazer um balanço entre torque e velocidades foi um desafio considerável pois boa parte da estrutura era alterada para acomodar o novo trem de engrenagens.
A placa utilizada no trabalho, a Handyboard, possui bateria interna limitada. Os dois motores utilizados, embora sejam idênticos em suas estruturas físicas e especificações, apresentam comportamentos diferentes e, como o controle realizado - exigido neste trabalho - é em malha-aberta (sem realimentação), a precisão dos valores necessários das variáveis tempo e potência - que acionam cada motor para movimentar o robô e traçar os caminhos determinados - é dificultada. Dessa forma, erros de rotação e de translação foram inevitáveis.
Para verificar o erro do movimento de translação do robô realizamos o seguinte teste: após verificar a potência mínima necessária fornecida ao motor responsável pela translação para o robô começar a andar (aproximadamente 50%), determinamos três valores de potência para realizar as medições, sendo estes a potência mínima (com uma margem de segurança em relação ao limiar), a potência máxima permitida e um valor intermediário - 60%, 80% e 100%. Para cada potência, acionamos o motor por um tempo constante (15 segundos) e medimos a distância percorrida (demarcada na cartolina). Realizamos 3 testes para cada potência e plotamos o gráfico “Erro de Translação do Robô - Distância [cm] vs. Potência [%]”, no qual é informado os valores máximo, mínimo, média e desvio padrão das medidas realizadas. O resultado obtido é mostrado na figura abaixo:

Figura 3: Grafico Erro de Translação do Robô – Distância[cm] vs. Potência[%].
De acordo com a figura acima, percebe-se que o erro de translação é inversamente proporcional à potência aplicada ao motor. Isso se deve ao fato de que, quanto menor a potência, mais lentamente o motor se move, o que faz com que seu desempenho seja mais suscetível às irregularidades do ambiente externo, como o atrito, assim como um possível desequílibrio no balanço de cargas do robô (difícil de mensurar).
Já para verificar o erro do movimento de rotação do robô realizamos o seguinte teste: novamente verificamos a potência mínima necessária fornecida ao motor responsável pelo movimento, no caso, a rotação, para o robô começar a girar (aproximadamente 70%), determinamos três valores de potência para realizar as medições, sendo estes a potência mínima (com uma margem de segurança em relação ao limiar), a potência máxima permitida e um valor intermediário - 80%, 90% e 100%. Para cada potência, acionamos o motor por um tempo constante (10 segundos) e medimos o ângulo realizado (com o auxílio de uma vareta colocada na frente do robô e apontada na direção inicial do movimento - 0º). Realizamos 3 testes para cada potência e plotamos o gráfico “Erro de Rotação do Robô - ngulo [º] vs. Potência [%]”, no qual é informado os valores máximo, mínimo, média e desvio padrão das medidas realizadas. O resultado obtido é mostrado na figura abaixo:

Figura 4: Grafico Erro de Rotação do Robô – Ângulo[º] vs. Potência[%].
De acordo com a figura acima, percebe-se que o erro angular é próximo para as potências aplicadas ao motor. Uma possível explicação é o fato de que, como a faixa de potências utilizada é pequena, as três potências utilizadas foram bem próximas, não sendo possível caracterizar bem o comportamento do robô ao se mover devagar ou rápido.
Varios testes foram feitos para fazer a calibração dos motores,
Segue abaixo teste de translação e rotação.
Utilizando o IC, um programa foi escrito para realizar a calibração dos motores e controlar os caminhos demarcados pelo robô. Uma função para cada caminho definido na especificação do trabalho foi implementada. Para mover o robô de um ponto a outro em uma determinada distância, o motor de translação é acionado pelo código e desligado após realizar a trajetória. Para girar o robô em um determinado ângulo, o motor de rotação é acionado pelo código e desligado após realizar o giro.
Foi exigida na especificação do trabalho prático 2 a realização de multitafera utilizando o IC. O robô deve realizar ao mesmo tempo e em 20 segundos, algum tipo de movimento, acender LEDs na sequência de cores azul, verde e veremelho e emitir algum tipo de som. Três funções foram criadas: uma para realizar o movimento do robô, outra para acender os LEDs na ordem indicada, e uma para emitir um som. Para a emissão do som utilizamos a função tone() do IC e escolhemos a música “Família Adams”. As frequências das notas da música foram calculadas pelo grupo. As funções poke(), bit_set() e bit_clear() do IC foram usadas para controlar e acender o LED na ordem exigida. Para realizar a multitarefa, cada uma das três funções criadas foram passadas como parâmetro para a função start_process() do IC. Dessa forma, todo o código implementado nessas funções realizavam em paralelo. Após 20 segundos, todas as tarefas são canceladas usando a função kill_process() do IC.
É importante ressaltar que o caminho escolhido para a multitarefa foi um círculo.
Segue abaixo um pequeno vídeo mostrando o robô Saci realizando a multitarefa:
Utilizando o IC e o carregando na Handyboard, um menu foi implementado. O menu é bastante intuitivo dizendo quais botões devem ser utilizados para selecionar ou trocar alguma opção (ou usar o knob se for o caso). Cada caminho que o robô faz (reto, triângulo ou quadrado) pode ser selecionado pelo menu, assim como a opção de Multitarefas. Além das opções exigidas no Trabalho Prático 2, o menu também possui opções extras, como ligar apenas um dos motores, testar uma cor específica de um LED ou escolher uma música a ser emitida pela placa. De modo geral, o menu possui funcionalidades importantes e bem descritas pelo mesmo.
O trabalho prático 2 nos permite observar que para um robô móvel, somente um controle em malha aberta, mesmo que todo o sistema mecânico tenha uma boa precisão e que todos os movimentos sejam bem calibrados, existem variáveis sobre as quais não se tem domínio. Tais variáveis, como mudança nos atritos entre as peças devido à aplicação de alguma força, mudança no atrito do robô com a superfície, mudança na eficiência dos motores à medida que suas temperaturas de operação aumentam, e folgas inerentes ao conjunto de peças LEGO, acabam por afetar significativamente o desempenho do robô. Assim, a falta de realimentação no controle do sistema (malha fechada) é um fator considerável na execução das tarefas pelo robô, influenciando diretamente nos seus resultados. Logo, garantir erro nulo é praticamente impossível neste contexto.
Portanto, é possível concluir que mesmo que a programação (software) contenha apenas comandos e trajetórias simples, estes só serão executados com boa precisão pelo robô (hardware) caso o controle em malha fechada seja implementado. Para tal, devem ser utilizados sensores adequados para que o robô consiga “perceber os próprios erros” e, assim, realizar ações de correção para que as tarefas possam ser realizadas de maneira consistente.