Having two or more Arduino boards be able to communicate with each other wirelessly over a distance opens lots of possibilities like remotely monitoring sensor data, control robots, home automation and the list goes on. E quando se trata de ter soluções de RF de 2 vias baratas e confiáveis, ninguém faz um trabalho melhor do que o módulo transceptor nRF24L01+ da Nordic Semiconductor.

nRF24L01+ (mais) módulo transceptor pode ser obtido online por menos de dois dólares, tornando-o uma das opções de comunicação de dados mais baratas que você pode obter. E o melhor de tudo, estes módulos são super pequenos, permitindo-lhe incorporar uma interface sem fios em quase qualquer projecto.

Hardware Overview

Radio Frequency

O módulo transceiver nRF24L01+ foi concebido para operar na banda de frequência ISM mundial de 2,4 GHz e utiliza a modulação GFSK para transmissão de dados. A taxa de transferência de dados pode ser uma de 250kbps, 1Mbps e 2Mbps.

O que é a banda ISM de 2,4 GHz?

2,4 GHz é uma das bandas industriais, científicas e médicas (ISM) reservadas internacionalmente para o uso de dispositivos de baixa potência não licenciados. Exemplos são telefones sem fio, dispositivos Bluetooth, dispositivos de comunicação próxima ao campo (NFC) e redes de computadores sem fio (WiFi), todos usam as freqüências ISM.

Consumo de energia

A tensão de operação do módulo é de 1,9 a 3.6V, mas a boa notícia é que os pinos lógicos são tolerantes a 5 volts, por isso podemos ligá-lo facilmente a um Arduino ou a qualquer microcontrolador lógico de 5V sem utilizar qualquer conversor de nível lógico.

O módulo suporta uma potência de saída programável viz. 0 dBm, -6 dBm, -12 dBm ou -18 dBm e consome inacreditavelmente cerca de 12 mA durante a transmissão a 0 dBm, o que é ainda inferior a um único LED. E o melhor de tudo, consome 26 µA em modo de espera e 900 nA em modo de desligamento. É por isso que eles são o dispositivo go-to wireless para aplicações de baixa potência.

InterfaceSPI

O módulo transceptor nRF24L01+ comunica através de uma Interface Serial Periférica (SPI) de 4 pinos com uma taxa máxima de dados de 10Mbps. Todos os parâmetros como canal de freqüência (125 canais selecionáveis), potência de saída (0 dBm, -6 dBm, -12 dBm ou -18 dBm) e taxa de dados (250kbps, 1Mbps ou 2Mbps) podem ser configurados através da interface SPI.

O barramento SPI usa um conceito de um Master e Slave, na maioria das aplicações comuns nosso Arduino é o Master e o módulo transceptor nRF24L01+ é o Slave. Ao contrário do bus I2C o número de escravos no bus SPI é limitado, no Arduino Uno você pode usar um máximo de dois escravos SPI ou seja, dois módulos transceptores nRF24L01+.

Aqui estão as especificações completas:

>

>

>

>

>

>

Faixa de frequência 2.Banda ISM de 4 GHz
Taxa máxima de dados de ar 2 Mb/s
Formato de modulação GFSK
Máx. Potência de Saída 0 dBm
Tensão de Alimentação Operacional 1,9 V a 3,6 V
Máx. Corrente operacional 13.5mA
Mín. Corrente (Modo Standby) 26µA
Entradas Lógicas 5V Tolerante
Gama de Comunicação 800+m (linha de visão)

nRF24L01+ módulo Vs nRF24L01+ módulo PA/LNA

Existe uma variedade de módulos disponíveis com base no chip nRF24L01+. Abaixo estão as versões mais populares.

nRF24L01+ Módulo sem fio

A primeira versão utiliza antena on-board. Isto permite uma versão mais compacta da fuga. No entanto, a antena menor também significa um menor alcance de transmissão. Com esta versão, você será capaz de se comunicar a uma distância de 100 metros. Claro que isso é ao ar livre em um espaço aberto. O seu alcance no interior, especialmente através de paredes, será ligeiramente enfraquecido.

nRF24L01+ Módulo Transceptor sem fios PA LNA com antena externa

A segunda versão vem com um conector SMA e uma antena duck-antenna, mas essa não é a verdadeira diferença. A verdadeira diferença é que vem com um chip especial RFX2401C que integra o circuito de comutação PA, LNA, e transmissão-recepção. Este chip extensor de alcance juntamente com uma antena-caminho ajuda o módulo a alcançar um alcance de transmissão significativamente maior cerca de 1000m.

O que é PA LNA?

O PA significa Amplificador de Potência. Ele apenas aumenta a potência do sinal a ser transmitido a partir do chip nRF24L01+. Já o LNA significa Amplificador de Baixo Ruído. A função do LNA é pegar o sinal

nRF24L01+ Diagrama de Bloco PA/LNA

sinal extremamente fraco e incerto da antena (geralmente na ordem de microvolts ou abaixo de -100 dBm) e amplificá-lo para um nível mais útil (geralmente cerca de 0.5 a 1V)

O amplificador de baixo ruído (LNA) do caminho de recepção e o amplificador de potência (PA) do caminho de transmissão conectam-se à antena através de um duplexer, que separa os dois sinais e evita que a saída relativamente potente do PA sobrecarregue a entrada sensível do LNA. Para mais informações consulte este artigo em digikey.com

Exceto esta diferença, ambos os módulos são compatíveis com drop-in. Ou seja, se construir o seu projecto com um pode simplesmente desligá-lo e utilizar outro sem necessidade de fazer quaisquer alterações ao sistema.

Como funciona o módulo transceptor nRF24L01+?

F Frequência do Canal RF

O módulo transceptor nRF24L01+ transmite e recebe dados numa determinada frequência chamada Canal. Também para que dois ou mais módulos transceptores comuniquem um com o outro, eles precisam estar no mesmo canal. Este canal pode ser qualquer frequência na banda ISM 2.4 GHz ou, para ser mais preciso, pode estar entre 2.400 a 2.525 GHz (2400 a 2525 MHz).

Cada canal ocupa uma largura de banda inferior a 1MHz. Isto nos dá 125 canais possíveis com espaçamento de 1MHz. Assim, o módulo pode utilizar 125 canais diferentes que dão a possibilidade de ter uma rede de 125 modems de trabalho independente em um só lugar.

O canal ocupa uma largura de banda inferior a 1MHz a 250kbps e 1Mbps de velocidade de dados aéreos. No entanto, a uma taxa de dados aéreos de 2Mbps, a largura de banda de 2MHz é ocupada (maior do que a resolução da definição de frequência do canal de RF). Assim, para garantir canais não sobrepostos e reduzir a conversa em modo 2Mbps, você precisa manter o espaçamento de 2MHz entre dois canais.

RF a frequência do canal seleccionado é definida de acordo com a seguinte fórmula:

Freq(Selected) = 2400 + CH(Selected)

Por exemplo, se seleccionar 108 como canal para transmissão de dados, a frequência do canal RF do seu canal seria 2508MHz (2400 + 108)

nRF24L01+ Multiceiver Network

O nRF24L01+ fornece uma funcionalidade chamada Multiceiver. É uma abreviação para Multiple Transmitters Single Receiver. No qual cada canal de RF é logicamente dividido em 6 canais de dados paralelos chamados Data Pipes. Em outras palavras, um tubo de dados é um canal lógico no canal de RF físico. Cada canal de dados tem seu próprio endereço físico (Data Pipe Address) e pode ser configurado. Isto pode ser ilustrado como mostrado abaixo.

nRF24L01+ Rede de Transmissores Múltiplos – Transmissores Simples Receptor

Para simplificar o diagrama acima, imagine o receptor primário atuando como um receptor central coletando informações de 6 nós diferentes de transmissores simultaneamente. O receptor do cubo pode parar de ouvir a qualquer momento e atuar como um transmissor. Mas isto só pode ser feito um tubo/nó de cada vez.

Protocolo Enhanced ShockBurst

O módulo transceptor nRF24L01+ utiliza uma estrutura de pacotes conhecida como Enhanced ShockBurst. Esta estrutura de pacotes simples é dividida em 5 campos diferentes, o que é ilustrado abaixo.

nRF24L01+Estrutura de pacotes ShockBurst Melhorada

A estrutura ShockBurst original consistia apenas de preâmbulo, endereço, carga útil e os campos Cyclic Redundancy Check (CRC). O ShockBurst aprimorado trouxe maior funcionalidade para comunicações mais aprimoradas usando um campo de controle de pacotes (PCF) recentemente introduzido.

Esta nova estrutura é ótima por uma série de razões. Em primeiro lugar, ela permite cargas úteis de comprimento variável com um especificador de comprimento útil, o que significa que as cargas úteis podem variar de 1 a 32 bytes.

Segundamente, ela fornece a cada pacote enviado um ID de pacote, o que permite ao dispositivo receptor determinar se uma mensagem é nova ou se ela foi retransmitida (e assim pode ser ignorada).

Finalmente, e mais importante, cada mensagem pode pedir um reconhecimento para ser enviada quando é recebida por outro dispositivo.

nRF24L01+ Manuseio Automático de Pacotes

Agora, vamos discutir três cenários para entender melhor como dois módulos nRF24L01+ transacionam um com o outro.

Transacção com reconhecimento e interrupção Este é um exemplo de cenário positivo. Aqui o transmissor inicia uma comunicação enviando um pacote de dados para o receptor. Uma vez que o pacote inteiro é transmitido, ele espera (cerca de 130 µs) para que o pacote de reconhecimento (pacote ACK) seja recebido. Quando o receptor recebe o pacote, ele envia o pacote ACK para o transmissor. Ao receber o pacote ACK o transmissor afirma que o sinal de interrupção (IRQ) para indicar que os novos dados estão disponíveis.

Transação com perda do pacote de dados Este é um cenário negativo onde uma retransmissão é necessária devido à perda do pacote transmitido. Após o pacote ser transmitido, o transmissor espera que o pacote ACK seja recebido. Se o transmissor não o receber dentro do tempo de Retransmissão Automática (ARD), o pacote é retransmitido. Quando o pacote retransmitido é recebido pelo receptor, o pacote ACK é transmitido, o que por sua vez gera uma interrupção no transmissor.

Transação com reconhecimento de perda Este é novamente um cenário negativo onde uma retransmissão é necessária devido à perda do pacote ACK. Aqui mesmo que o receptor receba o pacote na primeira tentativa, devido à perda do pacote ACK, o transmissor pensa que o receptor não recebeu o pacote de todo. Assim, após o término do tempo de Retransmissão-Atraso Automático, ele retransmite o pacote. Agora, quando o receptor recebe o pacote contendo o mesmo ID do pacote anterior, ele o descarta e envia o pacote ACK novamente.

Esta manipulação de pacote inteiro é feita automaticamente pelo chip nRF24L01+ sem o envolvimento do microcontrolador.

>

nRF24L01+ Pino do Módulo Transceptor

Vamos ver o pino de ambas as versões do Módulo Transceptor nRF24L01+.

GND é o pino de terra. Normalmente é marcado por um quadrado, para que possa ser usado como referência para identificar os outros pinos.

VCC fornece energia para o módulo. Isto pode ser em qualquer lugar de 1,9 a 3,9 volts. Você pode conectá-lo à saída de 3.3V do seu Arduino. Lembre-se que ligá-lo ao pino de 5V provavelmente destruirá o seu módulo nRF24L01+!

CE (Chip Enable) é um pino ativo-ALTO. Quando seleccionado, o nRF24L01 irá transmitir ou receber, dependendo do modo em que está actualmente.

CSN (Chip Select Not) é um pino activo-LOW e é normalmente mantido ELEVADO. Quando este pino fica baixo, o nRF24L01 começa a ouvir os dados na sua porta SPI e processa-os em conformidade.

SCK (Relógio Serial) aceita pulsos de relógio fornecidos pelo SPI Bus Master.

MOSI (Master Out Slave In) é a entrada SPI para o nRF24L01.

MISO (Master In Slave Out) é a saída SPI do nRF24L01.

IRQ é um pino de interrupção que pode alertar o mestre quando novos dados estão disponíveis para processar.

Cabeamento – Conectando o módulo transceptor nRF24L01+ ao Arduino UNO

Agora temos um entendimento completo de como o módulo transceptor nRF24L01+ funciona, podemos começar a ligá-lo ao nosso Arduino!

Para começar, conecte o pino VCC no módulo a 3.3V no Arduino e o pino GND à terra. Os pinos CSN e CE podem ser ligados a qualquer pino digital no Arduino. No nosso caso, está ligado ao pino digital#8 e #9 respectivamente. Agora estamos ficando com os pinos que são usados para comunicação SPI.

Como o módulo transceptor nRF24L01+ requer uma grande transferência de dados, eles darão o melhor desempenho quando conectados aos pinos SPI do hardware em um microcontrolador. Os pinos SPI do hardware são muito mais rápidos que ‘bit-banging’ o código da interface usando outro conjunto de pinos.

Note que cada placa Arduino tem diferentes pinos SPI que devem ser conectados de acordo. Para placas Arduino como a UNO/Nano V3.0 esses pinos são digitais 13 (SCK), 12 (MISO) e 11 (MOSI).

Se você tiver um Mega, os pinos são diferentes! Você vai querer usar o digital 50 (MISO), 51 (MOSI), 52 (SCK), e 53 (SS). Consulte a tabela abaixo para uma rápida compreensão.

MOSI MISO SCK
Arduino Uno 11 12 13
Arduino Nano 11 12 13
Arduino Mega 51 50 52

No caso de estar a usar uma prancha Arduino diferente da acima mencionada, é aconselhável verificar a documentação oficial do Arduino antes de prosseguir.

Fiação nRF24L01+ Módulo Transceptor sem fio para Arduino UNO
Fiação nRF24L01+ Módulo LNA sem fio PA para Arduino UNO

Lembrar! Você precisa fazer dois destes circuitos. Um funciona como um transmissor e o outro como um receptor. A fiação para ambos é idêntica.

Após você ter tudo ligado você está pronto para ir!

RF24 Biblioteca Arduino para nRF24L01+ Module

Interfacing with nRF24L01+ transceiver module is a bunch of work, but luckily for us, there are a number of libraries available. Uma das bibliotecas populares é a RF24. Esta biblioteca já existe há vários anos. É simples de usar para iniciantes, mas ainda oferece muito para usuários avançados. Em nossos experimentos, estaremos usando a mesma biblioteca.

Você pode baixar a última versão da biblioteca no garfo do repositório RF24 GitHub ou, basta clicar neste botão para baixar o zip:

Para instalá-lo, abra o Arduino IDE, vá para Sketch > Incluir biblioteca > Adicionar biblioteca .ZIP e, em seguida, selecione o arquivo RF24-master que você acabou de baixar. Se você precisar de mais detalhes sobre como instalar uma biblioteca, visite este tutorial Instalando uma Biblioteca Arduino.

Arduino Code – For Transmitter

Em nosso experimento nós apenas enviaremos uma mensagem tradicional ‘Hello World’ do transmissor para o receptor.

Aqui está o esboço que estaremos usando para nosso transmissor:

//Include Libraries#include <SPI.h>#include <nRF24L01.h>#include <RF24.h>//create an RF24 objectRF24 radio(9, 8); // CE, CSN//address through which two modules communicate.const byte address = "00001";void setup(){ radio.begin(); //set the address radio.openWritingPipe(address); //Set module as transmitter radio.stopListening();}void loop(){ //Send message to receiver const char text = "Hello World"; radio.write(&text, sizeof(text)); delay(1000);}

O esboço começa com a inclusão das bibliotecas. A biblioteca SPI.h trata da comunicação SPI enquanto nRF24L01.h e RF24.h controla o módulo.

//Include Libraries#include <SPI.h>#include <nRF24L01.h>#include <RF24.h>

Próximo, precisamos criar um objeto RF24. O objeto toma dois números de pinos como parâmetros aos quais os sinais CE e CSN estão conectados.

//create an RF24 objectRF24 radio(9, 8); // CE, CSN

Próximo, precisamos criar uma matriz de bytes que representará o endereço de pipe através do qual dois módulos nRF24L01+ comunicam.

//address through which two modules communicate.const byte address = "00001";

Podemos alterar o valor deste endereço para qualquer string de 5 letras, como “node1”. O endereço é necessário se você tiver alguns módulos em uma rede. Graças ao endereço, você pode escolher um determinado módulo para o qual você está interessado em se comunicar, então no nosso caso teremos o mesmo endereço tanto para o transmissor como para o receptor.

Próximo na função de configuração: precisamos inicializar o objeto rádio usando radio.begin() e usando a função radio.openWritingPipe() definimos o endereço do transmissor.

//set the addressradio.openWritingPipe(address);

Finalmente, vamos usar a função radio.stopListening() que define o módulo como transmissor.

//Set module as transmitterradio.stopListening();

Na seção loop: criamos um array de caracteres ao qual atribuímos a mensagem “Hello World”. Usando a função radio.write() enviaremos essa mensagem para o receptor. O primeiro argumento aqui é a mensagem que queremos enviar. O segundo argumento é o número de bytes presentes nessa mensagem.

const char text = "Hello World";radio.write(&text, sizeof(text));

Por este método, você pode enviar até 32 bytes de cada vez. Porque esse é o tamanho máximo de um único pacote que o nRF24L01+ pode suportar. Se você precisar de uma confirmação de que o receptor recebeu dados, o método radio.write() retorna um valor bool. Se ele retornar VERDADEIRO, os dados chegaram ao receptor. Se ele retornar FALSO, os dados foram perdidos.

a função radio.write() bloqueia o programa até que ele receba o reconhecimento ou se esgote de todas as tentativas de retransmissão.

Arduino Code – For Receiver

Aqui está o esboço que estaremos usando para nosso receptor

//Include Libraries#include <SPI.h>#include <nRF24L01.h>#include <RF24.h>//create an RF24 objectRF24 radio(9, 8); // CE, CSN//address through which two modules communicate.const byte address = "00001";void setup(){ while (!Serial); Serial.begin(9600); radio.begin(); //set the address radio.openReadingPipe(0, address); //Set module as receiver radio.startListening();}void loop(){ //Read the data if available in buffer if (radio.available()) { char text = {0}; radio.read(&text, sizeof(text)); Serial.println(text); }}

Este programa se parece bastante com o programa do transmissor, exceto por algumas mudanças.

No início da função de configuração iniciamos a comunicação serial. A seguir usando a função radio.setReadingPipe() definimos o mesmo endereço do transmissor e dessa forma habilitamos a comunicação entre o transmissor e o receptor.

 //set the address radio.openReadingPipe(0, address);

O primeiro argumento é o número do stream. Você pode criar até 6 fluxos que respondem a diferentes endereços. O segundo argumento é o endereço ao qual o fluxo reagirá para recolher os dados.

O próximo passo é definir o módulo como um receptor e começar a receber dados. Para fazer isso usamos a função radio.startListening(). A partir desse momento o modem espera por dados enviados para o endereço especificado.

//Set module as receiver radio.startListening();

Na função loop: O sketch verifica se algum dado chegou ao endereço usando o método radio.available(). Este método retorna o valor VERDADEIRO se algum dado estiver disponível no buffer.

if (radio.available()) { char text = {0}; radio.read(&text, sizeof(text)); Serial.println(text); }

Se os dados forem recebidos, então ele cria um array de 32 caracteres preenchidos com zeros (mais tarde o programa irá preenchê-lo com os dados recebidos). Para ler os dados usamos o método radio.read (& text, sizeof (text)). Isto irá armazenar os dados recebidos em nosso array de caracteres.

No final nós apenas imprimimos a mensagem recebida no monitor serial. Se você fez tudo ok e não há erros nas conexões, você deve ver algo assim no seu Monitor Serial.

nRF24L01+ Saída do Transceptor no Monitor Serial

Melhorando o alcance do nRF24L01+ Módulo Transceptor

Um parâmetro chave para um sistema de comunicação sem fio é o alcance da comunicação. Em muitos casos, é o fator decisivo para a escolha de uma solução de RF. Portanto, vamos discutir o que podemos fazer para obter um alcance melhor para o nosso módulo.

Reduzir o ruído da fonte de alimentação

Um circuito de RF que gera um sinal de Radiofreqüência (RF), é muito sensível ao ruído da fonte de alimentação. Se não for controlado, o ruído da fonte de alimentação pode reduzir significativamente o alcance que você pode obter.

A menos que a fonte de alimentação seja uma bateria autônoma, há uma boa chance de que haja ruído associado à geração da energia. Para evitar que este ruído entre no sistema, é aconselhável colocar um condensador de filtro de 10 µf através da linha de alimentação o mais próximo possível fisicamente do módulo nRF24L01+.

Uma maneira mais fácil de ultrapassar é usar um módulo adaptador muito barato para o nRF24L01.

nRF24L01+ Adaptador

O módulo adaptador tem um conector fêmea de 8 pinos para lhe permitir ligar o seu módulo nRF24L01. Ele pode acomodar tanto o módulo que discutimos anteriormente, aquele com antena integrada como outro com antena externa (PA/LNA). Tem também um conector macho de 6 pinos para as ligações SPI e Interrupt e um conector de 2 pinos para a entrada de alimentação.

O módulo adaptador tem o seu próprio regulador de tensão de 3,3 volts e um conjunto de condensadores com filtro, para que possa alimentá-lo com uma fonte de alimentação de 5 volts.

Mude a frequência do seu canal

Outra fonte potencial de ruído para um circuito de RF é o ambiente externo, especialmente se tiver redes vizinhas configuradas no mesmo canal ou interferência de outros componentes electrónicos.

Para evitar que estes sinais causem problemas, sugerimos que utilize os 25 canais mais altos do seu módulo nRF24L01+. A razão para isto é que o WiFi usa a maioria dos canais mais baixos.

Low Data Rate

O nRF24L01+ oferece a maior sensibilidade do receptor a 250Kbps de velocidade que é de -94dBm. Contudo, a uma taxa de dados de 2MBps, a sensibilidade do receptor cai para -82dBm. Se você fala este idioma, você sabe que o receptor a 250Kbps é quase 10 vezes mais sensível que a 2Mbps. Isso significa que o receptor pode decodificar um sinal 10 vezes mais fraco.

O que significa a sensibilidade do receptor (Rx)?

Sensibilidade do receptor é o nível de potência mais baixo no qual o receptor pode detectar um sinal de RF. Quanto maior for o valor absoluto do número negativo, melhor será a sensibilidade do receptor. Por exemplo, uma sensibilidade do receptor de -94 dBm é melhor do que uma sensibilidade do receptor de -82 dBm por 12 dB.

Então, a redução da taxa de dados pode melhorar significativamente a faixa que você pode alcançar. Também, para a maioria dos nossos projetos, a velocidade de 250Kbps é mais do que suficiente.

Potência de saída mais elevada

Configurar a potência máxima de saída também pode melhorar o alcance da comunicação. O nRF24L01+ permite que você escolha uma das potências de saída viz. 0 dBm, -6 dBm, -12 dBm ou -18 dBm. Selecionando 0 dBm de potência de saída envia um sinal mais forte sobre o ar.

Deixe uma resposta

O seu endereço de email não será publicado.