Tabela de conteúdos
Terceiro Trabalho Prático
O Robô
Eletrônica
Regulador de Tensão
Figura - Circuito Regulador de Tensão
Componentes Utilizados:
- Regulador CI LM317T
- 2 diodo retificador 1N4007
- resistor 1KΩ (dourado, vermelho, preto, marrom)
- resistor variável (trimpot) 10KΩ
- capacitor eletrolítico 22μF
- capacitor eletrolítico 10μF
- capacitor cerâmico 100nF
- J3,J4; conectores Borne KRE 2
Especificações do CI :
- Tensão de entrada 3 V – 40 V
- Tensão de saída 1.25 V – 37 V
- Temperatura de operação 0 °C – 125 °C
- Corrente máxima de saída 1,5A
Mais informações no Datasheet do CI LM317T
Visto que o regulador de tensão anteriormente utilizado pelo grupo não estava tão robusto quanto desejado, e em alguns dos testes foi mal manuseado e estragou, para esse Trabalho Prático construímos um novo regulador de tensão. Desta vez utilizando um par de diodos que suportam tensão reversa de 7V, sendo assim, impede-se a passagem de corrente quando polarizado reversamente.
Um teste não planejado da robustez do circuito e do funcionamento do diodo aconteceu quando o Arduino foi ligado a porta USB do computador enquando o circuito de alimentação estava conectado ao Arduino. A placa do regulador de tensão foi alimentada pelos terminais de saída com os 5V vindos do ‘Vin’ sem danificar a placa. Na antiga placa projetada pelo nosso grupo, um diodo retificador que suporta tensão reversa de 7V era usado permitir passagem de corrente no sentido fonte de alimentação (baterias+regulador de tensão) para o ‘Vin’ do Arduino e impedir que o ‘Vin’ alimentasse reversamente o regulador. Sendo assim, era possível reprogramar o Arduino sem retirar os fios da alimentação, o que não é possível de ser feito nessa placa.
Mudanças de Projeto
Nos dois primeiros Trabalhos Práticos da disciplina, o grupo optou pelo desafio de construir nossos próprios shields e circuitos, fazendo todas as placas usando apenas componentes eletrônicos básicos. Os módulos prontos apesar de possuirem maior confiabilidade no uso, por outro lado geralmente são mais caros e não são tão desafiadores, eletrônicamente falando. Construir nossos próprios módulos proporciona mais liberdade de projetar algo que atenda as necessidades do grupo, de uma maneira não tão engessada, porém também demanda um tempo grande de dedicação e gera muito retrabalho visto que os desafios dos TPs não são sabidos desde o princípio.
Nesse TP nos foi sugerido o uso e nos foi emprestado uma placa que engloba todos os shields que havíamos feito de uma maneira mais organizada e melhor projetada. O primeiro shield que encaixa sobre o Arduino é usado para acionamento de 4 motores. E o segundo é o conjuto de um display LCD com 6 botões, usados para exibir mensagens na tela e poder navegar no menu e configurar parâmetros através dos botões.
LCD Keypad Shield
Figura - LCD Keypad Shield
O shield LCD 16×2 com Keypad (teclado) é um componente útil se quisermos montar algum tipo de painel que necessite de entrada de dados ou controle por meio de botões. Este shield é compatível com placas Arduino, e utilizada como interface com usuário, permitindo que este navegue através de um menu ou selecine o valor de alguns parâmetros.
Outra vantagem é que este não impossibilita o uso das portas PWM e analógicas que apesar de não estarem sendo utilizadas estão encobertas pelo shield. Basta solda uma barra de pinos sobre o shield que é possível utilizar estas portas.
Figura - Acessibilidade das Portas PWM
Figura - Acessibilidade das Portas Analógicas
Os botões do shield usam uma única porta analógica, A0. Através de uma associação de resistores é possível determinar qual botão foi pressionado, e com isso há uma grande economia de portas digitais do Arduino.
Figura - Esquemático da Associação de Botões.
Placa do Sensor LDR
Placa projetada para o reconhecimento de cor. Utilizamos um LED RGB que pisca cada cor por um curto tempo. Após refletir no objeto o sensor LDR recebe o sinal pelo fio amarelo e entrega o valor para o Arduíno que com sua determinada programação descobre o valor da cor. O VCC é ligado em 5V do Arduíno e o GND no Terra. O Sinal deve ser ligado em uma porta analógica. Os resistores do LED são de 300Ω. E do sensor LDR é o de 10KΩ, já que a corrente deve ser menor nesse.
Figura - Placa do Sensor LDR.
Sensor Óptico Reflexivo
Utilizamos o sensor óptico TRCT5000, esse possui um LED emissor de infravermelho e um fototransistor. De acordo com seu datasheet temos que a distância de operação com eficiência maior que 20% é de 0.2mm até 15mm. Utilizamos um resistor R1 de 300Ω e em R2 um de 10KΩ. O OUT foi ligado a uma porta analógica. E o VCC é a voltagem do Arduíno, 5V.
Figura - Sensor Óptico TRCT5000.
Para a tarefa de seguir a linha utilizamos três desses sensores ligados cada um em separado no Arduíno e o circuito utilizado para testes pode ser mostrado a seguir:
Figura - Montagem dos sensores ópticos.
Sinal x Distância
Gráficos dos valores lidos pela distância do objeto ao sensor.
Gráfico 1: Sinal a 5mm.
Gráfico 2: Sinal a 10mm.
Gráfico 3: Sinal a 15mm.
Gráfico 4: Sinal a 20mm.
Controle Remoto
Com o intuito facilitar o controle do robô foi acoplado ao Arduino um receptor de infravermelho, que recebe na frequência de 38kHz. Isso fez com que conseguimos navegar no menu, digitar a velocidade desejada, parar o robô e inserir outros parâmetros à uma distância mediana. Como a luminosidade influenciava significativamente no desempenho do receptor IR foi feita uma proteção para o mesmo. Ainda não descobrimos porque a luz que vibra a 60Hz influencia na leitura de um sensor de 38kHz.
Para emitir o sinal infravermelho foi usado um smartphone e o aplicativo Peel Smart Remote. Todo o código foi programado para a codificação das teclas do controle remoto da marca LG. Sendo assim, caso não se tenha disponível um smartphone com tais funcionalidades, é possível usar o controle remoto da TV, DVD, etc.
Figura - Modelo do Controle Remoto
Figura - Aplicativo do Controle Remoto
Acionamento de Motores
Para o acionamento dos motores foi utilizado o AdaFruit Motor Shield. Este por sua vez é um bom controlador de motores para plataformas Arduino. Usando o circuito integrado L293D como base da ponte-H é possível controlar sentido de giro e velocidade de motores, fornecendo 0,6A nominal e 1,2A de pico. Neste TP, o shield foi utilizado para controlar dois motores DC, e para isso utilizamos 7V para alimentação tanto do Arduino quanto do shield dos motores, porém caso necessário é possível utilizar até 4 motores DC. Uma das vantagens da utilização do shield é o número reduzido de portas do Arduino que são utilizadas. Utilizamos apenas dois pinos do Arduino : o pino SDA e o pino SCL, que formam a interface de comunicação I2C.
Figura - AdaFruit Motor Shield
Mecânica
A estrutura mecânica de LEGO necessária para a execução da tarefa de seguir linha e fazer curvas de 90º não foi muito diferente da estrutura necessária para a tarefa anterior. No entanto, alguns problemas na última etapa poderiam ter seus efeitos minimizados com algumas mudanças na estrutura e tais mudanças foram feitas.
A primeira foi o aumento da área superficial do carro e consequente redução da altura. A estrutura mais larga e comprida fornecia mais espaço para engrenagens, para o sustentar o shield, as baterias e sensores de maneira mais organizada, oferecendo com isso mais segurança para os componentes eletrônicos da montagem. No entanto, tal objetivo é importante e ainda pode e deve ser melhorado para as etapas seguintes, principalmente em relação aos fios expostos e estabilidade das partes durante o movimento do carro.
A segunda mudança feita foi na posição da terceira roda, aquela que não é movida por motores e fornece estabilidade estática a estrutura. A terceira roda gera atrito ao se posicionar na direção do movimento e isso por sua vez gera uma desorientação nas mudanças de direção. Para minimizar esse efeito, a terceira roda foi colocada na parte de trás e, ao invés de direcionar o carro, ela é apenas arrastada por ele, mas ainda com a função de manter o equilíbrio.
A última mudança foi uma melhoria na caixa de redução. Os movimentos rápidos na etapa anterior, derivados de uma pequena redução com engrenagens, ampliavam qualquer perturbação e tornavam o movimento muito tortuoso. A nova caixa de redução consiste em três reduções de 40:10, sendo que os motores podem ser instalados em quaisquer uma das 3. A maior versatilidade e amplitude da caixa de redução tornou a estrutura ideal para vários cenários e diminuiu um gargalo do projeto.
Uma boa estrutura mecânica permite que alterações sejam feitas em outras características do carro e ainda gera um bom resultado no final. Essa característica é importante por não sabermos quais serão as próximas etapas de antemão e querermos que a mesma estrutura mecânica seja utilizada novamente.
Programação
Modularização
Para facilitar o gerenciamento do código, dado o crescimento do mesmo em cada TP, o código do robô foi modularizado em bibliotecas, cada uma responsável por controlar uma parte especifica do robô. As bibliotecas criadas foram
- MotorControl (controla os sinais enviados para os motores)
- Menu (controla a exibição e navegação do menu)
- Timer (biblioteca de temporização)
- ColorDetect (biblioteca com as rotinas de reconhecimento de cores)
Cada biblioteca expõe sua assinatura por um .h e é implementada no respectivo .cpp.
A modularização ainda precisa ser aperfeiçoada, pois idealmente cada biblioteca deveria controlar apenas funções de uma única área, porém um grande volume de código ainda se encontra no arquivo principal do projeto. A modularização será melhorada ao longo do próximo TP.
Menu
O código do menu foi aperfeiçoado de modo a aperfeiçoar sua manutenabilidade e legibilidade. Cada opção exibida no LCD foi abstraída para uma struct MenuOpt.
Option1 option2 contém as strings a serem exibidas na primeira e segunda linha respectivamente. Os ponteiros next e prev apontam para o MenuOpt a ser exibido ao navegar para frente e para traz no menu. Já os ponteiros enter e back apontam para o MenuOpt a ser exibido quando a tecla enter e back são pressionadas, respectivamente, caso aja algum submenu presente. As funções de navegação agora apenas atualiza o ponteiro para o MenuOpt atual. No caso da função menuEnter, como a tecla de ativação da opção é a mesma para entrar no submenu, caso o ponteiro enter for nulo na opção atual, a função executa a tarefa da opção atual do menu.
Controle Remoto
Uma das decisões de implementação da equipe neste projeto foi o uso de controle remoto de emissão de infravermelho, comumente usados em televisores, para a navegação e ajustes no menu. Um controle remoto emite sinais infravermelho codificados de maneira que cada botão emite um código de 4 bytes distinto, desta forma, usando um sensor infravermelho, para detectar os botões pressionados no controle, bastar detectar o código enviado pelo mesmo. Nós utilizamos a biblioteca Arduino IRRemote disponibilizada pelo usuário z3t0 no GitHub (disponível em: http://z3t0.github.io/Arduino-IRremote/) para detectar o código enviado pelo controle, deste modo a programação era reduzida a mapear os botões do controle usado, e assim que o código fosse detectado, executar as funções de navegação do menu.
Detecção de cores
Utilizando a placa com o LED RGB e o LDR,. a programação da detecção de cores foi feita em basicamente dois passos:
- Emitir cada cor do LED RGB sucessivamente em intervalos curtos e ler o valor na porta do LDR para cada cor
- Determinar as cores com o valor lido
A rotina de determinação de cores foi encontrada após alguns testes para se ter uma ideia do valor do sinal encontrado em cada cor. Assim notou-se que as cores seguiam a seguinte lógica:
Vermelho: o valor lido pelo LDR ao piscar o LED vermelho era maior do que o valor lido ao piscar a cor verde e a cor azul, e o lido ao piscar a luz azul era maior do que a verde.
Verde: o valor lido pelo LDR ao piscar o LED verde era maior do que o valor lido ao piscar a cor vermelha e a cor azul, e o lido ao piscar a luz azul era maior do que a vermelha.
Azul: o valor lido pelo LDR ao piscar o LED azul era maior do que o valor lido ao piscar a cor verde e a cor vermelha, e o lido ao piscar a luz verde era maior do que a vermelha. Além disso, diferente da cor verde, o valor lido na cor azul é sempre maior que 400.
Amarelo: o valor lido pelo LDR ao piscar o LED vermelho era maior do que o valor lido ao piscar a cor verde e a cor azul, e o lido ao piscar a luz verde era maior do que a azul.
Preto: o valor lido pelo LDR ao piscar todas as cores no LED RGB era em sempre menor que 270.
Line following
Na montagem foram usados 3 sensores optico-reflexisvos para a detecção de linha, a rotina de line following consistia de seguinte estrategia:
- Ler o valor de entrada dos 3 sensores.
- Se o sensor frontal estivesse na linha, indica que o robô se encontra havia linha a frente, logo o robô seguia em linha reta.
- Caso o contrário, os sensores laterais eram consultados, caso o da esquerda estivesse na linha, o robô girava em seu próprio eixo para a direita
- Caso o da esquerda estivesse na linha, o robô girava em seu próprio eixo para a esquerda.
- Caso ambos os sensores laterais estivessem preto, se o movimento anterior era de giro para um dos lados, o mesmo lado é escolhido
- Se o movimento anterior era de linha reta, a esquerda era priorizada.
Como os sensores estavam ligados em portas digitais, não foi necessário calibrar as cores, pois a leitura de HIGH para preto e LOW para branco se mostrou bastante confiável independente da luz ambiente.
Durante os testes, notamos que o display LCD alterava seu brilho brevemente quando um dos motores tinha seu sentido de giro alterado. O problema foi resolvido pausando o giro dos motores por um breve período antes de mudar a direção de giro. Essa estrategia, apesar de resolver o problema de brilho do LCD, criava um novo problema, onde o robô parava varias vezes em um intervalo curto de tempo, enquanto tentava corrigir seu curso na linha. Novamente o problema resolvido temporizando a tomada de decisão, de maneira que o robô mantinha o movimento por 500ms antes de decidir se devia alterar o curso ou seguir em frente.
Motores
Com o novo shield de controle dos motores, o código de movimentação criado no ultimo TP foi alterado pra se adequar a sintaxe na nova biblioteca de movimentação. O as funções mantiveram sua assinatura e resultado esperado, mas sua implementação interna foi alterada. O shield dos motores utiliza a biblioteca Adafruit_Motor_Shield_V2 disponibilizado pelo professor para nosso grupo. A nova biblioteca tornou a programação de giro dos motores mais simples, onde era necessário apenas setar a velocidade do motor com um método e a direção de giro com outro.
Vídeos do Robô em Funcionamento:
Detecção de Cores
Controle Remoto
Seguidor de Linha
Referências Bibliográficas
Regulador de Tensão:
http://www.projetostecnologicos.com/Componentes/Reguladores-Tensao/lm317/lm317.html http://www.arduinoecia.com.br/2015/06/modulo-regulador-tensao-lm317-step-down.html
LCD Keypad Shield:
http://www.dfrobot.com/wiki/index.php?title=Arduino_LCD_KeyPad_Shield_%28SKU:_DFR0009%29 http://www.arduinoecia.com.br/2013/08/arduino-shield-lcd-16x2-com-keypad.html
Sensor Óptico Reflexivo:
http://www.zerokol.com/2012/11/tcrt5000-sensor-optico-reflexivo.html
AdaFruit Motor Shield:
https://learn.adafruit.com/adafruit-motor-shield/



















