Uno de los sensores con los que pude trabajar y que me gustaron mucho es el MLX90614 de la compañía Melexis http://www.melexis.com/ , esta pequeña maravilla es un sensor de temperatura infrarrojo que incluye una termopila para detectar la temperatura, un amplificador de bajo ruido, un convertidor analógico digital de 17 bits y una pequeña unidad DSP, todo en el mismo ASIC, la salida puede ser en forma de señal PWM proporcional a la temperatura ó utilizando el puerto SMBUS (que es básicamente el bus I2C con algunas variaciones)
sensor de temperatura MLX90614
Existen varias versiones del mismo sensor, dependiendo de algunas características, por ejemplo si es de una o dos zonas de detección, voltaje de alimentación (3 ó 5 volts) , resolución, en fin (incluso existe una versión de grado médico) pero esto se puede verificar el la hoja de especificaciones.
El costo del sensor esta alrededor de los 5 dólares a través de América II electronics, un precio mucho mas que aceptable considerando las características del sensor, aunque al escribir esto pase por algunas de la tiendas en línea de electrónica y me sorprendí al ver como se dispararon los precios, llegando a los 27 dólares en algunos lugares como Digikey.
Interfaz del sensor con un PIC MICRO
En la pagina del fabricante viene una nota de aplicación para realizar la comunicación usando el SMBUS, sin embargo esta nota de aplicación se basa en un pic10 y usando lenguaje ensamblador, que aunque nos sirve para entender el proceso de comunicación completo, realmente no es de mucha ayuda cuando se trata de echar a andar el sensor rápidamente para una aplicación.
Para utilizar rápidamente el sensor lo mas aconsejable es utilizar algún compilador en C y utilizar directamente el puerto I2C para la comunicación, en ejemplo que coloco aquí estoy utilizando un PIC18F4550, y el compilador CCS
//// Programa para hacer interfaz con el sensor de temperatura ////
//// infrarrojo Melexis ////
//// ////
//// ////
//// ////
//// status: Funcionando ////
//// Por: Victor Pasilla Campos ////
//// 30 Agosto 2007 ////
//// ////
//// Notas: ////
//// ////
//// ////
///////////////////////////////////////////////////////////////////////////////////////
#include <18F4550.H>
//#device ADC=10
//#device ADC=8
#device HIGH_INTS=TRUE
//#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,PUT,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN // para el cristal de 20mhz
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN // para el cristal de 12mhz
#use delay (clock=48000000)
#use rs232(baud=115200, xmit=PIN_C6,rcv=PIN_C7)
#use I2C(master,sda=PIN_B0, scl=PIN_B1)
int8 resultado1=0;
int8 resultado2=0;
int8 CRC=0;
int16 tempk=0;
float tempc=0.0;
void main (void){
while (TRUE){
// lectura = read_adc();
output_toggle(pin_B4);
i2c_start();
//i2c_write(0x00); // pido datos del sensor
if (i2c_write(0xB4)==0){ // direccion del sensor melexis para mandar comando
i2c_write(0x07); // pido datos del sensor
i2c_start();
i2c_write(0xB5); // direccion del sensor melexis para leer
resultado1 = i2c_read(1);
resultado2 = i2c_read(1);
tempk= make16(resultado2,resultado1);
CRC = i2c_read(0);
}
i2c_stop();
tempc=(tempk*0.02)-273;
printf("temp:%3.2f\n\r",tempc);
delay_ms(500);
}
}
El programa lee de un único sensor conectado en el bus I2C y envía el resultado de la temperatura a través del puerto Serial, en la PC puede visualizarse usando cualquier SERIAL PORT MONITOR, como el que viene incluido con el compilador CCS, o incluso puede usarse el hiperterminal.
Estoy realizando un proyecto similar, pero con mlx90615 y 18f4550 con mikroc pero no me funciona aun me gustaria saber si me puedes ayudar con la programacion el sensor funciona con SMBus y PWM cual de estas dos formas me recomendaria para hacerlo funcionar, y felicidades excelente pagina saludos
Saludos
con el compilador de MikroC no lo he hecho pero supongo que es muy similar, sin embargo recuerdo que algo que me dio muchos problemas es que este sensor no sigue exactamente el protocolo I2C,
así que fíjate en el programa después de la instrucción
if (i2c_write(0xB4)==0){ // si es cero el sensor responde con un ACK
i2c_write(0x07); // pido datos del sensor
inmediatamente vuelvo a enviar una condición de Start ,
i2c_start();
si no haces esto el chip no responde
Estoy programando con el sensor mlx90615 pero aun tengo problemas no logro comunicar los dispositivos al igual q tu utilizo un pic 18f4550, necesito ayuda saludos
el programa que esta de ejemplo funciona perfectamente, sin embargo recuerdo que también tuve que modificar el hardware, normalmente pongo resistencias de pull-up en el bus I2C cuando comunico varios Micros, sin embargo este chip requiere que las resistencias de pull-up sean mas pequeñas , con unas de 2.2k funciona sin problemas
Hola! el codigo me funciona perfectamente, nada mas que me quedaron muchas dudas, una de ellas es que segun el datasheet dice que la direccion de comunicacion es 0x5A, entonces no se porque esta en el codigo 0xB4 y 0xB5 no se si podrias describir el porque de cada direccion con mas detalle, si no es mucha molestia.. n.n
oh y otra cosa que no entiendo es para que se usa esto #device HIGH_INTS=TRUE
en realidad no necesita esa instrucción, tome ese segmento de código de un programa más grande que usaba dos interrupciones de Timers y una interrupción del puerto serial y tenía que darle prioridad a la del puerto serial, así que esa instrucción hacia eso , pero nada más, para esta aplicación no es útil
ok,…
si revisas el protocolo que usa, (pagina 15 del Datasheet) en la figura 4 se ve como están los bits que envías al dispositivo algo como esto:
| 1 | 7 | 1 | 1 | 8 | 1 | 1
____________________________________________
| S | dirección | Wr | A | Datos | A | P
entonces para comenzar la trasmisión envías la condición de inicio (S), luego la dirección del dispositivo y luego el bit que determina si se lee o se escribe desde el dispositivo
así que tenemos 0x5A = 1011010 y el bit menos significativo de lectura o escritura un 1 ó 0 , asi que formamos las direcciones 1011010 0 =0xB4 para escribir y 1011010 1 =0xB5 para leer
y eso es todo 😉
Entendido Muchas Gracias!! 😀
Hola buen día, quisiera preguntar qué función tiene output_toggle ahí en el código, tampoco entiendo la función de la variable CRC…Gracias por responder (:
bueno, la función output_toggle solo esta cambiando de alto a bajo en cada ciclo, y la usaba para revisar que no hubiera ningún problema con el bus de comunicación I2C, esto debido a que cuando hacia las primeras pruebas el bus de I2C dejaba de transmitir en algún momento y con esto lo detectaba, lo del CRC es por que el sensor envía un condigo CRC para verificar la comunicación y el micro podría revisar que toda la transmisión de datos fuera correcta, pero en este demo no la implemente.
Ok entendido muchas gracias por responderme 😀
Alguien a intentado leer dos sensores de estos en un Pic, necesito una orientacion.
primero debes cambiar la dirección por default de uno de los sensores,busca en la sección 8.3.3 ahí esta la direccíon de la EEPROM correspondiente a la dirección del dispositivo
y en la sección 8.4.1 de la hoja de especificaciones esta la descripción de funcionamiento del bus, de hecho indica que se pueden conectar hasta 127 dispositivos en el mismo bus
int8 resultado1,resultado_3=0;
int8 resultado2,resultado_4=0;
int8 CRC=0;
int16 tempk,tempk_1=0;
float tempc,tempc_1=0.0;
void main (void)
{
while (TRUE)
{
output_toggle(pin_B4);
i2c_start();
if (i2c_write(0xB4)==0) // direccion del sensor para mandar comando 1101011
{
i2c_write(0x07); // pido datos del sensor
i2c_start();
i2c_write(0xB5); // direccion del sensor para leer
resultado1 = i2c_read(1);
resultado2 = i2c_read(1);
tempk= make16(resultado2,resultado1);
CRC = i2c_read(0);
}
i2c_stop();
tempc=(tempk*0.02)-273;
printf(«temp:%3.2f\n\r»,tempc); delay_ms(500);
////////////////////////////////////////////////////////////////////////////////
if (i2c_write(0xB6)==0) // direccion del sensor para mandar comando 01011011
{
i2c_write(0x08); // pido datos del sensor
i2c_start();
i2c_write(0xB7); // direccion del sensor para leer
resultado_3 = i2c_read(1);
resultado_4 = i2c_read(1);
tempk_1= make16(resultado_4,resultado_3);
CRC = i2c_read(0);
}
i2c_stop();
tempc_1=(tempk_1*0.02)-273;
printf(«temp:%3.2f\n\r»,tempc_1); delay_ms(500);
}
////////////////////////////////////////////////////////////////////////////////
}
}
Hola, asi es como entendi, podrias compartir tu opinion. Como comentaba, lo que trato es de ver la lectura de los 2 sensores a la vez.
Por favor, revisa el codigo y comparte!!.
Hola que tal, no había podido responder porque he tenido mucho trabajo…
Bueno no he revisado bien tu código, y no lo podría probar ya que no tengo mas sensores de estos, lo siento
hola que tal, una consulta tienes el diagrama de conexion de los pines del sensor hacia tu microcontrolador te agradeceria bastante poder brindarlo
pues creo que si tengo el diagrama, pero la conexión es muy sencilla, ya que usa el bus I2C solo debes conectar los pines SDA (datos) y SCK (reloj) del microcontrolador a los pines SD y SCK del sensor sin olvidar las resistencias de pull-up, y listo eso es todo, la conexion del sensor viene en la hoja de especificaciones
Saludos
Así es, de los pines SDA y SCL conectas unas resistencias de 2.2k a voltaje y listo!.
Ya implemente físicamente el programa y funciona de maravilla. Pero aun tengo una pregunta. ¿?… Como obtengo la temperatura objeto y la temperatura ambiente en el mismo programa del pic?.
hola nuevamente estimados, mi pregunta se basa en la distancia promedio de testeo del sensor hacia el objeto a medir,desde ya agradezco su respuesta. Muchas gracias
Lo mas cercano a la realidad seria medir primero la temperatura pegando el sensor al objeto y despues sacar un coeficiente ya retirando a cierta distancia el sensor. Por decir asi, el objeto tiene una temp. de 80°C y a 10 cm tiene una temp de 79, entonces hay una relacion distancia temperatura. De ahi lo puedes sacar. Saludos…
Esa podría ser una aproximación, simplemente midiendo la temperatura de un objeto cuya temperatura también mides con otro sensor por ejemplo un termopar y comparando la medida a diferentes distancias,y obteniendo una relación aproximada la cual variara un poco dependiendo del sensor que uses , por ejemplo revisa en la pagina 35 del DataSheet, y veras el FOV de cada modelo de sensor hay unos que tienen un campo de visión de unos 20 grados y nos que son mucho mas cerrados, con lo cual solo medirá la temperatura de objetos que se encuentren prácticamente frente al sensor y nada mas
hola mi estimados..he ensamblado todo con un pic 16f877a y mostrarlo en un LCD pero no recibo resultado alguno…que creen ustdes mis estimados que seael problema’??
Hola, sigues el programa principal?,, revisa el hardware sobre todo las resistencias de pull up
BUEN DIA VICTOR, SOY ESTUDIANTE Y ESTOY HACIENDO UN PROYECTO CON EL SENSOR MLX90614 PERO YO ESTOY UTILIZANDO EL KIT CP2112EK DE SILLICON LABS PARA COMUNICARME CON EL SENSOR, PERO LA VERDAD NO LOGRO COMUNICARME, TU PODRIAS AYUDARME??
Hola , no tengo este KIT, tienes el diagrama?, revisa que la conexión sea la misma, que como esta en el Datasheet del dispositivo, que micro estas usando ? este programa es solo para uno de la serie 18
ahh ya lo revise, este kit es básicamente un conversor de USB a I2C, bueno empieza viendo si el módulo por si mismo funciona, antes de meterte con el senso, prueba a comunicarte con un micro , con un programa de eco simple ya que veas que el kit funciona despues intenta trabajar con el sensor
Hola, espero aun revisen el post 😛 estoy trabajando con el pic18f4550, pero yo quiero escribir y leer datos en una eeprom 24lc512, envio los datos por bluetooth y no logro hacer la comunicación, de momento me conformo con que me saquen de una duda, la función i2c_read(1); trabaja con ack, pero no se cuado poner 0, cuando 1 o 0u, me podrían ayudar con esa duda?, gracias y saludos
Hola que tal, pues la verdad ya no tengo mucho tiempo para escribir cosas nuevas como quisiera pero reviso de vez en cuando…
ok veamos , el ACK te sirve para indicar que recibiste el dato, pero también depende del dispositivo que es estés usando, si estas leyendo muchos datos tal vez necesites un ACK por cada dato, o puede que solo un ACK al final de la lectura de todos … necesitas checarlo con la hoja de especificaciones
Saludos
Hola buen día, me gustaría ayuda para realizar la programación del sensor utilizando el c compiler y un pic16f877a
Hola , disculpa que no contestara tan rápido, casi no tengo tiempo de seguir escribiendo….
el código que compartí debería servir para ese micro , aunque no puedo asegurarlo, necesitaría probarlo
Buenas, quería preguntar si ya probaste el código para el micro PIC16F877A, si es funcional
hola , no lo he probado para ese micro en específico pero creo que debería funcionar