Midiendo la presión y la temperatura con un BMP085

Sensor presión y temperatura I2CTodo en uno 10DOF - (L3G4200D+ADXL345+HMC5883L+BMP085)Acabo de recibir un 10DOF. Es un módulo «todo en uno» que combina cuatro integrados (L3G4200D+ADXL345+HMC5883L+BMP085) con comunicación I2C en la misma placa. Permite medir en los tres ejes la orientación magnética, la velocidad angular y la aceleración angular, ademas de la presión y la temperatura, por lo que es especialmente interesante para tareas de navegación asistida (para aeromodelismo por ejemplo).

En el capítulo de hoy vamos a ver como medir la presión atmosférica y la temperatura, con el BMP085.

Como se puede ver en el datasheet, el BMP085 proporciona medidas de presión entre 300 y 1100 hPA con una resolución de hasta 0.03 hPA. Se puede usar para calcular altitudes con una precisión de 0.25 m, o bien para una estación meteorológica, sabiendo que las bajadas de presión suelen coincidir con alta probabilidad de lluvia y la subidas con tiempo soleado.

Existen varias versiones de la placa que usaremos, pero todas tienen en común los cuatro pines que vamos a utilizar: Vcc, GND, SCL y SDA. Los dos primeros proporcionan alimentación a la placa, yo voy a utilizar 3.3V pero lleva un regulador integrado que permite trabajar también a 5V. Los dos últimos son el reloj y los datos del bus I2C. Es un bus half-duplex, por lo que la misma señal de datos (SDA) se usa en las dos direcciones, el reloj si embargo lo controla sólamente el maestro. En este caso un PIC.

Utilizaremos las librerias software de CCS para la comunicación I2C con un 18F1320 (que no tiene I2C por hardware), pero podríamos usar el módulo integrado I2C que tienen muchos otros modelos de PIC.

El BMP085 proporciona unos valores brutos de temperatura y presión que luego debemos adaptar utilizando los valores leidos de los registros de calibración del chip, en la página 12 del datasheet se puede ver cual es el proceso completo de obtención de los datos:

  • Leemos los 11 parámetros de calibración de la memoria del BMP085
  • Leemos la temperatura y presión sin compensar
  • Aplicamos las fórmulas de conversión para sacar la temperatura real en unidades de 0.1 ºC
  • Obtenemos la presión compensada aplicando las fórmulas del datasheet para sacar la presión en Pa.

La lectura de un registro de la memoria del BMP085 se reduce a los siguientes pasos:

  • Iniciamos el bus I2C – i2c_start()
  • Escribimos la dirección del módulo BMP085 para la escritura (0xEE) – i2c_write(0xEE)
  • Ponemos la dirección del registro a leer – i2cwrite(addr)
  • Reiniciamos el bus I2c – i2c_start()
  • Escribimos la dirección del módulo para lectura (0XEF) – i2c_write(0xEF)
  • Leemos el byte alto del registro con ACK – i2c_read(1)
  • Leemos el byte bajo del registro sin ACK – i2c_read(0)
  • Cerramos la comunicación – i2c_stop

Mediante la lectura de registros 0xAA – 0xBF, obtenemos los parámetros de cálculo. La medición de temperatura y presión se hace poniendo una demanda de lectura en el registro 0xF4, esperando el fin de conversión (entre 4.5 y 25.5 ms en función de la precisión de la lectura deseada) y leyendo los registros de resultado (0xF6 – 0xF8)

El proceso es sencillo, pero hay que tener cuidado con las asignaciones de tipos utilizadas durante la aplicación de las fórmulas de calibración, ya que en función del compilador de C usado los tipos int por defecto pueden ser signed, unsigned, 8 bits, 16 bis o 32 bits, lo que puede dar lugar a resultados erroneos (en caso de duda lo mejor es utilizar un casting delante de las variables utilizadas y respetar los tipos indicados en el datasheet (long = 32bits, short = 16 bits).

Enviamos los valores medidos al PC por el puerto serie integrado en el PIC en las pines B1 (TX) y B4(RX), usamos un módulo HC-06 como otras veces, pero se puede usar un convertidor serie TTL.

Para la comunicación I2C usamos los pines B3 para SCL y B2 para SDA conectados a los pines de la placa 10DOF serigrafiados con el mismo nombre, la alimentación usada es de 3,3V y se une directamente al PIC y al módulo de sensores.

El programa de ejemplo es el siguiente:

Fichero sólo visible para usuarios registrados

 En las próximas entradas veremos como comunicar con los otros integrados existentes en el módulo 10DOF.

2 pings

  1. […] procedimiento para comunicar con los dos integrados de este artículo es similar al empleado con el barómetro, enviamos una trama de configuración a uno de los registros del chip y luego leemos los datos en […]

Deja una respuesta

Tu email nunca se publicará.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

ACEPTAR
Aviso de cookies