terça-feira, setembro 22, 2015

Rádio nRF24L01+: Explorando Topologias de Rede e Economia de Energia

Nos dois posts anteriores usamos o nRF24L01+ para comunicação ponto a ponto entre dois dispositivos. Vejamos agora algumas considerações sobre economia de energia e topologias mais sofisticadas.

Consumo de Energia no nRF24L01+

 O datasheet do nRF24L01+ apresenta valores típicos de consumo em várias situações.

O consumo mínimo (900 nA) é quando ele está no estado power down, que é selecionado no bit PWR_UP do registrador CONFIG. Entretanto, é preciso um tempo grande (1,5 a 4,5 ms, dependendo do cristal) para sair deste estado e poder receber ou transmitir.

Seguindo em ordem crescente, temos os estados standby-I (26 uA) e standby-II (320 uA). Para entrar no estado standby-I é necessário configurar o bit PWR_UP no registrador CONFIG e deixar o sinal CE no nível baixo. Quando o sinal CE for levantado, o nRF24L01+ passará rapidamente (130 us) para a recepção ou transmissao (conforme selecionado no bit PRIM_RX do registrador CONFIG). O modo standby-II ocorre quando o sinal CE é levantado, está selecionada transmissão e não há nada a transmitir.

A transmissão irá consumir entre 7 e 11.3 mA, dependendo da potência configurada.

O campeão no consumo é a recepção, que gira em torno de 13 mA e varia ligeiramente com a taxa de comunicação.

Portanto o consumo é, no pior caso, semelhante a um LED com brilho forte. Nada demais para situações em que a alimentação vem da rede elétrica, porém problemático quando se deseja alimentação por bateria.

Comunicação Ponto-a-Ponto, Recepção Sempre Ativa

Esta é a topologia que usei nos meus exemplos anteriores. É extremamente simples do ponto de vista de implementação e permite que qualquer uma das pontas transmita a qualquer momento. Entretanto, é extremamente "gulosa" do ponto de vista de energia.

Como o nRF24L01+ possui seis pipes de recepção, este esquema pode ser estendido sem muitas complicações para seis dispositivos, permitindo a comunicação direta de qualquer par. É preciso somente tratar o caso de dois dispositivos tentarem comunicar ao mesmo tempo, o que provavelmente vai impedir ambas as comunicações. Neste caso basta cada transmissor esperar um tempo diferente (por exemplo, baseado no seu endereço) antes de tentar transmitir de novo.

Comunicação em Estrela

Uma situação comum é termos alguns sensores querendo reportar a sua leitura para um nó central. O nó central provavelmente estará sendo alimentado pela rede elétrica enquanto que pode ser necessário que os sensores operem com bateria. Neste caso o fluxo da comunicação é primordialmente em um único sentido, do sensor para o nó central.


Se tivermos até seis sensores, o nRF24L01+ cabe como uma luva nesta configuração. O nó central fica permanentemente em recepção, com os seus pipes preparados para receber os dados enviados pelos sensores. Dependendo da latência desejada na leitura dos sensores, o rádio poderá ser mantido desligado ou em standby. Periodicamente (ou quando ocorrer uma mudança significativa na leitura) o sensor ativa o rádio e envia a leitura.

Este esquema pode ser expandido para permitir uma comunicação restrita no outro sentido: basta o sensor deixar o rádio em recepção por um pequeno período de tempo após enviar uma leitura (não necessariamente a toda leitura). Isto permite que o nó central envia algum parâmetro de configuração (ou até mesmo uma atualização de software, se o microcontrolador do sensor permitir isto).

A coisa complica se quisermos suportar mais de seis sensores. Neste caso não dá para contar com os pipes e o recurso de auto ack, pois o ack é enviado para o endereço de recepção do pipe. O jeito é fazer a coisa toda na raça:
  • Desligar o ack automático
  • Usar um endereço único de recepção no nó central
  • Colocar nos dados do pacote o endereço do sensor que será usado para o nó central responder a ele.
  • Implementar "na unha" um esquema de ack, retransmissão e descarte de pacotes repetidos.
"A implementação deste protocolo fica como exercício para o leitor".

Comunicação em Árvore

Nesta topologia a comunicação entre os nós se faz em uma estrutura de árvore, com endereços (e posições na árvore) previamente definidos. Uma mensagem podendo passar por vários nós antes de chegar ao destino.

Por exemplo, uma mensagem no nó 13 para o nó 123 faria o caminho 13 -> 03 -> 23 -> 123.


O autor da biblioteca RF24 (TMRh20) criou também a biblioteca RF24Network que implementa esta topologia. Ela não economiza energia e pode exigir vários "saltos" para uma mensagem chegar ao seu destino, mas permite a comunicação entre até mais de 3000 nós. Uma figura melhor e mais detalhada que a acima, explicando o endereçamento usado na biblioteca, pode ser vista aqui.

Uma desvantagem deste esquema é que a "queda" de um nó deixa inacessíveis os nós pendurados a ele.

Rede Mesh

Uma rede mesh é uma generalização do caso acima. O TMRh20 possui um projeto experimental, RF24Mesh, que cria uma camada acima do RF24Network para permitir a alocação dinâmica dos endereços na árvore. Com isto a árvore é montada e remontada dinamicamente, permitindo que nós se juntem e se separem da rede.

Próximos Passos

Vou dar um tempo neste assunto aqui no blog. Na lista de ideias está fazer um teste de montar um "nó sensor" alimentado a bateria, usando um MSP430. Ficaria legal este nó conversar com um Raspberry Pi, pra gravar as leituras em um arquivo e/ou disponibilizar na web. Este projeto deve demorar algumas semanas, após o que eu reporto no blog os resultados.

Nenhum comentário: