Accueil du site > Ressources > Peindre son environnement avec de la lumière et de la chaleur

Développé en 2009 par Éric Rosenbaum, du Lifelong Kindergarten au MIT Media Lab, Glow Doodle est un logiciel libre pour peindre avec la lumière, et partager ses compositions sur le web.

Développé pour un usage en ligne ou pour une installation sous Mac ou Windows, Glow Doodle vous permet de prendre des positions longues de sorte que vous pouvez peindre avec la lumière en temps réel en utilisant votre webcam. Glow Doodle met ainsi en place une sorte de rémanence lumineuse vous permettant d’obtenir différents effets en fonction de vos sources lumineuses. À essayer plutôt en environnement sombre.

Explorant les possibilités de la lumière et de la chaleur, le Public Laboratory for Open Technology and Science (PLOTS) a ainsi couplé Glow Doodle avec une lampe de poche thermique.

Travaillant dans le sens de la superposition des couleurs directement sur l’environnement, le PLOTS a ainsi imaginé une lampe de poche thermique. Le principe en est simple : une lumière rouge est émise lorsque la lampe est dirigée vers quelque chose de tiède à chaud (par défaut 24 °C ou plus) et une lumière bleue lorsqu’elle est dirigée vers quelque chose de froid (par défaut 16 °C ou moins). Associée à Glow Doodle, la lumière émise est ainsi capturée, générant des photographies thermiques de notre environnement direct. Après avoir placé votre webcam ou caméra reliée à Glow Doodle face au décors, balayez la scène avec le faisceau de la lampe de poche en maintenant une distance de 2 à 3 centimètres entre la lampe et les différents éléments. Il est utile de porter des vêtements sombres afin de ne pas apparaître dans le champ lorsque vous vous déplacez.

Fabriquer une lampe de poche thermique

- Liste des composants

> 1 thermomètre infra-rouge Melexis MLX90614 (3 v)
> 1 RGB common-cathode LED
> 2 résistances 4.7k Ohm
> 2 résistances 100 Ohm
> 1 résistance 180 Ohm
> 1 condensateur 0.1 μF
> 1 Arduino
> 1 batterie 9 v


- Schéma de montage

Thermal Camera : Arduino UNO + MLX90614 IR Thermometer
Circuit diagram for simple thermal flashlight


- Code
// See http://bildr.org/2011/02/mlx90614-arduino/ for i2c library and instructions

// You must download the "twimaster.cpp" and "i2cmaster.h" files, and place them in a folder called "I2Cmaster". This must be placed in a folder called "libraries" which in turn should be placed in your Sketchbook folder (see Arduino's Preferences menu item to see where this is on your machine.).

// Typically, once you install these files, you must relaunch Arduino.

// The extra files are included in this Gist, as well as attached to the page http://publiclaboratory.org/tool/thermal-camera

#include <i2cmaster.h>
#include "Wire.h"
//#include "BlinkM_funcs.h"

const float lowReading = 60;
const float highReading = 75;
const unsigned char separatorCharacter = 255;

void setup(){
 
 pinMode(9,OUTPUT);
 pinMode(10,OUTPUT);
 pinMode(11,OUTPUT);
 Serial.begin(9600);
 Serial.println("starting setup...");  

 i2c_init(); //Initialise the i2c bus
 PORTC = (1 << PORTC4) | (1 << PORTC5);//enable pullups
 Serial.println("completed setup");
}

float normf(float x, float low, float high) {
 float y = (x - low) * 255.f / (high - low);
 if(y > 255) {
   y = 255;
 }
 if(y < 0) {
   y = 0;
 }
 return y;
}

void loop(){
 int dev = 0x5A<<1;
 int data_low = 0;
 int data_high = 0;
 int pec = 0;

 i2c_start_wait(dev+I2C_WRITE);
 i2c_write(0x07);

// read
 i2c_rep_start(dev+I2C_READ);
 data_low = i2c_readAck(); //Read 1 byte and then send ack
 data_high = i2c_readAck(); //Read 1 byte and then send ack
 pec = i2c_readNak();
 i2c_stop();
//This converts high and low bytes together and processes temperature, MSB is a error bit and is ignored for temps
double tempFactor = 0.02; // 0.02 degrees per LSB (measurement resolution of the MLX90614)
double tempData = 0x0000; // zero out the data
int frac; // data past the decimal point

// This masks off the error bit of the high byte, then moves it left 8 bits and adds the low byte.
 tempData = (double)(((data_high & 0x007F) << 8) + data_low);
 tempData = (tempData * tempFactor)-0.01;
 float celcius = tempData - 273.15;  
 float fahrenheit = (celcius*1.8) + 32;
 
 //Serial.println(fahrenheit);
 
 float state = normf(fahrenheit, lowReading, highReading);
 //Serial.write((unsigned int) state);
 //Serial.write(separatorCharacter);
 
 // BlinkM MaxM super-bright LED:
 // 165 is blue, 0 is red
 //BlinkM_fadeToHSB(blinkm_addr, map(state, 0, 255, 165, 0), 255, 255);

 // Regular ol' RGB LED:
 int hue = map(state,0,255,359,(359*0.5)); // not the whole color wheel
 setLedColorHSV(hue,1,1); //We are using Saturation and Value constant at 1
 Serial.print(fahrenheit);
 Serial.print(" degrees F, hue: ");
 Serial.println(+hue);
}

//Convert a given HSV (Hue Saturation Value) to RGB(Red Green Blue) and set the led to the color
//  h is hue value, integer between 0 and 360
//  s is saturation value, double between 0 and 1
//  v is value, double between 0 and 1
//http://splinter.com.au/blog/?p=29
void setLedColorHSV(int h, double s, double v) {
 //this is the algorithm to convert from RGB to HSV
 double r=0;
 double g=0;
 double b=0;

 double hf=h/60.0;

 int i=(int)floor(h/60.0);
 double f = h/60.0 - i;
 double pv = v * (1 - s);
 double qv = v * (1 - s*f);
 double tv = v * (1 - s * (1 - f));

 switch (i)
 {
 case 0: //rojo dominante
   r = v;
   g = tv;
   b = pv;
   break;
 case 1: //verde
   r = qv;
   g = v;
   b = pv;
   break;
 case 2:
   r = pv;
   g = v;
   b = tv;
   break;
 case 3: //azul
   r = pv;
   g = qv;
   b = v;
   break;
 case 4:
   r = tv;
   g = pv;
   b = v;
   break;
 case 5: //rojo
   r = v;
   g = pv;
   b = qv;
   break;
 }
 //set each component to a integer value between 0 and 255
 int red=constrain((int)255*r,0,255);
 int green=constrain((int)255*g,0,255);
 int blue=constrain((int)255*b,0,255);

 setLedColor(red,green,blue);
}

//Sets the current color for the RGB LED
void setLedColor(int red, int green, int blue) {

 //Note that we are reducing 1/4 the intensity for the green and blue components because

 //  the red one is too dim on my LED. You may want to adjust that.
 analogWrite(9,red); //Red pin attached to 9
 analogWrite(10,green); //Red pin attached to 9
 analogWrite(11,blue); //Red pin attached to 9
}

Haut
Contrat Creative Commons Contenus mis à disposition sous un contrat Creative Commons.
Plan du site | Réalisé avec Spip | Hébergé par Frédéric Guerrier | jQuery Twitter | RSS 2.0