Archive for diciembre, 2010

Esquema de instalación

Descripción esquemática del funcionamiento de la instalación. Es un proyecto modular por lo que la cantidad de objetos lumínicos podrá ser variable de acuerdo al espacio de exposición.

instalacion

Processing, Arduino y objeto luminico

instalacion

Deteccion de presencia

instalacion

encendido y apagado de los objetos luminicos

Esquema de instalación

Esquema basico de instalación


Objeto lumínico

Objetos en funcionamiento con fotos obtenidas en www.dentrodecasa.net


Pruebas de conexión Processing-Arduino

circuito lampara arduino

Realizamos pruebas ejecutando Processing y conectando con Arduino para encender y apagar las lámparas al detectar presencia mediante la webcam.

Primero comprobamos el funcionamiento de relé usando baterías, luego probamos conexión de la computadora con arduino encendiendo dos leds y finalmente conectamos las lámparas a 220v.

Componentes: transistor BD137, rele JQC3F, diodo, resistencia.

.

mesa de trabajo

Mesa de trabajo

arduino

arduino

arduino-luz

arduino lampara 220v

protoboard

protoboard


Construcción del objeto lumínico

planos del objeto

planos del objeto

Montaje

Montaje del objeto y prueba de funcionamiento

Paso a paso de la construcción del objeto lumínico-casa con Poliestireno plegado, basado en plano de “casa para armar”.


Detección de presencia con Processing

processing

Processing ejecutando la detección de presencia, determinando un centro de masa de la imagen umbralizada

El código de Processing para detectar la presencia de un espectador y en consecuencia apagar o enceder las luces de los objetos lumínicos es el siguiente:

// uso "descriptores" para contar los px blancos y determinar presencia
// import codeanticode.gsvideo.*;
import processing.serial.*;
import cc.arduino.*;
import processing.video.*;              // MAC

Arduino arduino; //objeto que representa el arduino para processing

// GSCapture cam;
Capture cam;                            // MAC
PImage imgref;
PImage imgout;

color ca;
float ra,ga,ba;
color cb;
float rb,gb,bb;
color ct;
float rt,gt,bt;

float L;
float umbral;
float ubicacionX;

float area;
float xcm,ycm;

void setup() {

 size(320, 240);

 // cam = new GSCapture(this, 320, 240);
 cam = new Capture(this, 320, 240);      // MAC
 imgref = createImage(cam.width,cam.height,RGB);
 imgout = createImage(cam.width,cam.height,RGB);
 arduino = new Arduino (this,Arduino.list() [0],57600); //constructor, this,5760"COM4",baudios (velocidad de firmata)
 arduino.pinMode (8,Arduino.OUTPUT); //en arduino es pinMode (9,OUTPUT)
 arduino.pinMode (9,Arduino.OUTPUT); //en arduino es pinMode (9,OUTPUT)
}

void draw() {
 //mapeo umbral y posicion en eje X
 umbral = map (mouseY,0,width,0,256);
 ubicacionX = map (xcm,0,width,0,100);
 println (ubicacionX);

 if (cam.available() == true) {
 cam.read();
 transformar();
 image(imgout,0,0,width,height);
 //println (area);
 fill(255,0,0);
 rect (xcm,ycm,5,5);//dibujo rect rojo sobre el centro de masa
 }
 if (ubicacionX < 33 ) {
 arduino.digitalWrite (8,Arduino.HIGH);//pin en que conecte luz 1
 delay (1000);}
 else {
 arduino.digitalWrite (8,Arduino.LOW);
 delay (500);
 }
 if (ubicacionX > 66 ) {
 arduino.digitalWrite (9,Arduino.HIGH);//pin en que conecte luz 2
 delay (1000);}
 else {
 arduino.digitalWrite (9,Arduino.LOW);
 delay (500);
 }
 }

void transformar() {

 area = 0;
 xcm = 0;
 ycm = 0;

 for (int j=0;j<cam.height;j++) {
 for (int i=0;i<cam.width;i++) {

 ca = cam.get(i,j);

 ra = red(ca);
 ga = green(ca);
 ba = blue(ca);

 cb = imgref.get(i,j);

 rb = red(cb);
 gb = green(cb);
 bb = blue(cb);

 rt = abs(ra - rb);
 gt = abs(ga - gb);
 bt = abs(ba - bb);

 L = (rt + gt + bt)/3;

 if (L<umbral) {
 rt = gt = bt = 0;//px negro
 } else {
 rt = gt = bt = 255;//fuerzo px blanco
 area++;//le sumo 1 al area inicial para sumar px blancos
 xcm += i;
 ycm += j;
 }

 ct = color(rt,gt,bt);

 imgout.set(i,j,ct);

 }
 }
 if (area != 0) {//!= "no es igual" xq si divido x 0 daria error!
 xcm = xcm/area;
 ycm = ycm/area;
 } else
 xcm = ycm = 0;
 //normalizo el area
 area = 100*area/(cam.width*cam.height);

 //ubicacionX = map (xcm,0,width,0);//quiero obtener ubicacion en X

}

void keyPressed() {

 if (key == ' ') {
 imgref.copy(cam,0,0,cam.width,cam.height,0,0,imgref.width,imgref.height);
 } 

}

  •  

    diciembre 2010
    L M X J V S D
    « nov   jul »
     12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
  • Copyright © 1996-2010 dentro de casa 2011. All rights reserved.
    Jarrah theme by Templates Next | Powered by WordPress