MKR 1010 y NRF24L01 comportamiento extrañó

Hola y buen día,

Quería presentarles un problema que llevo varios días dando vuelta y después de investigar en varios foros no consigo encontrar una solución.

Tengo dos Arduino nano conectados a sus respectivos NRF24l01, estoy usando los ejemplos "MultiCeiverDemo" que vienen en la librería de TMRh20 (v1.4.1). El único cambio que le hice a los ejemplos es el siguiente:

El que funciona como receptor (una línea).

struct PayloadStruct
{
  unsigned long nodeID;
  **float payloadID;   <--------------------------------------------------  "unsigned long" por "float"**
};
PayloadStruct payload;

El que funciona como transmisor (dos líneas)

struct PayloadStruct
{
  unsigned long nodeID;
  **float payloadID;  // <--------------------------------------------------  "unsigned long" por "float"**
};
PayloadStruct payload;
void loop() {

  if (role <= 53) {
    // This device is a TX node

    unsigned long start_timer = micros();                    // start the timer
    bool report = radio.write(&payload, sizeof(payload));    // transmit & save the report
    unsigned long end_timer = micros();                      // end the timer

    if (report) {
      // payload was delivered

      Serial.print(F("Transmission of payloadID "));
      Serial.print(payload.payloadID);                       // print payloadID
      Serial.print(F(" as node "));
      Serial.print(payload.nodeID);                          // print nodeID
      Serial.print(F(" successful!"));
      Serial.print(F(" Time to transmit: "));
      Serial.print(end_timer - start_timer);                 // print the timer result
      Serial.println(F(" us"));
    } else {
      Serial.println(F("Transmission failed or timed out")); // payload was not delivered
    }
**payload.payloadID = 99.99;    // <-----------  "payload.payloadID++" por  "payload.payloadID= 99.99"**

el resultado se muestra correctamente el el monitor

El problema acontece cuando cambio uno de los Arduino nano, por ya sea un MKR WIFI 1010 o MKR 1400 (son los que tengo pero sospecho me pasaría con cualquier MKR). el resultado es:

el hecho de mandar la variable como float deja de ser reconocida con el MKR, cabe aclarar que si dejo el ejemplo original (con unsigned long) el receptor MKR si recibe un valor, pero este no es el correcto. Aquí el monitor con el código original:

Ya había encontrado una publicación de alguien que reporto algo parecido, pero sin respuesta. este es el link: https://forum.arduino.cc/t/mkr-1010-with-nrf-problems/882817

¿Alguna idea que pueda probar? ya he probado con receptores con su capacitor de 10microF, he probado con receptores en su adaptador de 5v (como el de la imagen). Igual mencionar, tengo conmigo unos 12 transmisores, ya pobre todos y el problema es el mismo (haciendo todo tipo de combinaciones), tengo de los normales y los que tienen antena integrada. Los ajustes al ejemplo original son únicamente lo que menciono arriba (y bueno, también ajuste la parte donde se definen los Pines para CE y CSN que tiene que ajustarse para cada placa). ¿Es posible que la librería no sea compatible?

adaptador

como nota adicional, tengo tres tipos de respuesta por parte del MKR, como mencione he probado muchos receptores, algunos de ellos me dan "ovf", como el de la imagen de arriba, otros me da 115 (cuando el valor que estoy transmitiendo es 99.99) y solo uno de ellos me oscila entre el valor correcto 99.99 y 115, lo cual solo me deja mas confundido.

Ojala alguien de ustedes ya haya tenido ese problema y pueda orientarme. Saludos.

Buscando tu ejemplo encontré este Multiceiver_demo.ino

struct PayloadStruct {
   unsigned long nodeID;
  unsigned long payloadID;
 };
PayloadStruct payload;

Eso es lo que encuentro no como has puesto **float palyloadID
Esto es un puntero a puntero, que al verlo me pareció muy raro.

El Role se cambia con R o T qeu supongo lo haces pq te ha funcionado.
Que nRF24 estas usando espero que sean los nRF24L01+ y no los que llevan antena.
Espero tu respuesta.
PD: tranquilo si las preguntas te resultan obvias es para ir comprendiendo el problema.

Hola Surbyte, gracias por tu respuesta, el "**float palyloadID" en realidad en mi código es solo "float palyloadID" sin los **, creo al momento de editar con la opción de BOLD me puso los **, creo estuvo mal, pero el caso es que efectivamente lo estoy usando como mencionas, solo "float palyloadID" y no con "**float palyloadID". Sobre los NRF, he probado ambos, mismo resultado (he probado ambos y en muchas combinaciones tambien). Y al MKR le pongo role = R y al nano le pongo entre 0 y 5.

disculpa, es "unsigned long payloadID;" mismo, de hecho la tercera imagen del monitos serial es justamente el ejemplo original (usando unsigned long payloadID;)

Bueno, he investigado el tema y ya comprendí donde esta el problema.
Las librerías de TMRh20 fueron hechas para AVR no para MKR que usa SAM, entonces hay que reescribir algunas partes.

Mira este link y modifica las librerías.
NRF24l01+ on MKR1000
He visto varios hilos preguntando por esto y que han quedado inconclusos. La mayoria los he respondido yo pero sin entender de que se trataba y al no tener un MKR nunca terminé de comprender el inconveniente.

Hola, Muchas gracias por tu ayuda, al final pude resolverlo y esta relacionado al link que compartiste.

Lo primero que hice fue actualizar a la ultima versión de la librería de TMRh20, tenia la 1.3.12, así que me instale la 1.4.1 pero esta ultima efectivamente no era compatible, no me dejaba copilar el programa (al menos la 1.13.12 no daba errores al cargar el skect). Bueno, actualizando la versión de la librería tuve que comentar una parte del archivo RF24_config, no se si es lo mas correcto, pero después de eso me dejo copilar el programa.

to ArduinoCore-sam (Due core) in 2013
            #endif
/*
            // Since the official arduino/ArduinoCore-samd repo switched to a unified API in 2016,
            // Serial.printf() is no longer defined in the unifying Arduino/ArduinoCore-API repo
            #if defined (ARDUINO_ARCH_SAMD) && !defined (ARDUINO_API_VERSION)
                // likely using the adafruit/ArduinoCore-samd repo
                #define printf_P Serial.printf
            #endif // defined (ARDUINO_ARCH_SAMD)
*/
            #ifndef pgm_read_byte
                #define pgm_read_byte(addr) (*(const unsigned 

Una vez echo esto, los receptores empezaron a funcionar mucho mejor, recuerda que había comentado que solo uno de ellos me daba la lectura correcta (aunque de vez en vez daba otro valor), bueno con esta nueva librería la mayoría de ellos mejoro.

Aunado a eso, me llegaron 2 receptores nuevos (comprados en Mercado Libre). Estos nuevos receptores los acabo de probar y están funcionando bien, no han dado ningún problema con los datos recibidos (los he tenido por mas de 8horas trabajando), entonces no se si además de la compatibilidad de la librería con el MKR, tenga algo que ver el fabricante. ¿Existe algún lugar donde pueda comprar módulos originales (no se si es la palabra correcta)?

Nota: los otros módulos que tengo, aunque funcionan mejor, siguen recibiendo de vez en cuando valores errados (deje el MKR 1010 con el receptor nuevo) y tengo el MKR 1400 para pruebas con los receptores viejos.

saludos

Quiero comentarte además que hemos descubierto que debes comprar siempre tus transceptores (perdona que te corrija pero no son receptores solamente, porque tmb son transmisores) en el mismo lugar y asegurarte que sean legítimos.
Hay clones y los clones funcionan entre ellos si es que funcionan.
Mucho cuidado, siempre compra un par, prueba y si funcionan con los tuyos entonces los que necesites.
Hay un hilo donde se habla de los códigos de estos dispositivos. Mas que nada en los que tienen antena.

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