[PEDIDO AJUDA] Nào consigo fazer funcionar modulos de radio de 1000m (NRF24L01+PA+LNA)

Galera,

   Tô precisando de ajuda pra valer, e dessa vez é pra mim, pois tenho que entregar um prototipo a um cliente de um controle remoto que alcance 500m no mínimo, de e tô meio que no desespero.

   
   Tentei aqueles controles de carro de 1000m, mas eles se mostraram afetáveis por interferências em algumas áreas(resumindo, testei e não serviu).
   Pensei em utilizar os Xbee,  mas o preço dos módulos de alta potência são proibitivos pra o projeto, visto que são vários.
   A solução foi partir pra os módulos de rádio nRF24l01, que tem de dois tipos, os de baixa potencia( nrf24l01+ ) que pelo datasheet dá uns 100m  e a versão nRF24l01+PA+LNA que pelo datasheet dá 1000m.

tá aqui os dois tipos:



Criei uma shield pra usar esses radios no arduino UNO, ela foi feita pra uso com a biblioteca RF24.h tá aqui ela:




O DESAFIO:

  Preciso que quando um dos lados for energizado(o transmissor), ele automaticamente mande um codigo pra o segundo modulo(receptor) que estará aguardando,  se o código bater ele acende um led por um tempo,  só isso,  parece fácil né ?    Mas não é!  


O PROBLEMA:

  O problema é que apesar do fabricando dizer que os dois modelos (de 100m e 1000m) serem iguais tendo como única diferença um amplificador no mais potente,  o que ocorre é que quando executo os sketchs abaixo, no radio mais simples( nrf24l01+ ),   tudo acontece bem,ele não falha nunca,   já quando executo no modelo de maior potencia (nRF24l01+PA+LNA)   ALGUMAS VEZES ELE FUNCIONA, OUTRAS NÃO ! e depois de um tempo, para de funcionar completamente.


PEDIDO DE AJUDA:

  Peço que se alguém já mexeu com esses rádios e souber alguma coisa que possa ser feita para eles funcionarem , que me dêem uma luz, pois já tentei várias coisas, inclusive colocar um capacitor de 4.7uF entre o VCC(3.3V) e o GND e nada.   Já tentei aumentar a tensão usando LM317 para o pico de 3.6V,  funcionou um tempo e parou,  dai quando aumentei mais ainda, queimei dois dos rádios.

  Tô precisando de ajuda mesmo.


os sketchs usados são esses:



// *********************************************************** TRANSMISSOR **
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

int comunica[1];

RF24 radio(9,10);

const uint64_t pipe = 0x88E8F0F0E1LL;

void setup(void)
{ Serial.begin(9600);
  radio.begin();
  radio.openWritingPipe(pipe);
  pinMode(3, OUTPUT);  
  comunica[0]=0;
  delay(100);}


void loop(void){
 
    comunica[0]=123;
    radio.write( comunica, sizeof(comunica) );
    digitalWrite(3, HIGH);
 
}




//  **************************************** RECEPTOR**
#include <avr/wdt.h>

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

int comunica[1];

RF24 radio(9,10);
const uint64_t pipe = 0x88E8F0F0E1LL;

void setup(void){
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(1,pipe);
  radio.startListening();
  pinMode(3, OUTPUT);  
 
wdt_enable(WDTO_4S);  // habilita o watchdog
 
}

void loop(void){
  if ( radio.available() ){
    bool done = false;
      while (!done){
        done = radio.read( comunica, sizeof(comunica) );
      if(comunica[0]==123){
        digitalWrite(3, HIGH);
        delay(1000);
        digitalWrite(3, LOW);     
      }
      else{
        digitalWrite(3, LOW); }
    }
  }
 
   delay(100);
    wdt_reset();  //  reseta o watchdog,
}





  

Exibições: 10255

Responder esta

Respostas a este tópico

Sugestão para teste - abaixe a velocidade de transmissão dos dados.

Usa 9600 Bps ? teste  por exemplo com 2400 Bps.

A distancia de teste para os dois transmissores é a mesma? 

Usa o mesmo circuito transceptor para receber e transmitir ? 

Olá Jose gustavo,

Obrigado por tentar ajudar amigo !

Bem, vamos lá, eu estava usando o modulo nas configurações default dele, mandando e recebendo deixando os parametros como velocidade, taxa de dados etc. tudo no que já vem pre configurado.

A verdade é que seguindo seu raciocinio fui verificar na pagina da biblioteca RF24 ( http://maniacbug.github.io/RF24/classRF24.html ) se existia alguma coisa pra mexer nesses parametros.

Acabei de testar a função setPALevel a qual descobri que os nrf24l01 vem pré setados como HIGH, ou seja, pra de cara já trabalharem na potencia maxima.

Fui mexendo e quando cheguei em LOW os radios automaticamente se viram.

Mas ai fica o problema, ele com essa potencia baixa vai pegar em cima da mesa, meu problema é fazer eles chegarem a 500m ( o radio chega a 1000m mas não preciso disso tudo).

De certa forma, a coisa me deixa numa sinuca, se baixo a potencia os radios se vêem mas a distancia é pequena, se aumento eles passam a não se ver.

Putz, baita enigma.

Só um parecer, venho de uns 8 meses pra cá estudando modulos de comunicação sem fio para microcontroladores, comecei com os de 433mhz, eles são bem subdimensionados, modifiquei as antenas do transmissor e do receptor e melhorou um pouco, mas são realmente simples.

Parti então logo pra o topo, fui para o Zigbee, esses são inquestionáveis, potência, confiabilidade, etc. mas o preço deles é proibitivo para quem ira trabalhar com recursos mais escassos, uma rede domotica domestica por exemplo, só de xbees você levará 90% do valor do projeto.

Dai veio os nrf24l01, eles são o meio termo, o custo beneficio desses radiozinhos é absurdo, só pra se ter uma ideia enquanto um xbee pro na autorizada pode passar dos R$ 200,00 enquanto no mercado livre comprei ontem mais 10 unidades do modelo de baixa potencia do nrf24l01 por R$ 6,50 cada ( sim isso mesmo só seis reais e cinquenta).

Os modulos de 1000m são um pouco mais caros, algo na faixa dos R$ 50,00.

Logo, minha intenção de aprender o maximo sobre eles pra poder em breve escrever um tutorial ensinando a galera como usa-los.

A comunidade arduino esta abraçando esses modulos, existem bibliotecas com varias finalidades, desde a basica que é a RF24, passando por bibliotecas mais complexas para redes mesh, a RF24NETWORK, até uma que descobri ontem que é para transmitir audio entre arduinos atraves desses radios a RF24AUDIO (http://tmrh20.github.io/RF24Audio/).

Mas por enquanto, TÔ APANHANDO kkk

Weider a minha sugestão é mudar a velocidade nos Arduinos.

Serial.begin(2400);

uhhhh!  gostei,  vou tentar  apesar que a comunicação desses modulos não é serial,  se não me engano é SPI, mas pode ser que interfira de alguma forma.

Tô tão desesperado que vale a pena tentar qualquer coisa.

Ola Weider... como vc havia me dito para estudar a biblioteca do Manicbug, fiz e conseguir fazer meus modulos se falarem, agora meu problema é tenho dois emissores enviando informacoes de sensores diferentes com os endereços:0xE13CBAF433LL, e 0xE13CBAF411LL e um receptor, mas parece que o receptor nao esta diferenciando um do outro oq tiver transmitindo no momento ele pega, enquanto que eu quero acada momento pegar um sensor diferente, voce pode ajudar?

Esse é o codigo do receptor que criei para alternar ente os transmisores


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

// Armazena os dados recebidos
double recebidos[1], receb[1];

// Inicializa o NRF24L01 nos pinos 9 (CE) e 10 (CS) do Arduino Mega
RF24 radio(9, 10);


// Define o endereco para comunicacao entre os modulos

const uint64_t pipe=0xE13CBAF433LL;
const uint64_t dois=0xE13CBAF411LL;


// Define o pino do led

void setup()
{
  radio.begin();
  // Entra em modo de recepcao
  radio.setChannel(100);//canal
  radio.getDynamicPayloadSize();//tamanho do payload automatico
 
  // Inicializa a serial
  Serial.begin(57600);
  // Mensagem inicial
  Serial.println("Aguardando dados...");
}

void loop()
{
  radio.openReadingPipe(1, pipe); //define o pipe1 como leitura
  radio.startListening(); // inicia a escuta da transmissao
  delay(12);

  // Verifica sinal de radio
  if (radio.available()==true)
  {
    radio.read(recebidos, 8);
    Serial.print("Recebido 1 : ");
    Serial.println(recebidos[0]);
    radio.stopListening();
    delay(12);
    pipe01();

  }

  else {
    radio.stopListening();
    delay(12);
    pipe01();
  }//else
}// loop

void pipe01() {
  radio.openReadingPipe(2, dois);//ler o endereço do pipe1(chamado pipe)
  radio.startListening();
  delay(12);
  if (radio.available()==true)
  {
    radio.read(receb, 8);
    Serial.print("Recebido 2 : ");
    Serial.println(receb[0]);
    radio.stopListening();
    delay(12);
    loop();
  }

  else {
    radio.stopListening();
    delay(12);
    loop();
  }
}

E ai Weider Duarte, conseguiu resolver a comunicação entre os nRF?

Muitos meses atrás eu estava brincando com essas placas, mas tive de deixar de lado por outras prioridades, mas elas ainda me assombram aqui e espero retomar meu projeto de automação em breve.

Enquanto não entendemos, as coisas são complicadas, depois piora (brincadeira), uma das questões esta na frequência, pois os roteadores e diversos outros dispositivo wifi usam 2.4ghz, ou seja, temos um bocado de interferência. Sem falar de coisas que não entendo relacionadas a antena, obstáculos e "coisas" que estão no "ar" por onde as ondas propagam.

Simplificando, a primeira coisa master importante é ver o datasheet e entender como os registradores funcionam, as livrarias que encontramos por ai servem para os propósitos que os autores criaram com as limitações que os autores aceitaram e existem muitas discussões na net a respeito (prós e contras), muita coisa não funciona nem com reza brava, é necessário ler e refletir muito (eu mesmo ainda não fiz o suficiente rs). Pacotes podem se perder, então é interessante pensar em como garantir que o receptor recebeu a mensagem ou o transmissor continua tentando até que a mensagem seja recebida.

A partir de diversas fontes eu escrevi o código anexo para uns testes, recordo-me que funcionava, mas os endereços dos pipes não estão adequados, deve-se evitar que sejam parecidos para que evite falsos positivos (exemplo evitar 0000 e 0001, isso mesmo, para nós um hexa é muito diferente do outro, mas em bits fica mais complicado).

Eu uso um add-in para o MS Visual Studio, muito melhor que usar a IDE do Arduino, chama-se visualmicro, pode baixar e usar o trial, ou abrir o .ino no arduino, que também funciona.

O código é "auto explicativo" (desculpe-me, me falta tempo para comentá-lo rs, mas não é difícil), basicamente um RX e 5 TX (aproveitando os 6 pipes nativos, importante ler sobre isso), o RX manda mensagens para todos os pipes e imprime a resposta na serial.

Tenho em algum lugar outros códigos mas estão uma bagunça e seria necessário revisá-los. Ah sim, coloque a serial em alta velocidade (eu uso 115200) pois a serial (o tempo que o arduino demora para processar) pode atrapalhar a comunicação, então serial.print ou consumo indevido de recursos deve ser evitado. (o printf não deveria ser usado por consumir muitos ciclos, mas estava nos exemplos eu deixei).

Alguns cuidados são os intervalos de envio e retorno, pois o chip não é tão rápido e processa um de cada vez, se você for rápido demais perderá pacotes (lendo e respondendo enquanto outro manda)... os chips não mandam mensagem uns para os outros, na verdade, por exemplo: o TX manda para o "ar" e o RX capta o pacote, identifica-o e coloca-o no buffer para que seja lido.

A livraria foi escrita em/por "Copyright (C) 2011 J. Coliz <maniacbug@ymail.com>", e não é perfeita, lembro-me de problemas com o tempo entre a alteração de registradores e com colocar o módulo em powerDown sem necessidade, o que também causava a perda de pacotes (em powerDown o RX não capta nada), mas se você mantiver um tempo entre envios deve ajudar.

As configurações ficam em void RF24::begin(void), mas é possível alterá-los, como esta no setup do sketch, observe todos os arquivos da livraria pois são muito bem comentados e fornecem informações cruciais para fazer a coisa funcionar.

Desculpe-me por digitar muita informação e dizer pouco, mas é o que consigo por hora (minha vida anda uma loucura e eu já deveria estar dormindo rs) e se me equivoquei em algo, peço desculpas desde já ;)

Retorne os resultados!

Anexos

Olá Marco Antonio,

     Cara, o que posso dizer é que consegui "re-colocar" os radios ao menos provisoriamente pra funcionar,  mas resultado,  resultado mesmo,  vou ver a partir de amanha quando terminar de montar um shield que criei exclusivamente pra testar esses radios.

   Cara, eu tenho criado placas de circuito impressos tipo shields pra o arduino muito legais, dai criei uma shield pra o nrf24l01 que liga reles, tem indicadores de comunicação por leds, mas ela funciona bem apenas como  receptor visto que o transmissor tem que ser de pequeno porte pra meu projeto,  agora tô terminando de criar uma shield teste que contem display, varias portas com bornes de entrada e saida,  testei rápido e funcionou legal(o shield).

   Agora vamos aos radios nrf24l01.

    Mantive contato com um pessoal de portugal e eles tambem tiveram esses problemas com esses radios, ou seja, tem mais gente apanhando,  dai eles descobriram que parte do problema esta na biblioteca RF24 do maniabug, que fazendo trocadilhos "tem muitos bugs" he he,   um deles já citado por você é colocar o radio pra dormir sem necessidade.

   O pessoal me aconselhou um blog de um cara chamado greg copeland que pegou a RF24 e corrigiu ela, e ele  colocou no blogo dele veja aqui:

http://maniacalbits.blogspot.com.br/2013/04/new-rf24-driver-release...

   A melhoria é drastica quando você utiliza essa biblioteca corrigida, mas pra os modulos nrf24l01+pa+lna só isso não resolve.

    Descobri então que parte do problema é que esses radios maiores precisam de bem mais corrente elétrica,  dai vi que em vários lugares citam sobre a colocação de um capacitor entre o VCC e o GND deles,  o problema é que cada lugar que fala sobre isso, cita um valor de capacitor diferente, sendo que encontrei de sites falando de 1uF até 100uF.

   Testei os de 1uF e não funcionou,  pulei logo pra o de 100uF e os radios passam a funcionar, porem, ficam extremamente lerdos.

    Agora tô na fase da tentativa e erro,  tô colocando 2 de 10uF e parece que a reação tá sendo boa.

    Resumindo, adoraria trocar mais ideias com você,  tô apanhando feio desses radiozinhos, mas já tô consegundo vencer algumas batalhas.

    Devido ao potencial e ao baixissimo custo,  vale muito a pena tentar identividar os segredos deles pra poder utiliza-los.

   Bem, amanhã vou fazer mais testes,  coloco os resultados aqui ok.

A criação de shields é muito legal, eu faço tudo nas veroboards da vida (é uma tristeza rs)... estou com partes para fazer uma fresadora, para otimizar o tempo com as pcbs, mas o complicado é o tempo. Também tenho usado os pró-mini por serem mais compactos.

Conversei com um pessoal (tugas inclusíve) no fórum do Arduino (veja este post e retorne algumas páginas pois tem..., mas não percebi muito interesse do pessoal em buscar algo mais definitivo, depois o HugoPT chegou a comprar uns nRF e postou uns testes básicos, mas ai, eu é que não teve mais tempo...

Eu fiz umas comparações com as libs do Maniac e do Greg, tentei chegar em um meio termo, pois na do Greg também tinha coisas com as quais eu não concordava, mas o ideal é perceber bem como funcionam os registradores e evitar códigos e variáveis que "travam" o microcontrolador. Nos testes que fiz, não encontrei muitos problemas com os PA+LNA, mas da mesma forma que eles amplificam o sinal, eles amplificam as interferências na entrada.

Um dos problemas que tive, foi resolvido com a alteração dos endereços dos pipes, como citei, em relação à velocidade de comunicação, quanto menor a velocidade maior a distância, o inverso também é verdadeiro. Faça testes com 256kbps, e sobre o capacitor, eu uso de 200uf diretamente na placa do nRF (é para alimentação, então não tem muita crise) nem os meus sem "PA+LNA" funcionavam sem o capacitor rs.

Vamos conversando, você chegou a ver meu código? Vamos torcer para eu conseguir parar no final se semana, então reviso os arquivos que tenho numa pasta aqui (muitas anotações pra rever)

Weider,

Me lembrei deste link da elecfreaks, dê uma olhada nesse artigo, tem um exemplo onde é sugerido alterar o abaixo:

de
{
...
// TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);

para
// TX_PWR:0dBm, Datarate:250kbps, LNA:HCURR
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0xA3);
}

Tentei rever minhas anotações, mas esta difícil lembrar de coisas de 7 meses atrás (para você ter noção, em uma classe eu tenho o mesmo método 4 vezes, testando "coisas" diferentes para se chegar ao mesmo lugar rs), deve ser a idade... rs

happy programming!

Marcos,

   Eu consigo fazer não só shields, mas praticamente quase tudo meu sai praticamente profissional, visto que após a fase de projeto utilizando o arduino uno,  em geral eu parto pra a montagem stand alone na protoboard pra teste, dai o proximo passo é passar o projeto pra o CAD EAGLE,  dai é só gerar a PCI.

  O lance é que inventei(ou descobri sei lá)  um metodo super fodastico de fazer placas de circuito impresso, eu criei um tutorial e coloquei pra galera aqui veja:

     http://labdegaragem.com/forum/topics/bomba-tutorial-novo-metodo-exc...

  Já evolui um bocado o método, que utiliza papel alumínio para transferência quase instantanea, não precisando ficar se matando como rola na termo transferência ensinada por ai no youtube.

  A maior evolução desde que escrevi o tutorial, foi perceber que eu podia meter a placa com papel alumínio no percloreto só por um minutinho até dissolver todo o papel aluminio, depois lavar a placa e verificar como ficou a transferencia antes mesmo de corroê-la completamente,  parece algo bobo,  mas faz uma diferença enorme.

   Se você desejar, eu te passo os desenhos de algumas placas que já criei,  devo ter só umas duas ou três com o nrf24l01  mas pra o que queremos já dá na conta, e tambem te dou toda a assistencia pra você fazer suas placas, o que for tendo duvidas eu vou te ajudando.

  Hoje me pegaram pelo pé e passei o dia ocupadasso, cheguei em casa agora a pouco e vou dar uma olhada agora no seu codigo.

   Sobre esse que vocÊ postou com o comando SPI_RW eu não conhecia, visto que na documentação do rf24 ele não consta, veja aqui:  http://maniacbug.github.io/RF24/classRF24.html

   Mas deixa eu colocar qual tá sendo de verdade meu graaaaaaaaaaaande problema...

   O lance é que tô tentando fazer um controle remoto de longo ancançe com o nrf24l01+pa+lna  dai eu utilizo aquelas mini pilhas de controle remoto de 12v,  utilizo um 78l05 (regulador em encapsulamento de transistor) e derrubo pra 5V pra mandar pra o atmega328,  em seguida pego os 5V e atraves de um LM317 derrubo pra os 3.3v e alimento o nrf24l01.

   O graaaaaaaande problema é que por se tratar de um controle remoto, e a bateria ser pequena,  o sistema fica o tempo todo desligado,  quando se pressiona um botão, o que se faz na verdade é energizar todo o sistema, ou seja, o botão é um interruptor que corta/ativa o Vcc.

   O problema tá ai... se o sistema ficasse o tempo todo sendo alimentado, bastava realmente meter um capacitor de 200uF que resolveria,  mas como todo o sistema tem que funcionar quando pressionado, um capacitor de 200uF leva tempo pra ser carregado e depois auxiliar o sistema,  o que fode com tudo.

   Dai tô meio sem saida.

   Deu pra entender meu problema ?

  

Acabei de dar uma olhada no seu codigo,

   Ele não é tão auto explicativo assim, principalmente depois de 2 cervejas na cabeça ha ha ha,  dá pra ter uma boa noção do que ele faz, mas não tenho certeza 100%.   Pelo que entendi ele começa definindo o uso da biblioteca rf24 do maniacbug, informa os pinos a trabalhar tradicionais começando do 9 em diante, só que abre um prececente condicional pra quem usa o arduino mega ou o arduino uno(atmega328).

   Você começa abrindo todos os 6 pipes que tem de direito, dai põe o radio como receptor e verifica a rede...vê se cada modulo é o TX ou o RX.

   Você cria rotinas (void() )  para o caso de cada escolha.

   Bem, pra não ficar falando passo a passo pelo que entendi ele tranmita entre TX e RX fazendo verificações e fazendo comunicação dos dois lados.

   Esse seu codigo me lembra muito o codigo gettingstarted da biblioteca rf24 só que com esteroides ha ha ha.

   Ei não entendi uma coisa?   vocÊ manda mexer na velocidade da serial,   se eu quiser longas distancias devo aumentar o valor serial ou baixar ?

  

AEEEEEEEE,  TÁ FUNCIONANDO !!!!!!!!!

      Cara, mexi em coisa pra caralho, mas parece que tá funfando ok!

      O que fiz:

- Baixei a taxa de dados padrão de 2M para 256k

- manipulei a potencia colocando ela em ciclos,  tipo, TX começa com a potencia minima, dai ele emite um codigo e se transforma em um RX   já o RX original fica o tempo todo aguardando o codigo, se bater, se transforma em TX e manda a resposta ao antigo TX que agora vivou RX.

  Quando recebe o TX original recebe a confirmação do RX original ele se autobloqueia pra não ficar forçando a comunicação.

   Já se o TX emite e o RX não responde o TX faz uns 20 ciclos desses e muda pra a proxima potencia, e assim vai aumentando até achar, se não achar volta pra o inicio.

-Mudei a biblioteca do maniacbug pela do greg

- por fim, fui no seu conselho, e aumentei pra valer o valor do capacitor,  botei logo um de 470uF.

RESULTADO,  TÁ FUNCIONANDO.

  Como disse fiz um shield testador de controles,  vou deixar ele ligado agora a noite toda emitindo e recebendo,  amanhã verei quantos posivitos e quantas falhas ele teve.

   Vou colocar pra ele emitir um pedido de comunicação a cada 3 minutos.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço