Páginas

lunes, 18 de marzo de 2013

Controlar funcionamiento de un Arduino con otro



 

  

 

 

 

 

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 

5 comentarios:

  1. muy bueno muchas gracias por compartir

    ResponderEliminar
  2. Muy interesante y útil. No lo he probado, pero puede hacernos falta.

    Gracias y felicitaciones por tu página.

    ResponderEliminar
  3. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  4. Hola 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.

    Muchas gracias ante todo. :)

    ResponderEliminar
    Respuestas
    1. 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.

      Un saludo.

      Eliminar