terça-feira, 12 de janeiro de 2016

Robótica: Telemetria & Comunicação Wireless

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:
  • 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:
  • 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
Não cabe aqui uma descrição técnica aprofundada do módulo, mas ele basicamente se utiliza de redes wireless 802.11 b/g/n, enviando e recebendo dados nos modos AP (Access Point) e STA (Station).

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:

Testes

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
        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.

Nenhum comentário:

Postar um comentário