Photo Thermique à base d'arduino

De Wikidebrouillard.

(Présentation de l'expérience)
Ligne 4 : Ligne 4 :
=='''Présentation de l'expérience'''==
=='''Présentation de l'expérience'''==
-
Comment prendre des photographies thermiques à moindre coût ? Ce petit montage peu coûteux comparé au prix d'une caméra dédiée à la photographie thermique, se base sur la technique du "light painting".
+
Comment prendre des photographies thermiques ? Ce petit montage peu coûteux comparé au prix d'une caméra dédiée à la photographie thermique, se base sur la technique du "light painting".
== '''Matériel''' ==
== '''Matériel''' ==

Version du 20 mai 2013 à 20:36

Article incomplet en cours de rédaction
La vidéo "Photo Thermique à base d'arduino"


Sommaire

Présentation de l'expérience

Comment prendre des photographies thermiques ? Ce petit montage peu coûteux comparé au prix d'une caméra dédiée à la photographie thermique, se base sur la technique du "light painting".

Matériel

  • Un appareil photo de type reflex
  • Un arduino
  • Une led RGB (Rouge, verte, bleue)
  • Un capteur de température Infra rouge ([1])

L'expérience

Réalisez le montage comme décris ci-dessous.

Uploadez le programme ci-dessous dans votre arduino. Afin d'avoir des résultats visibles, c'est à dire des couleurs bleues pour les zones froides et rouges pour les zones chaudes, bien contrastées , effectuez des mesures sur votre mur ou objet afin d'avoir un ordre de grandeur des températures à détecter.

/****************************************************************************/
// Code pour photographie thermique. ATTENTION NE FONCTIONNE PAS AVEC UN ARDUINO DUEMILANOVE !
// inspiré de http://publiclaboratory.org/tool/thermal-photography
// et du tutoriel Grove sensor capteur de température IR : http://www.seeedstudio.com/wiki/Grove_-_Infrared_temperature_sensor	
// 
// Programme sous licence GNU-GPL
// Les Petits Débrouillards 2013
//******************************************************************************/



#include <math.h> // bibliothèque Math parce que l'on va faire des calculs !

#define SUR_TEMP_PIN A0 // Entrée Analogique pour connecter la broche "SUR" du capteur de température
#define OBJ_TEMP_PIN A1 // Entrée Analogique pour connecter la broche "OBJ" du capteur de température

/// Réglage de la température minimale et maximale
const float lowReading = 0;
const float highReading = 45;


//Parametres de calibrage du capteur IR ///////////////////////////
float temp_calibration=0;       //this parameter was used to calibrate the temperature
//float objt_calibration=0.000; //this parameter was used to calibrate the object temperature
float temperature_range=10;    //we make a map of temperature-voltage according to sensor datasheet. 10 is the temperature step when sensor and 
//object distance is 9CM.
float offset_vol=0.014;        //this parameter was used to set the mid level voltage,when put the sensor in normal environment after 10 min,
//the sensor output 0.For example,the surrounding temperature is 29℃,but the result is 27℃ via the sensor,
//you should set the reerence to 0.520 or more,according to your sensor to change.
//the unit is V
float tempValue = 0; 
float objtValue= 0;  
float current_temp=0;
float temp=0;
float temp1=0;
float temp2=0;
unsigned int temp3=0;
const float reference_vol=0.500;
unsigned char clear_num=0;//when use lcd to display
float R=0;
float voltage=0;
long res[100]={
  318300,302903,288329,274533,261471,249100,237381,226276,215750,205768,
  196300,187316,178788,170691,163002,155700,148766,142183,135936,130012,
  124400,119038,113928,109059,104420,100000,95788,91775,87950,84305,
  80830,77517,74357,71342,68466,65720,63098,60595,58202,55916,
  53730,51645,49652,47746,45924,44180,42511,40912,39380,37910,
  36500,35155,33866,32631,31446,30311,29222,28177,27175,26213,
  25290,24403,23554,22738,21955,21202,20479,19783,19115,18472,
  17260,16688,16138,15608,15098,14608,14135,13680,13242,12819,
  12412,12020,11642,11278,10926,10587,10260,9945,9641,9347,
  9063,8789,8525,8270,8023,7785,7555,7333,7118,6911};

float obj [13][12]={
  /*0*/  { 
    0,-0.274,-0.58,-0.922,-1.301,-1.721,-2.183,-2.691,-3.247,-3.854,-4.516,-5.236  }
  , //
  /*1*/  { 
    0.271,0,-0.303,-0.642,-1.018,-1.434,-1.894,-2.398,-2.951,-3.556,-4.215,-4.931  }
  ,  //→surrounding temperature,from -10,0,10,...100
  /*2*/  { 
    0.567,0.3,0,-0.335,-0.708,-1.121,-1.577,-2.078,-2.628,-3.229,-3.884,-4.597  }
  ,   //↓object temperature,from -10,0,10,...110
  /*3*/  { 
    0.891,0.628,0.331,0,-0.369,-0.778,-1.23,-1.728,-2.274,-2.871,-3.523,-4.232  }
  ,
  /*4*/  { 
    1.244,0.985,0.692,0.365,0,-0.405,-0.853,-1.347,-1.889,-2.482,-3.13,-3.835  }
  ,
  /*5*/  { 
    1.628,1.372,1.084,0.761,0.401,0,-0.444,-0.933,-1.47,-2.059,-2.702,-3.403  }
  ,
  /*6*/  { 
    2.043,1.792,1.509,1.191,0.835,0.439,0,-0.484,-1.017,-1.601,-2.24,-2.936  }
  ,
  /*7*/  { 
    2.491,2.246,1.968,1.655,1.304,0.913,0.479,0,-0.528,-1.107,-1.74,-2.431  }
  ,
  /*8*/  { 
    2.975,2.735,2.462,2.155,1.809,1.424,0.996,0.522,0,-0.573,-1.201,-1.887  }
  ,
  /*9*/  { 
    3.495,3.261,2.994,2.692,2.353,1.974,1.552,1.084,0.568,0,-0.622,-1.301  }
  ,
  /*10*/  { 
    4.053,3.825,3.565,3.27,2.937,2.564,2.148,1.687,1.177,0.616,0,-0.673  }
  ,
  /*11*/  { 
    4.651,4.43,4.177,3.888,3.562,3.196,2.787,2.332,1.829,1.275,0.666,0  }
  ,
  /*12*/  { 
    5.29,5.076,4.83,4.549,4.231,3.872,3.47,3.023,2.527,1.98,1.379,0.72  }
};
const unsigned char separatorCharacter = 255;
////////////////////////////////////////////////////////////////////

void setup() 
{
  Serial.begin(9600); // Initialisation de la communication série à 9600 bauds
 //(mega only)set the refenrence voltage 1.1V,the distinguishability can up to 1mV.
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
}
void loop()
{
   analogReference(INTERNAL);
  
  measureSurTemp();//measure the Surrounding temperature around the sensor
  measureObjectTemp();

  float state = normf(measureObjectTemp(), lowReading, highReading);
  int hue = map(state,0,255,(360.00*0.60),0); // transformation de la température en couleur
   analogReference(DEFAULT);
  setLedColorHSV(hue,1,1); //commande de la led

  Serial.println(temp);

}

float binSearch(long x)// this function used for measure the surrounding temperature
{
  int low,mid,high;
  low=0;
  //mid=0;
  high=100;
  while (low<=high)
  {
    mid=(low+high)/2;
    if(x<res[mid])
      low= mid+1;
    else//(x>res[mid])
    high=mid-1;
  }
  return mid;
}

float arraysearch(float x,float y)//x is the surrounding temperature,y is the object temperature
{
  int i=0;
  float tem_coefficient=100;//Magnification of 100 times	
  i=(x/10)+1;//Ambient temperature			
  voltage=(float)y/tem_coefficient;//the original voltage		
  //Serial.print("sensor voltage:\t");		
  //Serial.print(voltage,5);	
  //Serial.print("V");			
  for(temp3=0;temp3<13;temp3++)		
  {			
    if((voltage>obj[temp3][i])&&(voltage<obj[temp3+1][i]))				
    {			
      return temp3;					
    }			
  }
}
float measureSurTemp()
{  
  unsigned char i=0;
  float current_temp1=0;	  
  int signal=0;	  
  tempValue=0;

  for(i=0;i<10;i++)       //	  
  {		  
    tempValue+= analogRead(SUR_TEMP_PIN); 		  
    delay(10); 	  
  }	  
  tempValue=tempValue/10;	  
  temp = tempValue*1.1/1023;	  
  R=2000000*temp/(2.50-temp);	  
  signal=binSearch(R);	  
  current_temp=signal-1+temp_calibration+(res[signal-1]-R)/(res[signal-1]-res[signal]);
  //Serial.print("Surrounding temperature:");
  //Serial.print(current_temp);
  return current_temp;
}

float measureObjectTemp()
{
  unsigned char i=0;  
  unsigned char j=0;  
  float sur_temp=0;  
  unsigned int array_temp=0;  
  float temp1,temp2; 
  float final_temp=0;
  objtValue=0;	
  for(i=0;i<10;i++)
  {
    objtValue+= analogRead(OBJ_TEMP_PIN); 
    delay(10); 
  }       
  objtValue=objtValue/10;//Averaging processing     
  temp1=objtValue*1.1/1023;//+objt_calibration; 
  sur_temp=temp1-(reference_vol+offset_vol);             
  //Serial.print("\t Sensor voltage:");		
  //Serial.print(sur_temp,3);	
  //Serial.print("V");	
  array_temp=arraysearch(current_temp,sur_temp*1000);        
  temp2=current_temp;        
  temp1=(temperature_range*voltage)/(obj[array_temp+1][(int)(temp2/10)+1]-obj[array_temp][(int)(temp2/10)+1]);        
  final_temp=temp2+temp1;        
  if((final_temp>100)||(final_temp<=-10))
  {
    Serial.println ("\t out of range!");
  }
  else
  {
    Serial.print("\t object temperature:");		
    Serial.println(final_temp,2); 
    return final_temp;
  }
}


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 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(11,red); //broche du rouge en 9
  analogWrite(10,green); //broche du vert en 10
  analogWrite(9,blue); //broche du bleu en 11
}


et ensuite modifiez les deux premières variables :

const float lowReading = 0; // température basse en degrés (bleu)
const float highReading = 35; // température haute en degrés (rouge)

Une fois le montage réalisé, scotchez le capteur de température infrarouge bien parallèle à la led RGB.


La manipulation

Je décris l'expérience

Que voit-on ?

Je note les points importants à observer !!!

Explications

De manière simple

Je propose une explication scientifique de manière simple, de la façon la plus imagée possible. Imaginez que vous expliquez l'expérience à un enfant ou à une personne non scientifique (éviter le tutoiement !

Questions sans réponses

Ici je mets les questions soulevées par l'expérience, qui n'ont pas trouvé de réponses !!

Allons plus loin dans l'explication

Développons les concepts scientifiques associés.
Ne pas hésiter à faire des liens avec Wikipédia.

Liens avec d'autres expériences

Expériences sur Wikidébrouillard

Indiquer ici les expériences de Wikidébrouillard.

Autres expériences

Autres expériences avec le même concept, recherche sur internet (indiquer les liens). 

Applications : liens avec le quotidien

C'est de la culture, ça aide à comprendre le monde !! N'hésitez pas à lancer la discussion de votre fiche (après l'avoir sauvegarder !) afin de trouver de l'aide pour la compléter

Lieux propices à sa réalisation

Indiquer ici des lieux où tout le matériel nécessaire pour réaliser cette expérience est disponible.

Catégories

Penser à fixer les disciplines scientifiques qui correspondent à l'expérience. Remplacer "à classer" par la discipline correspondante.
Portail des ExplorateursWikidébrouillardLéon DitFLOGPhoto mystèreJ'ai FaitPortraits
AR
AR

Photo Thermique à base d'arduino

Rechercher

Page Discussion Historique
Powered by MediaWiki
Creative Commons - Paternite Partage a l

© Graphisme : Les Petits Débrouillards Grand Ouest (Patrice Guinche - Jessica Romero) | Développement web : Libre Informatique