Go Down

Topic: [solucionado]Problema modulo nrf2401 (Read 981 times) previous topic - next topic

pedro_mm

May 16, 2016, 07:57 am Last Edit: May 19, 2016, 06:38 am by pedro_mm
Muy buenas tengo un problema con estos módulos ,mi finalidad es conectar 3 arduinos(un mega y dos Uno )  mediante los modulos de RF , los dos arduinos Uno enviaran datos de sensores y el arduino mega los almacenara .

Tengo 3 nrf2401 conectados , uno a cada arduino,el caso es que en una comunicación bidireccional no tengo problema , ya sea mega <-> Uno  Uno<->Uno   ...  Bien el problema me viene al realizar la comunicación de los 3 .

Mi código esta planteado de la siguiente manera , declaro los canales de comunicación , en un principio todos escuchan , cuando Mega quiere los datos se posiciona en modo escritura llama a canal 1 o 2 , cuando este acepta ,automáticamente cambia a escucha y el nodo seleccionado cambia a trasmitir

Code: [Select]


#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <DHT.h>
#include "Wire.h"
#define DS1307_ADDRESS 0x68
#define CE_PIN   9
#define CSN_PIN 10

struct N_DHT22 {
  float T_amb;
  float HR_amb;
}DHT_N;

struct N_DHT24 {
  float T_amb;
  float HR_amb;
}DHT_24;


const uint64_t  Emisor[2] ={ 0xE8E8F0F0E1LL ,  0xE8E8F0F0E8LL }; //donde escribe
const uint64_t  Receptor[2] ={ 0x38E8F0F0E1LL ,0x38E8F0F0E8LL }; //donde escuchamos  
//CONFIGURACIÓN NR24L01
RF24 radio(CE_PIN, CSN_PIN); // Pines de conexion de radio




/****** SETUP ******/
void setup()  
{
  Serial.begin(9600);
  delay(1000);
  Serial.println("Nrf24L01 Nodo Maestro ");
  Wire.begin();
  radio.begin();
  //repetimos el envio en caso de error
 radio.setRetries(15,15);
  int i;//usada para bucle
  for ( i=1;i<=2;i++){
    radio.openReadingPipe(i,Receptor[i-1]);
    }
  //Se abre canal de comunicación
  //los nodos comienzan escuchando
  radio.startListening();
      
}//--(end setup )---
  
  
  void loop()
  {
   delay(2000);//tiempo para esperar emisor trasmita
  
   int i;
   for(i=1;i<=2;i++)
      {Serial.print("Comienza trasmisión con Nodo  .......");
       Serial.println(i);
       despertar_n(i);//despierta a los nodos , solo a uno
       radio.startListening();//cambia a escuchar MEGA
       delay(2000);
       leer_n(i);//lee datos de los nodos
      
       }
  
}



//Nodo_i cambia de receptor a trasmisor
void despertar_n(int nodo)
 {
   //deja de escuchar para comenzar a trasmitir
   radio.stopListening();
   radio.openWritingPipe(Emisor[nodo-1]);
  
   bool ok=false;
   do{  
     ok=radio.write( &nodo, sizeof(nodo) );
     //enviamos "nodo", contiene numero de nodo , para que el receptor
     // pueda saber si le toca su turno  
     if(ok)
     {
        Serial.print("aviso enviado correctamente a nodo :");
        Serial.println(nodo);
     }
     else  
     {
        Serial.print("aviso NO enviado correctamente a nodo :");
        Serial.println(nodo);
        delay(100);
            
     }
   }while(!ok);
}


void leer_n(int nodo)
{  
   while( radio.available()!=1 )
   {
      Serial.println(" nada qe leer en el canal");
      delay(20);  // Para dar tiempo al emisor
   }
   if(nodo==1)
   {
      radio.read(&DHT_N, sizeof(struct N_DHT22) );
    
   }  
   else
   {
    radio.startListening();
    radio.read(&DHT_24, sizeof(struct N_DHT24) );
    
   }
   delay(1000);        
}




Codigo de arduino Uno 1

Code: [Select]

//elimino definiciones**

#define NODO   1
// estructura para datos de dht22

struct N_DHT22 {
  float T_amb;
  float HR_amb;
  }DHT_N;

const uint64_t  Emisor[2] ={ 0x38E8F0F0E1LL ,0x38E8F0F0E8LL }; //donde escuchamos  
const uint64_t Receptor[2] ={ 0xE8E8F0F0E1LL ,0x38E8F0F0E8LL }; //donde escribe
RF24 radio(CE_PIN, CSN_PIN); // Create a Radio
DHT dht(DHTPIN, DHTTYPE);
void setup()   /****** SETUP ******/
{
  Serial.begin(9600);
  radio.begin();//inicializacion comunicacion radio
  dht.begin(); // inicialización del sensor dht22
  radio.setRetries(15,15);
  radio.openWritingPipe(Emisor[NODO-1]);
  radio.openReadingPipe(NODO,Receptor[NODO-1]);//el escucha por este canal
  radio.startListening();
}


void loop()   /****** LOOP******/
{
   radio.startListening();//cada ciclo vuelve a escuchar

  
   Serial.println("Vamos a escuchar..");
   escuchar();
   radio.stopListening();
  
   leer_datos();
   Enviar_datos();
    
}
  
  
void escuchar()
{   int aviso;
    bool done=false;
    while( radio.available()!=1 ) {
         delay(20);
         }
    while( !done) {
         done=radio.read(&aviso, sizeof(aviso) );
         }    
    if(aviso==NODO) {
        
         return;  }
           else { escuchar();  }
    //si la petición no es la esperada,, seguira escuchando...    
        
}



      
void leer_datos(){
     DHT_N.HR_amb= dht.readHumidity();                                  
     DHT_N.T_amb= dht.readTemperature();
     if (isnan(DHT_N.HR_amb) || isnan(DHT_N.T_amb)) {
        Serial.println("FALLO DE LECTURA");
         leer_datos();//cambio con respecto anterior version
         //return;
        }
     return;
}


void Enviar_datos(){
  bool ok=false;
  while(ok!=1){
      ok=radio.write( &DHT_N, sizeof( struct N_DHT22) );}
      //si se envia correctamente nos devuelve un 1 sino un 0
      
     if(ok){
              Serial.println("ENVIADO.correctamente..");
              Serial.print("HR: ");
              Serial.print(DHT_N.HR_amb);
              Serial.print(" %\t");
              Serial.print("Temperatura: ");
              Serial.print(DHT_N.T_amb);
              Serial.println(" *C ");
              }
      else{    
              Serial.print(" No se pudo enviar  ");
          }  
}



en el nodo 1 , tengo el sensor DHT22 , por eso esa función de mas

Code: [Select]

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

#define DHTPIN 2     //PIN DE DATOS SENSOR
#define DHTTYPE DHT22  // MODELO A UTILIZAR
#define CE_PIN   9
#define CSN_PIN 10
#define NODO   2//defino que es el nodo 2


struct N_DHT22 {
  float T_amb=25.30;
  float HR_amb=55.30;
  }DHT_N;
//de momento estos valores fijos , puesto no tengo más sensores los debo de comprar
const uint64_t  Emisor[2] ={ 0x38E8F0F0E1LL ,0x38E8F0F0E8LL  }; //donde escuchamos  
const uint64_t Receptor[2] ={ 0xE8E8F0F0E1LL ,0xE8E8F0F0E8LL }; //donde escribe
RF24 radio(CE_PIN, CSN_PIN);
void setup()   /****** SETUP ******/
{
  Serial.begin(9600);
  radio.begin();//inicializacion comunicacion radio
  radio.setRetries(15,15);
  radio.openWritingPipe(Emisor[NODO-1]);
  radio.openReadingPipe(NODO,Receptor[NODO-1]);//el escucha por este canal
  radio.startListening();
}


void loop()   /****** LOOP******/
{
   radio.startListening();//cada ciclo vuelve a escuchar
  
   //ESPERA PARA CALIBRACION
   Serial.println("Vamos a escuchar..");
   escuchar();
   radio.stopListening();
   delay(2000);
   Enviar_datos();
    
}

  

  
void escuchar()
{   int aviso;
    bool done=false;
   Serial.println(radio.available());

    while( radio.available()!=1 ) {
         delay(100);
         }
    while( !done) {
         done=radio.read(&aviso, sizeof(aviso) );
         }    
    if(aviso==NODO) {
                 return;  }
           else { escuchar();  }
    //si la petición no es la esperada,, seguira escuchando...      
}

          
void  Enviar_datos(){
  
   bool ok=false;
      

  
   while(ok!=1){
      ok=radio.write( &DHT_N, sizeof( struct N_DHT22) );
       delay(20);
          
}
      
   if(ok)
   {
      Serial.print("ENVIADO a maestro ..nodo 2");
   }
    
}


En este nodo creo una estructura igual , para siimular que tengo el sensor .
El problema resulta en la comunicación como siempre  ... El primer nodo no tiene ningún problema en cambio con el segundo nodo a veces lo despierta , y consigue entrar a la función de enviar datos .
El caso es que si funciona bien toda la comunicación con el nodo 1 porque no con el nodo 2 ,pues no esta nunca 2 trasmitiendo a la vez , o eso creo .

Creo que esta todo bien , llevo muchas horas perdidas en esto , sino no hubiese posteado nada .

No se si el fallo esta en el MEGA o en el nodo  2 ... si sirve de algo los tengo los 3 juntos ,alimentando los arduinos por USB .
Por ejemplo la siguiente captura , no llega a enviarse el mensaje de despertar nodo2
captura de arduino mega

imagen


Pero lo curioso es que ,lo mismo a las 2 h vuelvo y esta vez si pasa el mensaje lo despierta pero el nodo 2 no contesta .
Si alguien quiere mis códigos  o algunos códigos sencillos no dude en pedirlos ;) ,saludos.





Hector_A



Por favor, edita tu mensaje y pega la imagen como se pide en las normas del foro. Las mismas las puedes encontrar arriba de todo de este mismo subforo.

Gracias de antemano!


Go Up