Misterioso problema con nRF24L01

Hola

Llevo varios días con un problema que me vuelve loco.
He modificado el programa de cerradura electronica que os mostré aquí Arduino Forum para añadirle un nRF24L01. Así espero guardar un Log de entradas y salidas, ademas de dar avisos por twitter ante algunas entradas en casa. Uso un Arduino Nano 3.0.

El caso es que el programa, corriendo sin el resto del hardware, en algún PC, funciona perfecto. Pero es ponerlo en la puerta y ya no funciona el nRF24L01 (el resto va bien).

He comprobado:
El nRF24L01 recibe sus 3,3v medido con polimetro.
He alimentado el arduino por su toma USB y tampoco va.
He probado 1001 veces el cableado.
He desconectado el RTC y el LCD por I2C que le he añadido hace poco. (q x cierto, es lento de narices)
He acercado los nRF24L01 para asegurarme que no había problema de cobertura.
He cambiado el micro por otros con el mismo programa.

No entiendo por qué el mismo programa corriendo enganchado a un portátil va OK y en la puerta no va (no recibo nada de el), aunque esté siendo alimentado por el portátil.

¿Ha alguien se le ocurre algo y me puede ayudar? Gracias.

Os pongo parte del código, que entero no cabe. Aunque insisto en que el código va OK enganchado al PC sin ponerle el resto de cosas (teclado, buzzer y relés):

Los pines y los includes:

PINES:  
2 Teclado Col 1
3 Teclado Col 2
4 Teclado Col 3
5 Zumbador           Teclado Col 4 (Opcional)
6 Teclado Fila 1 
7 Teclado Fila 2
8 Teclado Fila 3
9 Teclado Fila 4
10 CS de nRF24L01  (antes de Tarjeta SD)
11 MOSI
12 MISO
13 SCK 
A0 (14) CE de nRF24L01
A1 (15) Sensor Temperatura 18B20
A2 (16) ABRIRCERRADURA   Rele cerradura ON 
A3 (17) CERRARCERRADURA  Rele cerradura OFF 
A4* RTC y LCD
A5* RTC y LCD
A6 Sensor timbre?   
A7 Sensor puerta abierta   (Poner una R de 5v al pin y luego el pin a Masa pasando por el interruptor)


#include <Wire.h>  
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Time.h>   // Para la hora
#include <DS1307RTC.h>  // a basic DS1307 library that returns time as a time_t
#include <EEPROM.h>
//#include <SD.h>
// Incluimos la librería para establecer comunicación mediante el protocolo 1-Wire
#include <OneWire.h>
// Incluimos la librería para comunicarnos con los sensores
#include <DallasTemperature.h>

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

Inicialización:

/*******   Para la Radio nRF24L01    **************/
// http://maniacbug.github.com/RF24/classRF24.html
RF24 radio(14, 10);   // RF24 radio((CE,CSN)    
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };
bool Dato_perdido=false;
/*******   FIN para la Radio nRF24L01    **************/

En el setup()

/*******   Para la Radio nRF24L01    **************/
 printf_begin(); // OJO ¿Esto será necesario?
 radio.begin();
// optionally, increase the delay between retries & # of retries
  radio.setRetries(15,15);
// Parece que abre la comunicacion en ambos sentidos?  
  radio.openReadingPipe(1,pipes[1]);
//Empieza a escuchar ¿será necesario?
  radio.startListening();
  //radio.printDetails();
/*******   FIN para la Radio nRF24L01    **************/

En el main()

  // Cada minuto: Comprobamos cambio de hora y enviamos cosas
  if (minute() != minutoTemp){
      ActualizaMinuto();  // Para restar o sumar hora en verano invierno
      EnviaDato(now());   //Enviamos la hora      
      //GuardaTemp();
    }

Y la función que envía los datos:

/************************************************************************************/
/*****************             Envia datos por Radio             ********************/
/** 1:CLAVE erronea 2:Puerta abierta 3:Entra CLAVE1 4:Entra CLAVE2 5:Entra CLAVE3   ******/
/**      6:ENTRA CLAVE DE UN SOLO USO        7: Reinicio        8:Puerta cerrada         **/
/*      Enviamos datos, como la temperatura.   Y 10 si ha habido error de TX        */
/************************************************************************************/
void EnviaDato(unsigned long Dato){
const int error=10;

  if(Dato_perdido){   // Avisamos de que se han perdido datos enviando un CERO
   radio.stopListening();  
   radio.write( &error, sizeof(unsigned long));     // Enviamos el dato
   radio.startListening();   
   delay(50);   
  }

  radio.stopListening();  
  radio.write( &Dato, sizeof(unsigned long));     // Enviamos el dato
  radio.startListening();
  
      // Wait here until we get a response, or timeout (250ms)
    unsigned long started_waiting_at = millis();
    bool timeout = false;
    while ( ! radio.available() && ! timeout )
      if (millis() - started_waiting_at > 200 )   timeout = true;

    if ( timeout )
    {
      //Serial.println("Dato enviado, pero no recibido ¡¡¡¡");
      Dato_perdido=true;    // Dato no recibido ¡¡¡¡
      lcd.setCursor(15,1);  // Situamos el cursor
      lcd.print("x");
    }else 
      {
        Dato_perdido=false;    // Dato recibido ok
        lcd.setCursor(15,1);  // Situamos el cursor
        lcd.print(" ");
        //      Serial.println("Dato recibido OK");
      }


} // Fin de EnviaDato()

Hola,
en el montaje de la puerta, ¿has probado poniendo los módulos muy cerca uno del otro, como a dos o tres metros? Yo me he llevado alguna sorpresa con estos módulos, por su reducido alcance en determinadas situaciones (muros, tabiques, etc.)

curro92:
Hola,
en el montaje de la puerta, ¿has probado poniendo los módulos muy cerca uno del otro, como a dos o tres metros? Yo me he llevado alguna sorpresa con estos módulos, por su reducido alcance en determinadas situaciones (muros, tabiques, etc.)

Si, los llegué a poner a escasos milímetros uno del otro y sigue sin funcionar.
Gracias por tu ayuda.

Hola,
puedes seguir investigando: desmóntalo de la puerta, y mira si funciona cerca de la puerta, acercando o alejando el otro módulo.

Hola

He llegado a conseguir que funcione cargando solo la parte del nRF24L01. Pero misteriosamente, a veces, deja de funcionar.
Estoy observando que a veces, sin motivo que yo entienda, el receptor arranca con el registro "EN_AA" en 0x00 en lugar de 0x3f. Este registro es algo del ACK. Esto se ve con la función radio.printDetails(); Cuando está en 0x00 no funciona el enlace.

Ahora pienso que el no entender el 95% de lo que hace la librería de maniacbug puede ser la causa de mis problemas. :roll_eyes: Si vuelve a dejar de funcionar, probaré con esto: RF24 library revisited - Bajdi electronics Es una simplificación de la librería.

Saludos, y gracias a todos.

PD: No lo pongo [SOLUCIONADO] porque ya no me fío de que realmente fuera ese el problema. En unos días si acaso.

Edito: Sigue funcionando. No se se si ha influido, pero puse unas pequeñas esperas (5ms) en la inicialización y llamadas del nRF24 para estabilizar.