ArduinoNovidade

Como utilizar o módulo NRF24L01 para comunicação sem fio entre Arduinos

Neste tutorial, vamos explorar como utilizar os módulos nRF24L01 para estabelecer uma comunicação sem fio entre dois Arduinos. O objetivo do projeto é criar um circuito em que um Arduino, atuando como transmissor, envia o sinal de um botão para outro Arduino, que funciona como receptor. Quando o botão no circuito transmissor for pressionado, os LEDs no circuito receptor acendem, e quando o botão for solto, os LEDs se apagam. Esse projeto é uma excelente introdução à comunicação sem fio com Arduinos, utilizando um dos módulos de rádio mais populares e acessíveis do mercado.

O módulo NRF24L01 (Figura 1) é uma das opções mais populares para comunicação sem fio de curto e médio alcance, amplamente utilizado em projetos de IoT (Internet das Coisas), automação e robótica. Ele opera na faixa de frequência de 2,4 GHz e é baseado no protocolo de comunicação SPI (Serial Peripheral Interface), que é um padrão amplamente usado para a comunicação entre microcontroladores e dispositivos periféricos.

Figura 1: Módulo Nrf24l01
Figura 1: Módulo Nrf24l01

Características principais:

  • Alcance: O módulo pode alcançar até 1000 metros com antena externa (ou cerca de 100 metros sem antena), dependendo das condições do ambiente e da potência configurada.
  • Velocidade de transmissão: Suporta taxas de transferência de dados de até 2 Mbps, o que o torna ideal para aplicações que exigem transferência rápida e eficiente de dados.
  • Comunicação full-duplex: O módulo suporta comunicação bidirecional, ou seja, ele pode enviar e receber dados simultaneamente, tornando-o adequado para sistemas de comunicação em tempo real.
  • Baixo consumo de energia: O nRF24L01 é eficiente em termos de consumo de energia, uma característica valiosa para projetos alimentados por bateria, como dispositivos portáteis e sensores remotos.

Quanto a disposição dos pinos, o módulo possui a configuração mostrada na Figura 2:

Figura 2: Pinos do Módulo NRF24L01
Figura 2: Pinos do Módulo NRF24L01

Onde os pinos têm a seguinte função:

  • GND: pino Ground com referência de tensão de 0V.
  • VCC: pino de alimentação que deve estar conectado com uma fonte de 3.3 volts.
  • CE, SCK, MISO, CSN e MOSI: pinos responsáveis pela comunicação SPI com o Arduino.
  • IRQ: Pino de interrupção.

Materiais necessários:

– 2x Arduino Uno;
– 2x Cabo USB tipo A-B compatível com Arduino Uno;
– 2x Módulos Nrf24l01;
– 2x Resistores 220 ohms;
– 2x Led difuso vermelho;
– 2x Protoboards 400 Furos;
– 1x Resistor 10K ohms;
– 1x Chave push button;
Jumpers Macho-Macho;
Jumpers Macho-Fêmea.

ESQUEMÁTICO DE LIGAÇÃO DOS COMPONENTES

Inicialmente certifique-se de que as placas estejam desligas para realizar as montagens apresentadas nas Figuras 3 e 4, lembrando que são dois circuitos distintos, um será o transmissor e o outro será o receptor.

Figura 3: Esquemático para o Circuito do Transmissor
Figura 3: Esquemático para o Circuito do Transmissor
Figura 4: Esquemático para o circuito do Receptor
Figura 4: Esquemático para o circuito do Receptor

Ligações em comum tanto do esquemático do módulo Transmissor quanto do módulo Receptor:

  • VCC: Conecte os pinos VCC dos módulos à entrada de 3.3V dos Arduinos. Atenção: O nRF24L01 não deve ser alimentado com 5V, pois isso pode danificar o módulo. A tensão máxima suportada pelo pino VCC do nRF24L01 é 3.6V. Portanto, utilize sempre 3.3V, como fornecido pelo Arduino ou uma fonte externa.
  • GND: Os pinos GND dos módulos devem ser conectados ao pino GND dos Arduinos.
  • CE: Os pinos CE dos módulos devem ser conectados à entrada digital 7 dos Arduinos.
  • CSN: Os pinos CSN dos módulos devem ser conectados à entrada digital 8 dos Arduinos.
  • SCK: Os pinos SCK dos módulos devem ser conectados à entrada digital 13 dos Arduinos.
  • MOSI: Os pinos MOSI dos módulos devem ser conectados à entrada digital 11 dos Arduinos.
  • MISO: Os pinos MISO dos módulos devem ser conectados à entrada digital 12 dos Arduinos.

Detalhes das ligações específicas para o circuito do Transmissor:

  • Botão: Um terminal do botão deve estar conectado à entrada GND do Arduino que terá a função de emissor.
  • O terminal oposto será o pino de sinal do botão e deve estar conectado à entrada digital 4 do Arduino e ao resistor de 10kΩ, que deve ser conectado ao pino 5V do Arduino, que terá a função de emissor.

Detalhes das ligações específicas para o circuito do Receptor:

  • LEDs: O polo positivo dos LEDs deve estar conectado às entradas analógicas A0 e A1 do Arduino, que terá a função de receptor.
  • O polo negativo dos LEDs deve estar conectado a um resistor de 220Ω e ao pino GND do Arduino receptor.

Elaborando o Código do módulo Transmissor:

Para este projeto, o transmissor terá a função de controlar o botão e emitir a informação para o módulo receptor. Para facilitar o entendimento do código, seguem os passos de lógica de programação utilizados:

1- Incluir biblioteca RF24.h

Na IDE do Arduino, clique no menu Sketch > Incluir Biblioteca > Gerenciar Bibliotecas (atalho: CTRL + Shift + I). Aguarde a janela abrir, digite “RF24”, e após alguns segundos, desça a página até encontrar a biblioteca RF24 e clique em Instalar, conforme mostrado na Figura 5.

Figura 5: Inclusão da biblioteca RF24
Figura 5: Inclusão da biblioteca RF24

2- Definir as entradas digitais que serão utilizadas

Definimos que o pino de sinal do botão será conectado à porta Digital 4 do Arduino. Também foi determinado que o pino CE deve ser conectado à porta digital 7 e o pino CSN à porta digital 8.

3- Declaração de variáveis

Foi declarada a variável botao, que armazenará os dados lidos do botão, indicando se ele foi acionado ou não.

4- Configurações iniciais

Na função setup, declaramos os comandos que serão utilizados na inicialização do código:

– O comando pinMode é utilizado para definir o pino do botão como sendo uma entrada de sinal.
– Os comandos radio.begin, radio.openWritingPipe, radio.setPALevel e radio.stopListening inicializam o módulo RF e configuram a comunicação com o Arduino.

5- Leitura do código e envio do sinal RF

Na função loop, declaramos os comandos que se repetirão durante a execução do código:

– A variável botao armazena as informações lidas do botão

– Utilizando a estrutura condicional if, se o valor do botão for igual a 1, o monitor serial exibirá que o botão não foi acionado. Se o valor for igual a 0, será exibido que o botão foi pressionado.

– O comando radio.write envia toda a informação para o módulo receptor.

Por fim, temos como o resultado o seguinte código para o Transmissor:

// Inclusão das bibliotecas necessárias para facilitar a comunicação com o módulo NRF24L01
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define pinBotao 4 // Define que o pino do botão está conectado à entrada digital 4 do Arduino transmissor

int botao = 0; // Declaração da variável que armazenará as informações lidas do botão
RF24 radio(7, 8); // Define que os pinos CE e CSN estarão conectados às entradas digitais 7 e 8 do Arduino
const byte address[6] = "00002"; // Define o endereço do módulo receptor

void setup() {
  pinMode(pinBotao, INPUT); // Define o pino do botão como entrada de sinal
  Serial.begin(9600); // Inicia a comunicação serial com a velocidade de dados de 9600 bauds
  radio.begin(); // Inicia a comunicação com o módulo NRF24L01
  radio.openWritingPipe(address); // Define o endereço do módulo receptor para onde os dados serão enviados
  radio.setPALevel(RF24_PA_MIN); // Define o nível do amplificador de potência como o mínimo
  radio.stopListening(); // Configura o módulo para modo transmissor (parando de escutar)
}

void loop() {
  botao = digitalRead(pinBotao); // Lê o estado do botão e armazena na variável 'botao'
  
  if (botao == 1) { // Se a leitura do botão for 1, significa que o botão não foi pressionado
    botao = 1;
    Serial.println("Botão não acionado");
  }
  else if (botao == 0) { // Se a leitura do botão for 0, significa que o botão foi pressionado
    botao = 0;
    Serial.println("Botão acionado");
  }

  Serial.println(botao); // Exibe o valor da variável 'botao' na comunicação serial

  radio.write(&botao, sizeof(botao)); // Transmite o valor da variável 'botao' para o módulo receptor
}

Elaborando o Código do módulo Receptor:

Para este projeto, o receptor terá a função de acionar os LEDs assim que o botão conectado ao transmissor for pressionado. Para facilitar o entendimento do código, seguem os passos de lógica de programação utilizados:

1- Definir as entradas digitais e analógicas que serão utilizadas:

Neste código, definimos que os pinos Pinled1 e Pinled2 estarão conectados às entradas analógicas A0 e A1, respectivamente. Também foi determinado que o pino CE deve ser conectado à porta digital 7 e o pino CSN à porta digital 8.

2- Declaração de variáveis:

Foi declarada a variável botao, que armazenará os dados enviados do transmissor, indicando se o botão foi acionado ou não.

3- Configurações iniciais

Na função setup, declaramos os comandos que serão utilizados na inicialização do código:

– O comando Serial.begin inicializa a comunicação com o monitor serial na velocidade de dados de 9600.

– O comando pinMode define os pinos dos LEDs como OUTPUT, ou seja, como saídas.

– O comando digitalWrite é utilizado para acionar um valor HIGH nos pinos dos LEDs, acendendo-os.

-Os comandos radio.begin, radio.openReadingPipe e radio.setPALevel são responsáveis por inicializar o módulo e configurar sua comunicação com o Arduino.

5- Recebimento do sinal RF

Na função loop, declaramos os comandos que serão executados repetidamente durante o funcionamento do código:

– Os comandos radio.startListening e radio.read são responsáveis por receber as informações enviadas pelo módulo transmissor.

– O comando Serial.println envia para o monitor serial o valor recebido da variável botao.

– Utilizando a estrutura condicional if, verificamos se o valor da variável botao é igual a 1 (o que significa que o botão não foi pressionado). Nesse caso, os LEDs permanecem apagados. Se o valor for igual a 0, os LEDs são acesos.  

Por fim, temos como o resultado o seguinte código para o Receptor:

// Inclusão das bibliotecas necessárias para facilitar a comunicação com o módulo NRF24L01
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define Pinled1 A0 // Define que o pino do LED 1 está conectado à entrada analógica A0
#define Pinled2 A1 // Define que o pino do LED 2 está conectado à entrada analógica A1

int botao = 0; // Declaração da variável que armazenará as informações recebidas do botão
RF24 radio(7, 8); // Define que os pinos CE e CSN estão conectados às entradas digitais 7 e 8 do Arduino
const byte address[6] = "00002";  // Define o endereço do módulo (o endereço é uma string de 5 caracteres)

void setup() {
  Serial.begin(9600); // Inicia a comunicação serial com a velocidade de 9600 bauds
  pinMode(Pinled1, OUTPUT); // Define o pino do LED 1 como saída
  pinMode(Pinled2, OUTPUT); // Define o pino do LED 2 como saída
  digitalWrite(Pinled1, HIGH); // Acende o LED 1 (valor HIGH)
  digitalWrite(Pinled2, HIGH); // Acende o LED 2 (valor HIGH)
  radio.begin(); // Inicia a comunicação com o módulo NRF24L01
  radio.openReadingPipe(0, address); // Define o endereço do receptor, que será o mesmo configurado no transmissor
  radio.setPALevel(RF24_PA_MIN); // Define o nível do amplificador de potência como o mínimo
}

void loop() {
  radio.startListening(); // Coloca o módulo em modo de escuta, aguardando dados
  radio.read(&botao, sizeof(botao)); // Lê os dados enviados pelo transmissor e armazena na variável 'botao'
  while (!radio.available()); // Espera até que os dados estejam disponíveis
  Serial.println(botao); // Exibe o valor recebido na comunicação serial

  if (botao == 1) { // Se o valor recebido for 1, os LEDs serão apagados
    digitalWrite(Pinled1, LOW); // Apaga o LED 1
    digitalWrite(Pinled2, LOW); // Apaga o LED 2
  }
  else if (botao == 0) { // Se o valor recebido for 0, os LEDs serão acesos
    digitalWrite(Pinled1, HIGH); // Acende o LED 1
    digitalWrite(Pinled2, HIGH); // Acende o LED 2
  }
}

Quando o botão no circuito do transmissor for pressionado, os dois LEDs no circuito receptor devem acender. Ao soltar o botão, os LEDs no receptor devem apagar. Esse comportamento é o resultado esperado para o projeto descrito acima.

Espero que tenha gostado deste tutorial. Em caso de dúvidas deixe seu comentário abaixo.

Atenciosamente, Kleber Bastos.

Bacharel em Engenharia de Computação. Um dos criadores do Blog da Robótica. Faz parte da equipe Casa da Robótica desde 2017. Apaixonado por tecnologias e pelas “loucuras” que é possível criar usando microcontroladores e impressoras 3D. Ex-BBB, mas isso é uma longa história... que poderá ser contada posteriormente.

Kleber Bastos

Bacharel em Engenharia de Computação. Um dos criadores do Blog da Robótica. Faz parte da equipe Casa da Robótica desde 2017. Apaixonado por tecnologias e pelas “loucuras” que é possível criar usando microcontroladores e impressoras 3D. Ex-BBB, mas isso é uma longa história... que poderá ser contada posteriormente.

Deixe uma pergunta

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.