Tecnología

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.


El comportamiento de los LEDs es controlado por Arduino y en el proceso de diseño usamos Fritzing.

DSC00921.jpg
Precisiones electrónicas. 


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.



Una variación de este circuito se usa para ahorrar energía haciendo que la escultura se apague automáticamente un rato después de que el público la enciende manualmente. El tiempo que permanece prendida depende del valor de C1, R1 y R2.

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.



DSC_0270.jpg
Biopsia de una de las esculturas.

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);
}