Autor Tema: Altimetro/Barómetro - UAV's  (Leído 4120 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado elgarbe

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2174
Altimetro/Barómetro - UAV's
« en: 05 de Enero de 2014, 11:53:13 »
Para esos sensores
-
Leonardo Garberoglio

Desconectado elgarbe

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2174
Re: Altimetro/Barómetro - UAV's
« Respuesta #1 en: 05 de Enero de 2014, 11:54:54 »
Reservado
-
Leonardo Garberoglio

Desconectado jonathanPIC888

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 287
Re: Altimetro/Barómetro - UAV's
« Respuesta #2 en: 27 de Enero de 2014, 18:34:40 »
Un barómetro es un instrumento que mide la presión atmosférica. La presión atmosférica es el peso por unidad de superficie ejercida por la atmósfera.
La unidad de medida de la presión atmosférica que suelen marcar los barómetros se llama hectopascal, de abreviación hPa. Esta unidad significa: hecto: cien; pascales:unidad de medida de presión. (Wikipedia)

Altímetro barométrico: (Wikipedia)

Es el más común de todos; su funcionamiento está basado en la relación entre presión y altitud, la presión atmosférica desciende con la altitud, aproximadamente, 1 hPa por cada 8,2 metros de altitud. Toman como base de referencia el nivel del mar, pero su funcionamiento está condicionado a los cambios meteorológicos, por lo que un altímetro de cierta calidad debería permitir compensar las variaciones de presión provocadas por el clima. Por otra parte, como el nivel del mar no es uniforme en todo el mundo, la base para medir la presión también puede variar según las latitudes en las que nos encontremos. O dicho en otros términos, si utilizamos el mismo altímetro en distintos países, los resultados pueden variar si no ajustamos la altura base (nivel del mar que sirve de referencia). Por último, como el espesor de la atmósfera varía mucho según la latitud (es mucho mayor en la zona intertropical) la correspondencia entre presión y altitud puede variar.

Aquí hay un gráfico aproximado de presión - altitud:



Para nuestras pruebas, utilizaremos un sensor BOSCH BMP085, que tiene las siguientes características:



- Rango de medición: 300 ....1100hpa (+9000m....-500m debajo del nivel del mar)
- Bajo ruido:  0.06hpa (0.5m) en modo de bajo consumo y 0.03hpa (0.25m) en modo de alta resolución.
- Comunicación i2c.

Para poder utilizar el sensor, se desarrolla una librería básica para usar con microcontroladores PIC y el compilador CCS.

El encabezado de la librería:

Código: C
  1. // CCS library compilation [2014]
  2. // Driver para el sensor de presión barométrica BMP085.
  3. // Programador: Moyano Jonathan
  4. // Compilador: CCS v4.140
  5. // Versión de la librería: v1.0 Revisión: 0.5
  6. // Fecha de modificación: Enero de 2014.
  7.  
  8. const int8 OVS_S = 3;          // Opción de muestreo (ver en la hoja de datos).
  9.  
  10. #define BMP085_ADDRESS 0xEE    // Dirección I2C del BMP085.
  11. #define P_CORRECTION   1.5     // Factor de corrección.
  12.  
  13. // Variables globales.
  14.  
  15. // Variables que contienen valores de calibración.
  16.  
  17. signed int16 ac1;
  18. signed int16 ac2;
  19. signed int16 ac3;
  20. int16 ac4;
  21. int16 ac5;
  22. int16 ac6;
  23. signed int16 b1;
  24. signed int16 b2;
  25. signed int16 mb;
  26. signed int16 mc;
  27. signed int16 md;
  28.  
  29. // Factores de cálculo en coma flotante.
  30.  
  31. float _c3;
  32. float _c4;
  33. float _b1;
  34. float _c5;
  35. float _c6;
  36. float _mc;
  37. float _md;
  38.  
  39. // Constantes polinómicas.
  40.  
  41. float _x0;
  42. float _x1;
  43. float _x2;
  44. float _y0;
  45. float _y1;
  46. float _y2;
  47. float _p0;
  48. float _p1;
  49. float _p2;
  50.  
  51. float _s;    
  52. float _Temp;
  53.  
  54. // Definición de funciones.
  55. int8  BMP085ReadByte(int8 address);            // Leemos un byte del BMP085.
  56. int16 BMP085ReadInt(int8 address);             // Leemos un entero de 16 bits del BMP085.
  57. void BMP085WriteByte(int8 address, int8 data); // Escribimos un byte en el BMP085.
  58. void bmp085Calibration(void);                  // Calibración del sensor BMP085.
  59. int16 BMP085ReadUT(void);                      // Leemos el valor no compensado de temperatura.
  60. int32 bmp085ReadUP(void);                      // Leemos el valor no compensado de presión.
  61. float BMP085GetTemp(float _tu);                // Lectura compensada de la temperatura.
  62. float BMP085GetPressure(float _pu);            // Lectura compensada de presión.
  63. float BMP085Pressure(boolean getTemp);         // Lectura de presión, pudiendo seleccionar o no, la lectura previa de temperatura.
  64. float BMP085Temperature(void);                 // Lectura no compensada de temperatura.
  65.  

El desarrollo de las funciones:

Código: C
  1. // CCS library compilation [2014]
  2. // Driver para el sensor de presión barométrica BMP085.
  3. // Programador: Moyano Jonathan
  4. // Compilador: CCS v4.140
  5. // Versión de la librería: v1.0 Revisión: 0.5
  6. // Fecha de modificación: Enero de 2014.
  7.  
  8. // Incluimos librerías utilizadas.
  9. #include "BMP085.h"
  10.  
  11.  
  12. // Desarrollo de funciones de usuario.
  13.  
  14.  
  15. int8 BMP085ReadByte(int8 address){
  16.  
  17. // Variables locales.
  18. int8 data=0x00;
  19.  
  20.    i2c_start();
  21.    i2c_write(BMP085_ADDRESS);
  22.    i2c_write(address);
  23.    i2c_start();
  24.    i2c_write(BMP085_ADDRESS | 0x01 );
  25.    data=i2c_read(0);
  26.    i2c_stop();
  27.    
  28.    return(data);
  29. }
  30.  
  31. int16 BMP085ReadInt(int8 address){
  32.  
  33. // Variables locales.
  34. int8  msb=0x00;
  35. int8  lsb=0x00;
  36. int16 temp=0x00;
  37.  
  38.    i2c_start();
  39.    i2c_write(BMP085_ADDRESS);
  40.    i2c_write(address);
  41.    i2c_start();
  42.    i2c_write(BMP085_ADDRESS | 0x01 );
  43.    msb = i2c_read();
  44.    lsb = i2c_read(0);
  45.    i2c_stop();
  46.    temp = make16(msb, lsb);
  47.    
  48.    return(temp);
  49. }
  50.  
  51. void BMP085WriteByte(int8 address, int8 data){
  52.  
  53.    i2c_start();
  54.    i2c_write(BMP085_ADDRESS);
  55.    i2c_write(address);
  56.    i2c_write(data);
  57.    i2c_stop();
  58. }
  59.  
  60.  
  61. void bmp085Calibration(void) {
  62.  
  63.    // Leemos de la EEPROM del BMP085, los factores de calibración.
  64.    
  65.    ac1 = bmp085ReadInt(0xAA);
  66.    ac2 = bmp085ReadInt(0xAC);
  67.    ac3 = bmp085ReadInt(0xAE);
  68.    ac4 = bmp085ReadInt(0xB0);
  69.    ac5 = bmp085ReadInt(0xB2);
  70.    ac6 = bmp085ReadInt(0xB4);
  71.    b1  = bmp085ReadInt(0xB6);
  72.    b2  = bmp085ReadInt(0xB8);
  73.    mb  = bmp085ReadInt(0xBA);
  74.    mc  = bmp085ReadInt(0xBC);
  75.    md  = bmp085ReadInt(0xBE);
  76.  
  77.    // Calculamos los factores de calibración en punto flotante.
  78.  
  79.    _c3 = 0.0048828125 * ac3;            
  80.    _c4 = 0.000000030517578125 * ac4;    
  81.    _c5 = 0.00000019073486328125 * ac5;  
  82.    _c6 = (float)ac6;
  83.    _b1 = 0.00002384185791015625 * b1;  
  84.    _mc = 0.08 * mc;                    
  85.    _md = (float)md / 160;
  86.    
  87.   // Cálculo de constantes polinómicas.
  88.    
  89.    _x0 = (float)ac1;
  90.    _x1 = 0.01953125 * ac2;            
  91.    _x2 = 0.000762939453125 * b2;      
  92.    _y0 = _c4 * 32768;                  
  93.    _y1 = _c4 * _c3;
  94.    _y2 = _c4 * _b1;
  95.    _p0 = 2.364375;  
  96.    _p1 = 0.992984;
  97.    _p2 = 0.000004421;    
  98. }
  99.  
  100. int16 BMP085ReadUT(void){
  101.  
  102. // Variables locales.
  103. int16 ut;
  104.  
  105.   BMP085WriteByte(0xF4, 0x2E);
  106.   delay_ms(5);  
  107.   ut = BMP085ReadInt(0xF6);
  108.   return((float)ut);
  109. }
  110.  
  111. int32 bmp085ReadUP(void){
  112.  
  113. // Variables locales.
  114. int8 msb, lsb, xlsb;
  115. float p;
  116.  
  117.  
  118.   BMP085WriteByte(0xF4, (0x34 + (OVS_S<<6)) );
  119.  
  120.   switch (OVS_S)
  121.   {
  122.      case 0: delay_ms(5);  break;
  123.      case 1: delay_ms(8);  break;
  124.      case 2: delay_ms(14); break;
  125.      case 3: delay_ms(26); break;
  126.   }    
  127.    
  128.    msb  = BMP085ReadByte(0xF6);
  129.    lsb  = BMP085ReadByte(0xF7);
  130.    xlsb = BMP085ReadByte(0xF8);
  131.    p = (256*msb) + lsb + (xlsb/256);
  132.    
  133.    return(p);
  134. }
  135.  
  136.  
  137. float BMP085GetTemp(float _tu){
  138.  
  139. // Variables locales.
  140. float alpha, T;
  141.  
  142.    alpha = _c5 * (_tu - _c6);
  143.    T = alpha + (_mc/(alpha + _md));
  144.    _s = T - 25;
  145.    
  146.    return(T);
  147. }    
  148.  
  149.  
  150. float BMP085GetPressure(float _pu){
  151.  
  152. // Variables locales.
  153. float x, y, z;
  154. float P;
  155.  
  156.    x = _x2*_s*_s + _x1*_s + _x0;
  157.    y = _y2*_s*_s + _y1*_s + _y0;
  158.    z = ((float)_pu - x) / y;
  159.    P = _p2*z*z + _p1*z + _p0;
  160.    P += P_CORRECTION;
  161.    return(P);
  162. }
  163.  
  164.  
  165. float BMP085Pressure(boolean getTemp){
  166.    if (getTemp)
  167.       _Temp = BMP085GetTemp(BMP085ReadUT());  
  168.    return(BMP085GetPressure(BMP085ReadUP()));
  169. }
  170.  
  171.  
  172. float BMP085Temperature(void){
  173.    _Temp = BMP085GetTemp(BMP085ReadUT());
  174.    return(_Temp);
  175. }
  176.  

El programa de ejemplo:

Código: C
  1. // Fecha: Enero de 2014.
  2. // Versión: v1.0
  3. // Revisión: r0.1
  4. // Programador: Moyano Jonathan
  5. // Compilador: CCS v4.140
  6. /////////////////////////////////////////
  7.  
  8. // Incluimos plantilla.
  9. #include <Plantilla_UconnectME28.h>  // Drivers de periféricos.
  10.  
  11. // Variables globales.
  12. float T_Cent;
  13. float P_mBar;  
  14.  
  15. void main () {
  16.  
  17.    // Calibramos el sensor.
  18.    bmp085Calibration();
  19.    
  20.    while(true){
  21.  
  22.       // Temperatura compensada.
  23.       T_Cent = BMP085Temperature();
  24.       // Tomamos el valor de presión con la temperatura ya calculada.
  25.       P_mBar = BMP085Pressure(false);  
  26.       fprintf(DEBUG,"Temperatura [C]: %.1g\r\n", T_Cent);
  27.       fprintf(DEBUG,"Presion [mBar]:  %0.2g\r\n", P_mBar);
  28.       delay_ms(1000);
  29.    
  30.     }
  31.    }
  32.  

Los resultados obtenidos:

Código: AppleScript
  1. Temperatura [C]: 25.9
  2. Presion [mBar]:  913.69
  3. Temperatura [C]: 25.9
  4. Presion [mBar]:  913.71
  5. Temperatura [C]: 25.9
  6. Presion [mBar]:  913.73
  7. Temperatura [C]: 25.9
  8. Presion [mBar]:  913.73
  9. Temperatura [C]: 25.9
  10. Presion [mBar]:  913.75
  11. Temperatura [C]: 25.9
  12. Presion [mBar]:  913.75

La presión según el sistema meteorológico de mendoza es de 1004.9 hPa en el día de la prueba...por lo tanto existe un pequeño margen de error a corregir.

Ahora falta solamente ver los cálculos de altitud, en la próxima entrega.

Desconectado AG1

  • PIC12
  • **
  • Mensajes: 96
    • allm2m
Re: Altimetro/Barómetro - UAV's
« Respuesta #3 en: 27 de Enero de 2014, 22:06:16 »
Hola:
   Ten en cuenta que el BMP085(una vez realizados los cálculos) te da la presión atmosférica absoluta(los 913hPa que indicas). Los 1004hPa que comentas, deben estar dados como presión atmosférica relativa(debes considerar que Mendoza está a unos 750m de elevación). Realizando unos calculos aproximados y añadidos a la lectura del BMP085 tenemos:
         750/8,6= 87
         luego la presión atmosférica relativa sería aproximadamente tus 913hPa+87= 1000hPa
         
Salu2.

Desconectado jonathanPIC888

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 287
Re: Altimetro/Barómetro - UAV's
« Respuesta #4 en: 27 de Enero de 2014, 22:40:25 »
Citar
Ten en cuenta que el BMP085(una vez realizados los cálculos) te da la presión atmosférica absoluta

Gracias por la aclaración, se me pasó por alto. Lo que no entiendo es de donde determinas el 8,6 que usas como divisor ? De qué cálculo sale, o como lo determinás ?

Saludos !

Desconectado AG1

  • PIC12
  • **
  • Mensajes: 96
    • allm2m
Re: Altimetro/Barómetro - UAV's
« Respuesta #5 en: 28 de Enero de 2014, 21:19:06 »
En estos enlaces indican el valor orientativo 8,6:

http://foro.tiempo.com/ajuste-presion-atmosferica-relativa-t43570.0.html

http://meteoasturias.elcomercio.es/foro/viewtopic.php?t=2882

También puedes aplicar la fórmula que aparece en el datasheet del BMP085, en la página 15 apartado 3.7. Con ella para una presión atmosférica de 913hPa y una altitud de 750m obtenemos una presión absoluta de 998,6hPa

Salu2.

Citar
Ten en cuenta que el BMP085(una vez realizados los cálculos) te da la presión atmosférica absoluta

Gracias por la aclaración, se me pasó por alto. Lo que no entiendo es de donde determinas el 8,6 que usas como divisor ? De qué cálculo sale, o como lo determinás ?

Saludos !


Desconectado andreaJB

  • PIC10
  • *
  • Mensajes: 2
Re:Altimetro/Barómetro - UAV's
« Respuesta #6 en: 11 de Octubre de 2015, 10:26:02 »
 :)hola sera que me podrias basar el programa del sensor que tienes  ...........tengo el bpm180 pero debo medir solo altura ...nose si me puedas colaborar  :(

Desconectado elgarbe

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2174
Re:Altimetro/Barómetro - UAV's
« Respuesta #7 en: 11 de Octubre de 2015, 10:37:02 »
Pues acá (http://www.todopic.com.ar/foros/index.php?topic=41982.msg349872#msg349872) jhonatan puso su código. no te sirve eso?

sds.
-
Leonardo Garberoglio

Desconectado andreaJB

  • PIC10
  • *
  • Mensajes: 2
Re:Altimetro/Barómetro - UAV's
« Respuesta #8 en: 12 de Octubre de 2015, 06:09:05 »
me podrias pasar el archivo porfa para compilarlo mi correo es andrea_4756@hotmail.com te lo agradecería muchísimo

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7433
Re:Altimetro/Barómetro - UAV's
« Respuesta #9 en: 12 de Octubre de 2015, 06:20:45 »
me podrias pasar el archivo porfa para compilarlo mi correo es andrea_4756@hotmail.com te lo agradecería muchísimo

No se como responderte a eso, tenes el codigo a 2/3 respuesta mas arriba como te lo indico elgarbe (en tu anterior peticion ), lo unico que tenes que hacer es seleccionarlo, copiarlo y pegarlo en un bloc de notas (si queres usar eso) y guardarlo. Ni esperar el email.

Seguro que tal ves necesites modificarlo para tu compilador, microcontrolador pero lo tenes ahi. Solo te resta estudiar el codigo, leer el datasheet del modulo y listo. Ya lo tenes funcionando. Es raro que encuentres el codigo EXACTO para el microcontrolador que vos quieras, asi que vas a tener que si o si aprender a portar los codigos. No va a venir nada de arriba.
« Última modificación: 12 de Octubre de 2015, 06:27:20 por KILLERJC »

Desconectado jvb57

  • PIC10
  • *
  • Mensajes: 10
Re:Altimetro/Barómetro - UAV's
« Respuesta #10 en: 21 de Noviembre de 2019, 12:58:14 »
Hermano sos un genio !! 10mil gracias !!
Solo Copy/paste, leer un poco y salio andando !!


 

anything