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
#include
#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(0x03, 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;
}

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.

14 comentarios en “Anemousemeter (I)

  1. Milo

    Buenas,

    Realmente muy muy útil no será, pero no puedo evitar felicitarte por la originalidad de la idea y sobre todo por la forma de llevarla a cabo.

    Un saludo.

  2. Quimijose

    Ya echaba en falta yo uno de tus inventos que nos tienes abandonados.

    Pinta muy bien, aunque tengo que ller con mas calma el artículo.

    Saludos.

  3. gerson manuel

    como puedo aser uno rapido espara mañana porfa esta padre el anemometro pofa contesten

  4. Jordi

    Buenas, me ha encantado tu web y estaba viendo este proyecto…
    Supongo que no te importa la complicación de este y menos si ya estás tan relacionado con los mouse, jejeje…
    Pero, ¿Qué te parecería usar un cuenta kilómetros de bicicleta? Con eso es sencillo registrar la velocidad.

  5. Makinolo Autor del post

    Evidentemente, con un cuenta de bici basado en el efecto hall es la manera mas sencilla de medir la velocidad… de hecho tengo varios por aqui ya que mi gran pasion son las bicis, pero no se puede saber la dirección del viento con el mismo aparato, ni me permite introducir esos datos en el ordenador para hacer estadisticas y gráficas.
    De todos modos lo mas difícil de este proyecto esta resultando fabricar el propio anemómetro. Las cazoletas hace meses que las tengo, pero el rodamiento que he conseguido no encuentro una forma de integrarlo con el resto de desechos que tengo para montarlo decentemente.

  6. Pingback: Por fin el anemómetro casero! How to anemometer o hágalo usted mismo - Vol.1 « …un poco de tecnología, un poco de cotidianeidad: un poco de todo.

  7. lopezrafa

    Hola, me parece que del mouse solo podes usar el sistema de captura de pulsos.
    Creo que para detectar la posicion necesitas un disco mas grnade con solo 3 ranuras, y qu ede las divisiones 1 se mas grande.de esta manera podes saber exactamente en que posicion se encuentra el desbalance aerodianmico.
    Realizar la comparacion entre las 3 velocidades y de ahi calcular las componente para determinar la direccion.
    Pero por ahi estoy equivocado…

  8. zoso

    La verdad que muy interesante este experimento.. me encantaria hacer uno y probarlo, ya que mi idea es parecida, necesito uno para saber si vale la pena construirme algo mas complicado (el generador)… realmente se necesita otro sensor lopezrafa?? aparentemente la diferencia entre la velocidad maxima promedio de unas cuantas vueltas y la velocidad minima te daria la idea de la desviacion del viento me parece..
    Y me parece que lopezrafa, te referis a que se necesita tener una referencia de la posicion además? creo que para eso alcanza con tomar el otro eje, el x, y usarlo solo con una ranura, y usar ese dato, en conjunto con la diferencia de velociadades angulares maximas y minimas (supongo que un promedio de algunas vueltas para estar seguros) relativas del eje y para saber en que direccion esta la variacion de la velocidad y por lo tanto la del viento…
    me parece que es necesaria otra referencia, ya que no sabemos cuando empezamos a tomar datos sino…
    La verdad que muy interesante… muy. Pero la verdad que no tengo idea de programacion, y por eso es que esta un poco fuera de mi alcanze… se podra hacer lo mismo en un entrono windows??? seria fantastico para mi y para muchos… saludos

  9. Lopezrafa

    desde mi punto de vista, creo que necesitas un valor de referencia incial.
    Como podrias saber haci adonde esta orientada la parte de menor velocidad si no cuentas con un punto fijo a partir del cual comparar el valor?
    Como logras sabe la orientacion del viento sin saber hacia que lado esta orientada la cazoleta con el freno aerodianmico?
    si lo que haces es una perforacion tapada peudes detctar esta, pero como sabes que no se ralentizo el disco?
    creo sin duda que es necesario un sensor de posicion inicial a partir del cual realizar la compartiva de velocidades.

  10. Xema

    jajajajaja, me rio de lo sencillamente genial que es lo del ratón. Bravo bravo!

  11. renzo

    interesantisima tu explicacion aunque ando mas perdido con todo eso de la electronica,te comento que estoy pensando armar un pequeño aerogenerador para alimentar mi terma electrica pero necesito saber si hay vientos que me peudan dar la electricidad necesaria, por eso mi interes en el anemometro, tal vez me peudas enviar informacion algo mas detallada, te quedaria enteramente agradecido.

Deja un comentario

Tu dirección de correo electrónico no será publicada.