Comunicação wireless com Arduino e módulo NRF24L01

Vou mostrar mais uma alternativa para comunicação wireless entre placas Arduino, o módulo wireless NRF24L01, que opera na frequência de 2.4GHz.

Módulo Wireless NRF24L01 2.4Ghz

Esse módulo é uma opção de baixo custo para comunicação não só entre placas Arduino, mas também pode ser utilizado para comunicação entre Arduino e Raspberry, Arduino e PIC, Raspberry e Beaglebone, e várias outras combinações.

Ele utiliza o chip NRF24L01+ da Nordic (datasheet), e funciona com alimentação de 1,9 à 3.6V. Possui um regulador de tensão interno que permite que seja ligado tanto em microcontroladores com nível de sinal de 3.3 como de 5V. A velocidade máxima de comunicação é de 2Mbps, utilizando uma antena embutida.  Uma outra característica do módulo é que ele pode funcionar como emissor ou como receptor, mediante alteração na programação.

Com relação à frequência de operação, apesar de operar na faixa de 2.4GHz, esse módulo não consegue se conectar às redes wireless padrão 802.11x, já que utiliza um protocolo de comunicação diferente dessas redes.

Pinagem do NRF24L01 e ligação ao Arduino

Na lateral da placa temos um conector de 10 pinos, dos quais 7 serão utilizados para conexão ao Arduino. Veja que no esquema abaixo temos os pinos Vcc e GND duplicados. Nos meus testes, eu utilizei apenas um de cada. Aparentemente não há necessidade de ligar os dois ao mesmo tempo.

Na tabela abaixo, o esquema de ligação do módulo que utiliza a interface SPI para comunicação com o microcontrolador. Vamos utilizar essa tabela para testar a comunicação entre duas placas Arduino, controlando, à partir de um Arduino Uno, um servo motor 9G e um led conectados à um Arduino Mega:

Vamos dividir esse tutorial em duas partes, apresentando o circuito e o programa para o emissor (Uno) e depois para o receptor (Mega).

Circuito NRF24L01 e Arduino Uno – Emissor

Nesse primeiro circuito, temos apenas o Arduino Uno e o módulo NRF24L01. Utilizaremos esse circuito emissor para enviar comandos ao receptor via serial monitor.

Antes de carregar o programa, baixe a biblioteca RF24 neste link. Descompacte o arquivo e coloque a pasta RF24 dentro da pasta Libraries da IDE do Arduino.

Carregue o programa abaixo no Arduino Uno. Tenha uma atenção especial com esta linha (18):

const uint64_t pipe = 0xE13CBAF433LL

O número no final da linha (0xE13CBAF433LL), deve ser o mesmo nos dois programas, pois é este valor que indica em qual rede o módulo está operando.

// Programa : NRF24L01 Emissor - Servo motor
// Autor : Arduino e Cia

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

// Armazena caractere digitado na serial
char valor[1];

// Armazena os dados enviados
int dados[1];

// Inicializa o NRF24L01 nos pinos 9 (CE) e 10 (CS) do Arduino Uno
RF24 radio(9,10);

// Define o endereco para comunicacao entre os modulos
const uint64_t pipe = 0xE13CBAF433LL;

void setup()
{
  // Inicializa a serial
  Serial.begin(57600);
  Serial.println("Digite 1, 2 ou L e pressione ENVIAR...");
  
  // Inicializa a comunicacao do NRF24L01
  radio.begin();
  // Entra em modo de transmissao
  radio.openWritingPipe(pipe);
}

void loop()
{
  // Le o caractere digitado na serial
  if (Serial.available() > 0) 
  {
    valor[0] = Serial.read();
  }
  
  // Envia 1 via radio caso seja digitado o valor 1
  if (valor[0] == '1')
  {
    Serial.println("Enviado : 1 - Gira servo para a esquerda");
    dados[0] = 1;
    radio.write(dados, 1);
    delay(100);
    valor[0] = 0;
  }
  
  // Envia 2 via radio caso seja digitado o valor 2
  if (valor[0] == '2')
  {
    Serial.println("Enviado : 2 - Gira servo para a direita");
    dados[0] = 2;
    radio.write(dados, 1);
    delay(100);
    valor[0] = 0;
  }
  
  // Envia 3 via radio caso seja digitado o caractere L
  if (valor[0] == 'L')
  {
    Serial.println("Enviado : L - Acende o led");
    dados[0] = 3;
    radio.write(dados, 1);
    delay(100);
    valor[0] = 0;
  }
}

Abra o serial monitor e você terá a tela abaixo, onde poderá enviar os caracteres 1, 2 ou L para o receptor:

Circuito Arduino Mega – Receptor

No Arduino Mega, vamos conectar o módulo NRF24L01 às portas 50, 51 e 52, que formam a interface SPI. O servo motor está ligado à porta digital 4 e o led à porta 5.

Carregue o seguinte programa no Arduino, que aguarda pelo sinal de rádio do módulo e, caso receba o número 1 movimenta o servo no sentido anti-horário, com o número 2 move o servo no sentido horário e para o número 3 (caractere L digitado), aciona o led.

// Programa : NRF24L01 Receptor - Servo motor
// Autor : Arduino e Cia

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <Servo.h> 

// Armazena os dados recebidos
int recebidos[1];

// Inicializa o NRF24L01 nos pinos 9 (CE) e 53 (CS) do Arduino Mega
RF24 radio(9,53);

Servo myservo;

// Define o endereco para comunicacao entre os modulos
const uint64_t pipe = 0xE13CBAF433LL;

// Define o pino do led
int LED1 = 5;

void setup()
{
  // Servo conectado ao pino 4
  myservo.attach(4);
  // Define o pino do led como saida
  pinMode(LED1, OUTPUT);
  // Inicializa a serial
  Serial.begin(57600);
  // Inicializa a comunicacao do NRF24L01
  radio.begin();
  // Entra em modo de recepcao
  radio.openReadingPipe(1,pipe);
  radio.startListening();
  // Mensagem inicial
  Serial.println("Aguardando dados...");
}

void loop()
{
  // Verifica sinal de radio
  if (radio.available())
  {
    bool done = false;    
    while (!done)
    {
      done = radio.read(recebidos, 1);
      Serial.print("Recebido : ");    
      Serial.print(recebidos[0]);
      
      // Se recebeu 1, movimenta o servo para a esquerda
      if (recebidos[0] == 1)
      {
        delay(10);
        Serial.println(" -> Girando motor para a esquerda");
        myservo.write(1);
      }
      
      // Se recebeu 2, movimenta o servo para a direita
      if (recebidos[0] == 2)
      {
        delay(10);
        Serial.println(" -> Girando motor para a direita");
        myservo.write(160);
      }

      // Se recebeu 3, acende o led
      if (recebidos[0] == 3)
      {
        delay(10);
        Serial.println(" -> Acende led");
        digitalWrite(LED1, HIGH);
      }
      else
      {
        digitalWrite(LED1, LOW);
      }
      delay(100);
    }
  }
}

No serial monitor, podemos acompanhar o recebimento dos dados ao mesmo tempo em que o servo motor e o led são acionados:

Gostou? Confira outros posts utilizando comunicação wireless aqui mesmo no Arduino e Cia!

5/5 - (6 votos)

Related posts

Incremente o som do seu projeto com o módulo amplificador de áudio MAX98306

by Arduino e Cia
9 anos ago

Contador de visitantes com Arduino usando led IR e fototransistor

by Arduino e Cia
10 anos ago

Botão de reset externo para Arduino

by Arduino e Cia
11 anos ago
Sair da versão mobile