Transmissão Wireless com nRF24L01 RESOLVIDO!!!!!!

Saudações prezados.

Depois de muito pesquisar, consegui fazer uma transmissão consistente com o Módulo Transceptor nRF24L01....olha....não foi fácil...rsrsrrs

Ainda existe pouco material disponível para o assunto...então faço questão de compartilhar com vocês o meu feito...que é apenas o acendimento de um LED através do apertar de um botão.

Digo faço questão porque sempre que precisei do pessoal do Fórum eu fui ajudado...infelizmente não por todos..tem gente que responde uma dúvida só pra constar que "ajudou"...porque fala cada "asneira" sem tamanho..o que pode confundir ao invés de ajudar.O pior é que quando questionamos a "ajuda", o "camarada" nem dá mais as caras..acho que deve ser a vergonha bobagem num Fórum tão difundido e conceituado...mas isso não vem ao caso.

Pessoal..segue o código comentado (para 2 Arduinos UNO)...e o esquemático de ligação.

Abração a todos e espero que seja útil futuramente.

Código Emissor
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"


int dados[1]; //Armazena os dados enviados pelo rádio

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

const uint64_t pipe = 0xE14BC8F482LL; //Define o endereço para comunicacao entre os módulos

int pino_botao1 = 7; //Inclui a Porta Digital 7 na estrutura da programação do módulo

void setup()
{
   pinMode(7, INPUT); //Define a Porta Digital 7 para entrada de sinal para disparo do Dispositivo Secundário
   digitalWrite(7,HIGH); //Define a Porta Digital 7 inicialmente em nível alto
 
  radio.begin(); //Inicializa a comunicação entre os módulos
  radio.openWritingPipe(pipe); //Entra em modo de transmissao
}

void loop()
{
  if (digitalRead(pino_botao1) == LOW) //Envia o comando para disparo caso a Porta Digital 7 entre em nível baixo
  {
    dados[0] = 1; // salva o valor 1 no índice dos valores enviados pelo rádio
    radio.write(dados, 1); // escreve o valor 1 na variável dados
  }
}


Código Receptor

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


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

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

const uint64_t pipe = 0xE14BC8F482LL; //Define o endereco para comunicaçao entre os módulos

int LED1 = 5; //Inclui a Porta Digital 5 na estrutura da programação do módulo

void setup()
{
  pinMode(LED1, OUTPUT); //Define a Porta Digital 5 como saída de sinal para disparo do Dispositivo Secundário

  radio.begin(); //Inicializa a comunicaçao entre os módulos
  radio.openReadingPipe(1, pipe); //Entra em modo de recepcao
  radio.startListening(); ////Entra em modo de recepcao
}

void loop()
{
  if (radio.available()) //Verifica se há sinal de radio
  {
    bool done = false; //determina a variável booleana como falsa
    while (!done) //executa uma rotina determinada enquanto a variável booleana é negada
    {
      done = radio.read(recebidos, 1); // Lê a variável transmitida

      if (recebidos[0] == 1) //Se recebeu o numero 1, executa determinada ação
      {
        delay(10); //Tempo até executar a rotina de ativamento
        digitalWrite(LED1, HIGH); //Ativa a Porta Digital 5 em nível alto para disparo do Dispositivo Secundário
      }
      else
      {
        digitalWrite(LED1, LOW); //Desativa Porta Digital 5 caso o valor recebido não seja igual ao valor 1
      }

      delay(100); //Tempo para reiniciar a verificação do sinal transmitido
    }
  }
 
}

Exibições: 8374

Anexos

Responder esta

Respostas a este tópico

Gustavo,

Uma SUPER DICA:

   Quando fizer QUALQUER trabalho com um NRF24L01, Sempre antes de fazer qualquer coisa,  upe no arduino um exemplo que vem junto da biblioteca RF24 do maniacbug chamado GettingStarted.

   Após upado esse sketch plugue o nrf24l01 ao arduino(com ele desligado) e seguida ligue ele a um PC e inicie a IDE do arduino.

   Escolha a porta com e o modelo do seu arduino adequadamante e mande abrir SERIAL MONITOR,  aguarde um pouco e será apresentado uma série de informações de status sobre o modulo.

   Se a maioria deles ficar com valores de 000000  então ou seu nrf esta com defeito ou sua conexão esta errada.

   ah!  só um detalhe o exemplo é configurado em 57600 enquanto o serial monitor no padrão esta em 9600,  mude um dos dois pra ficarem iguais,  só assim vai dar pra ter uma leitura correta.

 

ola, eu tive o mesmo problema do gustavo e nao consigo resolver, tentei isso que vc falou mas nao entendi se precisa configurar outro arduino+wifi ou se esse teste funciona apenas com o receptor

Tenho uma duvida na linha: radio.openReadingPipe(1, pipe); ele entra em modo de recepcao (leitura dos dados) no endereço chamado pipe, mas e esse parâmetro 1 diz reseito a oque?

Ok... muito obrigado, com certeza serão úteis.

Olá Ailton Silva,

   Bem vindo ao mundo do NORDIC NRF24L01.

  

Sua duvida é:

Tenho uma duvida na linha: radio.openReadingPipe(1, pipe); ele entra em modo de recepcao (leitura dos dados) no endereço chamado pipe, mas e esse parâmetro 1 diz reseito a oque?

Cara, o nrf utiliza o conceito de PIPES(tubos) para comunicacao,  seria mais ou menos o equivalente a canais,  o NRF permite o uso simultaneo de até 6 pipes.

   A linha que voce citou radio.openReadingPipe(1, pipe); é antecedida por uma linha tipo const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };

  Logo o que a linha openReadingPipe esta indicando é qual sera o tubo utilizado para leitura de dados (reading) no exemplo que citei acima, eu identifiquei 2 pipes, na linha citada por voce estou chamando o primeiro a trabalhar, deu pra entender?

   Porem, esses comandos apenas identificam quais pipes serao para leitura e quais para transmissao de dados (write) ,  mas nao sao eles que colocam o radio para ouvir ou enviar quem faz isso é o comando radio.startListening(); ( radio começe a ouvir ) e o comando radio.stopListening(); ( radio pare de ouvir ).

   Tudo que eu estou lhe explicando esta bem facil de entender no exemplo GerringStarted da biblioteca RF24,  eu peguei todos os comentarios linha por linha e traduzi no google translator dai passe a entender como tudo funciona.

  Espero ter ajudado.

Super ajudou... mas sem querer abusar e ja abusando....se eu for usar 5 pipes tenho que ouvir um apos o outro definindo no codigo, ou existe uma comando que o radio ouve todos e pega as informacoes do que esta transmitindo no momento, pois no meu projeto terao varios pipes transmitindo a cada 1 segundo cada, ou seja havera momentos em que o pipe nao vai ta transmitindo e se coencidir com o momento em que ele esta sendo escutado, nao chegara nada, e se ele tiver transmitindo e nao for ouvido? Mais uma duvida precisarei colocar o endereço dos 5 pipes em todos os transmissores ou apenas o receptor tera o endereço de todos e cada tranmissor so tera seu propio endereço? Espero nao ter deixado a pergunta confusa mas tenho muitas duvidas...desde ja agradeço...

PS: Nunca imaginei que conseguiria pessoas tao dispostas a ajudar na internet

Vamo lá...

   Como você sabe o arduino utiliza linguagem C para ser programado, e ela é uma linguagem linear, logo, um comando é executado um após outro e assim sucessivamente, porem, estamos falando em milhares, talvez milhões de instruções dentro de um segundo, dai se dá a sensação as vezes de varias coisas estarem sendo executadas ao mesmo tempo.

   No caso dos NRF você não precisa trabalhar com varios pipes, tipos, os 6 possiveis, você pode utilizar so dois um pra ida e outro pra volta e utilizar logica de programação para coordenar toda a comunicação, dessa forma não havera choques,  tipo, vocë colocando um radio central para fazer o pedido de dados a todos os outros e so ai cada um respondendo, nao rola encavalamento de dados.

   Deu pra entender sobre essa parte de execução das coisas ?

   Agora vamos falar sobre os NRF,  eu não vou te responder suas duvidas uma por uma, ao inves disso vou te passar o historico do NRF24L01.

   o NRF24L01 é um chip criado pela nordic, porem, a nordic so faz o chip,  quem constroi os radios que temos acesso são diversos fabricantes por ai.  Da mesma forma as bibliotecas e codigos para o NRF são todos da comundade arduino.

    Falando sobre as bibliotecas tudo começou com uma biblioteca com o nome do proprio modulo a nrf24l01.h

    Dai vieram varias bibliotecas como a MIRF e a RADIOHEAD,  mas a que mais tomou corpo foi a RF24.

    a RF24 foi originalmente escrita pelo MANIACBUG,  porem, diversas atualizações para ela foram realizadas, sendo uma das melhores a do greg copeland.

    Mas ai todo mundo parou de atualizar, e ai surgiu o TMRH20,  que recebeu todo apoio tanto do maniacbug, do greg e de outros e vem atualizando a biblioteca ate hoje.

    O lance é que ele criou bibliotecas de apoio em cima da RF24 como a RF24NETWORK, ou a RF24MESH.

    Cada biblioteca cabe a uma finalidade e não tem essa de uma ser melhor que a outra, vai depender de cada projeto.

   Logo, visite o site do cara   https://github.com/TMRh20   ; baixe as bibliotecas e estude os exemplos que cada uma traz,  é o melhor jeito de entender e ficar fera.

    Só ai voce vai ver o que é melhor a cada projeto atual ou futuro.

Esse manja....hehehehehh

Parabéns Weider!!!

Entendir obrigado... Isso explica o porque de eu ficar tão confuso com as bibliotecas cada hora pego uma e quando penso q estou entendendo pego uma um pouco diferente e me atrapalho... O negócio é focar em uma só e entende-la. Valeu Weider pela ajuda

Pessoal graças a ajuda de voces conseguir fazer meus modulos se comunicarem...So tem um probleminha, sempre que tento enviar uma variavel do tipo float ela chega zerado(0.00), alguem ai sabe se o modulo permite envio de valores reais? se sim porque sera que esta chegando zero ao ives do valor?

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço