Pregunta de tubería nRF24L01

9

Estoy mirando el código de ejemplo que se encuentra aquí . Sé que hay 6 tubos que el módulo nRF24L01 puede usar, pero he estado buscando en Internet las designaciones de dirección y no he podido encontrar nada. Más específicamente en la línea 37, ¿hay alguna referencia de dónde obtiene el autor 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL?

Gracias.

Alex H
fuente
1
¿Has mirado la hoja de datos de la radio IC? Eso ciertamente tiene más información sobre las direcciones de tubería.
1
Verifique el documento RF24 API openReadingPipe()aquí: maniacbug.github.io/RF24/… menciona que puede usar cualquier valor para el último byte de dirección.
jfpoilpret
Así que revisé la documentación pero no menciona cómo se elige la dirección de la tubería. Solo dice que deberían compartir los primeros 32 bits. Por ejemplo 0xF0F0F0F0 (XX), ¿0x cuenta como un byte? ¿O son F0F0F0F0 los 32 bits que importan? Además, ¿importa si no es F0F0F0F0 siempre que las tuberías compartan esos 32 bits? ¿Qué tal los dos últimos bytes significativos (XX)? ¿Son esos también arbitrarios?
Alex H
El 0x...prefijo es solo para decir que el valor está en hexadecimal. Esto se debe a que 99 en decimal es diferente de 99 en hexadecimal, aunque se vean iguales. Entonces, en su lugar, usamos 0x99.
Gerben
2
El código que está utilizando solo admite 1 tubería. El nRF24L01 tiene 2 tuberías únicas (0 y 1). También tiene 4 tuberías adicionales (2, 3, 4 y 5), donde solo puede establecer el byte menos significativo. Los otros bytes serán los mismos que la segunda tubería (1).
Gerben

Respuestas:

5

Como la mayoría de la gente ha publicado, los valores para la tubería son arbitrarios, pero deben seguir las reglas según la API:

Las tuberías 1-5 deberían compartir los primeros 32 bits. Solo el byte menos significativo debe ser único, p. Ej.

Antes de responder a su pregunta, creo que se necesita una explicación sobre los valores hexadecimales y decimales.

El hexadecimal de 40 bits es una representación numérica de la base 16. Un decimal es de la base 10. Por lo tanto, puede convertir un valor hexadecimal a decimal. Como esto está fuera del alcance de la pregunta, puede buscar en Google cómo convertir de uno a otro. Hay algunos convertidores en línea:

Conversor de hexadecimal a decimal

Cuando convierta el valor hexadecimal a decimal, verá que es solo una representación numérica. Cuando conviertes, sueltas el 0xy LL. Como se indicó, 0xindica que el valor es un valor hexadecimal y LLsignifica tipo Long Long .

Entonces, para responder a su pregunta, use el convertidor a para encontrar un número hexadecimal como:

F0F0F0F0A1
F0F0F0F0A2
F0F0F0F0B4
F0F0F0F0E9

Simplemente cambie los últimos 2 dígitos (bit menos significativo):

Pipes 1-5 should share the first 32 bits. Only the least significant byte should be unique, e.g.
   openReadingPipe(1,0xF0F0F0F0AA);
   openReadingPipe(2,0xF0F0F0F066);

Agregue el 0xyLL

0xF0F0F0F0A1LL
0xF0F0F0F0A2LL
0xF0F0F0F0B4LL
0xF0F0F0F0E9LL

Todo debería funcionar.

No soy un experto en hexadecimal, como estoy aprendiendo, así que si soy incorrecto, por favor, alguien me corrija.

Finalmente, la hoja de datos nRF24L01 señala que la elección de la dirección no es completamente arbitraria:

Nota: Las direcciones en las que el nivel cambia solo una vez (es decir, 000FFFFFFF) a menudo se pueden detectar en ruido y pueden dar una detección falsa, lo que puede dar una tasa de error de paquete elevada. Las direcciones como continuación del preámbulo (alternar entre alta y baja) también aumentan la tasa de error de paquete.

PhillyNJ
fuente
¿podría mencionar también que esas tuberías se refieren únicamente a la función "6 receptores múltiples de datos" (s. hoja de datos nórdica p39-40). de forma predeterminada, solo se habilitan las tuberías de datos 0 y 1.
@bersch - ¿Es eso relevante? El OP preguntaba cómo se eligen los valores de tubería where the author is getting 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL?, por ejemplo , no cómo se usan las tuberías.
PhillyNJ
Para elegir los valores, debe saber que, de forma predeterminada, hay un tubo de escritura y un tubo de lectura. En el modo multireceptor hay una escritura y hasta 5 tubos de lectura. Usted describe solo los tubos de lectura. Hasta ahora no lo he comprobado, pero creo que si uno elige la tubería de lectura y escritura que comparte los primeros 32 bits, fallará.
Según mis pruebas, los valores son arbitrarios siempre que su tubería 0 y 1 sean los mismos en el transmisor y el receptor
PhillyNJ
Veo. Por mi parte, no verifiqué la función de múltiples receptores. Yo uso cada chip para transmitir y recibir.
2

Los valores 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LLson valores arbitrarios y definen las direcciones de los remitentes y receptores con quienes hablar.

Si usas la biblioteca Mirf

Mirf.setRADDR((byte *)"serv1");

también pueden ser cadenas como serv1.

RF24 usos

write_register(RX_ADDR_P0, &value, 5);
write_register(TX_ADDR, &value, 5);

fuente
1

Hay algo que todos olvidan decirte:

Las tuberías en el receptor deben acortarse después de la primera.

const uint64_t pipe01 = 0xE8E8F0F0A1LL;
const uint64_t pipe02 = 0xA2LL;  
const uint64_t pipe03 = 0xA3LL;
const uint64_t pipe04 = 0xA4LL;
const uint64_t pipe05 = 0xA5LL;
const uint64_t pipe06 = 0xA6LL;

radio.openReadingPipe(1, pipe01);  
radio.openReadingPipe(2, pipe02);
radio.openReadingPipe(3, pipe03);
radio.openReadingPipe(4, pipe04);
radio.openReadingPipe(5, pipe05);

Las tuberías en el transmisor deben estar

const uint64_t pipe01 = 0xE8E8F0F0A1LL;
const uint64_t pipe02 = 0xE8E8F0F0A2LL;  
const uint64_t pipe03 = 0xE8E8F0F0A3LL;
const uint64_t pipe04 = 0xE8E8F0F0A4LL;
const uint64_t pipe05 = 0xE8E8F0F0A5LL;
const uint64_t pipe06 = 0xE8E8F0F0A6LL;

uint64_t setPipeToSend = pipe01; // or pipe02 or pipe03 or pipe04 or pipe05
radio.openWritingPipe(setPipeToSend );

Si desea saber qué mensaje de la tubería ha llegado, use

  uint8_t someVariable;
    if (radio.available(&someVariable))
    {
       Serial.print("pipe number ");
       Serial.printLn(someVariable);
    }

También la tubería número 6 se usa para recibir mensajes de confirmación .

Además, el código de inicialización debe tener radio.enableDynamicPayloads(); Este me funciona bien:

    radio.begin();
    //radio.setChannel(0x57); //if set should be the same at the both sides
    radio.setPALevel(RF24_PA_LOW);  // "LOW" is more stable mode
    radio.enableAckPayload(); //for autoanswers
    radio.openWritingPipe(pipe01); //for sending
    //link pipe numbers to the pipe addresses
    //radio.openReadingPipe(1, pipe01); // I use pipe01 for sending
    radio.openReadingPipe(2, pipe02);
    radio.openReadingPipe(3, pipe03);
    radio.openReadingPipe(4, pipe04);
    radio.openReadingPipe(5, pipe05);
    radio.enableDynamicPayloads(); //must have for multi pipe receiving
    radio.startListening();  //start listening

Buena suerte...

Faig
fuente
¿ pipeQué se define en tu ejemplo?
x29a
1
He editado el código. Puede usar cualquiera de estos 'tubos' para enviar, pero no olvide (como yo) excluir ese tubo de la lectura.
Faig