Lo mismo arreglo un cachivache, que fabrico un chirimbolo.
 RSS 2.0 

Posts filed under 'Domótica'

Anemousemeter (I)

Por fin me pongo en marcha con este proyecto tan completito y a la vez tan inútil que llevo meses intentando empezar.
Voy a fabricarme un anemómetro digital casero con la sana intención de medir el viento reinante en la zona donde vivo y sopesar si merece la pena montarme un generador eólico de “pinipon“, que por supuesto también estaría amparado bajo la filosofía del HUM.
Anemómetro de cazoletas
Mi primera idea era la que suele aparecer en todos los sitios en los que te explican como construir un anemómetro casero de cazoletas. Al conjunto rotatorio que forman las 3 cazoletas con el rodamiento se le incorpora un imán que al pasar por el sensor de efecto hall cierra un circuito que permite contabilizar una vuelta. Si calculas las vueltas por segundo ya tienes una medida de velocidad base que comparar con la velocidad del viento.
Es algo relativamente sencillo pero tiene un problema. No mide la dirección del viento. Se necesita una veleta adicional para medirlo.

Veleta
Para construir una veleta también había varias opciones, las mas simples con 8 sensores magnéticos como el comentado antes te permitían saber -mas o menos- la dirección del viento de entre 8 posibilidades. Bastante patético.
Sin embargo la aproximación mas directa era la del potenciómetro. Un potenciómetro rotativo al que se le incorporaba la veleta, va quedando siempre en una posición determinada dependiendo de la dirección en que sopla el viento. Para cada posición la resistencia ofrecida por el potenciómetro es distinta por lo que mediante un simple conversor analógico digital de resolución suficiente podemos obtener un amplio abanico de valores que nos indiquen la dirección exacta del viento.
Desde luego parece la mejor solución si no fuera porque los potenciómetros normales que existen en el mercado no superan en el mejor de los casos los 270º de giro, por lo que siempre quedaría una zona muerta de 90º en la que no podríamos medir el viento.
Por supuesto hay potenciómetros de 360º, incluso los hay sin tope para que puedan girar locos, pero su precio en España es mayor que el de un kit de veleta completo comprado en USA, y yo, además de pasarlo bien haciendo inventos, espero también que no me arruine con ellos.

Seguí investigando y leyendo sobre el tema hasta que di con un curioso invento: un anemómetro que combina en el mismo aparato la captación de la velocidad y dirección del viento. Se llama Rotorvane Anemometer y hasta hace unos años vendían un kit para hacértelo tu mismo. Ahora RayMarine les ha comprado la patente y ya no se puede ver libremente que tecnología usan, aunque explican a grandes rasgos como funciona el invento.
Anemómetro Rotorvane
Se trata de un anemómetro de cazoletas tradicional en el que una de sus cazoletas tiene una asimetría aerodinámica con respecto a las otras dos. Esto hace que a una velocidad de viento constante, la velocidad angular del conjunto varíe en determinado momento de cada giro dependiendo de por donde sopla el viento. Es decir, existe una diferencia entre la velocidad media del conjunto y la velocidad instantánea en algún punto de cada giro. Si sabes en que punto del giro se produce esa diferencia, sabes de donde viene el viento. Enrevesado, pero muy inteligente.
Afortunadamente el mundo esta lleno de frikis y James Derrick, que hizo el proyecto en 1999 (no ha llovido ni na), lo documentó de manera escueta, lo que me permite entender un poco mejor cuales son los pasos a seguir.

Lo que se me ocurrió a continuación fue fantástico y constata que tengo algún tipo de fijación con los ratones de ordenador. El principio por el que funcionan los ratones de bola es que un disco con perforaciones pasa por delante de un puente óptico que al ser interrumpido se interpreta como movimiento. Un ratón es capaz de dar distancia recorrida en 2 ejes mediante este principio y ademas el sistema es circular, así que me bastaría acoplar un disco perforado y engancharlo al sensor óptico de un ratón para que la circuitería del mismo me fuese diciendo el movimiento que realiza el rotor del anemómetro. La información me llegaría por el puerto PS/2 y un programa podría calcular la velocidad a partir de esos datos.
Prueba con ratón
Así que me puse manos a la obra para hacer alguna pequeña prueba. Desmonté el ratón, enganché la rueda dentada al rodamiento y la uní a un pequeño motor de DC mediante una goma de transmisión, conecté el motor a la línea de 5V de mi fuente de alimentación de pruebas intercalando un potenciómetro para controlar la velocidad de giro y conecté el cable al puerto PS/2 de mi servidor Linux.
En el servidor hice un pequeño programa en C que abre el /dev/psaux y se pone a leer de el. Ayudandome de la información que encontré en la página de Computer-Engineering he podido configurar el ratón para que actúe a la máxima capacidad de muestreo (200 muestras por segundo) y máxima resolución (8 counts por mm) y me ha permitido saber para que sirven cada uno de los 4 bytes que envía el ratón en cada muestreo. El programa acumula todos los movimientos que le llegan del eje Y y va calculando la velocidad media cada segundo.

#include <stdio .h>
#include <sys /time.h>
#define TRUE 1
#define FALSE 0

int main (int argc, char *argv[])
{
  FILE *pfile;
  char data[4];
  int end=FALSE;
  long acumulado=0L;
  struct timeval starttime, endtime, diff;
  long elapsed, totaltime=0;
  double  velocidad, vmax=0;

  pfile = fopen(“/dev/psaux”, “r+”);

  // Set sampling rate a 200                                                                                                                                                     
  fputc(0xF2, pfile);
  printf(“Preguntando por el device id, respuesta: 0x%x 0x%x\n, fgetc(pfile), fgetc(pfile));
  fputc(0xF3, pfile);
  printf(“Cambiando el sample rate, respuesta: 0x%x\n, fgetc(pfile));
  fputc(200, pfile);
  printf(“Cambiado el sample rate a 200, respuesta: 0x%x\n, fgetc(pfile));

  fputc(0xE8, pfile);
  printf(“Cambiando la resolucion, respuesta: 0x%x\n, fgetc(pfile));
  fputc(0×03, pfile);
  printf(“Resolucion, a 8count/mm respuesta: 0x%x\n, fgetc(pfile));

  gettimeofday(&starttime, NULL);
  elapsed = 0;
  while(! end)
  {
    data[0] = fgetc(pfile)// Info de los botones y desbordamientos
    data[1] = fgetc(pfile)// Incrementos del eje X
    data[2] = fgetc(pfile)// Incrementos del eje Y
    data[3] = fgetc(pfile)// Incrementos del eje Z (wheel)
    acumulado += data[2];

    gettimeofday(&endtime, NULL);
    timeval_subtract(&diff, &endtime, &starttime);
    elapsed += diff.tv_usec;
    starttime = endtime;

    if(elapsed>=1000000)
    {
      velocidad = (double)acumulado / (double)elapsed;
      if (vmax < velocidad ) vmax = velocidad;
      totaltime +=elapsed;
      elapsed = 0;
      acumulado = 0;
      printf(“Velocidad = %f t/s  Max:%f t/s  Tiempo de medicion: %f s\n, velocidad*1000000, vmax*1000000, (float)(totaltime / 1000000));
      printf(“          = %f km/h \n, velocidad * 1000000 * 9 * 0.0174 * 0.8 * 3600 / 100000 );
    } 
  }
  fclose(pfile);

}

/* Subtract the `struct timeval’ values X and Y,                                                                                                                                 
        storing the result in RESULT.                                                                                                                                             
        Return 1 if the difference is negative, otherwise 0.  */

     int
     timeval_subtract (result, x, y)
     struct timeval *result, *x, *y;
{
  /* Perform the carry for the later subtraction by updating y. */
  if (x->tv_usec < y->tv_usec) {
    int nsec = (y->tv_usec – x->tv_usec) / 1000000 + 1;
    y->tv_usec -= 1000000 * nsec;
    y->tv_sec += nsec;
  }
  if (x->tv_usec – y->tv_usec > 1000000) {
    int nsec = (x->tv_usec – y->tv_usec) / 1000000;
    y->tv_usec += 1000000 * nsec;
    y->tv_sec -= nsec;
  }

  /* Compute the time remaining to wait.                                                                                                                                         
     tv_usec is certainly positive. */

  result->tv_sec = x->tv_sec – y->tv_sec;
  result->tv_usec = x->tv_usec – y->tv_usec;

  /* Return 1 if result is negative. */
  return x->tv_sec < y->tv_sec;
}

</sys></stdio>

Los tiempos se toman en microsegundos (usec) y la velocidad lineal real de la rueda, que no tiene por qué ser la velocidad del viento cuando el invento esté montado, se calcula una vez por segundo y se hace a partir de los siguientes datos:

velocidad * 1000000 * 9 * 0.0174 * 0.9 * 3600 / 100000

Velocidad es la velocidad calculada tics por microsegundo. Se multiplica por 1000000 para tenerla en tics por segundo.
La rueda de mi ratón tiene exactamente 40 agujeros. Esto quiere decir que cada agujero representa aproximadamente 9 grados de circunferencia (360/40 = 9). Al multiplicar por 9 los tics por segundo, consigo la velocidad en grados por segundo. Como 1 grado = 0.0174 radianes (2*Pi/360), multiplico y obtengo la velocidad en radianes por segundo.
¿Para que necesito la velocidad en radianes / segundo?, porque esta es la velocidad angular y para averiguar la velocidad lineal de un punto del borde del disco dentado tengo la fórmula:

v = r * w (uve igual a erre por omega)

donde omega es la velocidad angular y r el radio de la circunferencia. Como el radio de la rueda de mi ratón mide 0.9 cm multiplico por esa cantidad y obtengo la velocidad en cm/s. Ahora solo queda multiplicar por 3600 segundos/hora y dividir por 100000 cm / Km y obtenemos la velocidad en Km/h.

Por supuesto esta expresión y otras partes del código se pueden simplificar, pero lo dejo así por motivos didácticos… vamos que si la simplifico no me entero ni yo de por qué he hecho lo que he hecho :)

Con este montaje y estos cálculos he logrado que la rueda alcance los 50Km/h. Supongo que si le meto 12V o quemo el motor, o consigo mas velocidad, pero no me preocupa demasiado ya que teniendo en cuenta que el anemómetro entero va a tener un radio de giro de 5 cm, para la misma velocidad angular, la velocidad del punto central de una cazoleta tendría que ser de ¡mas de 300 Km/h!

¡Esto no ha hecho mas que empezar! Os mantendré informados de los progresos.

13 comments Junio 20th, 2007

 Guias

 Comentarios

 

 Categorías