sábado, 3 de junio de 2017

CONTROLADOR RGB CON ARDUINO




Este proyecto es sencillo de realizar, se trata de un controlador de luz RGB que  permite obtener distintas tonalidades de luz que resultan de la mezcla de los colores primarios ROJO, VERDE Y AZUL.

Hay muchas aplicaciones que podemos dar a este circuito; Quizás una de las mas interesantes que he encontrado es el que propone Rajarshi Roy en su blog; que consiste en encender al LED RGB con el mismo color que proyecta la pantalla del computador; Así por ejemplo, cuando vemos una película, podemos hacer que nuestro cuarto se ilumine con los mismos colores que están en escena. A continuación dejo un video de como funciona:


A continuación explico como construirlo...

Materiales

  • TRES RESISTENCIAS 220 OHM
  • UN LED RGB
  • PLACA ARDUINO UNO R3

Circuito:


Para explicar como funciona este proyecto lo he dividido en dos etapas;

La primera Etapa corresponde a una aplicación desarrollada en processing que se encarga de hacer un análisis del color RGB que esta proyectando el monitor; seguidamente envía la información al puerto serie del computador; Los datos enviados tienen el siguiente formato:

0xFF 0xRR 0xGG 0xBB

donde el primer byte siempre es 0xFF y sirve para indicar el inicio de la trama; los siguientes bytes son hexadecimales que indican la intensidad de los colores rojo, verde y azul respectivamente; a continuación pongo el código del programa desarrollado en processing
//Developed by Rajarshi Roy
import java.awt.Robot; //java library that lets us take screenshots
import java.awt.AWTException;
import java.awt.event.InputEvent;
import java.awt.image.BufferedImage;
import java.awt.Rectangle;
import java.awt.Dimension;
import processing.serial.*; //library for serial communication
Serial port; //creates object "port" of serial class
Robot robby; //creates object "robby" of robot class
void setup()
{
  port = new Serial(this, Serial.list()[0],9600); //set baud rate
  size(100, 100); //window size (doesn't matter)
  try //standard Robot class error check
  {
    robby = new Robot();
  }
  catch (AWTException e)
  {
    println("Robot class not supported by your system!");
    exit();
  }
}
void draw()
{
  int pixel; //ARGB variable with 32 int bytes where
  //sets of 8 bytes are: Alpha, Red, Green, Blue
  float r=0;
  float g=0;
  float b=0;
  //get screenshot into object "screenshot" of class BufferedImage
  BufferedImage screenshot = robby.createScreenCapture(new Rectangle(new Dimension(1368,928)));
  //1368*928 is the screen resolution
  int i=0;
  int j=0;
  //1368*928
  //I skip every alternate pixel making my program 4 times faster
  for(i =0;i<1368; i=i+2){
    for(j=0; j<928;j=j+2){
      pixel = screenshot.getRGB(i,j); //the ARGB integer has the colors of pixel (i,j)
      r = r+(int)(255&(pixel>>16)); //add up reds
      g = g+(int)(255&(pixel>>8)); //add up greens
      b = b+(int)(255&(pixel)); //add up blues
    }
  }
  r=r/(684*464); //average red (remember that I skipped ever alternate pixel)
  g=g/(684*464); //average green
  b=b/(684*464); //average blue
  port.write(0xff); //write marker (0xff) for synchronization
  port.write((byte)(r)); //write red value
  port.write((byte)(g)); //write green value
  port.write((byte)(b)); //write blue value
  delay(10); //delay for safety
  background(r,g,b); //make window background average color
}

En la segunda etapa tenemos al firmware que debe grabar en ARDUINO,  el mismo que se encarga de recibir los datos que llegan desde el puerto serie y de acorde con ellos genera las correspondientes señales PWM que controlan al LED RGB. A continuación el código:
//Developed by Rajarshi Roy int red, green, blue; //red, green and blue values int RedPin = 3; //Red pin 9 has a PWM int GreenPin = 5; //Green pin 10 has a PWM int BluePin = 6; //Blue pin 11 has a PWM int power = 4; void setup() { Serial.begin(9600);   //initial values (no significance)   int red = 255;   int blue = 255;   int green = 255; pinMode(4,OUTPUT); digitalWrite(4,LOW); } void loop() { //protocol expects data in format of 4 bytes   //(xff) as a marker to ensure proper synchronization always   //followed by red, green, blue bytes   if (Serial.available()>=4) {     if(Serial.read() == 0xff){       red = Serial.read();       green= Serial.read();       blue = Serial.read();     }   }   //finally control led brightness through pulse-width modulation   analogWrite (RedPin, red);   analogWrite (GreenPin, green);   analogWrite (BluePin, blue);   delay(10); //just to be safe }

Dejo un vídeo que muestra el funcionamiento:


Gracias!

No hay comentarios.:

Publicar un comentario

CONSTRUYA UN ANALIZADOR DE ESPECTRO CON ARDUINO Y WINAMP

Este articulo explica como hacer un analizador de espectro utilizando el reproductor de música WINAMP y el Plugin "gen_crownsoft_lcd...