BMP280 BME280

¡Hola!

Hoy quería contaros un poco sobre este sensor. Se trata de un circuito integrado que vamos a encontrar en modulitos, como se hace todo ahora, para tener el acceso fácil. Vamos a dejar primero una cosa clara para que no os equivoquéis como yo:

- BMP280: sensor de temperatura y presión
- BME280: sensor de temperatura, humedad y presión

Los más baratos los encontraréis a 3.3V, y la diferencia con los más caros es, no nos engañemos, que estos últimos llevan un pequeño regulador de tensión y puedes conectarlo a 5V. Y luego están los muy caros que llevan adaptadores de nivel de tensión para que el módulo no sufra, lo cual es lo más indicado.

Aunque sea de 3.3V, se puede conectar con un puerto digital con un máximo de 5V, mientras alimentas la patita Vcc con 3.3V. Pero no es lo más recomendable. Se puede usar un Arduino Pro Mini o Due, o algún otro modelo que funcione a 3.3V.

Aquí uno caro con reguladores de Adafruit

¿Qué puedes hacer con estos sensores?
Lo que he hecho yo ha sido poner un módulo BMP280 conectado a la Raspberry Pi 3. Cada cierto tiempo, 5 minutos, hago que se lean los valores del sensor, se guarden los valores en un archivo de datos (dos archivos de datos distintos, de hecho, uno del día y otro de las últimas 24 horas) y mediante un extenso código creo una gráfica, que luego puedo visualizar en el navegador mediante un poco de código php y html. Aquí un resultado:

A ver, la temperatura está demasiado elevada, esto es porque está en un lugar bastante cerrado junto a la raspberry que suelta algo de calor (el procesador se pasa el día sobre los 50ºC). Hay picos de temperatura cuando encendemos el ventilador, lo cual es muy curioso. La presión tampoco es correcta y ahí ya no sé qué decir, pero la evolución, comparada con un sensor calibrado no muy lejos de aquí, es la misma.

Este es el comienzo de un proyecto mayor que tengo entre manos y aunque el resultado no parezca muy correcto, ya he conseguido tener algunas pinceladas del software y de paso ver cómo se comporta la temperatura de la habitación ante determinados eventos.

Otras cosas que se pueden hacer: antes de la raspberry probé el módulo con Arduino y daba valores bastante realistas tanto de temperatura como de presión. Conociendo la presión atmosférica a nivel del mar y la que da el sensor, puedes aproximar la altitud a la que te encuentras. Esto viene en el código de ejemplo de Arduino IDE con la librería Adafruit_BMP280.

Y si te compras el BME280, puedes medir la humedad y ya tienes un sensor ambiental completo.

Estos módulos se comunican mediante I2C, lo cual requiere dos cables de comunicación. Por ejemplo en el Arduino Uno R3 se conecta:

  • Pin SDI del módulo al pin A4 (analógico 4) del Arduino
  • Pin SCK del módulo al pin A5 (analógico 5) del Arduino

Debido a que el módulo ya contiene unas resistencias de pull-up, no es necesario preocuparse de nada más, sólo requiere la alimentación (recordad, Vcc a 3.3V) y GND.

Para el resto de placas y microcontroladores (Raspberry, STM32, ...) hay librerías, así que su uso sigue siendo igual de sencillo.

He generalizado mucho para el BMP280, porque el BME no lo he probado, pero las librerías se encuentran fácilmente poniendo en Google por ejemplo: Arduino bme280 library.

Mucho ánimo y espero que se os ocurran cosas geniales con este módulo.

Analógica 3: sistema

Lo que vamos a hacer ahora es  aprender las características que se le pueden atribuir a un sistema. Estáticas y dinámicas (de donde sale el diagrama de Bode, chan, chan, chaaaan...)

Tipo de entrada

Al igual que a la señal, se  le puede atribuir a un sistema una topología de entrada. Pero ésto tendrá sus efectos. Veamos qué ocurre según la topología de la señal:

  • Single ended y grounded: antes de conectar tendremos una V salida = V generador. Con un sistema no diferencial, de impedancia ideal (infinita), seguiremos teniendo que Ventrada = Vgenerador. Y con un sistema diferencial de impedancia ideal, lo mismo.
  • Single ended y flotante: sin problema, será igual

Conclusión: pongamos el sistema que pongamos no va a ocurrir nada, no perdemos señal.

  • Diferencial o pseudodiferencial y grounded: antes de conectar la Vsalida = Vgenerador1 - Vgenerador2. Si la conectamos a un sistema no diferencial de impedancia ideal, la Ve = Vgenerador1, pero ¿qué ocurre? Pues que la señal del generador 2 va a masa, y se pierde. Ésto no ocurre en un sistema diferencial donde tendremos una Ventrada1 = Vgenerador1 y una Ventrada2 = Vgenerador2.
  • Diferencial o pseudodiferencial y flotante: antes de conectar la salida, mismas condiciones. Cuando la conectemos a un sistema no diferencial, Ve = Vg1 - Vg2. Con un sistema diferencial, Ve = Vg1 - Vg2. No tenemos ninguna pérdida.

Impedancia de entrada de un sistema diferencial

La impedancia de entrada de un sistema no diferencial, pues como que es fácil de calcular e interpretar. Pero la de un sistema diferencial puede  tomar dos formas:

  • La impedancia de cada terminal a masa: la calcularíamos poniendo una fuente virtual en un terminal y llevando el otro a tierra, y viceversa. Sale como:

impdif

  • La impedancia diferencial: unimos un terminal de la fuente a un terminal de entrada y el otro terminal de la fuente al otro terminal de entrada:

impdif2

Errores en el sistema de procesado

En éste apartado veremos la exactitud, que es la diferencia entre lo que debería resultar y lo que resulta de un sistema. Hay 2 tipos de error:

  • Aleatorio: es incontrolable y a saber de dónde sale. Sería un ruido interno, una interferencia externa y cosas así. Impredecible.
  • Sistemático: éstos por suerte los conocemos y los podemos predecir y corregir. Son errores de ganancia, de offset, de linealidad...

Podemos expresar éstos errores de forma absoluta (un valor que es el valor ideal menos el valor real) o relativa (en tanto por cien). Allá van unos poquitos:

  • El error de offset: se introduce un nivel de continua indeseado, que también será procesado por el sistema

En éste caso a la salida obtendríamos Vs = Ve*Ganancia + Eoffset

Afecta a la función de transferencia, desplazándola arriba o abajo.

Se puede calcular un error de offset a la entrada (RTI), si queremos saber, por ejemplo, tras el sistema de amplificación de la señal del sensor térmico, a cuántos grados de error equivaldrá el offset:

Eo (RTI) = Eo(RTOutput)/G

Si concatenamos 2 sistemas, a la salida tendremos:

E0(RTO) = Eo1(RTO)*G2 + Eo2(RTO)

Eo(RTI) = Eo1(RTO)/G1 + Eo2(RTO)/(G1*G2)

  • El error de ganancia: lo que ocurre es que debido a cualquier desviación del sistema (podría ser una resistencia en un amplificador operacional), la ganancia no es exactamente igual a la que queríamos, sino un valor cercano. Ésto afecta a la pendiente de la función de transferencia haciéndola más o menos pronunciada.

Se suele expresar en términos relativos como:

Eg(rel) = |(VeGideal - VeGreal)/VeGideal| *100 = |(Gideal - Greal)/Gideal|*100

Y en términos absolutos como:

Eg(abs) = Eg(rel)*|Vsalidaideal|/100

Sólo recordar que en un sistema en cadena la ganancia total es el producto de todas las ganancias: Gt = G1*G2*...*Gn

También vamos a ver un error aleatorio como es el ruido:

Ruido

Lo único que hay que saber es que se introduce entre medias del sistema, por lo que usualmente se da el error RTO. Lo que hace es que varía la salida:

Vs = Ve*G + Vnpp/2 (porque si te lo dan pico a pico lo que interesa es la amplitud)

También puede ser multietapa como el offset: se multiplicaría el En del sistema 1 por la ganancia del sistema 2 y se sumaría el En del sistema 2.

Dados los errores y calculada la resolución, obtenemos el Margen Dinámico:

MD = Rango de medida/ Resolución

Ancho de banda

Ahora lo que vamos a ver es el rango de frecuencias que nuestro sistema va a poder procesar. Mejor aún, lo vamos a calcular.

Para ello, lo que haremos será sustituir los condensadores por su impedancia compleja (De forma Xc = 1/jwC), y analizaremos el circuito para obtener su ganancia (G = Ventrada/Vsalida) en función de jw. Por lo general lo que tendremos por ahí será un divisor de tensión con la impedancia del condensador. Luego intentaremos dejar la ganancia en una expresión que se parezca a las formas canónicas que voy a dejar a continuación, junto con sus respectivos diagramas de Bode:

cte

der

inte

cero

pasobajo

pasoalto

Estos dos últimos son el famoso filtro pasobajo y filtro pasoalto. La cuestión es que hay que saberse todas las formas canónicas al dedillo para el diagrama de Bode.

Tened en cuenta que w0 = 1/RC, de aquí extraemos la frecuencia de corte, f = 1/2*pi*RC, que podrá ser superior o inferior dependiendo de la forma canónica. Para ver mejor la forma de la ecuación es mejor despejar w0 por el 1/RC, por ejemplo el término paso bajo se quedaría 1/(1+jwRC), mucho mejor.

¿Que no sabías que había un diagrama de Bode fasorial? Pues ya lo sabes. La fase de la señal cambia también con la frecuencia.

¿Que no sabes dibujar diagramas de Bode? Yo te enseño.

En primer lugar, saber que lo que se usa para el diagrama de Bode es papel logarítmico, como éste:

Como podéis ver, las rallitas no están todas equidistantes. Empieza por 10, la siguiente es 20, 30, 40, 50... Y la siguiente equidistante es 100, 200, 300... Y la siguiente equidistante es 1000, y la siguiente equidistante 10000... Así podemos hacer un diagrama desde 10 Hz hasta 1MHz sin problema.

Lo siguiente es que la ganancia se expresa en decibelios. Ésto se calcula como G(dB) = 20*log(Ve/Vs).

Para hacer el diagrama de Bode, lo más inteligente es poner cada forma canónica sobre el papel con sus frecuencias de corte. Todas por separado, y luego sumarlas todas sobre el papel. Os pongo un ejemplo de los ejercicios que hice yo:

bode

Como se ve, el sistema tenía una ganancia de R2/R1 (era un amplificador operacional amplificador inversor), y un filtro pasa altos. Se colocan ambos donde les corresponde, y la línea roja es el resultado. Interpretación: a frecuencias bajas, el amplificador no multiplica la señal por la ganancia total, sino que la atenúa un poco, mientras que a frecuencias medias, tiene la totalidad de su ganancia.

Frecuencia de corte superior

A veces un sistema va a poder procesar toda la frecuencia que queramos, otras veces no. Vamos a ver lo que ocurre a los amplificadores operacionales reales. Se debe a dos parámetros:

  • Slew Rate: cuando hay una variación de tensión a la entrada, al amplificador le cuesta un poco alcanzar el nivel de salida. Se debe a la capacidad de los condensadores internos o externos. Es un dato del fabricante, o se calcula como SR = I/C. La frecuencia máxima es: Fmáx = SR/(pi*Amplitud máxima)
  • Gain Bandwidth Product (GBP o GxBW): es un dato que siempre nos va a proporcionar el fabricante del amplificador. Va a equivaler a la frecuencia donde la ganancia, debido a las características internas, es 0 queramos o no. La frecuencia máxima es fmáx = GBP/Ganancia

Como se podrá suponer, la frecuencia mínima de las frecuencias máximas (entre GBP, SR y filtro paso bajo), es la frecuencia máxima del sistema.

Lo próximo es ver qué tipos de bloques funcionales podemos incluír en el diseño. Es rapidito.

Analógica 2: señal

Un sistema por lo general está compuesto en su primera etapa por una señal física que queremos medir, con un sensor, y que se transforma a una señal eléctrica. Ésta señal tiene unas características y necesita de un acondicionamiento.

Hay muy distintos tipos de señales, por ejemplo: eléctricas, ópticas, radiadas y acopladas capacitiva e inductivamente.

Para el análisis, y mejorar la representación de la señal de entrada, usamos un equivalente, bien sea de Thevenin (si nos conviene que sea en tensión), o de Norton (en corriente).

Ahora vamos a ver las diferentes características que definen a una señal:

Amplitud, nivel y rango

Una señal suele estar compuesta por 2 componentes: una continua y/o una alterna. A la componente continua se la asocia con el nivel, y a la alterna con la amplitud.

La señal puede ser periódica y de valor medio conocido. En éste caso el valor medio es el nivel. Sería el caso de una senoidal pura superpuesta a un nivel de continua. Muy bonito. Veamos sus características:

senoidalsuperp

Como veis, se puede extraer fácilmente el nivel, que coincide con el valor medio (\displaystyle U_{m}), se puede calcular una amplitud en un tiempo (\displaystyle u(t_{1})) determinado (al ser una senoidal tendrá una frecuencia, una amplitud máxima (\displaystyle U_{max})...), y la amplitud pico a pico (\displaystyle A_{pp}) así como el mínimo.

También hay otras señales que son de valor desconocido y desconociendo el valor medio. En ése caso tomamos el nivel como el valor mínimo y la amplitud máxima como el pico máximo menos el nivel:

señaldesconocida

Impedancia de salida

Ésto es muy importante porque cuando en un sistema tenemos algo como ésto:

sist2

Lo que tenemos es un divisor de tensión, y entra en juego lo que llamaremos el factor de desadaptación de impedancias (que al fin y al cabo no es más que la fórmula del divisor):

 \displaystyle V_{e} = V_{s} \cdot \frac{Z_{e}}{Z_{e}+Z_{s}}

También ocurre con un equivalente de Norton, pero entonces es un divisor de corriente:

\displaystyle I_{e} = I_{s} \cdot \frac{Z_{s}}{Z_{s}+Z_{e}}

Lo normal es que cuando tenemos un equivalente de Thevenin, que la fuente es de tensión, la impedancia sea baja, mientras que con el equivalente de Norton y su fuente de corriente, la impedancia sea alta.

¿Cómo mido la impedancia de un sistema?

  • Con el equivalente de de Thevenin o Norton (¡No me digas!)
  • Con un cálculo de tensión a circuito abierto y de corriente en cortocircuito (ésto no lo hagáis en la práctica...), de forma que Z = V/I, de toda la vida
  • El cálculo con fuentes dependientes. Ésto ya lo puse en Electricidad II. Se cortocircuitan las fuentes de tensión y se abren las de corriente (independientes), se añade una fuente virtual de valor conocido (V o I) y se calcula el otro valor (I o V), volvemos a que: Z=V/I.
  • Experimentalmente, que mola más. Medimos la tensión a circuito abierto (Va), ponemos un potenciómetro en "modo resistencia variable", y variamos el potenciómetro hasta que obtenemos una V=Va/2. En éste punto, la resistencia del potenciómetro es la misma que la impedancia de salida.

Tipología de la señal

Veamos los distintos tipos:

  • Single Ended: un terminal coincide con masa:

sist3

 

  • Pseudo-diferencial: un terminal tiene un potencial fijo distinto a 0 y el otro es variable:

sist4

 

  • Diferencial: los dos terminales tienen un potencial variable:

sist5

 

Además, podemos clasificarlos también según la conexión de la masa:

  • Grounded: la masa de la señal es igual a la del sistema
  • Flotante: no coinciden

Ancho de banda

Es el rango de frecuencias en el que se hallan todas las componentes frecuenciales de la señal. Dicho más sencillamente:

BW = fmáx - fmín

Puede ser

  • Estrecho: hay poca variación de frecuencia alrededor de una central (p.ej. un sistema DC)
  • Amplio: entre ésto encontraríamos varios sistemas como sensores de sonido y vibración (0-10Khz), señales transitorias, audio (20hz - 20Khz), radio (20khz - 100Mhz) o video (0 - 150Mhz)

Éstas son todas las características que se le pueden atribuir a la señal que vamos a procesar. Lo próximo es caracterizar el sistema de procesado.

Conversor AD y puerto USB

Como ya sabemos desde el pin A0 al A5 podemos meter una señal analógica y que nuestro Arduino la interprete. Con ciertas limitaciones.

El máximo son 5 voltios y su resolución es de 10 bits. Es decir, cuando tengamos 5 voltios a la entrada tendremos como resultado 1024, y si tenemos 0 voltios tendremos como resultado 0. Ésto nos da un paso de 0,005 voltios.

A su vez sabemos que la placa es capaz de enviar y recibir datos por USB. En éste programa usaremos ésa capacidad para ver el resultado.

A la  entrada analógica pondremos un potenciómetro conectado a +5 y GND, conformando un divisor de tensión para que la salida intermedia de un rango de 5 a 0 voltios. Éste será el funcionamiento generalizado de cualquier sensor, pero lo podemos manipular.

Vamos con el programa:

void setup(){
 pinMode(2,INPUT); //el pin 2 es input
 pinMode(13,OUTPUT); //el pin 13 output
 Serial.begin(9600); //mandar cosas por USB, a cierta velocidad (bits/s)
}
void loop(){
 double lecturas[4]; //declaramos un vector de 5 posiciones
 double mandar; //y una variable flotante
 if(digitalRead(2)==LOW){ //si apretamos el boton y dejamos que el pin 2 se conecte a tierra
 Serial.println("leyendo"); //mandas esto por USB
 for(int x=0;x<5;x++){ //y lees 5 veces
 lecturas[x]=analogRead(0); //el puerto analógico AN0 y lo vas guardando en el vector
 delay(100); //con un pequeño delay para que le dé tiempo
 }
 mandar=5*(lecturas[0]+lecturas[1]+lecturas[2]+lecturas[3]+lecturas[4])/(5*1024.0); //hacemos un promedio de las lecturas
 Serial.print(mandar); //y mandamos el resultado por USB
 }
}

Las instrucciones nuevas son:

Serial.begin(bauds) -> Inicializa el puerto serie (USB) para el envío de datos a una cierta cantidad de bits por segundo (bauds).

Serial.println(var) o Serial.println("text") -> Envía por el puerto USB una variable o un texto. También se puede utilizar Serial.print(var) para que no haga un salto de línea.

analogRead(pin) -> lee el pin analógico seleccionado, en éste caso 0, A0, y devuelve un número entre 0 y 1023.

He procesado el resultado de la lectura analógica para que muestre, en vez de un número entre 0 y 1024, un determinado valor de la tensión que está entrando por el pin analógico.

El resultado lo podéis ver en vuestro monitor serie, que se encuentra en la pestaña Herramientas -> Monitor Serial del software de arduino.