foto termica bassa risoluzione

Ciao
a “soli” 15€ mi sono comprato un MLX90614ESF-ACF, ovvero un termometro infrarosso. Ma uno qualsiasi: ACF infatti sta per:
A = 5V
C = Gradiente-compensato (meno problemi per interferenze esterne sulla lettura)
F = 10° di FOV, cioò vuol dire che “vede” un cono che a 100 cm di distanza è di 10 cm di raggio (c’è anche la I a 5° ma saliamo molto di prezzo -.-")

il bello di questo sensore è che è i2c e restituisce una bellissima temperatura in Kelvin, anche se non pare essere compatibile con la Wire, ho trovatoun esempio per usarlo qui: http://wiki.bildr.org/index.php/Infrared_Thermometer_-_MLX90614, ed è molto più veloce a rispondere ai cambiamenti di temperatura di una sonda K (l’ho messo in parallelo con sonda K e un DS18B20 però in chiusura ermetica)

ora, per giocare un pò con il sensore ho deciso di prendere un paio di servo che avevo in giro per casa, e con scotch e barattolo dello yogurt creare una piccola (e pessima) “macchina fotografica termica”

quindi un servo lo muove a destra/sinistra (roll) e uno su/giù (pitch), con intervalli di circa 2° (20 step ma girano di solo 45° circa, devo regolare l’escursione dei servo, quindi dovrei arrivare sui 30/40), il che ci porta ad un immagine 20*20 pixel.

Vengono dunque attesi 500ms per attendere che l’accrocchio si fermi, e viene presa una misura. Infine viene rispedito al PC il valore di posizione dei due sensori più la lettura in kelvin, formato ascii divisi da uno spazio e \n finale.

Si nota bene il copia incolla del codice per il sensore, occhio che serve la libreria i2cmaster che rovate al link allegato col codice originale.

Ho fatto un video, lo linko appena finisce di caricare, ogni tanto l’i2c “salta” per via dei collegamenti volanti. Dopodomani parto, ma quado torno vorrei fare collegamenti più seri e un piccolo visualizzatore dello “scatto” in scala di grigi in base alla temperatura in processing.
Stay tuned

#include <i2cmaster.h>
#include <Servo.h>

const int  MIN_SERVO = 800, MAX_SERVO = 1800;
Servo a, b;

void setup(){
  Serial.begin(9600);
  Serial.println("Setup...");

  i2c_init(); //Initialise the i2c bus
  PORTC = (1 << PORTC4) | (1 << PORTC5);//enable pullups
  a.attach(10, MIN_SERVO, MAX_SERVO);
  b.attach(12, MIN_SERVO, MAX_SERVO);
}

void loop(){
  for (int yaw = MIN_SERVO; yaw < MAX_SERVO; yaw+=50){
    a.writeMicroseconds(yaw);
    for (int pitch = MIN_SERVO; pitch < MAX_SERVO; pitch+=50){
      b.writeMicroseconds(pitch);
      delay(500);
      Serial.print(yaw);
      Serial.print(" ");
      Serial.print(pitch);
      Serial.print(" ");
      Serial.print( readTemp() );
      Serial.println();
      //delay(500);
    }
  }
}

double readTemp(){
  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.
  if (data_high & 0x8000){
    return -1; //error flag reading
  }
  tempData = (double)(((data_high & 0x007F) << 8) + data_low);
  tempData = (tempData * tempFactor)-0.01;

  float celcius = tempData - 273.15;
  float fahrenheit = (celcius*1.8) + 32;

  return tempData; //kelvin

  //Serial.print("Kelvin: ");
  //Serial.println(tempData);

  //Serial.print("Celcius: ");
  //Serial.println(celcius);

  //Serial.print("Fahrenheit: ");
  //Serial.println(fahrenheit);

  //delay(1000); // wait a second before printing again
}

ora, per giocare un pò con il sensore ho deciso di prendere un paio di servo che avevo in giro per casa, e con scotch e barattolo dello yogurt creare una piccola (e pessima) "macchina fotografica termica"

interessante, attendo gli sviluppi

EDIT avevi visto questo? http://forum.arduino.cc/index.php?topic=54655.105

tipo questo di robot-italy (15,49 euro ivato)?

non lo sapevo... il principio di lavoro è esattamente lo stesso, certo loro l'ahho portato mille volte più in là.. quando sarà disponibile il video vi farete quattro risate a vedere l'accrocchio che si impalla, tocco i fili dell'i2c per fare contatto e voilà :) (certo che 200€ per il kit completo... esagerati secondo me, 100-150€ al massimo)

Notare che è da ottimizzare il range dei servo, il fatto che ogni volta i rservo ripartono da 0° invece che fare 0°->180°->0°

tra l'altro mi sono ricordato che i servo fanno circa 180°, quindi devo raddoppiare i valori di cui sopra.. o frose i miei fanno solo 90°, bho.

nid69ita: tipo questo di robot-italy (15,49 euro ivato)? http://www.robot-italy.com/it/infrared-thermometer-mlx90614.html

NO! querllo è un -BAA che vuol dire: B: 3V, quindi ti serve un covertitore di livelli logici 3V->5V A: singola zona: possibile problema di precisione A: pacake stanrd: quindi IMMAGINO > 35° FOV (che è la C)(a 100cm il diametro è 35cm) ed è esageratamente grande, infatti il sensore fa una media dell'area letta.

quindi è troppo impreciso a meno che non devi misurare una grande area o usarlo da molto vicino (a 10cm leggi un cerchio di diametro 3cm, ci puoi leggere se hai la febbre, per esempio!)

edit: lo trovi a 7€ (? FOV, probabile > 35°): http://www.futureelectronics.it/it/technologies/semiconductors/analog/sensors/temperature/Pagine/6266423-MLX90614ESF-AAA-000-TU.aspx?IM=0 il mio 15€ (10° FOV) http://www.futureelectronics.it/it/technologies/semiconductors/analog/sensors/temperature/Pagine/4099248-MLX90614ESF-ACF-000-TU.aspx?IM=0 il loro (5°FOV) 27€ http://www.futureelectronics.it/it/technologies/semiconductors/analog/sensors/temperature/Pagine/1013502-MLX90614ESF-BCI-000-TU.aspx?IM=0

E' possibile sapere dove lo hai comprato? Anche su Sparkfun ho visto solo un -AAA

uppato il post precedente con il negozio, vende anche tantissi componenti all’ingrosso… e per ingrosso intendo 1000 componenti alla volta a pochi euro… qualcuno necessita dioi o transior? :grin: :grin: :grin:

Che tipo di transistor? Mi sono rifornito di un sacco di roba dall' ultmo ordine da electronic.it, tranne transistor. Avrò preso 2-300 trimmer :)

Be', anch'io in genere prendo confezioni da 50 o 100 pezzi ... prima di tutto perche' si pagano di meno in proporzione, poi perche' tanto prima o dopo vengono sempre buoni per qualcosa, ma soprattutto perche' il negozio di elettronica piu vicino sta a 60Km da qui ... se ogni volta che devo andare a prendere qualcosa mi tocca buttare 20 Euro di gasolio, tanto vale fare scorta da internet, ed usarli per prendere piu materiale :P XD

tutti TO-92 bc547bta (npn 100mA) x25 bc237brl1g (npn 100mA) x100 bc557btf (npn 100mA) x100 1n4933(diodi) x100

sono 3 serie perchè una è stata presa per errore al posto dei pin maschi. uff

ma… quanti ne hai presi?

…io continuo ad aggiungere link a tema :stuck_out_tongue:

http://www.centralnexus.com/thermal/

sempre lo stesso. son tornato ieri notte dalle vacanze, a breve riprendo in mano un pò i progetti vari

x iscrizione

10€

Madwriter: x iscrizione

leo72: 10€

ROTFL :grin: :grin: :grin: