miércoles, mayo 23, 2012

Tacómetro para proyecto de aerogenerador (Arduino y Tecnologías para educación secundaria).

Hace tiempo que quería hacer un proyecto que integrara y reutilizara algún tipo de maqueta con partes móviles, la placa Arduino y algún elemento transductor sencillo para alumnos de ESO y no se me fuera mucho tiempo en ello. En casa tenía una maqueta didáctica distribuida por CEBEK y en el aula una compañera estaba haciendo un proyecto con los alumnos para trabajar el tema de mecanismos que consistía en la fabricación de un aerogenerador con distintos elementos mecánicos. Así decidí montar un tacómetro para medir las revoluciones por minuto del rotor utilizando un relé Reed, la controladora Arduino y uno de los programas de ejemplo que vienen en el IDE de Arduino que detectan el cambio de estado en una entrada digital... así de sencillo. Paso a describir e ilustrar el proyecto por si alguien le interesa montárlo en casa o en el aula:

PROYECTOS DE TECNOLOGÍAS CON ARDUINO:
"Tacómetro para maqueta con elementos rotativos de bajas revoluciones"

Aprenderás a : 

Medir las revoluciones por minuto de tus proyectos de Tecnologías que incluyan partes rotatorias. Como ejemplo de esta práctica se ha utilizado un aerogenerador pero el principio de funcionamiento hace que sea aplicable a cualquier otro proyecto similar como norias, tiovivos, etc…


Necesitarás: 
  • Placa Arduino.
  • Placa protoboard.
  • Imán ligero y de pequeño tamaño (similar a los que se adhieren en las neveras).
  • Relé Reed. 
  • Resistencia 10 K. Cable rígido de conexión protoboard.
  • Ordenador personal para monitorizar la salida.
  • Proyecto de tecnologías ya montado y funcional (en nuestro caso la maqueta de un aerogenerador). 
Descripción del proyecto: 

 Mediante esta práctica se pretenden medir las revoluciones por minuto (RPM) del rotor de una maqueta que simula el movimiento de un aerogenerador. Se han utilizado dos modelos para realizar las pruebas. Uno es el modelo didáctico comercial de CEBEK y el otro aerogenerador corresponde a un modelo construido por alumnos de tercero de ESO con materiales del aula taller. Hay que tener en cuenta que la maqueta no realiza la función de generación de energía mediante la fuerza de viento, como corresponde a un aerogenerador, sino que simplemente provoca el movimiento del rotor para simular el efecto del viento. Para ello se suministra la corriente necesaria al motor eléctrico bien mediante una una placa solar o bien mediante una pila en cada caso. Para realizar la detección de cada vuelta se utiliza un imán adherido a una de las palas que gira solidario a ella y un detector magnético, en este caso un relé Reed. Cada vez que el imán se posiciona frente al relé, debido a su campo magnético, provoca el contacto de los terminales del relé poniendo en conexión un canal de lectura digital de la tarjeta Arduino con una tensión de 5 voltios. Esta acción provoca que la tarjeta reconozca un nivel lógico alto que, mediante la un sencillo programa, realizará un conteo de vueltas y la medida de las revoluciones por minuto del rotor.

 Montaje:

 Se ubica el relé Reed sobre la parte superior y el imán se pega a una de las palas del aerogenerador, de forma que cuando pase la pala por la parte superior del aerogenerador, imán y relé queden enfrentados. Así el campo magnético del imán permite cerrar los contactos del relé Reed.


Figura 1 (detalle cabeza aerogenerador relé -imán)

Las conexiones eléctricas se realizarán con el apoyo de la placa protoboard según el esquema que se adjunta. Se conecta la resistencia en configuración “pull-down”, es decir, cuando el imán está enfrentado al relé éste se cierra (ON) y conecta la entrada digital a una tensión de +5 V. En ausencia de imán el relé permanece abierto (OFF) y la entrada digital quedará conectada a masa (GND) a través de la resistencia de 10K.

 Figura 2 (esquema eléctrico - www.circuitlab.com )

Figura 3 (detalle conexiones protoboard)

 Programa:

Una vez configurados el pin 2 como entrada digital y la comunicación serie para poder monitorizar la salida, realiza de forma cíclica una lectura del puerto de entrada. Mediante una sentencia condicional comprueba si el estado ha cambiado. En el caso de que el cambio sea a un nivel alto (HIGH) incrementa en una unidad la variable que cuenta las vueltas. Con el apoyo de la instrucción millis() se puede calcular el tiempo que trascurre el rotor en dar una vuelta completa (tiempo_una_rev), por lo que mediante un sencillo cálculo podremos conocer la velocidad en revoluciones por minuto, como se indica en la siguiente línea del programa: rpm = 60000 / tiempo_una_rev;
A continuación se incluye el programa completo:

  /*
Programa basado en http://arduino.cc/en/Tutorial/ButtonStateChange (Examples ->; Digital ->; StateChangeDetection).
Tildes omitidas.
Detecta la conexion de los terminales de un rele Reed.
Se aplica para contar las vueltas de una maqueta aerogenerador mediante un
iman ubicado en una de las palas.
Circuito:


+5 V
o
|
|
|
o
  /
/ Reed Rele
|
|
|------> Pin 2 (Digital)
---
| |
| |  R = 10 KOhmios
| |
---
|
|
|
GND


created  27 Sep 2005
modified 30 Aug 2011
by Tom Igoe
modificado por Jorge Muñoz 15 Mayo 2012

This example code is in the public domain.

http://arduino.cc/en/Tutorial/ButtonStateChange

*/

const int  releReedPin = 2;
int vueltas = 0;
int estadoRele = 0;        
int ultimoEstadoRele = 0;  
long tiempo_anterior = 0;
long tiempo_una_rev = 0;
unsigned long tiempo_ahora;
long rpm;
void setup()
{
  pinMode(releReedPin, INPUT);
  Serial.begin(9600);
}


void loop() {
  // Lee el estado del rele
  estadoRele = digitalRead(releReedPin);
  // Compara el estado del rele con el estado previo
  if (estadoRele != ultimoEstadoRele) {
    // Si el estado ha cambiado incrementa el contador
    if (estadoRele == HIGH)
    {
      vueltas++;
      tiempo_ahora =millis();
      tiempo_una_rev = tiempo_ahora - tiempo_anterior;
      rpm = 60000 / tiempo_una_rev; // 1 minuto = 60000 ms
      Serial.println("Rele ON");
      Serial.print("vuelta ");
      Serial.println(vueltas);
      Serial.print("Tiempo por revolucion: ");
      Serial.println(tiempo_una_rev);
      Serial.print("Revoluciones por minuto: ");
      Serial.println(rpm);
    }
    else {
      // Si el estado actual es LOW pasa de ON a OFF
      Serial.println("Rele OFF");

      tiempo_anterior = tiempo_ahora;
    }
  }
  // Guarda el estado actual como ultimo estado
  ultimoEstadoRele = estadoRele;

}




 Práctica en funcionamiento: