Roomba, .NET e RC
Autor: Marcelo Nery | Publicado: 2010-10-16T16:27:00-03:00

Sempre tive interesse em saber como as coisas funcionam. Em alguns casos, me aprofundo mais em busca de detalhes e em outros eu tento apenas dividir as partes de um produto até blocos que considero reutilizáveis em outras aplicações.  Com base em observações e alguma busca na internet, percebi que um sistema de rádio para aeromodelos segue um padrão bem simples: para cada um dos controles no transmissor, o receptor eh capaz de gerar um sinal num pino chamado "canal". Um sistema de rádio com 6 canais normalmente terá 6 controles no transmissor e 6 pinos no receptor, um pino para cada um dos canais que pode ser enviado pelo transmissor.  O sinal gerado no receptor também foi fruto de um estudo. Quando o sistema está em comunicação com o transmissor, o sinal gerado no receptor possui a seguinte característica: a cada 20 milissegundos (0,02 segundos), o valor da tensão do pino de sinal sai de 0 Volts para 5 Volts. A tensão de 5 Volts dura de 1 a 2 milissegundos. O tempo específico entre 1 e 2 depende exclusivamente do controle que está sendo dado pelo piloto no transmissor. Pulsos de 1 milissegundo indicam que o controle está totalmente virado para um lado, pulsos de 2 milissegundos indicam que o controle está totalmente para o lado oposto. E pulsos de 1,5 milissegundos significam que o controle está centralizado. Vale salientar que qualquer posição intermediária é refletida numa duração proporcional no receptor, logo, o movimento é contínuo.  Recentemente eu comprei uma placa onde se pode colocar um programa que interage com o mundo utilizando os pinos de entrada/saída dessa placa. O desenvolvimento de software para essa placa é feito em .NET, um ambiente criado pela Microsoft para facilitar o desenvolvimento de aplicações.  Dado o conhecimento acima sobre o funcionamento de rádios, fiquei curioso para saber o quão efetiva essa placa seria para observar o sinal gerado pelo receptor. Para o meu entusiasmo, vi que o ambiente de programação possuía a seguinte funcionalidade: sempre que a tensão mudar de 0 para 5 volts, chame uma função do meu programa. O oposto também é verdade, ou seja, sempre que a tensão mudar de 5 para 0 volts, chame essa função.  A placa também mantém informação sobre o tempo/hora atual, de forma que durante a execução do programa, é possível determinar quanto tempo se passou entre diferentes trechos do programa comparando os valores entre dois instantes no tempo. Assim, tudo o que eu precisava para saber quanto tempo a tensão ficou em 5 volts era registrar o instante em que a tensão saiu de 0 para 5 e no momento que a tensão voltasse de 5 para 0 eu compararia o tempo atual com o meu registro anterior. A diferença me daria a duração do pulso e consequentemente meu programa saberia qual a posição do controle no transmissor.  Um detalhe importante nesse procedimento é a precisão que a placa possui para registrar o tempo. Essa precisão eh dada em unidades de 100 nanossegundos (0,0000001 segundos), o que é algo bem razoável/preciso para a maioria das minhas aplicações. Só para recaptular, no pulso de 1,5 milissegundos que representa que o controle no transmissor está centralizado, a plaquinha consegue me dizer que a diferença de tempo foi de 15 mil unidades de tempo, o que corresponde a 0,0015000 segundos, ou seja, 1,5 milissegundos).  Pois bem, agora que o meu programa pode saber sobre a posição dos controles do transmissor, procurei algo interessante para controlar. Resolvi então tirar a Roomba do armário e transformá-la num carrinho de controle remoto. Para quem não conhece, a Roomba é um robô (aspirador de pó) autônomo. Ela possui a capacidade de aspirar pó enquanto anda por um ambiente. Sempre que ela bate em uma parede ou um móvel, ela percebe o impacto e muda sua trajetória para fugir do obstáculo e limpar todo o cômodo. O programa que roda nela é relativamente esperto e consegue aspirar toda a superfície do cômodo. Seu principal problema eh com os fios pelo chão, que ela as vezes se enrosca e para de andar.   Eu já sabia que a Roomba aceitava comandos pela "porta serial", e a placa que comprei tem suporte para portas seriais (o que é bem comum nesse tipo de hardware). Existem vários comandos que a Roomba aceita e vou citar apenas um como exemplo, que é o comando de "direção". O comando é definido por um número, no caso, o número 137, seguido por dois outros números: a velocidade que a Roomba deve andar (um número positivo indica que ela deve andar adiante e um número negativo a faz andar de ré). A velocidade eh dada em milímetros/segundo. O segundo número e o raio do movimento, onde ela pode fazer curvas abertas (caso o valor do raio seja alto), ou curvas fechadas (caso o valor do raio seja baixo).  Assim, mais uma vez eu tinha a missão de juntar as peças do quebra-cabeças e teria que, dado os comandos do transmissor, fazer com que a minha placa gerasse os comandos para a Roomba, fazendo-a andar pra frente, pra trás, e fazer curvas para os dois lados.  Comparando essa nova placa com os ambientes que usei anteriormente, o desenvolvimento agora é bem mais poderoso, visto que a placa tem uma comunicação com o PC onde é possível saber exatamente o que está acontecendo no seu programa e ver os números enquanto eles estão sendo gerados. De forma que se algo não funciona como o esperado na placa, é bem mais fácil dissecar o problema e saber onde ele está ocorrendo. No final, o desenvolvimento da "Roomba RC" (Roomba de controle remoto) demorou algumas horas apenas, o que é bem interessante.Como Fernanda está no Brasil, fica meio complicado eh fazer um vídeo do funcionamento da Roomba RC, então vou publicar apenas as fotos. Se alguém tiver interesse no código ou em mais detalhes, é só dizer.Referências:Placa:http://www.tinyclr.com/hardware/16/fez-panda/Roomba SCI (Serial Command Interface):http://www.irobot.com/images/consumer/hacker/Roomba_SCI_Spec_Manual.pdf