====== Trabalho Prático III ====== Anteriormente à execução do trabalho prático 3 recebemos do professor 2 (dois) sensores //break-beam// para serem utilizados na confecção de contadores de giro (//shaft-encoder//). ==== Melhor resistência para o Fototransistor ==== A //Handyboard// possui um resistor embutido de 47 KΩ ligando uma tensão de 5 V até a entrada analógica correspondente à saída do sensor. Alguns fototransistores melhoram sua performance ao incluir um resistor paralelo ao nativo da //Handyboard//. Efetuamos diversos testes variando a resistência em paralelo com o objetivo de encontrar a melhor configuração para a melhor sensibilidade do fototransistor. O gráfico abaixo ilustra o resultado de nossos ensaios. {{:cursos:introrobotica:2006-2:grupo3:resist.jpg|:cursos:introrobotica:2006-2:grupo3:resist.jpg}} Quando nenhum resistor foi conectado em paralelo, a leitura do sensor indicou 113, sendo este o melhor valor obtido dentre todos os experimentos. ==== Conectando LED´s infravermelhos na HandyBoard ==== Pode-se conectar LED´s na saída da //Handyboard//. Considerando a tyensão de saída da //Handyboard// de 5V, uma queda de tensão no LED de 2V e utilizando um resistor limitador de 330 Ω pode-se determinar a corrente através da Lei de Ohm (V = RI). Portanto, I = 9,1 mA. Em certos casos, é necessário a utilização de diversos LED´s acionados por uma única porta. A saída da porta do sensor na //Handyboard// é capaz de suprir de 20 mA a 25 mA. Portanto, podemos utilizar até dois LED´s por porta. Outra solução seria utilizar o pino de alimentação da //Handyboard//, capaz de fornecer 100 mA. Utilizando este pino, com o auxílio de um transistor conectado a porta do sensor para acionar os LED´s quando requerido, pode-se então utilizar 10 LED´s em paralelo. Caso seja utilizado a porta de fornecimento dos motores (corrente máxima: 600 mA), poderia ser conectado até 65 LED´s com a mesma potência. Lembrando-se que há a necessidade de recalcular o valor das resistências limitadoras de corrente pois o motor fornece uma alimentação de 9V. Para todas as montagens acima, é imprescindível a utilização de resistores limitadores de corrente para cada LED. ==== Simple Feedback Control ==== Fixamos na lateral do robô o sensor ótico (par diodo-fototransistor, o mesmo utilizado no TP2 para identificar cores) conforme a figura abaixo. {{:cursos:introrobotica:2006-2:grupo3:Fabinho_02.jpg|:cursos:introrobotica:2006-2:grupo3:Fabinho_02.jpg}} O objetivo deste item do trabalho é implementar um algoritmo com a finalidade do robô andar rente à parede ou uma superfície plana de cor constante. O robô deve manter-se a uma distância constante da parede. Implementamos quatro algoritmos para alcançar o objetivo proposto, segundo especificado na seção 5.1.3 do livro-texto. A primeira estratégia de controle para alcançar os objetivos propostos foi a de definir uma distância (valor do sensor óptico) da parede a qual deve ser mantida o mais constante possível e atuar com potência de 100% em uma roda e 0% na outra, de modo a aproximar ou afastar o robô (e conseqüentemente o sensor) da parede caso haja diferença entre o medido e a referência. A resposta obtida foi, como esperado, bastante oscilante, já que o robô só anda em //zig-zag//. Este é um algoritmo de dois estados. O gráfico de um teste executado pode ser observado na figura abaixo. Neste, pode-se ver a curva realizada pelo robô em uma quina da parede aproximadamente após 11 segundos e posterior seguimento da outra face da parede. {{:cursos:introrobotica:2006-2:grupo3:cont100.jpg|:cursos:introrobotica:2006-2:grupo3:cont100.jpg}} O segundo algoritmo de controle é parecido com o primeiro, diferindo apenas que, ao invés de aplicar uma potência de 0% na roda do lado o qual será feito o movimento, aplica-se uma potência de 50%. Notou-se que esta estratégia de controle é mais interessante que o algoritmo de 100%-0% para seguir paredes retas, já que apresenta menor amplitude de oscilação em torno do //set point//. Entretanto, este algoritmo não é eficiente para fazer curvas fechadas (como uma quina de parede), como pode ser observado na figura abaixo aproximadamente no tempo de 7 segundos. O raio da curvatura do robô é demasiado grande devido às potências pré-definidas dos motores. {{:cursos:introrobotica:2006-2:grupo3:cont100_50.jpg|:cursos:introrobotica:2006-2:grupo3:cont100_50.jpg}} O terceiro algoritmo de controle define dois limites, inferior e superior, de valores os quais definem um intervalo de distância que o robô deve seguir a parede. O algoritmo agora possui três estados: dois para virar para os dois lados e um para fazer o robô andar em linha reta. Esta estratégia de controle permite um andar mais suave com possibilidade do mesmo fazer curvas fechadas. As potências dos motores utilizadas foi de 35%-0% ou vice-versa e 35%-35%, como pode ser vizualizado na figura abaixo. {{:cursos:introrobotica:2006-2:grupo3:cont3estados.jpg|:cursos:introrobotica:2006-2:grupo3:cont3estados.jpg}} O último algoritmo implementa um controlador proporcional. Define-se, como no terceiro algoritmo, limites inferior e superior, mas a atuação do sinal de potência é proporcional à diferença entre a referência (limite inferior ou superior, dependendo do caso) e a distância da parede do robô. Este tipo de algoritmo permite um andar mais suave do robô, com curvas de menor freqüência. O gráfico de um experimento pode ser observado abaixo. {{:cursos:introrobotica:2006-2:grupo3:contProp.jpg|:cursos:introrobotica:2006-2:grupo3:contProp.jpg}} Nenhum algoritmo foi capaz de realizar curvas fechadas para dentro, ou seja, cantos de parede, como já era esperado. Para tal, seria necessário outro sensor, posicionado ortogonalmente ao outro, que detecte a proximidade do robô da outra face da parede, ao invés de trombar na mesma como ele executa com a atual configuração. ==== Montagem do shaft-encoder ==== Utilizamos rodas LEGO de seis furos para ser o oscilador de sinal da contagem de giros. Ao girar, a roda corta ou deixa passar a emissão de luz do diodo para o fototransistor do sensor //break beam//. A montagem realizada pode ser observada nas figuras abaixo. {{:cursos:introrobotica:2006-2:grupo3:Fabinho_04.jpg|:cursos:introrobotica:2006-2:grupo3:Fabinho_04.jpg}} {{:cursos:introrobotica:2006-2:grupo3:Fabinho_05.jpg|:cursos:introrobotica:2006-2:grupo3:Fabinho_05.jpg}} {{:cursos:introrobotica:2006-2:grupo3:Fabinho_03.jpg|:cursos:introrobotica:2006-2:grupo3:Fabinho_03.jpg}} ==== Controle Proporcional Derivativo (PD)==== A implementação de um controlador proporcional-derivativo para a posição leva em consideração a posição (proporcional) e a derivada da mesma (velocidade). O livro-texto expõe como projetar um controlador PD para uma roda a qual possui dois //shaft encoders//, sendo assim possível saber o sentido de rotação, além da velocidade e do número de pulsos gerados pela roda em rotação. O nosso grupo recebeu apenas dois sensores desse tipo e como teríamos que adquirir sensoriamento das duas rodas de nosso robô, optou-se por utilizar apenas um //break beam// para cada roda. A sintonia do controlador foi realizada, com tentativa e erro, levando-se em consideração que não poderia haver //overshoot// na posição, já que nossos //shaft encoders// não possuem a capacidade de sensoriar a direção de rotação da roda do robô. Utilizamos ganhos proporcional de 4 e ganho derivativo 3 e aplicamos um degrau de 200 counts. Utilizou-se também os programas em Assembly já implementados e disponíveis para download. O resultado do ensaio realizado pode ser observado na figura abaixo. {{:cursos:introrobotica:2006-2:grupo3:pdumaroda.jpg|:cursos:introrobotica:2006-2:grupo3:pdumaroda.jpg}} Posteriormente, implementou-se um algoritmo utilizando o controle PD com a finalidade do robô andar uma distância definida pelo usuário em linha reta. A estratégia de controle utilizada foi de implementar o controle PD para uma roda e para a outra roda um controle apenas proporcional com //setpoint// definido pela outra roda. Em outras palavras, uma roda executa o controle de posição e a outra executa um controle para acompanhar a primeira roda. Após a implementação do algoritmo realizamos diversos testes com o robô para encontrarmos a relação de centímetros para counts. Encontramos a relação de 1000 counts para 42 centímetros ou seja, 23.81 counts/cm. As respostas de counts, velocidade e potência das duas rodas para uma entrada em degrau na posição podem ser observadas na figura abaixo. {{:cursos:introrobotica:2006-2:grupo3:PD.jpg|:cursos:introrobotica:2006-2:grupo3:PD.jpg}} ==== Controle Deliberativo ==== Implementamos funções de andar reto e girar 90 graus com o controle PD em uma roda e o controle proporcional em outra (como discutido anteriormente na seção "Controle Proporcional Derivativo (PD)") para o robô executar esta tarefa. O objetivo é fornecer ao robô uma matriz contendo os locais de partida e fim e os obstáculos. O robô deve ir até o local final desviando dos obstáculos. Utilizamos o algoritmo //wavefront// de programa já implementado e obtido em http://generalrobotics.org/labs/lab05/. Os resultados foram satisfatórios, embora ocorra eventualmente erros "RUN TIME ERROR", de causa desconhecida, no programa obtido (wavefront.c). ==== Código fonte do TP3 ==== {{:cursos:introrobotica:2006-2:grupo3:TP3.zip|:cursos:introrobotica:2006-2:grupo3:TP3.zip}}