NRF24L01 com Arduino
Autor: AJ O. Alves | Publicado: 2013-02-15T11:00:00-03:00


O Módulo

 

Figura 1 - Exemplo do Módulo NRF24L01
O módulo NRF24L01 é um circuito poderoso e barato de comunicação por Radiofrequência
 (RF) sem fio que opera na faixa de 2,4GHz de baixo consumo de energia e
 que vem ganhando espaço em diversas aplicações industriais, o melhor de
 tudo é que ele pode ser usado no Arduino.
O circuito é baseado no chip nRF24L01+ da Nordic Semiconductor que integra um transceptor (Transmissor e Recepitor) de RF a 2,4 GHz, um sintetizador de RF, e também inclui o protocolo acelerador de hardware ShockBurst™ dando suporte a uma interface avançada SPI (Serial Peripheral Interface) de alta velocidade para o controlador de aplicação.




Características
Por
 se sustentar sob um chip de baixo custo de aquisição (mas lembrem-se, 
poderoso) existem várias implementações deste hardware no mercado, mas 
todas desempenham as mesmas funcionalidades. Recomendo fortemente que 
baixe e leia o DATASHEET do nRF24L01+ para uma total compreensão do equipamento.

Comunicação
 RF sem fio a 2,4GHz. (Obs:. Este módulo opera na mesma frequência do 
padrão IEEE 802.11 [b | g | n] "redes de internet sem fio" que é uma 
faixa de frequência livre "Não há necessidade de pagamento de taxas para
 aplicações que operem nessa faixa, desde que respeitem os limites de 
banda e potência vigentes em cada País" mas não causa interferência 
significativa no sinal da rede sem fio, contudo para melhor performasse 
deste modo uma analise dentre os 128 canais possíveis de se trabalhar 
deve ser feita para manter-se completamente fora da interferência 
exterior)
Permite comunicação entre vários pontos de acesso.
Velocidade de dados [256kbps | 1Mbps | 2Mbps]
Distancia de operação entre 70m a 100m para 256kbps (600m a 1Km nos módulos que vem com antena)
Modos de operação [Modo de baixa potencia | Modo de Standby | Modo RX | Modo TX]
Sensibilidade de operação de -85dBm em 1Mbps.
Tensão de operação entre 1.9V e 3.6V.
Corrente de operação em 13,2 (RX) e 13,5mA (TX) para 2Mbps. (1uA se no modo de baixa potencia)
Dimensões figuram em média de 20mm x 29mm x 0.8mm


Conexão
Para conectar o módulo NRF24L01 com o Arduino (Pois usaremos a biblioteca RF24)
 basta seguir o especificado na Tabela 1, é importante ressaltar que 
algumas placas do módulo vem com 8 pinos e outras com 10 (Estas possuem 2
 pinos para o VCC e GND) mas a conexão é feita da mesma forma.


Pinos do Módulo
Pinos do ArduinoPinos Arduino MegaDescrição

GND
GNDGNDAlimentação negativa
VCC3.3V3.3VAlimentação positiva (Atenção, cuidado para não ligar ao 5V)
CE949Habilitador que ativa o modo de RX ou TX
CSN1053SPI Seletor do chip
SCK1352SPI Clock
MOSI1151SPI (Escravo) Dados de Entrada
MISO1250SPI (Escravo) Dados de Saída
IRQ22Pino de interrupção (Uso não obrigatório) (Serve para alertar quando tem dados
chegando ou o número máximo de retransmissão foi alcançado)


Tabela 1 - Pinagem do módulo ao Arduino


Biblioteca
A RF24
 é uma biblioteca especialmente voltada para trabalhar com o Módulo 
NRF24L01 e o Arduino (Há também a intensão de expandir para outras 
plataformas de hardware) que suporta todas as funcionalidades do chip e 
também é muito simples de utilizar.
Para uma completa avaliacão da biblioteca nada melhor que a página oficial do desenvolvedor LINK lá você encontrará uma documentação completa bem como informações sobre o chip e novidades no código.

Passo 1 - Instalação
Para instalar a biblioteca basta ir no LINK
 oficial do desenvolvedor hospedado no GitHub, fazer ou download ou um 
git clone do código e salvar tudo na pasta /libraries na pasta do 
Aruduino IDE, pronto, é só reiniciar a IDE.

Passo 2 - Escolher um canal de operação
Escolher
 um canal de operação é muito importante para se trabalhar com este 
módulo. Com falado anteriormente ele opera na faixa de frequência de 
2,4GHz, faixa está que livre de taxas e por isso possui diversos 
dispositivos operando nela (rede de internet sem fio, bluetooth, 
telefone residencial sem fio e muitos outros), para isso a biblioteca 
RF24 possui um código já pronto para fazer essa tarefa, para acessá-lo 
basta abrir o Arduino IDE então no Menu Principal escolha FILE -&gt; 
Exemplos -&gt; RF24 -&gt; scanner
Não há a necessidade de alterar 
nada no código, basta conectar o módulo ao Arduino como foi previamente 
descrito e fazer o UPLOAD do código, ao abrir o Monitor da Serial 
(Repare que o código está configurado para 57600 de baundrate) você verá
 uma saída semelhante a exibida na Figura 2, esse sketch (Código) 
monitora os 128 canais da faixa 2,4GHz possíveis de se trabalhar com o 
módulo e mostra a atividade periodicamente neles.





Figura 2 - Saída serial gerada pelo sketch "scanner"
Para
 entendimento da Figura 2 observe a segunda e a terceira linha como 
colunas, elas indicam em hexadecimal o 128 canais (De 0 a 127), as 
demais linhas são geradas segundo a segundo indicando a atividade em 
cada canal, a ideia é selecionar algum canal que só apresentem 0 (zeros)
 na saída (No meu caso, há muitos livre).

Passo 3 - Testar
Para
 testar o módulo, tudo que você precisa são de dois Arduinos e dois 
Módulos RF24L01. Faça a conexão como descrito anteriormente faça o 
upload do Código 1 no primeiro Arduino, este será a estação de 
transmissão.

/*
    AJ Alves (aj.alves@zerokol.com)
*/

// Importando as bibliotecas necessárias
#include 
#include "nRF24L01.h"
#include "RF24.h"

RF24 radio(9, 10); // Instanciando a classe RF24 com os valores de CE e CSN

// Endereço para que os dois dispositivos possam se comunicar
const uint64_t pipe = 0xE8E8F0F0E1LL;

boolean ledStatus = false; // Estado que o led deve se encontrar

void setup(){
    Serial.begin(9600); // Configurando a saída serial

    radio.begin(); // Iniciando a transmissão

    radio.setChannel(100); // Configurando para trabalhar no canal de número 100
 
    radio.openWritingPipe(pipe); // Abrindo o meio de comunicação
}

void loop(){
    ledStatus = !ledStatus; // A cada iteração o valor é invertido

    if(!ledStatus){
        Serial.print("Ligando o LED... ");
    }else{
        Serial.print("Apagando o LED... ");
    }

    // Enviando o comando via RF
    bool success = radio.write(&amp;ledStatus, sizeof(boolean));

    if(success){
        Serial.println("sucesso!");
    }else{
        Serial.println("falha!");
    }

    delay(2000); // Repetir a cada dois segundo
}


Código 1 - Sketck para a estação
No outro Arduino faça o upload do Código 2, este será o receptor, adicione um LED ligado a porta digital 3 do Arduino
/*
    AJ Alves (aj.alves@zerokol.com)
*/

// Importando as bibliotecas necessárias
#include 
#include "nRF24L01.h"
#include "RF24.h"

RF24 radio(9, 10); // Instanciando a classe RF24 com os valores de CE e CSN

// Endereço para que os dois dispositivos possam se comunicar
const uint64_t pipe = 0xE8E8F0F0E1LL;

int ledPin = 3;

boolean ledStatus = false; // Estado que o led deve se encontrar

void setup(){
    Serial.begin(9600); // Configurando a saída serial

    radio.begin(); // Iniciando a transmissão
    
    radio.setChannel(100); // Configurando para trabalhar no canal de número 100

    radio.openReadingPipe(1, pipe); // Abrindo o espaço para recepição
 
    radio.startListening(); // Iniciar a "escutar" por requisições

    pinMode(ledPin, OUTPUT); // LED como saída
    digitalWrite(ledPin, LOW); // LED inicialmente desligado
}

void loop(){
    // aguardando até algo ser enviado
    if(radio.available()){
        bool done = false; // Armazenar o payloads até chegar tudo
        while (!done){
            // Pegar o payload, e analisar se é a última parte
            done = radio.read(&amp;ledStatus, sizeof(ledStatus));

            if(ledStatus){
                Serial.println("LED ligado!");
                digitalWrite(ledPin, HIGH);
            }else{
                Serial.println("ED desligado!");
                digitalWrite(ledPin, LOW);
            }
        }
    }
    delay(50);
}


Código 2 - sketck do receptor
Esse
 código fará com que o LED do receptor acenda e apague a cada dois 
segundos, este é um exemplo muito simples mas que mostra o funcionamento
 do módulo, para se aperfeiçoar utilize os exemplos que vem com a 
própria biblioteca.