Pesquisar

Postagens populares

sexta-feira, 15 de fevereiro de 2013

NRF24L01 com Arduino

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 -> Exemplos -> RF24 -> 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(&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(&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.

Um comentário:

guilherme disse...

da um monte de erro esse codigo ai