Diferencia entre revisiones de «Grupo HotPlug»

De Proyecto Butiá
Saltar a: navegación, buscar
Línea 57: Línea 57:
  
  
[[Archivo:probando3.jpg|left| 600px]]
+
[[Archivo:probando3.jpg|600px]]
  
 +
 +
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''.
 +
Incluimos el código de dicha función.
 +
 +
<source lang="c">
 +
void Conector::update_config () {
 +
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);
 +
  switch (id) {
 +
    case 3:                                                      // NADA     
 +
      pinMode (pin_dig0, INPUT);
 +
      pinMode (pin_dig1, INPUT);
 +
      type = 0;
 +
      subtype = 0;
 +
      break; 
 +
    case 2:                                                      // sensor analógico     
 +
      pinMode (pin_dig0, INPUT);
 +
      pinMode (pin_dig1, INPUT);
 +
      digitalWrite (pin_dig0, HIGH);            // activa los pull-ups
 +
      digitalWrite (pin_dig1, HIGH);            // activa los pull-ups
 +
      type = 1;
 +
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);
 +
      break;       
 +
    case 1:                                                      // sensor analógico c/pin de control     
 +
      pinMode (pin_dig0, OUTPUT);
 +
      pinMode (pin_dig1, INPUT);
 +
      digitalWrite (pin_dig1, HIGH);            // activa los pull-ups
 +
      type = 2;
 +
      subtype = digitalRead (pin_dig1);
 +
      break;
 +
    case 0:                                                    // sensor o actuador digital
 +
    { 
 +
      int analog_id = analogRead (pin_analog); 
 +
      byte i;
 +
      for (i=0; i<NUM_VALORES; i++) {
 +
          if (abs(analog_id-values[i]) <= TOLERANCIA) {break;}
 +
      }
 +
      switch (i) {
 +
        case 0: case 1: case 2: case 3: case 4:
 +
          pinMode (pin_dig0, INPUT);
 +
          pinMode (pin_dig1, INPUT);
 +
          type = 3;                                            // sensor digital
 +
          subtype = i;
 +
          break;       
 +
        case 5: case 6: case 7: case 8:
 +
          pinMode (pin_dig0, OUTPUT);
 +
          pinMode (pin_dig1, INPUT);
 +
          type = 4;
 +
          subtype = i-5;
 +
          break;
 +
        case 9: case 10: case 11: case 12:
 +
          pinMode (pin_dig0, OUTPUT);
 +
          pinMode (pin_dig1, OUTPUT);
 +
          type = 5;                                            // sensor digital c/pin de control
 +
          subtype = i-9;
 +
          break;
 +
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual
 +
          pinMode (pin_dig0, INPUT);
 +
          pinMode (pin_dig1, INPUT);
 +
          type = 0;
 +
          subtype = 0;
 +
          break; 
 +
      } 
 +
    }
 +
  }
 +
</source>
 +
 +
 +
 +
 +
[[Archivo:probando4.png|600px]]
  
  

Revisión del 18:38 18 nov 2011

Integrantes:

  • Juan La Cruz
  • Sofía Maiolo
  • Mathias Battistella


Tema elegido:

Firmware + Software : soporte HotPlug.

Objetivos:

Que la actualización de los módulos de usuario y drivers del Butiá sea "on the fly" es decir, dinámico. Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.


Documentación:

  • En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido


for (k=0; k<NUM_CONNECTORS; k++)
{ 
   if (conector[k].get_type() != 0) 
        {add_module(k) }; 
}
  • Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:


api.hot_plug = {}
api.hot_plug.parameters = {} -- no se envian parámetros
api.hot_plug.returns = {} --nos devuelve el estado de los conectores
api.hot_plug.call = function ()
	device:send(HOT_PLUG) --envío el código de operación
	
end

Pruebas realizadas:

  • Ahora estamos probando nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien.

Los desconectamos, llamamos a nuestra operación y al INIT. Sin embargo, al usar el comando LIST, los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada

Probando.jpg



Probando2.png



Probando3.jpg


Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada update_config (). Incluimos el código de dicha función.

void Conector::update_config () {
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);
  switch (id) {
    case 3:                                                      // NADA       
      pinMode (pin_dig0, INPUT); 
      pinMode (pin_dig1, INPUT);
      type = 0;
      subtype = 0;
      break;   
    case 2:                                                      // sensor analógico       
      pinMode (pin_dig0, INPUT); 
      pinMode (pin_dig1, INPUT);
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups
      type = 1;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);
      break;         
    case 1:                                                      // sensor analógico c/pin de control       
      pinMode (pin_dig0, OUTPUT); 
      pinMode (pin_dig1, INPUT);
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups
      type = 2;
      subtype = digitalRead (pin_dig1);
      break;
    case 0:                                                     // sensor o actuador digital
    {  
      int analog_id = analogRead (pin_analog);   
      byte i;
      for (i=0; i<NUM_VALORES; i++) {
          if (abs(analog_id-values[i]) <= TOLERANCIA) {break;}
      } 
      switch (i) {
        case 0: case 1: case 2: case 3: case 4:
          pinMode (pin_dig0, INPUT); 
          pinMode (pin_dig1, INPUT);
          type = 3;                                             // sensor digital
          subtype = i;
          break;        
        case 5: case 6: case 7: case 8:
          pinMode (pin_dig0, OUTPUT); 
          pinMode (pin_dig1, INPUT);
          type = 4;
          subtype = i-5;
          break;
        case 9: case 10: case 11: case 12:
          pinMode (pin_dig0, OUTPUT); 
          pinMode (pin_dig1, OUTPUT);
          type = 5;                                            // sensor digital c/pin de control
          subtype = i-9;
          break;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual
          pinMode (pin_dig0, INPUT); 
          pinMode (pin_dig1, INPUT);
          type = 0;
          subtype = 0;
          break;   
      }  
    }
  }



Probando4.png



Referencia:

http://linux-hotplug.sourceforge.net/