BUILDBOT Blog

Comunicação wireless com o módulo NRF24L01

Módulo Transceiver Wireless NRF24L01 2.4GHz

Hoje vamos falar sobre o módulo wireless NRF24L01+ 2.4GHz, um módulo compacto e muito eficiente, perfeito para quem precisa montar um sistema de comunicação entre dois (ou mais) dispositivos.

Além do tamanho reduzido, esse módulo, que é controlado pelo CI NRF24L01+ da Nordic (datasheet) se caracteriza pelo baixo consumo de energia e pela velocidade de comunicação, que pode chegar a 2Mbps. Devido ao uso da interface SPI, é possível interligar esse módulo à maioria dos microcontroladores disponíveis atualmente.

O alcance do módulo varia de 10 metros em ambiente fechado (indoor) à 50 metros em ambiente aberto (outdoor). Uma outra vantagem é que um mesmo módulo pode atuar como emissor ou receptor, apenas realizando-se uma configuração por software. Sua tensão de alimentação vai de 1,9 à 3.6V, e os pinos de sinal podem trabalhar normalmente com nível de sinal de 5V.

Pinagem e características do módulo

Na imagem abaixo mostramos o módulo com os 8 pinos usados para conexão ao microcontrolador : GND, Vcc, CE, CS, SCK, MOSI, MISO e IRQ. No lado direito, podemos ver a antena embutida.

Modulo NRF24L01 - Pinos

O tipo do conector de 8 pinos utilizado no módulo impede o uso diretamente na protoboard. Recomendamos a utilização de um adaptador para protoboard ou a utilização de algum outro tipo de fio, como os jumpers macho-fêmea.

Utilização do módulo NRF24L01 com Arduino

Como um mesmo módulo pode ser configurado como emissor ou receptor, e isso é feito via software, o esquema de ligação ao Arduino será o mesmo nos dois circuitos que vamos utilizar para testes.

Vamos usar duas placas Arduino Uno, sendo que uma delas atuará como EMISSOR, enviando comandos por meio de 2 botões ligados às portas digitais 2 e 7.

No Arduino que atuará como RECEPTOR, temos 2 leds ligados à portas digitais 3 e 5.

Vamos montar primeiro o circuito do Arduino que será o EMISSOR. Atenção para a alimentação do módulo, que é feita por meio do pino 3.3V do Arduino.

Circuito Arduino Uno NRF24L01 - Emissor

O programa utiliza a biblioteca RF24, que você encontra neste link. Faça o download da biblioteca e coloque a pasta RF24 dentro da pasta Libraries da IDE do Arduino.

No início do programa temos a definição dos 2 botões (push-buttons), nas portas digitais 2 e 7, e a configuração do módulo wireless, com os pinos CE e CS sendo conectados às portas 9 e 10 do Arduino, respectivamente.

Para que a comunicação seja realizada com sucesso, os dois módulos devem possuir o mesmo endereço de comunicação, que é especificado na linha

const uint64_t pipe = 0xE14BC8F482LL 

Um loop verifica se algum dos botôes foi pressionado, enviando o sinal via wireless com o número “1” se o botão 1 foi pressionado, e “2” se o botão 2 foi pressionado.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
//Programa : Teste NRF24L01 - Emissor - Botoes
//Autor : Adilson Thomsen

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

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

//Inicializa a placa nos pinos 9 (CE) e 10 (CS) do Arduino
RF24 radio(9,10);

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

//Define os pinos dos botoes
int pino_botao1 = 7;
int pino_botao2 = 2;

void setup()
{
  //Define os botoes como entrada e
  //ativa pull-up
  pinMode(7, INPUT);
  digitalWrite(7,HIGH);
  pinMode(2, INPUT);
  digitalWrite(2,HIGH);

  //Inicializa a serial
  Serial.begin(57600);
  Serial.println("Pressione botao 1 ou 2 para iniciar a comunicacao...");
  
  //Inicializa a comunicacao
  radio.begin();
  //Entra em modo de transmissao
  radio.openWritingPipe(pipe);
}

void loop()
{
  //Envia o numero 1 caso o botao1 seja pressionado
  if (digitalRead(pino_botao1) == LOW)
  {
    Serial.println("Botao 1 pressionado !");
    dados[0] = 1;
    radio.write(dados, 1);
  }
  
  //Envia o numero 2 caso o botao2 seja pressionado
  if (digitalRead(pino_botao2) == LOW)
  {
    Serial.println("Botao 2 pressionado !");
    dados[0] = 2;
    radio.write(dados, 1);
  }
}

 

Podemos acompanhar no serial monitor a atividade do módulo, que mostra qual dos botões foi acionado. Não se esqueça de alterar a velocidade de comunicação para 57600, no lado inferior direito da tela:

Serial monitor Emissor

Agora temos o circuito do Arduino RECEPTOR, responsável por receber os sinais pelo módulo wireless e acionar as portas digitais 3 e 5, onde conectamos 2 leds:

Circuito Arduino Uno NRF24L01 - Receptor

O programa do receptor segue a mesma estrutura do programa emissor, com a definição dos pinos digitais 9 e 10 para conexão dos pinos CE e CS do módulo.

O módulo wireless entra em modo de recepção e aguarda pelo recebimento dos dados. Caso receba o valor “1“, acende o led ligado à porta 3 e caso receba o valor “2” acende o led ligado à porta 5.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
//Programa : Teste NRF24L01 - Receptor - Led
//Autor : Adilson Thomsen

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

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

//Inicializa a placa nos pinos 9 (CE) e 10 (CS) do Arduino
RF24 radio(9,10);

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

//Define os pinos dos leds
int LED1 = 5;
int LED2 = 3;

void setup()
{
  //Define os pinos dos leds como saida
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);

  //Inicializa a serial
  Serial.begin(57600);
  
  //Inicializa a comunicacao
  radio.begin();
  //Entra em modo de recepcao
  radio.openReadingPipe(1,pipe);
  radio.startListening();
}

void loop()
{
  //Verifica se ha sinal de radio
  if (radio.available())
  {
    bool done = false;    
    while (!done)
    {
      done = radio.read(recebidos, 1);
      Serial.print("Dados recebidos : ");    
      Serial.println(recebidos[0]);
      
      //Se recebeu o numero 1, acende o LED1
      if (recebidos[0] == 1)
      {
        delay(10);
        digitalWrite(LED1, HIGH);
      }
      else 
      {
       digitalWrite(LED1, LOW);
      }
      
      //Se recebeu o numero 2, acende o LED2
      if (recebidos[0] == 2)
      {
        delay(10);digitalWrite(LED2, HIGH);
      }
      else 
      {
        digitalWrite(LED2, LOW);
      }
      delay(100);
    }
  }
  else
  {
  Serial.println("Aguardando dados...");
  }
}

 

No serial monitor, enquanto não há recebimento de sinal é mostrada a mensagem “Aguardando dados“. Caso um dos botões seja pressionado no Arduino emissor, o valor correspondente será mostrado na tela:

Serial monitor Receptor

Podemos expandir facilmente os programas acima, aumentando o número de portas a serem controladas, ou configurando a comunicação entre vários módulos NRF24L01.

Category: Artigos
  • Braulio says:

    Ola vc sabe informar porque meu receptor so aparece a seguinte mensagem “Dados recebidos: 255″

    17/02/2015 at 16:49
    • BUILDBOT says:

      Tentamos reproduzir esse erro mas não conseguimos, talvez seja algo na linha:
      Serial.println(recebidos[0]);

      Pode ser por outro valor colocado ou alguma mudança no programa emissor.

      19/02/2015 at 11:40
  • Rafa Ochiussi says:

    Olá, como incrementar o código para vários módulos?
    todos tem que ter o mesmo endereço?

    const uint64_t pipe = 0xE14BC8F482LL

    Esse endereço eu posso preencher como eu quiser desde que obedeça o mesmo tamanho?
    Exemplo:
    const uint64_t pipe = 0xR25HJ9G080RC

    27/02/2015 at 17:19
    • Adilson Thomsen says:

      Boa tarde,

      Exatamente. Você pode escolher um endereço de sua preferencia, obedecendo o tamanho. Todos os módulos devem estar na mesma rede (endereço).

      Abraço.

      Adilson

      20/03/2015 at 16:46
  • Eloy x3x says:

    Olá, o código do receptor ao compilar aparece o error: void value not ignored as it ought to be.

    Como faço para corrigir :

    17/03/2015 at 02:07
    • Adilson Thomsen says:

      Boa tarde Eloy,

      Que placa Arduino você está usando e qual versão da IDE ? Aqui nos testes usamos o Arduino Uno com IDE 1.0.6.

      Abraço.

      Adilson

      20/03/2015 at 16:44
  • Rubens Lima says:

    Saudações prezados.
    Parabéns pelo post…é muito difícil ainda conseguir material sobre esses Tranceptores…com a qualidade de vocês então…ainda não vi.
    Fiz a ligação conforme proposto no esquema tanto no receptor quanto emissor (estou usando um Uno como transmissor e um Mega como receptor)mas não funcionou…compilação e passagem pras placas sem problemas..mas na prática não funcionou.
    O receptor fica aguardando dados…e o emissor inclusive esta recebendo apenas o sinal de um dos botões.Até mesmo acredito que meus Transceptores estão com problemas e como não conheço ABSOLUTAMENTE NADA deles, permita-me perguntar:
    Quando apenas ligamos o GND e o VCC de 3.3V nos Transceptores, algum LED SMD dele fica acesso ou pisca?Porque os meus Transceptores não fazem nada…nem dão sinal de vida…
    Podem me ajudar com qualquer informação?
    Muito grato e novamente PARABÉNS pelo post!!!!
    Abração e muito sucesso!!!!

    18/03/2015 at 04:09
    • Adilson Thomsen says:

      Boa tarde Rubens,

      Muito obrigado. Realmente esse módulo NRF24L01 não tem nenhum led indicando se o módulo está ligado ou se há transmissão de dados. Só conseguimos ver o resultado dos testes no Arduino mesmo.

      No seu caso, creio que o problema seja a interface SPI, que é diferente no Arduino Mega. Enquanto no Arduino Uno os pinos MOSI, MISO, SCK e SS são de 10 à 13, no Mega eles vão de 50 à 53. Por favor dê uma olhada nesse link para ver as alterações que você precisa fazer :

      http://arduino.cc/en/Reference/SPI

      Abraço.

      Adilson

      20/03/2015 at 16:43
  • Eduardo castellani says:

    OLÁ, VOCE DISSE: Podemos expandir facilmente os programas acima, aumentando o número de portas a serem controladas. POIS É ISSO QUE ESTOU BUSCANDO, fazer um controle remoto com mais saidas, como poderei fazer? pode me ajudar?

    22/03/2015 at 17:37
  • Agnno Marinho says:

    Como posso conectar varios arduinos com esse código? Se eu colocar varios receptores com o mesmo código é isso?

    10/04/2015 at 18:39
    • Adilson Thomsen says:

      Boa tarde,

      Exato, mas você terá que programar algum tipo de checagem para comunicação entre os módulos, para garantir que só o módulo “x” atenda à requisição do servidor.

      Abraço

      Adilson

      11/04/2015 at 17:30
  • Gustavo says:

    Como faço para que dois potenciometros e alguns botoes sejam recebidos e interpretados ao mesmo tempo? eu gostaria de adaptar um arduino dentro de um controle remoto de helicoptero mais para isso ele vai ter que ler multiplos comandos ao mesmo tempo se fosse só um potenciometro eu saberia adaptar este codigo mesmo ;( caso seja complicado este é um otimo codigo para publicar em um novo post 😉

    21/04/2015 at 01:34
  • dcm says:

    “Tenho dois transceptor o primeiro envia para o segundo “Mensagem 1″ e logo ao receber retorna “Mensagem 2″ para o primeiro transceptor” ou seja o primeiro transceptor vai estar em modo de transmissor e logo depois de enviar passar a entrar em modo de receptor.

    Alguém sabe me dizer se isso é capaz ? Possui exemplos de códigos que façam isso?

    19/05/2015 at 17:58
  • Marco says:

    Bom Dia!
    eu tenho 4 modulos NRF24L01+ e 3 Arduinos pro mini + 1 arduino UNO, e gostaria de saber como faço para controlar 3 modulos relé com o UNO mandando os sinais e os pro mini recebendo?

    04/06/2015 at 14:40
  • Rodrigo Soares says:

    Estou com a mesma dificuldade do Gustavo says, so que no meu caso é um carrinho

    05/06/2015 at 13:27
  • Marco says:

    O que devo mudar no codigo, para quando eu apertar o botao o led ficar aceso, e quando apertar denovo o led apagar, sen a necessidade de ficar seguro o botao

    05/06/2015 at 20:30
    • christopher says:

      //Se recebeu o numero 2, acende o LED2
      if (recebidos[0] == 2)
      {
      delay(10);
      digitalWrite(LED2, !digitalRead(LED2));
      }

      //Se recebeu o numero 3, acende o LED3
      if (recebidos[0] == 3)
      {
      delay(10);
      digitalWrite(LED3, !digitalRead(LED3));
      }

      04/07/2015 at 01:45
  • Brasil says:

    o que devo mudar no código para que possa ligar os dois leds ao mesmo tempo se tiver os dois botões tambémcarregado

    14/07/2015 at 10:14
  • Brasil says:

    é que com o código acima só acende um leds de cada vez e se carregar nos dois botões em simultâneo fico com uma saida a 0V e a outra 2.5V

    14/07/2015 at 10:17
  • Bruno says:

    Muito bom, até que fim consegui fazer funcionar.. Você poderia fazer um poste sobre como fazer uma rede simples, com 3 ou 4 modulos?
    parabéns e muito obrigado.

    21/07/2015 at 17:04
  • marco pomponi says:

    tambem estou precisando saber o codigo para apertar dois botoes simultaneo

    26/07/2015 at 17:31
  • Darcio Samp says:

    como faço pra transmitir e receber dados de um acelerometro, sensor de umidade ou qualquer outro dispositivo através deste módulo nRF24L01

    10/08/2015 at 01:30

Your email address will not be published. Required fields are marked *

*