Buenas, de primeras perdón por la tardanza pero estuve ausente por covid, y muchas gracias por tus aportes.
Es mi primer post en el foro asique no se si recibiré respuesta en un post pasados tantos días pero voy a intentar explicarlo todo detalladamente aquí, allá voy.
Lo que intento conseguir es un riego automático mediante un sistema mono cable, en este, un Arduino Mega2560 situado en un cuadro eléctrico general dentro de un cabezal actuara como maestro y recibiría unas entradas mediante sus pines, dependiendo de que pin reciba debería actuar por modbus sobre diferentes relés situados en el campo, los cuales, al abrir o cerrar su contacto alimentaran solenoides para dar paso al agua.
Teniendo esto en mente compré una placa de 4 relés manejados por modbus (Relay Board-4 V1.2), con el siguiente código ya he conseguido actuar sobre esta placa modbus de relés para alimentar un solenoide con la librería "ModbusMaster" y el siguiente código:
#include <ModbusMaster.h> //utilizamos la libreria modbusmaster (añadir libreria en programa-añadir libreria).
#define MAX485_DE 2 //PIN utilizado para elegir modo receptor(LOW GND)/transmisor(HIGH VCC)
ModbusMaster node; //Definir objeto maestro.
void preTransmission()
{
digitalWrite(MAX485_DE, 1);
delay(10);
}
void postTransmission()
{
digitalWrite(MAX485_DE, 0);
delay(10);
}
void setup()
{
pinMode(MAX485_DE, OUTPUT);
// iniciar en modo receptor
digitalWrite(MAX485_DE, 0);
// Iniciamos comunicacion modbus 9600 baud rate.
Serial.begin(9600);
// Iniciamos puesto modbus ( ID del esclavo, puerto)
node.begin(1, Serial);
// Configuracion voids para pasar de receptor a transmisor
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
}
void loop()
{
//declalro variables para alojar la lectura.
int entrada1;
int entrada2;
int entrada3;
int entrada4;
//lecturas de entradas
int Mdelay = 15; // microdelay
node.readDiscreteInputs(0x0, 1); // node."funcion"(registro inicial, numero de registros)
Serial.print("[ENTRADA1] ");
entrada1 = node.getResponseBuffer(0); //Igualamos el valor de la respuesta buffer a la variable entrada1
Serial.print(entrada1);
delay(Mdelay);
node.clearResponseBuffer(); //limpiamos el valor del buffer para siguientes lecturas
Serial.print(" ");
node.readDiscreteInputs(0x1, 1);
Serial.print("[ENTRADA2] ");
entrada2 = (node.getResponseBuffer(0));
Serial.print(entrada2);
delay(Mdelay);
node.clearResponseBuffer();
Serial.print(" ");
node.readDiscreteInputs(0x2, 1);
Serial.print("[ENTRADA3] ");
entrada3 = (node.getResponseBuffer(0));
Serial.print(entrada3);
delay(Mdelay);
node.clearResponseBuffer();
Serial.print(" ");
node.readDiscreteInputs(0x3, 1);
Serial.print("[ENTRADA4] ");
entrada4 = (node.getResponseBuffer(0));
Serial.print(entrada4);
delay(Mdelay);
node.clearResponseBuffer();
Serial.print(" ");
//escribir salidas al leer entradas
if ( entrada1 == 1 ) {
node.writeSingleCoil(0x0, 1); // node."funcion"(registro, valor a escribir)
node.writeSingleCoil(0x3, 1);
}
else{
node.writeSingleCoil(0x0, 0);
node.writeSingleCoil(0x3, 0);
}
if ( entrada2 == 1 ) {
node.writeSingleCoil(0x1, 1);
node.writeSingleCoil(0x2, 1);
}
else{
node.writeSingleCoil(0x1, 0);
node.writeSingleCoil(0x2, 0);
}
}
Problemas:
1º- No encuentro forma de cambiar la dirección asignada a la placa de relés para utilizar varias de estas.
2º- Según comprendo la dirección del esclavo se elige en el setup haciendo
node.begin(1, Serial); //(ID, PUERTO)
y no se hasta que punto podría estar apuntando a diferentes direcciones en mitad del código.
3º- Creo que de la forma en la que actuó con esta librería no puedo hacerlo sobre otros arduinos como explico en la parte de abajo.
Habiendo hecho todo lo anterior decidí intentar hacer lo mismo pero en vez de usar placas de relés modbus, utilizar Arduinos UNO como esclavos,, estos solo deberían ser capaces de recibir un numero, ya sea de cualquiera de estas 2 formas:
1º- Que todos reciban el numero que se manda al mismo tiempo, por ejemplo un numero del 1 al 10 y yo haría que el Arduino 1 ejecute el código para abrir el solenoide si recibe un 1, el 2 si recibe un 2, etc..
2º- Direccionar de alguna forma cual es cada uno y mandarles constantemente un 0 o un 1 para que actúen o dejen de actuar sobre el solenoide.
Problemas:
1º- No consigo establecer conexión entre un Arduino MEGA2560 y un Arduino UNO utilizando modbus (si por serial) con el adaptador MAX485(ttl to rs484) y no logro encontrar un ejemplo de esta situación comunicando varios arduinos.
PD: No he entendido bien lo que me has dicho de asignar otros pines que no sean TX y RX, según los esquemas que he visto sobre la placa DI va conectado a TX y RO a RX para transformar la comunicación serial a RS485, y RE y DE deben alimentarse con HIGH para emisor y GND para receptor por lo que supongo que A5 y A6 son los que usa la librería para cambiar el estado de emisor a receptor. Al final mi conclusión es que tienes razón, esa librería esta hecha para los MKR1XXX y no me da buenos resultados.
igualmente, ¿Cómo podría cambiar la librería para probar si asignando bien los pines me sirve?
PD2: Respecto al comentario que me has hecho sobre
Serial.print("Failed to write coil! ");
la verdad que no se si seria un problema, ese código no es mío, ambos tanto emisor como receptor son los ejemplos que traía la librería en ejemplos.
Sigo con mi búsqueda pero me vendría genial que me pasasen algún ejemplo similar resuelto con éxito porque por el momento no he logrado encontrar ninguno que me sirva o alguna librería adecuada a los MAX485 o alguna que me sirviese para configurar los arduino UNO como receptores porque las que he ido probando no me dan buenos resultados.
Adjunto esquema de cableado de las placas MAX485 (el arduino Mega conectado como emisor, el arduino UNO conectado como receptor y las placas conectadas entre si A-A y B-B) y imagen de los dispositivos que he utilizado para realizar las pruebas que he mencionado.
Edito: No me deja subir la imagen que hice con el telefono de los aparatos.
Edito2: Me he dado cuenta de que todo el rato me estoy refiriendo a modbus lo cual implica tener registros prediseñados donde mandar o leer los datos y creo que esta un poco desacertado, lo que necesito es una comunicacion basica RS485 donde simplemente pueda mandar un valor a los distintos arduino UNO para que actuen en su codigo teniendo como condicion ese valor que les llega.

