lunes, 16 de enero de 2012

Sensor de temperatura. OneWire y DS1820

Descripción


Gracias a la gente de Maxim, he podido probar los famosos DS1820, los cuales son unos sensores de temperatura  con un rango de funcionamiento entre -55 ºC y +125 ºC (con una precisión de +-0.5 ºC entre -10 ºC y +85 ºC), y disponen de un bus de comunicaciones OneWire. Por encima os comentaré que es un bus que tan solo necesita un cable para datos y otro como referencia. Una de las principales ventajas de estos dispositivos es que pueden ser alimentados en "modo parásito" a través del bus de datos sin necesidad de una alimentación extra (si queréis podéis leer más sobre este bus), el rango de tensión para la alimentación es de 3.0V a 5.5V. 

Lo normal es que obtengáis este dispositivo en su encapsulado TO-92, para poder trabajar con él mucho mejor, aunque también esta disponible en SO, aunque ya me diréis como lo vais a pinchar en la placa si estáis haciendo pruebas... 



Conexión

Como os dije anteriormente, una de las principales ventajas de este dispositivo es la posibilidad de conectarlo en "modo parásito", en el datasheet viene un largo apartado para explicar todo esto, pero os dejo un esquema de la conexión eléctrica en este modo.



Mapeado de memoria

Como llevo diciendo en todo momento, posee un bus de comunicaciones, y este permite conectar diversos dispositivos al mismo bus (teóricamente pueden ser direccionados en un bus infinitos dispositivos), por lo que el maestro (en nuestro caso el micro-controlador) tendrá que ser capaz de distinguir entre un dispositivo y otro. Pues bien, el DS1820 dispone de un registro de memoria (en ROM) que contiene un código de 64 bit, de los cuales:
  • Los 8 menos significativos contienen un código característico de la familia DS1820.
  • Los siguientes 48 bits contienen un código único para ese dispositivo.
  • Los 8 bits más significativos contienen el byte de chequeo de redundancia cíclico (CRC), calculado a partir de los primeros 56 bits.
La memoria del DS1820 esta organizada según la siguiente tabla:


Según la gente de Maxim, este mapeado de memoria consiste en un "bloc de notas", scratchpad en la lengua de Shakespeare, almacenado en una EEPROM no volátil (con todo lo que ello conlleva). Pero analicemos paso a paso cada uno de los bytes de este scratchpad.
  • Byte 0. Contiene la parte menos significativa (LSB) de la medida de temperatura. Es un registro sólo para lectura.
  • Byte 1. Contiene la parte más significativa (MSB) de la medida de temperatura. Es un registro sólo para lectura. 
  • Bytes 2 y 3. Registros TH y TL. Este dispositivo tiene la posibilidad de comparar la temperatura que este midiendo en el momento con una que se configure, este es el lugar para indicar esa temperatura con la que se quiere comparar. El bit 7, es de signo y el resto contendrá la información que le facilitemos. Según el datasheet (esto no lo he podido comprobar), al hacer la comparación el trigger de la alarma se almacenará en los registros 1-byte de TH y TL. Ni que decir tiene que son registros de lectura y escritura.
  • Bytes 4 y 5. Reservados. Estos registros no pueden ser sobre-escritos.
  • Bytes 6 y 7. Contienen los registros COUNT REMAIN y COUNT PER ºC, los cuales pueden ser utilizados para calcular con mayor resolución la medida de temperatura. Son registros de lectura.
  • Byte 8. Contiene el registro CRC o Cyclic Redundancy Checks, que no es para que para comprobar la correcta medida del sensor. Es un registro solo para lectura. 

Programación


Si a la vez que seguís este texto, o antes o después, tenéis la oportunidad de leer el datasheet (cosa que creo que es muy recomendable si queréis usar el DS1820), veréis que explican los procesos que hay que seguir para iniciar las comunicaciones por el bus one-wire. La ventaja que tenemos si usamos las librerías de Arduino es que todo esto ya esta implementado, y por tanto solo tendríamos que hacer llamadas a las distintas funciones que necesitemos. Mi intención es ir explicando y desarrollando las librerías, pero como estamos empezando os explico un poco las funciones utilizadas en el programa:

#include <OneWire.h> Incluimos la librería OneWire.h

ds.reset() Resetea el bus de comunicaciones. Necesario antes de iniciar las comunicaciones.

ds.search(arraydirec) Busca un nuevo dispositivo en el bus, arraydirec debe ser un array de 8 bytes esta función encuentra un nuevo dispositivo, introduce su dirección en arraydirec y devuelve TRUE, sino encuentra nada devuelve FALSE.

ds.reset-search() Inicia una nueva búsqueda.

ds.select(arraydirec) Selecciona el dispositivo sobre el que vamos a actuar.

ds.write(num,1) Escribe el byte num, y deja el bus a 1.

ds.write(num) Escribe el byte num.

ds.read() Lee un byte.


De todas formas podéis ver mas información y ejemplos de la librería en la web del desarrollador.


Os dejo mi código para Arduino, es una modificación del código de Trimbitas Sorín (no pretendo colgarme ninguna medalla), pero ampliada y sobre todo comentada. 






No hay comentarios:

Publicar un comentario