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
}
}
}
Tags:
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?
Boa tarde Ailton.
Meu caro, eu não lembro agora do que se trata o número 1.
Estudei bastante o código a 8 meses atrás...depois não usei mais.
Sinto muito não poder ajudar nesse momento..mas assim que eu relembrar eu te passo as informações.
Dá uma olhada nesses links...eles me ajudaram MUITO!!!
Abração e BOA SORTE!!!!!!!!!!
http://www.elecfreaks.com/203.html
http://www.seucurso.com.br/index.php?option=com_content&view=ar...
http://labdegaragem.com/forum/topics/nrf24l01-duvida-envio-e-recebm...
http://futebol-uff.blogspot.com.br/2012/12/nrf24l01-testes-iniciais...
http://www.instructables.com/id/RF-Control-System-For-RC-Vehicle-Ba...
https://www.youtube.com/watch?v=OHGv65b52us
https://www.youtube.com/watch?v=_1_ag3Y17fc
http://buildbot.com.br/blog/comunicacao-wireless-com-o-modulo-nrf24...
https://www.youtube.com/watch?v=_1_ag3Y17fc
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!!!
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?
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por