Usando o modulo nrf24l01 para enviar e receber dados simutaneamente

E ae pessoal, estou longe dos meus arduinos para testar isso, mas gostaria de saber se o nrf24l01 pode: hora enviar e hora receber dados.

Exemplo:

O modulo está a todo tempo esperando dados (ou seja RECEPTOR) mas se um push button for pressionado ele irá parar de receber e irá emitir ( RECEPTOR) que o push foi pressionado.

Sei que esses modulos podem ser os dois, emissor e receptor, mas a duvida é se pode-se mudar esse status em tempo real.

Obrigado!

Exibições: 2488

Responder esta

Respostas a este tópico

Sim,

   É exatamente essa a ideia do nome "transceptor"  basta indicar no code se você deseja que ele esteja ouvindo (listerning) ou falando (stoplisterning).

   Atenção especial para os pipes, se você vai trabalhar com ele enviando e recebendo nunca esqueça de abrir 2 pipes ao inves de um como tem nos exemplos por ai.

   Usando um só pipe pode até funcionar, mas uma hora ou outra vai começar a rolar colisão,  dai abra um pipe para envio e outro para recebimento, sendo que no outro modulo os pipes devem ser invertidos, o de falar deve ficar pra ouvir e de ouvir pra falar.

   Leia os exemplos das bibliotecas que tem tudo certinho lá.

Muito obrigado Weider, foi muito especifico, assim que puder vou testar!

Complementando a dica do amigo Weider, para cada pipe um endereço diferente.

Veja um exemplo aqui:

https://forum.arduino.cc/index.php?topic=364050.0

vlw!!!

Bom dia a todos, volto com algumas duvidas, depois de tentar e não conseguir fazer a comunicação funcionar ainda.

Quero apenas o seguinte:

Tenho dois arduinos, cada arduino com um push button e um led. Quando eu precionar o push button de um arduino, o led do outro acenda e vice-versa. Assim se comunicando de forma simultanea.

este é o codigo que estou usando em um dos arduinos:

*atentem para as linhas que comentei, sem eles o arduino consegue ler o sinal que chega, mas obviamente, como seria elas que enviaria o sinal de volta, o led do outro arduino não acende ou apaga. Se eu descomentar essas linhas, ele nem recebe, nem envia.

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

int dados[1];

int recebidos[1];

RF24 radio(9,10);

uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };


int LED = 7;


int pino_botao2 = 2;

bool check_lamp = false;

void setup()
{

pinMode(LED, OUTPUT);


pinMode(2, INPUT);
digitalWrite(2,HIGH);


Serial.begin(57600);


radio.begin();


radio.openReadingPipe(1,pipes[1]);
radio.startListening();


radio.openWritingPipe(pipes[2]);
}

void loop(){
bool done = false;
done = radio.read(recebidos, 1);

if (recebidos[0] == 2)
{
delay(10);
digitalWrite(LED, HIGH);
}
else
{
digitalWrite(LED, LOW);
}

if (digitalRead(pino_botao2) == LOW)
{
dados[0] = 1;
//radio.write(dados, 1); // quando comento estas linhas, funciona a leitura do sinal do outro radio
}else{
dados[0] = 2;
//radio.write(dados, 1); // quando comento estas linhas, funciona a leitura do sinal do outro radio
}

}

Já adianto um obrigado!

Olá madson,

  Tente ver se na proxima vez, você coloca o sketch com o numero das linhas, pois assim facilita pra ajudar,  vou fazer assim, vou copiar seu codigo e fazer criticas em negrito ok.

#include <SPI.h>
#include "nRF24L01.h"    // Se você precisa utilizar ainda a biblioteca nrf24l01.h significa que voce esta usando versao antida da RF24 procure no google por RF24 TMRH20, é a versao mais completa moderna e com menos falhas
#include "RF24.h"

int dados[1];

int recebidos[1];

RF24 radio(9,10);

uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };


int LED = 7;


int pino_botao2 = 2;

bool check_lamp = false;

void setup()
{

pinMode(LED, OUTPUT);


pinMode(2, INPUT);
digitalWrite(2,HIGH);  // porque voce não usou a funcao INPUT_PULLUP  ?


Serial.begin(57600);


radio.begin();


radio.openReadingPipe(1,pipes[1]);  // Você não pode copiar esse mesmo codigo pra os dois radios,  se no primeiro o pipe 1 esta ouvindo (reading)  no segundo radio tem que inverter tem que ser escrever (writing),  ou seja, inverta essa e a linha de baixo quando gravar o sketch em um radio e no outro,     ESSA LINHA corretamente seria  radio.openReadingPipe(1,pipes[0]);


radio.openWritingPipe(pipes[2]);  // Testa ai, mas se não me engano esse endereçamento ta errado,  apesar de lá na declaracao você dizer que tem 2 pipes,  na hora de chamar, o primeiro é chamado como 0 e o segundo como 1,  você esta chamando como 2, o que significa que voce ta usando um pipe só)

radio.startListening();
}

void loop(){
bool done = false;
done = radio.read(recebidos, 1);

if (recebidos[0] == 2)
{
delay(10);
digitalWrite(LED, HIGH);
}
else
{
digitalWrite(LED, LOW);
}

if (digitalRead(pino_botao2) == LOW)
{
dados[0] = 1;
//radio.write(dados, 1); // quando comento estas linhas, funciona a leitura do sinal do outro radio
}else{
dados[0] = 2;
//radio.write(dados, 1); // quando comento estas linhas, funciona a leitura do sinal do outro radio
}

}

Caro Weider, obrigado pelos conselhos.

logo mudarei a biblioteca assim como está me indicando, mas ainda sim gostaria de tentar com essas, ao menos para intender o funcionamento dos rádios.

Assim como eu disse, não estou com o mesmo código nos dois arduinos, no segundo eu fiz a inversão dos pipes.

Quanto a chamada ao pipe[1] em vez de pipe[0], realmente achei estranho tb, mas peguei essa parte do código em um tutorial, acabei não percebendo. Obrigado!

O código como está funciona, porem como está não atende objetivo, pois o arduino só está ouvindo, quando eu tiro o comentário da linha "radio.write(dados, 1);" ele envia porem não recebe dados.

Tenta sempre depois de enviar chamar uma funcao que o coloca em modo de recebimento novamente, nao olhei direito seu codigo mas pelo oq vc falou ele envia e continua no modo de envio, vc deve muda-lo para receber apos o envio.

Olá Madson Saldanha! Estou tentando fazer a mesma coisa que você tentou e não estou conseguindo, não estou conseguindo entender essa parte de mandar um pará de "ouvir" para começar enviar o dado. Você conseguiu fazer?

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço