sábado, 1 de junio de 2019

Anemómetro con sensor efecto Hall 44E402 Introducción

Cuando decidí hacerme la estación meteorológica, consideré comenzar por este elemento ya que me parecía sencillo...menudo patinazo!!!

El modelo de anemómetro que aquí vamos a tratar emplea un sistema ampliamente utilizado en las estaciones meteorológicas comerciales.
Se trata de un sistema formado por tres o más cazoletas que son empujadas por el viento haciendo rodar el conjunto sobre un eje. En un punto del sistema giratorio, se coloca un imán que girará solidariamente con el eje, paralelo al eje se fija un sensor de efecto Hall (en nuestro caso el 44E402 ó A3144) de manera que al encararse el imán frente al sensor, éste nos dará una señal, lo que interpretamos como una revolución, y aplicando el factor tiempo obtenemos la velocidad.

Pero el sistema de cazoletas ó cubetas rotativas no es el único sistema para medir la velocidad del viento ni tampoco el mas eficiente como veremos mas adelante.

Anemómetro rotativo
Otro sistema que se suele aplicar a las veletas comerciales últimamente es el sistema ultrasónico.
Este sistema consta de uno o dos emisores ultrasónicos y sus correspondientes receptores.

Anemómetro ultrasónico
Anemómetro ultrasonico
fuente: www.darrera.com

Esencialmente su funcionamiento es el siguiente, el emisor emite una frecuencia constantemente que es captada por el receptor, pero esta señal se demora cierto tiempo, en ausencia de viento la demora es la mínima posible, mientras que a medida que el viento aumenta (y que atraviesa el espacio entre emisor y receptor) la señal tarda mas tiempo en alcanzar el receptor.
Estos sistemas suelen emplear dos emisores y receptores promediando las dos señales para obtener la intensidad. Sería perfectamente posible y mas sencillo de programar, un sistema con un solo emisor-receptor pero habría que mantenerlo encarado al viento (aprovechando quizás el sistema de la veleta)

También existen otros sistemas como serían, el Anemómetro de compresión, el Anemómetro de hilo caliente y el Anemómetro de empuje.

De todos ellos, el Anemómetro de empuje considero que es el más adecuado y eficiente para la medición de la intensidad del viento, y más aún aquí en Menorca, dada su particularidad racheada.

La intensidad del viento no es ni de lejos constante, y este comportamiento varia mucho en función del lugar. En el diseño de implantaciones de energía eólica, se debe tener muy en cuenta este comportamiento, existen lugares como La muela en Zaragoza donde la intensidad del viento se comporta de manera muy estable.

Menorca se encuentra en una zona altamente inestable, tal es así que en ciertas tormentas las "rachas" pueden alcanzar el triple de la intensidad "sostenida" y con una duración de uno a tres segundos.

Si deseamos, la mas alta precisión, para registrar este comportamiento aquí en Menorca, no nos queda otra que diseñar un sistema de medición (Anemómetro de empuje) capaz de reaccionar ¡al segundo! y que la aplicación permita registrar los datos a esa velocidad.

Imagino que ya vais entendiendo lo de mi patinazo.

Para la Estación Meteorológica que nos concierne os propongo el sistema tradicional (rotativo) que es relativamente sencillo de realizar y programar, con ello podemos obtener picos de intensidad y viento sostenido con una precisión baja para lugares "Poco estables" y alta para lugares "Estables"

Las dos Estaciones Meteorológicas que yo he fabricado emplean el módulo Keyes 44E402 como sensor de revoluciones que integra el transistor 44E402.



Este módulo es muy eficiente, duradero (2 años aprox.) y económico, entre 0,30 y 1€

En su lugar podemos emplear el transistor A3144 que se comporta igual que el anterior, con la siguiente conexión:


En la implantación física necesitamos un imán que haga reaccionar el transistor a su paso, yo compré imanes de neodimio en Aliexpress, de tipo botón y perforado, son muy potentes y fáciles de fijar
(por el agujero).

Os dejo unas imágenes para que veáis como he colocado estos dos elementos. La primera es una vista general...


A continuación os muestro el módulo fuera de su caja protectora...


Para que el módulo este protegido de las inclemencias climáticas he tenido que vaciar un pedazo de metacrilato, lo prefiero transparente por que este módulo posee un led rojo que se enciende al paso del imán, y me permite visualizar su funcionamiento...


Ha sido bastante entretenido vaciar el pedacito de metacrilato así como hacerle las ranuras laterales para que el modulo encaje...



en la siguiente vemos el Led encendido al tener encarado el imán...


Bueno, una vez vista la configuración física, vamos a pasar a la programación, el siguiente Sketch es un programa básico para determinar el funcionamiento del módulo, pero antes os muestro el diagrama de conexiones para el módulo Keyes 44E402:


y este con el transistor A3344:



/* Sensor Hall digital A3144 o modulo 44E402, Compilacion Arduino 1.8.1, 09/03/2019
ESQUEMA DE CONEXIONES
                                          +-----+
              ____[PWR]___________________| USB |__
             |                            +-----+  |
             |         GND/RST2  [ ][ ]            |
             |       MOSI2/SCK2  [ ][ ]  A5/SCL[ ] |  
             |          5V/MISO2 [ ][ ]  A4/SDA[ ] |      
             |                             AREF[ ] |
             |                              GND[ ] |
             | [ ]N/C                    SCK/13[ ] | 
             | [ ]IOREF                 MISO/12[ ] |
             | [ ]RST                   MOSI/11[ ]~|
             | [ ]3V3    +---+               10[ ]~|
Positivo-->  | [ ]5v    -| A |-               9[ ]~|
Negativo-->  | [ ]GND   -| R |-               8[ ] |   
             | [ ]GND   -| D |-                    |
             | [ ]Vin   -| U |-               7[ ] |
             |          -| I |-               6[ ]~|
             | [ ]A0    -| N |-               5[ ]~|
             | [ ]A1    -| O |-               4[ ] |   
             | [ ]A2     +---+           INT1/3[ ]~|  
             | [ ]A3                     INT0/2[ ] | <-- Señal transistor A3144 o modulo 44E402 
             | [ ]A4/SDA  RST SCK MISO     TX>1[ ] |   
             | [ ]A5/SCL  [ ] [ ] [ ]      RX<0[ ] |   
             |            [ ] [ ] [ ]              |
             |  UNO_R3    GND MOSI 5V  ____________/
              \_______________________/
     */
#define Hall_pin 2 // Definimos el pin 2 como receptor de la señal
int revolucion; // variable que acumulará las revoluciones
void setup(){
    Serial.begin(9600);// Iniciamos la consola                    
    pinMode(Hall_pin,INPUT); // declaramos el pin de la señal como entrada
}

void loop(){
    byte magnetico = digitalRead(Hall_pin); // Asignamos a la variable magnetico el valor del pin 2
    if(magnetico == LOW){ // Cuidado! nos devuelve TRUE al no percibir nada y False al detectar el campo magnetico. Imagino que será por el PullUp-PullDdown
        Serial.print("Revolucion: "); Serial.println(revolucion); // imprimimos por consola el texto Revolucion junto con el valor 
        revolucion++; // incrementamos en una la variable a cada revolucion
        delay(250); // esperamos cierto tiempo; por el rebote electrico que será nuestro mayor problema al programar el anemómetro
    }
}

Este código nos servirá para comprobar el funcionamiento del sensor, nos basta con pasarle el imán frente al sensor para que vaya sumando una revolución, nosotros debemos convertir eso en velocidad, y para ello debemos conocer el radio ó diámetro de las cazoletas y así establecer la distancia recorrida, además la fórmula de velocidad, requiere el tiempo transcurrido, en general se define por la formula Velocidad=Espacio/Tiempo, y digo en general por que habría que contemplar otros aspectos, por ejemplo si el sistema de cazoletas que has diseñado solo tiene tres de ellas se deben aplicar fórmulas mas concretas, y además habría que tener en cuenta la densidad del aire en cada momento, yo no me voy a meter en berenjenales de momento...

La circunferencia que dibuja nuestro sistema de cazoletas tiene una distancia que conoceremos con su formula: L=2x π x R; ó Pi por Radio al cuadrado.
Y para establecer el tiempo vamos ha echar mano de nuestro diseño final de RelojBasico con LCD

Ahora hay que hacer funcionar el conjunto con una LCD, y realizar las pruebas iniciales de nuestro anemómetro
Las cazoletas deben instalarse sobre un eje con al menos un cojinete y este conjunto debe girar lo más fino posible, en función de esa finura obtendremos nuestra velocidad minina y que difícilmente detectará valores entre 0,5 km/h. y 1 km/h. aunque estaremos de acuerdo que esas velocidades poco nos importan...
Como decía cada uno debe ir afinando su velocidad mediante prueba-ensayo, y modificar la fórmula de velocidad (yo modifico la longitud) hasta que nuestros resultados se asemejen a los ofrecidos por ejemplo por la meteo del lugar, o con una estación comercial de algún conocido,  también existen anemómetros que se conectan al smartphone, ó anemómetros portátiles  (que son mas económicos) no necesitamos que sea demasiado precisos, pero nos serviría para establecer un punto de partida.

Aunque el problema mas espinoso con el que me topé fue crear el algoritmo "perfecto" para la obtención de las revoluciones en todas las circunstancias, viento fuerte, flojo o nulo, sólo que para vosotros este aspecto ya os lo doy resuelto...

Los problemas básicamente fueron dos:
   - Cada vez que el imán pasa frente al sensor, se produce un rebote eléctrico también conocido                como debouncing, Luis Llamas lo explica muy bien AQUI.
   - En función de la intensidad del viento, el imán permanece mas o menos tiempo frente al sensor
   - Si el viento es nulo o prácticamente nulo y el imán se queda parado frente al sensor, fua!

después de muchos días y unas cuantas versiones conseguí salvarlo todo con un par de While's...en fin...,

El siguiente Sketch nos permite comprobar el funcionamiento del Anemómetro, su salida es por Serial, de manera que se requiere un ordenador para comprobar si su salida es correcta:


// Version compilada con Arduino 1.8.1, 15/03/2019
/* ESQUEMA DE CONEXIONES
                                          +-----+
              ____[PWR]___________________| USB |__
             |                            +-----+  |
             |         GND/RST2  [ ][ ]            |
             |       MOSI2/SCK2  [ ][ ]  A5/SCL[ ] |  
             |          5V/MISO2 [ ][ ]  A4/SDA[ ] |      
             |                             AREF[ ] |
             |                              GND[ ] |
             | [ ]N/C                    SCK/13[ ] | 
             | [ ]IOREF                 MISO/12[ ] |
             | [ ]RST                   MOSI/11[ ]~|
             | [ ]3V3    +---+               10[ ]~|
Positivo-->  | [ ]5v    -| A |-               9[ ]~|
Negativo-->  | [ ]GND   -| R |-               8[ ] |   
             | [ ]GND   -| D |-                    |
             | [ ]Vin   -| U |-               7[ ] | <-- Señal transistor A3144 o modulo 44E402 
             |          -| I |-               6[ ]~|
             | [ ]A0    -| N |-               5[ ]~|
             | [ ]A1    -| O |-               4[ ] |   
             | [ ]A2     +---+           INT1/3[ ]~|  
             | [ ]A3                     INT0/2[ ] | 
             | [ ]A4/SDA  RST SCK MISO     TX>1[ ] |   
             | [ ]A5/SCL  [ ] [ ] [ ]      RX<0[ ] |   
             |            [ ] [ ] [ ]              |
             |  UNO_R3    GND MOSI 5V  ____________/
              \_______________________/
     */

boolean sh, fileWrite=true;// Sentecia Anemometro
unsigned int rev,kmh;// Sentecia Anemometro
float D=1.60,e,v,Cf=(D*PI);// Sentecia Anemometro.
const byte sensHall= 7; // Sentecia Anemometro. 
long newMilli; // Control de tiempo
void setup(){
  Serial.begin(9600);
}

void loop() {
  newMilli=millis()/999; // Asignamos a nuestra varible newMillis() el valor que contiene millis(); contador interno de Arduino
  while(newMilli+60>millis()/999){ // 
    sh = digitalRead(sensHall);// Leemos el valor del sensor y se lo asignamos a nuestra variable sh
    if (sh){ // si el valor es 1 o true se accede al condicional
      rev++; // incrementa en uno el valor de rev.
      while(sh && newMilli+60>millis()/999){//este while evita que contador aumente si el Iman ha quedado frente al sensor,
        sh = digitalRead(sensHall); //cuando sh sea false ó se superen los 999 ms saldrá del bucle
      }//Cierra while sh
    }// cierra if sh
  } // Cierra While Millis 
  Serial.print("rev: ");Serial.println(rev);
  kmh=calcVel(rev);
  rev=0;
Serial.print("kmh: ");Serial.println(kmh);
}

int calcVel(int z){ // recibe las rev
    return ((Cf*z)/60)*3.6;// calcula la la velocidad, dadas las caracteristicas de nuestro anem. establecidas en la declaracion de variables 
}