Controlar funcionamiento de un Arduino con otro.
Para afrontar un proyecto grande con Arduino hay un tema que nos puede preocupar, sobretodo si este proyecto va a controlar algun dispositivo que puede ser crítico. Y es la posibilidad de que nuestro Arduino se nos quede bloqueado.
Esto se puede deber a varios motivos, se quede sin memoría, sobrecalentamiento, etc ... lo que hay que tener presente principalmente es que no se llegue a este estremo teniendo una programación correcta y haciendo un buen número de pruebas y trazas de funcionamiento.
Si pese a este trabajo vemos que puede ser crítico que se nos pueda quedar bloqueado nuestro Arduino, por ejemplo si controla una bomba de agua, un termostato de la calefacción, etc ... lo que podemos implementar es una especie de alta disponibilidad muy simple. En realidad no es alta disponibilidad pero sí un mecanismo de seguridad de forma que si nuestro Arduino se queda bloqueado es reinicido.
Para llevar a cambo esta implementación existen varias opciones pero la que yo he adoptado es la de poner un Arduino más simple y pequeño de manera que testee en que estado se encuentra nuestro Arduino principal y en caso de que no responda lo reinicie.
Esto que en teoría puede parecer complicado, es muy sencillo y facild e implementar. Para este ejemplo he utilizado 2 Arduino Nano. Los conectamos de la siguiente manera:
Arduino Master
|
Arduino Esclavo
|
5V
|
5V
|
GND
|
GND
|
D5
|
RST
|
D2
|
D2
|
D10
|
D10
|
El mecanismo de testeo es sencicllo, el Arduino Master envía una señal por una salida digital, y espera un tiempo a que el Arduino Esclavo responda por otra salida digital. Este algoritmo es simple, se puede mejorar pidiendole al Arduino Esclavo varíe la señal de respuesta en función de la señal de entrada, eso ya queda a gusto de cada uno.
Uan vez tngamos los 2 Arduinos convenientemente conectados, cargamos en cada uno de ellos los sketch que les correspondan:
// Monitorización Arduinos ***MASTER*** // Conectamos los Arduino entre si: // GND -> GND // 5V -> 5V // D5 -> RST // D2 -> D2 // D10 -> D10 // Podemos utilizar otras salidas digitales distintas // http://arubia45.blogspot.com.es/ // Constates, definición de las entradas/salidas const int myReset = 5; const int myRead = 2; const int myWrite = 10; // Tiempo de Espera de la Respuesta const int Valor_Espera = 100; void setup() { pinMode(myReset, OUTPUT); pinMode(myRead, INPUT); pinMode(myWrite, OUTPUT); Serial.begin(9600); digitalWrite(myWrite, LOW); digitalWrite(myReset, HIGH); } // Función de Reset void resetea() { Serial.println("Enviar Reset"); digitalWrite(myReset, LOW); digitalWrite(myReset, HIGH); } int i; void loop() { delay(1000); digitalWrite(myWrite, HIGH); Serial.print ("Esperando respuesta"); for (i=1; i < Valor_Espera; i++) { Serial.print("."); delay(100); if (digitalRead(myRead)== HIGH) { Serial.println("Recibido"); break; } } Serial.println(i); if (i== Valor_Espera) resetea(); else digitalWrite(myWrite, LOW); }
// Monitorización Arduinos ***ESCLAVO*** // Conectamos los Arduino entre si: // GND -> GND // 5V -> 5V // RST -> D5 // D2 -> D2 // D10 -> D10 // Podemos utilizar otras salidas digitales distintas // http://arubia45.blogspot.com.es/ // Constates, definición de las entradas/salidas const int myRead = 10; const int myWrite = 2; void setup() { pinMode(myRead, INPUT); pinMode(myWrite, OUTPUT); Serial.begin(9600); digitalWrite(myWrite, LOW); } void loop() { delay(100); if (digitalRead(myRead)== HIGH) { delay (200); Serial.println ("Enviando respuesta"); digitalWrite(myWrite, HIGH); delay(200); digitalWrite(myWrite, LOW); } else Serial.println ("No recibiendo");
Hay que tener en cuenta que hemos conectado las tierras GND y la alimentación 5V por lo que sólo habrá que alimentar a uno de ellos por USB para que funcione o bien utilizar otro tipo de alimentación externa pero siempre común.
Ejemplo Master
Ejemplo Esclavo
muy bueno muchas gracias por compartir
ResponderEliminarMuy interesante y útil. No lo he probado, pero puede hacernos falta.
ResponderEliminarGracias y felicitaciones por tu página.
Este comentario ha sido eliminado por el autor.
ResponderEliminarHola soy Fco Javier, es de mis primeras veces que comento en un foro. Tengo la intención de montar un Arduino para medir el pH y controlarlo con unas electrovalvulas que suministran CO2. Tengo ya unas sondas de la marca Hanna y hasta hace poco un controlador de la misma marca, pero por temas de humedad se me ha estropeado y reponerlo vale un pastor, más de 300 euros. Por lo que busco una alternativa más económica. Un amigo me comentó que los Arduinos podrían ser mi solución. No tengo mucha idea de este mundo, por lo que estaré agradecido con cualquier aporte.
ResponderEliminarMuchas gracias ante todo. :)
Hola, utilizar un Arduino es sin duda una alternativa más económica pero mucho más trabajosa. Te recomiendo que utilices un Arduino Mega para realizar este controlador.
EliminarUn saludo.