Para este proyecto usamos técnicas recopiladas y explicadas excelentemente en español en el sitio de Open Solar Circuits. Aunque hicimos modificaciones a los circuitos mencionados para adaptarlos a nuestras necesidades, esta fue nuestra primera fuente y dejamos los links como referencia.
La parte electrónica de las esculturas consta de tres partes importantes:
1. El circuito de encendido y autoapagado: Está formado por un botón oculto que hace que la escultura se prenda al ser presionada hacia abajo, y un temporizador hecho con un capacitor, una serie de resistencias y un par de transistores en configuración de par de Darlington. El trabajo del temporizador es mantener el circuito encendido durante unos segundos y después volverlo a apagar.
Está basado en el siguiente diagrama que encontramos en Internet.
2. El circuito amplificador-rectificador: Se encarga de elevar el voltaje de alimentación de 2.4v a 5v, está formado por un circuito conocido como joule thieff, que amplifica el voltaje en sí, pero lo convierte en pulsos y un puente de diodos que vuelve a convertir los pulsos en una corriente continua estable en 5v.
Circuito básico del Joule Thieff, |
Circuito rectificador. |
3. El microcontrolador y los LEDs: Es la parte del circuito que proporciona la iluminación y controla su comportamiento. El microcontrolador es un atmega168, conectado a algunos componentes siguiendo la configuración del Bare Bones Arduino, y conectado a los LEDs RGB por sus salidas análogas.
CÓDIGO ARDUINO:
#include <RgbLed.h> //carga la librería RgbLed, disponible en http://www.insanegiantrobots.com/arduino/rgbled.zip
//Definir los pins que usaremos para controlar el LED (para quefuncione correctamente deben ser pins análogos)
#define LED1_PIN_RED 9 //el pin 9 controla el rojo
#define LED1_PIN_BLUE 10 //el pin 10 controla el azul
#define LED1_PIN_GREEN 11 //el pin 11 controla el verde
RgbLedCommonAnode led_rgb1(LED1_PIN_RED, LED1_PIN_GREEN, LED1_PIN_BLUE, true); // define los pins seleccionados como parámetros de led_rgb1
int temperaturas[] = {/*aquí va la lista de tempreatudas a usar, por problemas de licencia no estamos autorizados a publicar los números*/};
//Esto es un array (una lista) que contiene todos los valores de las temperaturas separados por comas.
void setup() {
}
void setPwm(unsigned int r, unsigned int g, unsigned int b) {
// define la función setPwm, sirve para prender el LED de un color específico
led_rgb1.setColor(r, g, b);
// el parámetro r determina la intensidad del rojo, el g del verde, el b del azul
}
void loop() {
//poner todos los valores de iluminación del LED en 0 (apagado)
int r=0;
int g=0;
int b=0;
//determinar el valor 0 para r, g, y b
setPwm(0, 0, 0);
//aplicar el valor de 0 a todos los pins -r,g y b- usando setPwm
int consTemp;
for(int i = 0; i < sizeof(temperaturas); i++){
//repetir lo siguiente una vez por cada elemento de la lista de temperaturas
//se considera un mínimo de 0ºc y un máximo de 50ºc, se transforman en valores de 0 a 255 (el rango del output análogo)
//de la siguiente manera: para el rojo, entre mayor sea el valor de la temperatura, más alto es el valor de r
//para verde y azul es lo contrario: la intensidad de la luz es mayor conforme la temperatura sea menor
consTemp= temperaturas[i];
//consTemp almacena el valor del elemento actual de la lista de temperaturas
r=map(consTemp/3, 0, 50, 1, 255);
//aquí los números están ajustados manualmente para
//compensar el hecho de que la luz roja es más dominante
g=map(consTemp, 0, 40, 255, 0);
b=map(consTemp, 0, 40, 255, 0);
setPwm(constrain(r,0,255), constrain(g,0,255), constrain(b,0,255));
delay (100);
}
setPwm(0, 0, 0);
delay(1000);
}