Site menu Arduino no ar
e-mail icon
Site menu

Arduino no ar

e-mail icon

2014.09.03

Este artigo expressa a opinião do autor na época da sua redação. Não há qualquer garantia de exatidão, ineditismo ou atualidade nos conteúdos. É proibida a cópia na íntegra. A citação de trechos é permitida mediante referência ao autor e este sítio de origem.

O sonho de brincar com rádio (amador ou pirata) ainda está na gaveta mas chegou um aperitivo para enganar a vontade por uns tempos: um radinho 433MHz para Arduino.

O kit mais simples com transmissor e receptor, que eu comprei, custa menos de 3 Obamas no DealExtreme. Ele só transmite um sinal "ligado" ou "desligado", e até mesmo a antena você precisa calcular e soldar.

Existem kits melhores, não muito mais caros (US$ 12), com antena inclusa, que transmitem mensagens de forma perfeita e acabada, mas qual seria a graça então? :)

Estes rádios na faixa UHF têm a vantagem de passar facilmente por paredes e outros obstáculos, o que é vulgarmente percebido como "maior alcance". Pelo mesmo motivo existe a disputa da banda de 700MHz para celular 4G, e a pressão para as TVs analógicas desocuparem logo essa moita.

O objetivo intrínseco de usar rádio com Arduino é reposicionar minha estação meteorológica num lugar mais adequado, em ambiente externo porém à sombra, para melhor precisão das leituras. Manter este sensor longe de equipamentos mais sensíveis também é sempre uma boa idéia.

E o objetivo extrínseco, como já foi dito antes, é dar pasto à "doença do rádio" que, assim como a fotografia, acomete todo nerd. Aquela coisa emocionante do troço não funcionar, e não há muitos meios diretos de achar em qual dos 10 pontos possíveis estaria o defeito.

O transmissor (TX) simplesmente "liga" ou "desliga" e é controlado como se fosse um LED, com digitalWrite(). O receptor (RX) pode ser lido com analogRead() ou digitalRead(). Extremamente simples, né? E praticamente inútil, porque o RX também capta ruídos, muitos ruídos. Não dá nem para para piscar um LED remotamente de forma confiável.

E como se resolve isto? Com uma grossa camada de software, é claro. É preciso adotar e implementar alguma técnica de modulação digital ou de banda-base. A única coisa a nosso favor é que podemos atingir taxas de amostragem realmente altas. O Arduino pode usar 100% da CPU continuamente sem pegar fogo.

O RX parece ter AGC (controle automático de ganho), então o sinal recebido tende a zero logo depois de uma transmissão, e o ruído aleatório vai entrando depois de alguns instantes. Notei isso depois de consertar um erro que ligava periodicamente o transmissor enquanto não transmitia dados (era um código que antes piscava um LED), e em seguida a recepção ficou muito mais difícil.

Na verdade este é o eterno problema da modulação digital: num canal com apenas dois valores possíveis (0 e 1), distinguir três valores (0, 1 e "nada"). Além disso, descobrir onde cada bit começa e termina, unicamente com base nos próprios bits.

Neste ponto, tomei um atalho e adotei a biblioteca VirtualWire. Ela implementa a transmissão de mensagens confiáveis de forma simples e engenhosa. Poder-se-ia sofisticar muito mais (por exemplo, com correção de erros) mas foi um atalho muito bem-vindo, conseguir transmitir dados palpáveis num momento do projeto em que você nem tem certeza que o transmissor funciona.

Como vantagem adicional, o VirtualWire usa interrupções em vez de busy loop para transmitir e receber amostras. Ou seja, ele não "come" 100% de CPU e permite que outras atividades corram em paralelo no mesmo Arduino.

O VirtualWire permite configurar a taxa de transmissão, e curiosamente uma taxa mais alta, tipo 1200bps, funciona melhor que uma taxa como 50bps. A simplicidade da codificação revela sua fraqueza aqui: a taxa muito baixa torna a transmissão demorada, o que dá mais oportunidade para o ruído atrapalhar.

O outro problema, já citado, é que transmitir pouco (e.g. a cada tantos segundos) também prejudica a recepção, apesar do VirtualWire adicionar preâmbulos que "treinam" o receptor. A solução que encontrei foi transmitir o tempo todo, repetidamente, a mesma mensagem. Correção de erros a fórceps ;)

Por pior que seja a recepção, às vezes ela acontecerá. No meu caso, é suficiente que ela ocorra uma vez a cada vários minutos. Pude assim posicionar o RX num canto oculto, perto da parede, que já sabia ser o pior lugar possível.

No meu caso, o esquema só tem de cruzar uma parede. O TX não é muito forte, embora suporte até 12V (que proporcionaria mais que o dobro do alcance dos 5V que estou usando). Minha antena é um pedaço de fio, que nem sequer é rígido!

Decerto um dia desses vou tentar implementar algum esquema de codificação, à moda das brincadeiras com modulação analógica que fiz em 2010.

e-mail icon