Construye tu propio Anemómetro [RS232 + PIC + CNC]
Aunque es un instrumento muy sencillo, hay muchas formas de hacerlo. En este caso me he decidido utilizar un rotor conectado a un micromotor, pero podría haber optado por algún metodo óptico para contar las vueltas o incluso magnético como los cuentakilómetros para bicicletas. Cada cual que elija!
La parte mecánica es bien sencilla. Para construir el rotor sólo necesitas
- 1 y 1/2 pelotas de ping pong
- Madera, plastico o metal para unirlos
- Pegamento
- Un motor que no tenga mucha resistencia (yo he utilizado el que viene aquí)
Mi rotor tiene las cazoletas separadas 120º, es decir que hay 3. Hay versiones de 4 o más, pero creo que es un buen número para empezar. La forma de sujetar las cazoletas es libre, en mi caso he fresado en contrachapado unos brazos para el rotor que sujeten las pelotas de pingpong y con un agujero para el eje del motor. Si alguien tiene fresadora CNC, AQUI tiene el fichero en G-CODE y AQUI el de SOLIDWORKS (DXF).
Para unir las cazoletas a los brazos del rotor lo mejor es utilizar pegamento epoxi, ya que aguantará cualquier inclemencia del tiempo. Las fotos se pueden ver al final de la página, con el montaje paso a paso. Lo siguiente será montar la parte electrónica.
Fotos del montaje:
Para diseñar la parte de electrónica hay que tener un par de consideraciones de diseño en cuenta. Dependiendo del motor que encuentres por tu casa o te compres, el tamaño de tu anemómetro, etc, hay ciertos parámetros que serán diferentes en tu caso que en el mio, pero intentaré explicar como ajustar en cada caso el diseño.
Acondicionado de señal
Dependiendo del tipo de motor y de la velocidad que llegue a alcanzar el rotor dependiendo de las cazoletas, se generará una tensión entre 0V (Parado total) y Vmax (Máxima velocidad medible). Tu misión ahora es medir la tensión Vmax con un polímetro y un buen secador de pelo haciendo girar el anemómetro. ¿Por qué es tan importante medir dicha tensión? Bueno, el siguiente paso es pasar el valor de tensión de salida del motor en un instante t a un valor en digital. Para ello se utiliza un conversor Analógico-Digital (ADC) y para maximizar la resolución es necesario saber donde está el mínimo y donde está el máximo. En mi caso he usado un ADC de 8 bits, así que podré leer 256 niveles diferentes de velocidad del viento. Habrá quien sea más fino y utilice más bits para ello. Para gustos, hay colores.
Supongamos entonces que has sido capaz de obtener Vmax, pues bien, en teoría esta tensión podrías usarla como tensión máxima de referencia para el ADC, pero suele ser tan baja, que lo único que te dará es un dolor de cabeza al intentar calibrar el invento. Lo ideal es amplificar dicha señal para que Vmax sea la VDD (Tensión de alimentación del ADC o del PIC en mi caso).
Yo tengo una tensión de refencia VDD=5V, y en mi motor medí Vmax=25mV. Más allá de eso, no creo que el huracán dejase mi anemómetro en pie. Para amplificar dichos 25mV linealmente hasta 5V, utilizaremos un amplificador operacional de propósito general, un LM358. Es muy barato, tiene 8 pines y además vienen 2, por si invitas a alguien a cenar. De nuevo en mi caso la ganancia necesaría sería: 5V/0,025= 200 V/V. Voy a montar el amplificador operacional en su configuración de amplificador no-inversor. Para el que no sepa como es esto que mire el dibujito. Sólo necesito calcular R1 y R2 para obtener G=200. La ecuación para esto es G=1+ (R2/R1). Así de sencillo. Yo he calculado para mi circuito R1=1 kOhm y R2=199 KOhm.
Conversión y Captura de datos
Una vez acondicionada la señal toca capturar y convertir a digital. Este paso yo lo he hecho utilizando un PIC16F88. El programa hecho en C para PICs lo tienes para bajartelo, incluso si quieres el .HEX. En mi caso yo capturo unas cuantas muestras durante un tiempo determinado y hago la media aritmetica. Otra opción que suaviza mucho mas los resultados es usar una media móvil, que consiste en capturar nuevos datos e ir haciendo la media tambien con los n anteriores (n ya lo eliges a tu gusto...)
Nada más que acordarse de poner VREF+ a la misma tensión de VDD o a la que te apetezca, pero siempre estable. Para la captura de datos, decidí enviar los datos a través de RS232, ya que el PIC tiene hardware específico para ello. Los datos llegan al ordenador y tambien es un buen formato para conectarlo a un módulo GPRS o Zigbee si quieres monitorizar a distancia la velocidad del viento.
El circuito

El programa
Este programa debe tomarse sólo como ejemplo. Es un mero programa de prueba y no tiene más que la función de capturar datos y enviarlos via serie RS232.
#include <16F88.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC //Internal RC Osc
#FUSES NOPUT //No Power Up Timer
#FUSES NOMCLR //Master Clear pin enabled
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOPROTECT //Code not protected from reading
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES IESO //Internal External Switch Over mode enabled
#use delay(clock=8000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bits=8)
void main()
{
unsigned long int value=0, valor=0;
long int i;
setup_adc_ports(sAN0|VSS_VREF);
//setup_adc_ports(AN0_AN1_AN2_AN4_VSS_VREF);
// setup_adc(ADC_CLOCK_DIV_32);
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(ALL_ANALOG);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
// TODO: USER CODE!!
printf("Comprobando envio.. ");
output_low(Pin_B0);
delay_ms(50);
output_high (PIN_B0);
delay_ms(2000);
output_low(PIN_B0);
while (1==1)
{
//set_adc_channel(0);
setup_adc( ALL_ANALOG );
setup_adc_ports(sAN0|VSS_VREF);
set_adc_channel(0);
delay_ms(25);
for (i=0;i<30;i++)
{
value = Read_ADC();
delay_ms(10);
valor=valor+value;
}
valor=valor/30;
printf("%Lu",valor);
output_high (PIN_B0);
delay_ms(100);
output_low(PIN_B0);
delay_ms(10);
}
}
| < Prev | Próximo > |
|---|


