Después de un tiempo sin poder hacer nada, hoy me he puesto de nuevo con mi seguidor de luz en Arduino. Las primeras comprobaciones que quiero realizar es cuánta tensión es capaz de dar la placa simplemente orientándola de modo estático hacia el sur.

He hecho una pequeña prueba hace unos días aprovechando que tenía pleno sol y he visto que en la micro-placa que he comprado la máxima tensión de salida que he conseguido es cercana a 1V. Perfecto, según la documentación de Arduino Leonardo:

By default the analog inputs measure from ground to 5 volts, though is it possible to change the upper end of their range using the AREF pin and the analogReference() function.

Osea, que podemos medir hasta 5V en los pines de entrada analógica (A0-A5) sin tener que tocar el analogReference(). Para más tensión yo usaría un divisor de tensión para garantizar la seguridad de la placa.

Total, que la cosa es sencilla. Se puede conectar directamente el positivo de la placa a una entrada analógica (A1) y el negativo a GRD y hacer que Arduino lea los valores cada intervalo t.

El problema es que por defecto no tenemos memoria dónde guardar los datos así que tendremos que guardarlos a través del puerto USB en nuestro ordenador, para lo que usaremos una hoja excel que tendremos abierta en el momento de recoger datos.

Los detalles del programa están en los comentarios del propio programa. Si tenéis alguna duda podéis dejarla en los comentarios.

/*  ==================================================================
  Registrador de voltaje de salida de mini-placa fotovoltaica
  Autor: Galideas
  Version: 0.1
  Fecha: 03/22/2014
  Descripcion: Registrador de voltaje de salida de mini-placa fotovoltaica.
               Los datos seran registrados en un excel.
    ==================================================================   */

// Declaracion de variables
int analogPin = 1; // Pin analogico 1
long registros; // Numero de datos registrados
float voltaje; // Voltaje de analogPin
float voltajeReal; // Sera el voltaje real de la placa

void setup()
{
  // ponemos indicador como salida por que ira un led
  pinMode(analogPin, INPUT);

  // Iniciamos comunicacion serie
  Serial.begin(9600);

  // Iniciamos el teclado
  Keyboard.begin();

}

void loop()
{
  // La toma de datos funciona si el digitalPin 12 esta puesto a tierra GRD

    voltaje = analogRead(analogPin); // Leemos el voltaje

    // Aplicamos la ecuacion obtenida anteriormente para calcular nuestro voltaje
    // real de la placa
    voltajeReal = 4.848*voltaje + 10.47;

    registros++; // Incrementamos el contador

    // Llevamos los datos a traves del USB al ordenador
    Serial.print(millis());
    Serial.print(" Registro: ");
    Serial.print(registros);
    Serial.print(" Voltaje; ");
    Serial.print(voltaje);

    // Ahora haremos que los escriba en pantalla donde tendremos abierto excel
    Keyboard.print(millis()/1000);
    Keyboard.press(KEY_TAB);   // Pulsamos tabulador para cambiar de celda
    delay(150);                // Espera 150ms por la velocidad de lectura/escritura de Arduino
    Keyboard.release(KEY_TAB); // Soltamos el tabulador
    Keyboard.print(registros);
    Keyboard.press(KEY_TAB);   // Pulsamos tabulador para cambiar de celda
    delay(150);                // Espera 150ms por la velocidad de lectura/escritura de Arduino
    Keyboard.release(KEY_TAB); // Soltamos el tabulador
    Keyboard.print(voltaje);
    Keyboard.press(KEY_TAB);   // Pulsamos tabulador para cambiar de celda
    delay(150);                // Espera 150ms por la velocidad de lectura/escritura de Arduino
    Keyboard.release(KEY_TAB); // Soltamos el tabulador
    Keyboard.print(voltajeReal);
    Keyboard.press(KEY_TAB);   // Pulsamos tabulador para cambiar de celda
    delay(150);                // Espera 150ms por la velocidad de lectura/escritura de Arduino
    Keyboard.release(KEY_TAB); // Soltamos el tabulador
    Keyboard.press(KEY_RETURN);
    delay(150);
    Keyboard.release(KEY_RETURN);

    // Ponemos un delay de 15 minutos para que no este registrando continuamente
    // Hay que usar valores Long porque superaremos el rango de int
    delay (15L*60L*3000L);  // Recordad que el tiempo se pone en milisegundos
}

Un detalle interesante, el analogRead() de un Arduino lleva un conversor analógico que recoge datos entre 0 y 1023 (más detalles aquí) por lo que he de pasarlo de algún modo a mi voltaje real. Aquellos que tengan hoja de especificaciones de su placa pueden hacerlo con un simple mapeado (map) pero yo no disponía de esto. Mi solución fue cargar el programa e ir mostrando en pantalla los valores analogRead() y con un polímetro medir la tensión real de salida de la placa. Luego sólo hizo falta ayudarme de excel para obtener mi estimación lineal de la función (con una R^2 de 1 nada menos) y esa es la función que veis que uso en el código para pasar el valor de lectura del pin analógico a voltios reales.

resultados_excelEl montaje de la placa es muy sencillo por lo que no hago esquema. Se trata de poner la salida positiva de la placa enchufada en A1 y la salida negativa en GRD de la placa Arduino. Y ya está. Conectarla al ordenador por USB, lanzar el programa y abrir una hoja excel porque la placa escribirá sus datos sobre cualquier cosa que haya en la pantalla (sea un excel, un txt o incluso la barra del navegador).

Un detalle final: no es muy práctico tener la placa conectada al ordenador y el excel abierto mucho tiempo para ir registrando datos y yo quiero dejar la placa varios días. Por eso, me he comprado esta shield para poder grabar los datos en una SD. Ya veis que el precio es muy bueno y se comunica por SPI, protocolo que Arduino Leonardo soporta.

A SoftwareSerial library allows for serial communication on any of the Leonardo’s digital pins.

The ATmega32U4 also supports I2C (TWI) and SPI communication. The Arduino software includes a Wire library to simplify use of the I2C bus; see the documentation for details. For SPI communication, use the SPI library.

Y esto es todo. Ahora a esperar que llegue la shield SD y luego a grabar datos en ella. Seguiremos informando.

Anuncios