Estoy trabajando con la librería RF24Mesh de TMRh20 para comunicar varios nodos NRF24L01. La comunicación entre nodo maestro (ID 0) y nodo hijo (ID 1) funciona sin problemas cuando están conectados directamente, se recibe el mensaje completo sin importar el tamaño.
El inconveniente aparece cuando intento usar un nodo repetidor/intermedio para ampliar el alcance: al principio los datos comienzan a transmitirse, pero después de un tiempo dejan de llegar al maestro, o simplemente no se recibe nada. En el monitor serie se observa que los nodos reciben su dirección y que al inicio hay tráfico, pero luego la recepción se detiene sin errores evidentes.
Haciendo varias pruebas para ir descartando todos los posibles problemas me encuentro que cuando envío un dato pequeño este se recibe sin problema alguno pasando por el repetidor, entonces si el problema es el tamaño del payload que mando, como podría solucionarlo?
Adjunto código de cada nodo junto con la estructura de datos que ocupo mandar.
El nodo repetidor y el nodo padre están con un Arduino uno y el nodo hijo es un Arduino Mega
void setup() {
Serial.begin(115200);
while (!Serial) {
// some boards need this because of native USB capability
}
// Set the nodeID to 0 for the master node
mesh.setNodeID(0);
Serial.println(mesh.getNodeID());
// Set the PA Level to MIN and disable LNA for testing & power supply related issues
radio.begin();
radio.setPALevel(RF24_PA_MAX, 0);
// Connect to the mesh
if (!mesh.begin()) {
// if mesh.begin() returns false for a master node, then radio.begin() returned false.
Serial.println(F("Radio hardware not responding."));
while (1) {
// hold in an infinite loop
}
}
}
Tu usas esto
// Conectar al Mesh
if (!mesh.begin(110, RF24_250KBPS)) {
Entiendo que a la mas baja velocidad tienes menos errores y mas alcance pero el 110 fija el canal de radio a uno específico y mi pregunta es si has verificado que es el que menos interferencia tenga, ese podría ser tu problema.
Hay un código que analiza los canales, vuelve a correrlo y verifica la situación con el 110.
Sí de echo eso es lo que quería hacer al poner el 110, fijar un canal para estar fuera del rango del wifi en teoría. Al estar probando lo que me dijo cambié el:
if (!mesh.begin(110, RF24_250KBPS)) {
Por:
if (!mesh.begin()) {
Y ya funciona correctamente.
Aunque me parece raro ya que igual revisé el código que analiza los canales y esto fue lo que me arrojó
Gracias por la respuesta, logré resolverlo, solo tengo una pequeña duda, revisando la documentación me doy cuenta que están los métodos renewAddress() ycheckConnection()
Estos sirven para que si un nodo se mueve de posición o un nodo hijo se desconecta busque la manera de reconectarse a la red, solo que lo he estado probando pero no logro que haga esa función, si el nodo repetidor se queda sin energía y luego vuelve a tener, este sí se conecta al nodo padre, pero el nodo hijo ya no se conecta al nodo repetidor, sabría cual puede ser el problema?
Este es el código que está en el nodoHijo
if (!mesh.checkConnection()) { //Comprueba la conectividad de este nodo con la red Mesh, devuelve 1 si está conectado y 0 si no lo está.
//Actualiza la dirección de la red
Serial.println("Renovando la dirección");
delay(1000);
if (mesh.renewAddress() == MESH_DEFAULT_ADDRESS) { //Si no se puede reconectar, el método devuelve MESH_DEFAULT_ADDRESS, indicando que no se pudo reconectar
//En ese caso, se reinicia la conexión Mesh con mesh.begin() para intentar recuperar la conexión desde cero.
mesh.begin();
}
}
Cada nodo obtiene una dirección dinámica del master.
Los hijos creo que no recuerdan a su nodo padre, sino que en cada reconexión deben volver a pedir su dirección.
Si un repetidor se cae, los hijos que dependían de él quedan aislados hasta que se vuelvan a registrar en la malla (mesh).
Entonces:
Tu nodo repetidor se conecta al padre.
El hijo todavía tiene la dirección en memoria, pero como la dirección puede no ser válida entonces falla.
Entonces checkConnection() devuelve falso y renewAddress() a veces no puede reconectar porque sigue pensando que la direccón es válida aunque no lo es.
Qué hacer?
Meté un reset mas fuerte de la red mesh usando mesh.update()