NRF24L01 funcionó bien con un código y dejo de de funcionar con otro

Llevaba un tiempo sin jugar con los modulos NRF24L01 y ahora me apetecia hacer un mando RC. Así que ni corto ni perezoso me compré un par de NRF con amplificador y antena.

Realize la siguiente conexión:
foro

En el emisor subí el siguiente código.

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

const int pinCE  =  9;
const int pinCSN = 10;

RF24 radio(pinCE, pinCSN);
const uint8_t pipe[5] = "nodo1";

void setup() {
  // put your setup code here, to run once:
  radio.begin();
  radio.openWritingPipe(pipe);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();
}

void loop() {
  // put your main code here, to run repeatedly:
  const char text[]="Hello Wrold";
  radio.write(&text, sizeof(text));
  delay(1000);
}

Y en el receptor lo de aquí:

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

const int pinCE  =  9;
const int pinCSN = 10;

RF24 radio(pinCE, pinCSN);
const uint8_t pipe[5] = "nodo1";

char data[16];

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(1,pipe);
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();
}

void loop() {
  // put your main code here, to run repeatedly:
  if ( radio.available() ) {
    radio.read(data, sizeof(data));
    Serial.println(data);
  }

Y funcionó a las mil maravillas.

Luego probé el siguiente código:

Emisor:

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

#define led 2

RF24 radio(9,10); // CE, CSN
const byte addresses[][6] = {"00001", "00002"};
boolean buttonState = 0;

void setup() {
  pinMode(led, OUTPUT);
  radio.begin();
  radio.openWritingPipe(addresses[1]); // 00002
  radio.openReadingPipe(1, addresses[0]); // 00001
  radio.setPALevel(RF24_PA_MIN);
}

void loop() {
  delay(5);

  radio.stopListening();
  int potValue = analogRead(A0);
  int angleValue = map(potValue, 0, 1023, 0, 180);
  radio.write(&angleValue, sizeof(angleValue));

  delay(5);
  radio.startListening();
  while (!radio.available());
  radio.read(&buttonState, sizeof(buttonState));
  if (buttonState == HIGH) {
    digitalWrite(led, HIGH);
  }
  else {
    digitalWrite(led, LOW);
  }
}

Receptor:

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

#define button 4

RF24 radio(9, 10); // CE, CSN
const byte addresses[][6] = {"00001", "00002"};
Servo myServo;
boolean buttonState = 0;

void setup() {
  pinMode(button, INPUT);
  myServo.attach(5);
  radio.begin();
  radio.openWritingPipe(addresses[0]); // 00001
  radio.openReadingPipe(1, addresses[1]); // 00002
  radio.setPALevel(RF24_PA_MIN);
}

void loop() {
  delay(5);
  radio.startListening();
  if ( radio.available()) {
    while (radio.available()) {
      int angleV = 0;
      radio.read(&angleV, sizeof(angleV));
      myServo.write(angleV);
    }
    delay(5);
    radio.stopListening();
    buttonState = digitalRead(button);
    radio.write(&buttonState, sizeof(buttonState));
  }
}

El código no es mio, lo saque de la página HowToMecatronics, tan solo modificando los pines CE y CSN a los que yo usado. También cambien el pin "led" del emisor que en el programa estaba en el pin 12 y ya sabemos que eso es imposible puesto que es la señal MISO y lo cambié por 2.

Conecté obviamente el led, potenciometro y servo.

Subí el programa y no funcionó, me lo esperaba, así que empecé a ver donde podría estar el fallo, como no encontré nada volví a subir los dos primeros programas de emisor/receptor y me encontré que tampoco funcionaba.

Descarto una mala conexión, puesto que he utilizado la función printPrettyDetails de la libreria RF24 y me respone datos de información del chip.

¿Qué creéis que está pasando, alguna sugerencia?

La verdad ya no sé si es un problema software o hardware. Me pase por la documentación de la librería a ver si encontraba algo y en las "fallas comunes" encontré una serie de recomenaciones hardware.

La fundamental es que si estás utilizando un nRF24L01 con los apellidos "PA" y "LNA" se supone que hay un consumo máximo de 115mA en el modo transmitir. Se supone que el UNO tiene un regulador de 3.3V que proporciona hasta 150mA, pero puede ser que se quede corto.

Y luego recomiendan usar un condensador de 10uF en los pines de alimentación del nRF24L01.

Así que monté lo siguiente:

La alimentación la saqué de la protoboard con la placa de alimentación, uní los GND de ambas placas, lo puse en 3.3V y coloque el condensador.

En el receptor no toque nada puesto que le dejé el primer código y solo recibe por lo tanto el consumo no debe dispararse.

Pues nada, todo sigue igual. Chequé las conexiones una y otra vez y probe con varios condensadores de distinto valor con el mismo resultado.

Al final quité el alimentador de la protoboard y lleve los 3.3V del arduino a la
protoboard, para poder seguir usando el condensador y entonces salió funcionando... aunque perdiendo algún paquete por el camino.

Voy a ver si consigo algún nRF24L01 normal para hacer alguna prueba sin tener que usar alimentación externa, sobretodo en el receptor. Además como se trata de hacer un mando RC el receptor de momento no va enviar nada.

Ten cuidado con el proveedor de los nRF24. Obviamente te funcionan pero hay mucho fake y debes usar grupos de la misma partida. No digo para este problema.
Con los nRF24 que usan antena siempre hay toda una pelea para lograr hacerlos funcionar. Son mas susceptibles a problemas de alimentación y tal vez a caidas de tensión. Habría que ver el comportamiento con el osciloscopio. Seguramente lo has hecho y si no, puede que de alguna pista. Aunque muchos sugieren 10uF puede que no sean suficientes. Estoy especulando.

Precisamente de 10uF no tenía ninguno a mano e hice pruebas con varios valores (22, 100 y 470uF), con el mismo resultado. De hecho en el emisor probé también con un UNO original y clonico por si acaso.

Por tirar al aire a ver si suena:
Cuidado con eso, el sizeof("nodo1") es 6 dado que se añade un \0.
Saludos.

There is no address length parameter because this function will always write the number of bytes (for pipes 0 and 1) that the radio addresses are configured to use (set with setAddressWidth()). 

De la wiki de la libreria. No importa el tamaño, el cogerá solo los 5 bytes primeros y el resto lo obvia.

Es mas:

void setup() {
  const uint8_t s[5]="nodo1";
  Serial.begin(9600);
  Serial.print(sizeof(s))  ;
}
void loop() {

}

La salida es 5.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.