Atuei em um projeto recentemente em que seria utilizada telemetria analógica para realizar medições de veículos de corrida. Para isto, seria necessário a comunicação entre o dispositivo instalado no veículo com uma central de comunicação, ou seja, comunicação a distância sem-fio.
Utilizando o - sempre sutil - Arduino, consegui desempenhar a tarefa com sucesso, por meio de poucos componentes e com baixo custo, como irei explicitar a seguir.
Componentes
Os componentes utilizados para auxiliar no projeto foram:
- ARDUINO MEGA 2560
- foi designado para embarcar os sensores, o display e o transceptor;
- modelo ideal pela quantidade de portas digitais e analógicas, o suficiente para poder embarcar todos os componentes necessários e poder armazenar memória o suficiente;
- para alimentação, foi utilizada uma bateria comum de 9V;
Arduino Mega 2560
- ARDUINO UNO
- se assemelha ao modelo acima, com a diferença de ser menor, contendo menos portas analógicas, digitais e menos memória;
- atuou como receptor dos dados da telemetria, conectado ao computador receptor dos dados, via cabo USB;
Arduino Uno
- NRF24L01 WIRELESS TRANSCEIVER
- o componente mais importante: o módulo de rede sem fio NRF24L01 é um transceptor fabricado pela Nordic e é uma excelente opção de comunicação wireless entre vários dispositivos, como: Arduino, PIC, Raspberry, BeagleBone entre outros;
- algumas especificações:
- alcance de 10 metros (ambientes internos) a 50 metros (campo aberto);
- possui uma antena embutida que opera na frequência de 2,4GHz com velocidade de 2Mbps;
- modulação GFSK;
- habilidade de anti-interferência;
- verificação de erros por CRC;
- comunicação multi-ponto de 125 canais;
- controle de fluxo;
- tensão de alimentação pode variar entre 1,9 e 3,6V;
- foram utilizados no total dois módulos:
- um NRF24L01 comum, acoplado ao Uno, e
- outro adaptado com PA (amplificador de potência) e LNA (antena externa), acoplado ao Mega, para alcance de longas distâncias: estima-se 1km!
Módulo NRF24L01 e outro adaptado com PA+LNA
- DISPLAY LCD
- este componente realizou a apresentação dos dados lidos pelo Arduino;
- foi utilizado o modelo 16x2 da fabricante Winstar, com backlight ajustável;
- foi programado para atuar em tempo real, atualizando os dados de acordo com o interpretado pelos sensores e também com a função de alternar as informações mostradas na tela, por meio de um push-button;
Display LCD Winstar
Montagem
ARDUINO MEGA (TRANSMISSOR)
Do projeto e componentes apresentados na imagem acima, há algumas observações pertinentes a se fazer:
Do projeto e componentes apresentados na imagem acima, há algumas observações pertinentes a se fazer:
- para o funcionamento correto do módulo wireless NRF24L01, o ideal é que se use um capacitor de 4.7 μF para o 3.3V do Arduino ou um regulador de tensão, se precisar utilizar alimentação de 5V, convertendo a tensão para 3.3V;
- no caso de problemas com transmissão utilizando wireless com PA+LNA, uma alternativa é baixar a taxa de transmissão (testar a partir de aprox. 2400bps);
- a montagem neste Arduino não segue o mesmo padrão dos demais, e deve ser realizado um mapeamento para converter a pinagem dos conectores, e ligar corretamente como mostrado no esquemático a seguir e na tabela de pinagens mais à frente;
- o led ligado ao pino digital 8 é utilizado para informar visualmente que as mensagens estão sendo trnasmitidas: quando enviado um sinal ao outro transceptor, o led irá piscar;
- o projeto foi desenvolvido utilizando os RFs com funções distintas - apenas como agente transmissor ou receptor, por sua vez; no entanto é possível utilizá-los como transceptores propriamente: realizar envio e recebimento de mensagens simultaneamente, ficando passível apenas de tratamento para o uso correto;
- este Arduino possui capacidade para embarcamento de mais sensores; no caso do projeto em questão, os pinos analógicos de A0 a A15 ficaram reservados para embarcar o acelerômetro a ser desenvolvido posteriormente;
Montagem no Arduino Mega
ARDUINO UNO (RECEPTOR)
A montagem da ponta receptora da telemetria por sua vez é mais simples, como mostrada na imagem a seguir, contendo apenas a conexão com o transceptor e um led que, assim como no outro Arduino, irá piscar, mas desta vez, quando receber a mensagem.
Uma observação cabível no caso do receptor: neste caso foi utilizado o Arduino pois se desejava realizar as leituras no computador. Mas há alternativas de se utilizar o módulo RF sem Arduino, por meio de adaptardores FTDI USB, tais como o PIC18F2450 e o FT2232.
Montagem no Arduino Uno
TABELA DE PINAGENS
O mapeamento utilizado no projeto foi como o descrito na tabela a seguir:
NRF24L01 vs. Outros
Algumas considerações sobre outros módulos pesquisados e o porquê de ter escolhido o NRF24L01 para desempenhar o papel de comunicador wireless:
Algumas considerações sobre outros módulos pesquisados e o porquê de ter escolhido o NRF24L01 para desempenhar o papel de comunicador wireless:
- xBee
- ótima qualidade porém inviável, tanto pelo preço pela quantidade de componentes necessários para o funcionamento completo no projeto em questão;
- Apc220
- posui ótimo alcançe e, em teoria, é simples de ser programado, porém o custo também restringe a viabilidade;
- Módulos bluetooth
- baratos e de usabilidade simples, porém curto alcance;
- Módulos WiFi:
- CC3000
- dependência de instalação, configuração e componentes de infra-estrutura WiFi, além do preço ser um pouco salgados;
- ESP8266
- o mais barato e simplista na configuração de infra;
- foi utilizado no projeto mas não funcionou 100%;
- breve detalhamento a seguir;
- ESP8266
Uma grande vantagem deste módulo é que ele possui um processador poderoso em sua placa, sendo capaz de integração com outros sensores e aplicações específicas, e podendo funcionar sozinho, por meio da configuração do firmware e do uso dos pinos GPIO, além de ser possível montar um webserver para monitoramento do módulo e de que não é necessário mais de um módulo para haver comunicação com o PC.
O módulo comprado apresentou muita instabilidade na montagem, pelo fato do módulo funcionar inteiramente em 3.3V (não apenas a alimentação, como também os demais pinos: RX, TX, CH_PD, RST e GPIO), e o único meio de fazê-lo funcionar foi utilizando o buffer não-inversor CD4050. A vantagem de usar este CI se dá por ser barato, fácil de encontrar, e fácil de utilizar: basta alimentar o circuito com 3.3V, e as entradas de 5V que ele receber serão então transformadas em 3.3V nas suas respectivas saídas. Além disso, usando um único buffer é possível trabalhar com 6 entradas passíveis de serem modificadas de 5V para 3,3V.
Dessa forma sua montagem e configuração foram realizadas com sucesso, porém a leitura das mensagens pelo monitor serial do Arduino não puderam ser ajustadas corretamente - foram testadas praticamente todas as combinações de baud possíveis.
- NRF24L01
Por fim, este módulo representou a melhor alternativa, chegando a uma configuração estável e realizando a comunicação devidamente. Os testes iniciais se deram na forma de transceptor, utilizando o módulo para receber e transmtir sinais e comandos, simultaneamente.
Foram testadas funções com push-button, servo motores, leds e acionamento de demais componentes, além da questão de distância: em campo aberto, o maior alcance funcional testado foi de 90m. Para funcionamento do módulo como transceptor, foi usado o conceito de mestre-servo. Para configurar um deles como o mestre, na configuração presente, passa-se um resistor entre um pino configurado no programa como input pull-up e o GND: dessa forma o programa procura por essa conexão para saber qual papel o módulo deve assumir. Não há problema em trocar, durante a execução, qual deles será o mestre, mas se ambos estiverem simultaneamente como mestre ou como servo, a comunicação não será bem-sucedida.
O uso do módulo RF na Nordic pode ser variado, por exemplo para acionamento de relés, automação e controle de sistemas via wireless.
Algumas fotos durante os testes iniciais do módulo em casa:
Algumas fotos durante os testes iniciais do módulo em casa:
Algoritmo
Algumas bibliotecas foram utilizadas, como a do Display LCD (LiquidCrystal), a do Serial (SoftwareSerial) para testes do ESP8266, ambas nativas do Arduino, e a do RF, baixada do site do fabricante.
Basicamente, o algoritmo do módulo consiste da inicialização dos componentes e do loop de comunicação entre ambos. Seria necessário complementação de lógica para realizar cálculo de medições caso o microcontrolador tivesse mais sensores embarcados, apenas uma adaptação e uma iteração a mais no vetor de dados a serem transmitidos.
A seguir, o pseudo-código implementado para cada ponta da telemetria:
RF-EMISSOR
setup
setup
radio.inicializa()
radio.abreCanalTransmissao()
led.inicializa()
display.inicializa()
loop
se (tempoEnvio > x)
para (i, 1 a 8)
rpm[i] ← leAnalogico(i)
/* medicao rpm */
msg[0] = codigo
msg[1] = rpm
radio.envia(msg)
led.pisca()
senao
tempoEnvio++
display.atualiza(rpm)
delay(100)
RF-RECEPTOR
setup
radio.inicializa()
radio.abreCanalRecepcao()
radio.comecaOuvir()
led.inicializa()
loop
se (radio.disponivel())
boolean concluido ← falso
enquanto (!concluido)
concluido ← radio.leMensagem(msg)
codigo ← msg[0]
rpm ← msg[1]
comuta
caso (codigo = x)
monitor.imprime(‘rpm’, rpm)
led.pisca()
default
monitor.imprime(‘codigo desconhecido’)
Obs: caso queira o código-fonte, favor solicite comentando no post ou enviando um e-mail.