Difusión en nRF24L01 +

3

Puedo establecer un canal de comunicación entre dos nRF24L01 +. Pero una vez que pateo a un segundo oyente, solo uno de ellos recibe el mensaje. Curiosamente, siempre es lo mismo que "gana" en la situación en la que dos están escuchando. ¿Hay alguna forma de tener múltiples receptores (como una transmisión)?

Aquí está el código de recepción que estoy usando para el Arduino:

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

#define channel        0x4c                  // nrf24 communication channel
#define writingPipe    0xF0F0F0F0E1LL        // nrf24 communication address
#define dataRate       RF24_250KBPS          // nrf24 data rate (lower == more distance)
#define paLevel        RF24_PA_HIGH          // nrf24 power level (black ebay models have some problems with PA_MAX)

RF24 radio(8,7);

char receive_payload[33]; // +1 to allow room for a terminating NULL char

void setup(void) {
  Serial.begin(57600);
  printf_begin();

  radio.begin();
  radio.setPALevel(paLevel);
  radio.setChannel(channel);
  radio.openReadingPipe(0, writingPipe);
  radio.enableDynamicPayloads();
  radio.setDataRate(dataRate);
  radio.setAutoAck(false);
  radio.startListening();

  radio.printDetails();
}

void loop(void) {   
  // if there is data ready
  if (radio.available()) {
    uint8_t len;
    bool done = false;
    while (!done) {
      // Fetch the payload, and see if this was the last one.
      len = radio.getDynamicPayloadSize();
      done = radio.read(receive_payload, len);

      // Put a zero at the end for easy printing
      receive_payload[len] = 0;

      // Spew it
      printf("Got payload size=%i value=%s\n\r", len, receive_payload);
    }
  }

  delay(1000);
}
    

3 respuestas

6

Sí, puede hacer que varias unidades reciban el mismo mensaje de difusión (o multidifusión), si están configuradas para usar la misma dirección de recepción a la que los transmisores están enviando. (Y dentro del rango de curso).

Recuerde que cada una puede tener hasta 6 direcciones de recepción configuradas, por lo que una de las formas de usar el dispositivo es configurar una dirección de recepción que sea única para un dispositivo determinado, y una dirección de recepción que se comparte con otros dispositivos (por ejemplo, : todos los receptores, por lo que algunos subconjuntos de ellos). El transmisor puede enviar a un solo receptor utilizando su dirección única, oa todos los receptores del grupo utilizando la dirección compartida. ("Multidifusión" puede ser una descripción algo mejor, ya que va a varios receptores en este escenario, pero no es necesario que vaya a todos los receptores, ya que puede controlar el subconjunto de receptores utilizando una dirección compartida determinada).

Por supuesto, si está enviando un mensaje de multidifusión, no debe usar ACK, ya que varios receptores intentarán enviar sus paquetes de ACK aproximadamente al mismo tiempo, lo que colisionaría. (Además: dado que la estructura de paquetes definida por hardware no tiene una dirección de "fuente", la forma en que funciona el ACK de ShockBurst mejorado es que el receptor envía el paquete ACK a su propia dirección, y el transmisor debe estar configurado para recibir en la dirección que está De este modo, en la multidifusión, la dirección de un receptor dado (a la que enviará un ACK) es también la dirección de recepción compartida para los otros receptores. Entonces, ACK debe estar desactivado para multidifusión (como lo indica su código).

No hay suficiente información para responder por qué su configuración particular hace que solo un receptor acepte el paquete. Supongamos que tiene un transmisor T y dos receptores R1 y R2 (ambos con la misma dirección). R1 es el que "siempre gana". ¿Es esta la situación?    (R2 no funciona): R1 recibe de forma confiable de T    (R1 no funciona): R2 recibe de forma confiable de T    (R1, R2 operando): solo R1 recibe de T, R2 no

Es decir, agregar un R1 a la segunda situación hace que el R2 deje de recibir de T. ¿Se puede verificar esto iniciando la prueba de T a R2 en un bucle y luego, después de un tiempo, también enciendo R1, en qué punto se detiene R2? recepción; luego apague R1 y vea si R2 comienza a recibir nuevamente?

Si es así, sospecho que algún tipo de problema ACK está involucrado, o hay algún problema con el hecho de que R1 y R2 estén demasiado cerca con algún tipo de interferencia de RF o antena, o están en la misma fuente de alimentación y hay alguna interferencia entre ellos a través de la línea eléctrica.

La familia nRF24 es un poco sensible al poder; a veces es necesario colocar una tapa de filtro a través de la entrada de alimentación al módulo; Por ejemplo: un electrolítico de 10 uF (observando + y -). He solucionado los problemas de software o de configuración cuando mejoré la fuente de alimentación del nRF24L01 +.

    
respondido por el Zeph
3

Estaba teniendo el mismo problema y pasé muchas horas antes de encontrar la solución. Como ya se mencionó, deshabilite la activación automática y la retransmisión automática. Luego agrega un tubo de lectura 0 si aún no lo tienes. Estaba usando solo el tubo de lectura 1 y solo una de las radios normalmente recibía el mensaje. Luego agregué el tubo de lectura 0 (con una dirección ficticia) y, de repente, todo funcionó muy bien.

    
respondido por el pgibbons
1

Cada radio puede tener una dirección. Asigne a cada uno una dirección y haga que reciban la señal y luego pásenla a la siguiente radio. Consulte este sitio para obtener un código básico.

    
respondido por el NorseEngineering

Lea otras preguntas en las etiquetas