Componentes Eletronicos

Guia Definitivo do Módulo Wireless NRF24L01+

Eletrogate 9 de fevereiro de 2021

Introdução

O nosso leitor já está familiarizado a fazer projetos em apenas uma placa Arduino, e só aí as possibilidade são infinitas, porém imagine agora a quantidade e a variedade de projetos possíveis de serem desenvolvidos se duas placas ou mais pudessem comunicar entre si sem a necessidade de fios entre elas. Essa é a principal funcionalidade do componente que abordaremos neste post: o Módulo Wireless NRF24L01+. Trataremos aqui sobre todas as suas características, principais funcionalidades, especificações e como utilizá-lo. Prontos para aprender? Bora lá!


Descrição e Funcionamento

O que é?

NRF24L01 é um transceptor de rádio de chip único que opera dentro das faixas de frequência ISM (Industrial, Sientific and Medical) de 2,4 – 2,5 GHz. O transceptor consiste em um sintetizador de frequência totalmente integrado, um amplificador, um oscilador de cristal, um demodulador, modulador e o protocolo Enhanced ShockBurst ™. Sua potência de saída, canais de frequência e configuração de protocolo são facilmente programáveis por meio de uma interface SPI. O consumo de corrente é muito baixo, apenas 9,0 mA a uma potência de saída de -6 dBm e 12,3 mA no modo RX. Os modos de “desligamento integrado” (Built-in Power Down) e de “espera” (Standby) tornam a economia de energia facilmente realizável.

Como funciona

O módulo transceptor nRF24L01 + transmite e recebe dados em uma determinada frequência chamada Canal (channel). Além disso, para que dois ou mais módulos de transceptor se comuniquem, eles precisam estar no mesmo canal. Este canal pode ser qualquer frequência na banda ISM de 2,4 GHz ou, para ser mais preciso, pode estar entre 2,400 a 2,525 GHz.

Cada canal ocupa uma largura de banda de menos de 1 MHz. Isso nos dá 125 canais possíveis com espaçamento de 1 MHz. Assim, o módulo pode usar 125 canais diferentes que dão a possibilidade de ter uma rede de 125 modems trabalhando independentemente em um só lugar.

Quando conectado a um microcontrolador, o módulo nRF24L01 + usa o protocolo de comunicação Serial Peripheral Interface (SPI) que usa o conceito de mestre e escravo. Na maioria das aplicações, o Arduino é o mestre e o módulo transceptor nRF24L01 + é o escravo. O número de escravos no barramento SPI é limitado e para o Arduino Uno é possível ter no máximo dois dispositivos escravos SPI, ou seja, dois módulos transceptores nRF24L01 +.

Especificações

  • Velocidade de operação de até 2Mbps, podendo ser empregados inclusive em aplicações VoIP de alta qualidade;
  • Taxas de transmissão selecionáveis entre 2Mbps, 1Mbps ou 250Kbps over the air;
  • Baixo consumo, com tensão de alimentação de 1,9 a 3,6V e corrente em modo Power Down de apenas 1uA, sendo ideal para dispositivos que operam com baterias;
  • Regulador de tensão integrado;
  • Entradas tolerantes a 5V;
  • Cristal não crítico, com tolerância de +/- 60 PPM;
  • Modulação GFSK de alta eficiência;
  • Habilidade anti-interferência;
  • Particularmente adequado para aplicações de controle industrial;
  • 125 canais, com capacidade de comunicação multiponto e frequency hopping, permitindo conexões bastante confiáveis;
  • Auto Acknowledge;
  • Controle de erros CRC por hardware;
  • Tecnologia ShockBurst™ com acelerador de protocolo por hardware, liberando o microcontrolador para tarefas mais importantes;
  • Comunicação multiponto com controle de endereçamento;
  • Software disponível para configurar os endereços, gerando interrupções apenas para dados recebidos dentro de uma mesma rede;
  • Pinagem padrão DIP com espaçamento de 2,54 mm;
  • Extremamente miniaturizado: 29 x 15 mm;
  • Pode ser conectado a uma grande variedade de microcontroladores com programação muito simples;
  • Pinagem padrão DIP com espaçamento de 2,54 mm;
  • Extremamente miniaturizado: 29 x 15 mm;
  • Alcance de até 100m em linha de visada.

Pinout

  • GND: é o pino Ground. Geralmente, é marcado por um quadrado branco ao seu redor, assim podendo ser utilizado como referência para os outros pinos;
  • VCC: fornece energia para o módulo. Ele pode ser de 1,9 V até 3,9 V. Pode ser conectado a saída de 3,3 V do Arduino. ATENÇÃO: Conectar o módulo NRF24L01+ a saída de 5 V do Arduino pode queimá-lo!
  • CE (Chip Enable): é um pino ativamente alto (active-HIGH). Quando selecionado, o módulo irá transmitir ou receber, dependendo do modo em que estiver.
  • CSN (Chip Select Not): é um pino ativamente baixo (active-LOW) porém é geralmente mantido em HIGH. Quando este pino estiver em LOW, o NRF24L01 começa a captar dados da porta SPI e processa-os de acordo com suas especificações.
  • SCK (Serial Clock): entrada de pulsos de clock providas pela conexão Mestre do SPI;
  • MOSI (Master Out Slave In): entrada SPI para o NRF24L01;
  • MISO (Master In Slave Out): saída SPI para o NRF24L01;
  • IRQ: é um pino interruptor que avisa o Mestre quando novos dados estão disponíveis para serem processados.

Exemplo Simples (Sketch)

A prática que será desenvolvida aqui tem o intuito de familiarizar o leitor com as funcionalidades do NRF24L01+. Ela consiste em estabelecer uma comunicação entre um módulo cliente e um servidor que são capazes de mandarem mensagem entre si. Para isso, é necessário baixar e instalar a biblioteca RadioHead. Para isso, basta acessar o link a seguir e clicar no local indicado na imagem para fazer o download da biblioteca.

airspayce.com/mikem/arduino/RadioHead/

Feito isso, abra sua IDE e instale a biblioteca baixada. Para isso, clique em Sketch->Incluir Biblioteca->Adicionar biblioteca .ZIP. Encontre a zip file da biblioteca no seu computador e instale-a.


Lista de Materiais

Os materiais necessários para a realização desta prática são os seguintes:

cta_cart


Diagrama

O diagrama do projeto está detalhado a seguir. As conexões do servidor e do cliente são as mesmas.

ATENÇÃO: Concecte o Vcc do módulo na saída de 3,3 V do Arduino. NUNCA conecte o módulo aos 5 V do Arduino, fazer isso pode queimar seu módulo!

Os pinos são:

  • Vcc -> 3V3;
  • GND -> GND;
  • CE -> 8;
  • CSN -> 10;
  • SCK -> 13;
  • MOSI -> 11;
  • MISO -> 12;

O pino IRQ do módulo não será usado.


Código

Os códigos utilizados aqui são exemplos incluídos na biblioteca que foi baixada. Serão utilizados dois códigos aqui, um para o cliente e outro para o servidor. Para acessar o código do cliente, basta abrir sua IDE e ir em Arquivo->Exemplos->RadioHead->nrf24->nrf24_client.

Ou se preferir, basta copiar o código abaixo.

// nrf24_client.pde
// -*- mode: C++ -*-
// Example sketch showing how to create a simple messageing client
// with the RH_NRF24 class. RH_NRF24 class does not provide for addressing or
// reliability, so you should only use RH_NRF24 if you do not need the higher
// level messaging abilities.
// It is designed to work with the other example nrf24_server.
// Tested on Uno with Sparkfun NRF25L01 module
// Tested on Anarduino Mini (http://www.anarduino.com/mini/) with RFM73 module
// Tested on Arduino Mega with Sparkfun WRL-00691 NRF25L01 module

#include <SPI.h>
#include <RH_NRF24.h>

// Singleton instance of the radio driver
RH_NRF24 nrf24;
// RH_NRF24 nrf24(8, 7); // use this to be electrically compatible with Mirf
// RH_NRF24 nrf24(8, 10);// For Leonardo, need explicit SS pin
// RH_NRF24 nrf24(8, 7); // For RFM73 on Anarduino Mini

void setup() 
{
  Serial.begin(9600);
  while (!Serial) 
    ; // wait for serial port to connect. Needed for Leonardo only
  if (!nrf24.init())
    Serial.println("init failed");
  // Defaults after init are 2.402 GHz (channel 2), 2Mbps, 0dBm
  if (!nrf24.setChannel(1))
    Serial.println("setChannel failed");
  if (!nrf24.setRF(RH_NRF24::DataRate2Mbps, RH_NRF24::TransmitPower0dBm))
    Serial.println("setRF failed");    
}


void loop()
{
  Serial.println("Sending to nrf24_server");
  // Send a message to nrf24_server
  uint8_t data[] = "Hello World!";
  nrf24.send(data, sizeof(data));
  
  nrf24.waitPacketSent();
  // Now wait for a reply
  uint8_t buf[RH_NRF24_MAX_MESSAGE_LEN];
  uint8_t len = sizeof(buf);

  if (nrf24.waitAvailableTimeout(500))
  { 
    // Should be a reply message for us now   
    if (nrf24.recv(buf, &len))
    {
      Serial.print("got reply: ");
      Serial.println((char*)buf);
    }
    else
    {
      Serial.println("recv failed");
    }
  }
  else
  {
    Serial.println("No reply, is nrf24_server running?");
  }
  delay(400);
}

Já o código do servidor é possível ser encontrado em Arquivo->Exemplos->RadioHead->nrf24->nrf_server.

O código também se encontra abaixo.

// nrf24_server.pde
// -*- mode: C++ -*-
// Example sketch showing how to create a simple messageing server
// with the RH_NRF24 class. RH_NRF24 class does not provide for addressing or
// reliability, so you should only use RH_NRF24  if you do not need the higher
// level messaging abilities.
// It is designed to work with the other example nrf24_client
// Tested on Uno with Sparkfun NRF25L01 module
// Tested on Anarduino Mini (http://www.anarduino.com/mini/) with RFM73 module
// Tested on Arduino Mega with Sparkfun WRL-00691 NRF25L01 module

#include <SPI.h>
#include <RH_NRF24.h>

// Singleton instance of the radio driver
RH_NRF24 nrf24;
// RH_NRF24 nrf24(8, 7); // use this to be electrically compatible with Mirf
// RH_NRF24 nrf24(8, 10);// For Leonardo, need explicit SS pin
// RH_NRF24 nrf24(8, 7); // For RFM73 on Anarduino Mini

void setup() 
{
  Serial.begin(9600);
  while (!Serial) 
    ; // wait for serial port to connect. Needed for Leonardo only
  if (!nrf24.init())
    Serial.println("init failed");
  // Defaults after init are 2.402 GHz (channel 2), 2Mbps, 0dBm
  if (!nrf24.setChannel(1))
    Serial.println("setChannel failed");
  if (!nrf24.setRF(RH_NRF24::DataRate2Mbps, RH_NRF24::TransmitPower0dBm))
    Serial.println("setRF failed");    
}

void loop()
{
  if (nrf24.available())
  {
    // Should be a message for us now   
    uint8_t buf[RH_NRF24_MAX_MESSAGE_LEN];
    uint8_t len = sizeof(buf);
    if (nrf24.recv(buf, &len))
    {
//      NRF24::printBuffer("request: ", buf, len);
      Serial.print("got request: ");
      Serial.println((char*)buf);
      
      // Send a reply
      uint8_t data[] = "And hello back to you";
      nrf24.send(data, sizeof(data));
      nrf24.waitPacketSent();
      Serial.println("Sent a reply");
    }
    else
    {
      Serial.println("recv failed");
    }
  }
}

Botando pra rodar!

Após carregar o código do cliente em uma placa e o do servidor na outra, basta rodar os códigos e abrir o monitor serial para conferir os resultados. Eles devem ser semelhantes aos da imagem abaixo.

Crédito: DroneBot Workshop

Se o leitor estiver interessado em aprofundar ainda mais seus conhecimentos neste módulo super prático e quiser desenvolver um projeto mais complexo utilizando os conhecimentos adquiridos aqui, indico fortemente que acesse nosso post sobre Radio Controle! Nele, é desenvolvido uma comunicação entre um carro e um controle remoto justamente com uma variante do Módulo Wireless NRF24L01+, ótimo para aprender ainda mais. Confira!

Faça seu próprio Rádio Controle


Considerações Finais

A partir do post acima, foi possível compreender um pouco mais sobre a aplicação do Módulo Wireless NRF24L01+, bem como seu funcionamento e as vantagens de sua utilização. Se o leitor se interessou pela implementação prática do projeto, acredito que gostará dos seguintes posts relacionados:

Curtiu o post? Avalie e deixe um comentário!

Siga-nos também no Instagram e nos marque quando fizer algum projeto nosso: @eletrogate.

Até a próxima!


Sobre o Autor


Ricardo Lousada
@ricardo_lousada

Graduando em Engenharia de Controle e Automação pela UFMG. Ocupo meu tempo aprendendo cada vez mais sobre eletrônica e programação, áreas que mais gosto. Meus hobbies são cinema e livros.


Eletrogate

9 de fevereiro de 2021

A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.

Conheça a Metodologia Eletrogate e Lecione um Curso de Robótica nas Escolas da sua Região!

Eletrogate Robô

Cadastre-se e fique por
dentro de novidades!