Tabla de contenido:

Cinta métrica atmosférica Arduino / MS5611 GY63 GY86 Demostración: 4 pasos (con imágenes)
Cinta métrica atmosférica Arduino / MS5611 GY63 GY86 Demostración: 4 pasos (con imágenes)

Video: Cinta métrica atmosférica Arduino / MS5611 GY63 GY86 Demostración: 4 pasos (con imágenes)

Video: Cinta métrica atmosférica Arduino / MS5611 GY63 GY86 Demostración: 4 pasos (con imágenes)
Video: ✅ ARDUINO: Altímetro barométrico | J_RPM 2024, Mes de julio
Anonim
Demostración de cinta métrica atmosférica Arduino / MS5611 GY63 GY86
Demostración de cinta métrica atmosférica Arduino / MS5611 GY63 GY86

Este es realmente un barómetro / altímetro, pero verá la razón del título mirando el video.

El sensor de presión MS5611, que se encuentra en las placas de conexión Arduino GY63 y GY86, ofrece un rendimiento asombroso. En un día tranquilo, medirá su altura con una precisión de 0,2 m. Esto consiste en medir efectivamente la distancia desde su cabeza al espacio exterior y restarla de la distancia de sus pies al espacio exterior (midiendo la presión, que es el peso del aire de arriba). Este espectacular dispositivo tiene un alcance que medirá cómodamente la altura del Everest, y también puede medir unos pocos centímetros.

Este proyecto tenía como objetivo: un proyecto escolar, un ejemplo de modificación del código Arduino y un buen punto de partida para explorar el uso del sensor MS5611. Hay muchas preguntas en el foro de quienes tienen dificultades con este sensor. El enfoque aquí hace que su uso sea muy sencillo. Después de realizar este proyecto, estará bien equipado para desarrollar otras aplicaciones relacionadas con la presión.

Cada sensor tiene sus propias constantes de calibración que deben leerse y usarse para corregir los datos. Hay una biblioteca disponible para ayudar a impulsarlos. El código que se muestra aquí usa la biblioteca para tomar lecturas y luego las convierte a la altura y las muestra en una pantalla LCD.

Primero, enviaremos los datos al monitor en serie en la PC / computadora portátil para las pruebas iniciales. Estos muestran algo de ruido, por lo que agregamos un filtro para suavizarlos. Luego, agregaremos una pantalla LCD para que la unidad pueda funcionar de forma independiente y pueda intentar medir su altura, o cualquier otra cosa.

Tenga en cuenta que la placa GY63 solo tiene el sensor de presión MS5611. La GY86 se llama placa de 10 grados de libertad y también incluye un acelerómetro de 3 ejes, un giroscopio de 3 ejes y un magnetómetro de 3 ejes por solo unos $ más.

Necesitará:

1. Arduino UNO (u otro con pinout estándar) y su cable USB

2. Placa de conexión GY63 o GY86

3. 4 cables Dupont macho-hembra - o cable de conexión

4. Escudo del teclado LCD Arduino

5. batería de 9v y plomo

6. Regleta de enchufes de 2,54 mm (opcional pero recomendada)

Preparación

Descargue el IDE de Arduino (entorno de desarrollo integrado) desde:

Algunas partes técnicas de interés

El MS5611 ofrece su gran rendimiento al promediar un gran número de mediciones. Puede realizar 4096 mediciones analógicas de 3 bytes (24 bits) en solo 8 ms y dar el valor promedio. Tiene que medir tanto la presión como la temperatura para que los datos de presión se puedan corregir para la temperatura interna. Por lo tanto, puede entregar alrededor de 60 pares de lecturas de presión y temperatura por segundo.

La hoja de datos está disponible en:

Las comunicaciones se realizan a través de I2C. Entonces, otros sensores I2C pueden compartir el bus (como es el caso de la placa GY86 10DOF donde todos los chips están en I2C).

Paso 1: obtenga una biblioteca MS5611

Muchos de los sensores Arduino utilizan una biblioteca estándar que se incluye con el IDE de Arduino o se suministran con un archivo zip con una biblioteca que se puede instalar fácilmente. Este no suele ser el caso de los sensores MS5611. Sin embargo, una búsqueda encontró: https://github.com/gronat/MS5611 que tiene una biblioteca para MS5611, incluida la realización de la corrección de temperatura.

Opción 1

Vaya al sitio web anterior, haga clic en "Clonar o descargar" y seleccione "Descargar ZIP". Esto debería entregar MS5611-master.zip a su directorio de descargas. Ahora, si lo desea, muévalo a una carpeta donde pueda encontrarlo en el futuro. Utilizo un directorio llamado "datos" agregado a mis carpetas de Arduino.

Desafortunadamente, el archivo.zip descargado no incluye bocetos de ejemplo y sería bueno agregar la biblioteca y los ejemplos al IDE de Arduino. Hay un ejemplo mínimo en el archivo README.md que se puede copiar y pegar en un boceto y guardar. Esta es una forma de empezar.

opcion 2

Para facilitar la ejecución del código en este instructable, agregué el ejemplo mínimo anterior y los ejemplos que se muestran aquí a la biblioteca y adjunto un archivo.zip a continuación que se instalará en el IDE de Arduino.

Descargue el archivo zip a continuación. Mueva esto a una carpeta mejor si lo desea.

Inicie el IDE de Arduino. Haga clic en Sketch> Incluir biblioteca> Agregar archivo zip y seleccione el archivo. Reinicie el IDE. El IDE ahora tendrá la biblioteca instalada más todos los ejemplos que se muestran aquí. Verifique haciendo clic en Archivo> ejemplos >> MS5611-master. Se deben enumerar tres bocetos.

Paso 2: conecte el sensor al Arduino y pruebe

Conecte el sensor al Arduino y pruebe
Conecte el sensor al Arduino y pruebe
Conecte el sensor al Arduino y pruebe
Conecte el sensor al Arduino y pruebe

Las placas GY63 / GY86 generalmente vienen con encabezados pero no soldados. Por lo tanto, es su elección soldar los encabezados en su lugar y usar cables Dupont macho-hembra, o (como decidí) soldar los cables directamente a la placa y agregar pines al cable para conectarlos al Arduino. La última opción es mejor si cree que podría querer soldar la placa en un proyecto más adelante. Lo primero es mejor si desea utilizar el tablero para experimentar. Desoldar los cables es mucho más fácil que un cabezal de clavija.

Las conexiones necesarias son:

Arduino GY63 / GY86

VCC - 5v Alimentación GND - GND Tierra SCL - Reloj A5 I2C> SDA - Datos A4 I2C

Conecte la placa del sensor al Arduino como se indicó anteriormente y conecte el Arduino a la PC / computadora portátil a través de su cable USB. También cubra el sensor con un material opaco / negro. El sensor es sensible a la luz (como es el caso de la mayoría de este tipo de sensor).

Inicie el IDE de Arduino. Hacer clic:

Archivo> ejemplos >> MS5611-master> MS5611data2serial.

Aparecerá una nueva instancia del IDE con el boceto. Haga clic en el botón de carga (flecha derecha).

A continuación, inicie el trazador en serie: haga clic en Herramientas> Trazador en serie y, si es necesario, configure los baudios en 9600. Los datos que se envían son la presión en pascales. Después de un segundo más o menos, se volverá a escalar y subir y bajar el sensor en, por ejemplo, 0,3 m debería mostrarse como bajada y subida de la traza (una altura más baja es una presión más alta).

Los datos tienen algo de ruido. Vea el primer gráfico arriba. Esto se puede suavizar con un filtro digital (una herramienta realmente útil).

La ecuación del filtro es:

valor = valor + K (valor nuevo)

donde "valor" son los datos filtrados y "nuevo" es la última medida. Si K = 1 no hay filtrado. Para valores más bajos de K, los datos se suavizan con una constante de tiempo de T / K donde T es el tiempo entre muestras. Aquí T es de alrededor de 17 ms, por lo que un valor de 0,1 da una constante de tiempo de 170 ms o alrededor de 1/6.

El filtro se puede agregar mediante:

Agregue una variable para los datos filtrados antes de la configuración ():

flotador filtrado = 0;

Luego agregue la ecuación del filtro después de la presión =…. línea.

filtrado = filtrado + 0,1 * (filtrado a presión);

Es una buena idea inicializar el valor filtrado en la primera lectura. Por lo tanto, agregue una declaración "si" alrededor de la línea de arriba que hace esto para que se vea así:

si (filtrado! = 0) {

filtrado = filtrado + 0,1 * (filtrado a presión); } else {filtrado = presión; // primera lectura, por lo que se establece filtrado en lectura}

La prueba "! =" No es "igual". Entonces, si "filtrado" no es igual a 0, se ejecuta la ecuación del filtro, pero si lo es, se establece en la lectura de presión.

Por último, debemos cambiar "presión" a "filtrado" en la declaración Serial.println para que veamos el valor filtrado.

El mejor aprendizaje se logra realizando los cambios anteriores manualmente. Sin embargo, los incluí en el ejemplo MS5611data2serialWfilter. Entonces, si hay problemas, se puede cargar el ejemplo.

Ahora cargue el código en Arduino y vea la mejora. Vea el segundo gráfico anterior y observe que la escala Y se expande x2.

Pruebe con un valor más bajo para la constante de filtro, digamos 0.02 en lugar de 0.1, y vea la diferencia. Los datos son más fluidos pero con una respuesta más lenta. Este es un compromiso que debe buscarse al utilizar este filtro simple. La característica es la misma que la de un filtro RC (resistencia y capacitancia) ampliamente utilizado en circuitos electrónicos.

Paso 3: Hágalo independiente

Ahora agregaremos un protector de teclado LCD, convertiremos la presión a altura en metros y lo mostraremos en la pantalla. También agregaremos la capacidad de poner a cero el valor presionando el botón "Seleccionar" del teclado.

Con el protector LCD en el Arduino, el sensor deberá estar conectado al protector LCD. Desafortunadamente, los protectores de LCD generalmente vienen sin los enchufes apropiados. Así que las opciones son hacer conexiones de soldadura o conseguir una regleta de enchufes. La regleta de enchufes está disponible en eBay por no mucho más que el costo de envío. Haga una búsqueda en "regleta de enchufes de 2,54 mm" y busque las que sean similares a las del Arduino. Por lo general, vienen en longitudes de 36 o 40 pines. Evitaría los de clavija torneada, ya que no son lo suficientemente profundos para los cables Dupont estándar.

La regleta de enchufes debe cortarse a medida y el corte debe realizarse en el mismo lugar que un alfiler. Entonces, para una tira de 6 pines, retire el séptimo pasador con unos alicates finos, luego corte en ese lugar con una sierra para metales junior. Lima los extremos para que queden limpios.

Asegúrese de que no haya puentes de soldadura al soldarlos en la placa.

Con la decisión adecuada sobre la conexión del sensor, conecte el protector de la pantalla LCD al Arduino y conecte el sensor con los mismos pines, pero ahora en el protector de la pantalla LCD.

También prepare la batería y el plomo. Hice mi plomo a partir de piezas en mi papelera, pero también están disponibles en eBay, incluida una buena opción que incluye una caja de batería y un interruptor. Busque "Plomo PP3 de 2,1 mm".

El consumo actual ronda los 80ma. Por lo tanto, si desea funcionar durante más de unos minutos, considere una batería de 9v más grande que la PP3.

Paso 4: agregue el código para la altitud y la pantalla LCD

Image
Image

Necesitamos hacer un poco más de codificación para convertir la presión en altura e impulsar la pantalla.

Al comienzo del boceto, agregue la biblioteca de visualización e indique qué pines se utilizan:

#incluir

// inicializar la biblioteca con los números de los pines de la interfaz LiquidCrystal lcd (8, 9, 4, 5, 6, 7);

A continuación, necesitamos algunas variables y una función para leer los botones del teclado. Todos ellos están conectados a la entrada analógica A0. Cada botón da un voltaje diferente a A0. Una búsqueda en "código de botones de protección lcd arduino" encontró un buen código en:

www.dfrobot.com/wiki/index.php/Arduino_LCD_KeyPad_Shield_(SKU:_DFR0009)#Sample_Code

Agregue este código antes de la configuración ():

// define algunos valores usados por el panel y los botones

int lcd_key = 0; int adc_key_in = 0; #define btnRIGHT 0 #define btnUP 1 #define btnDOWN 2 #define btnLEFT 3 #define btnSELECT 4 #define btnNONE 5 // lee los botones int read_LCD_buttons () {adc_key_in = analogRead (0); // leemos el valor del sensor // mis botones cuando se leen están centrados en estos valores: 0, 144, 329, 504, 741 // agregamos aproximadamente 50 a esos valores y verificamos si estamos cerca if (adc_key_in> 1000) devuelve btnNONE; // Hacemos de esta la primera opción por razones de velocidad, ya que será el resultado más probable si (adc_key_in <50) return btnRIGHT; if (adc_key_in <250) return btnUP; if (adc_key_in <450) return btnDOWN; if (adc_key_in <650) return btnLEFT; if (adc_key_in <850) return btnSELECT; return btnNONE; // cuando todos los demás fallan, devuelve esto…}

La altitud generalmente se pone a cero en el punto de partida. Entonces necesitamos variables tanto para la altura como para la referencia. Agregue estos antes de setup () y la función anterior:

flotador mtr;

flotador ref = 0;

La conversión de presión en pascales a metros es casi exactamente una división por 12 al nivel del mar. Esta fórmula está bien para la mayoría de las mediciones terrestres. Hay fórmulas más precisas que son más apropiadas para la conversión a grandes altitudes. Úselos si va a usar esto para registrar la altitud de un vuelo en globo.

La referencia debe establecerse en la primera lectura de presión, por lo que comenzamos en la altura cero y cuando se presiona el botón SELECT. Agregue, después del código de filtro y antes de la declaración Serial.println:

si (ref == 0) {

ref = filtrado / 12,0; } if (read_LCD_buttons () == btnSELECT) {ref = filtrado / 12.0; }

Después de esto, agregue el cálculo de la altura:

mtr = ref - filtrado / 12.0;

Por último, cambie la declaración Serial.println para enviar "mtr" en lugar de "filtrado" y agregue el código para enviar "mtr" a la pantalla LCD:

Serial.println (mtr); // Enviar presión vía serial (UART)

lcd.setCursor (0, 1); // línea 2 lcd.print (mtr);

Todos los cambios aquí están incluidos en el ejemplo MS5611data2lcd. Cargue esto como en el paso 2.

Hay un último mod que es útil. La pantalla es difícil de leer cuando se actualiza 60 veces por segundo. Nuestro filtro suaviza los datos con una constante de tiempo de alrededor de 0,8 s. Así que actualizar la pantalla cada 0.3s parece suficiente.

Por lo tanto, agregue un contador después de todas las demás definiciones de variables al comienzo del boceto (por ejemplo, después de float ref = 0;):

int i = 0;

Luego agregue código para incrementar 'i' y una instrucción 'if' para que se ejecute cuando llegue a 20 y luego vuelva a establecerlo en cero y mueva los comandos Serial y lcd dentro de la instrucción 'if' para que solo se ejecuten cada 20 lecturas:

i + = 1;

if (i> = 20) {Serial.println (mtr); // Enviar presión vía serial (UART) lcd.setCursor (0, 1); // línea 2 lcd.print (mtr); i = 0; }

No incluí un ejemplo con esta última modificación para incentivar la introducción manual del código que ayuda al aprendizaje.

Este proyecto debería ser un buen punto de partida, por ejemplo, para un barómetro digital. Para aquellos que quieran considerar su uso en modelos RC, busque OpenXvario para el código que habilita un altímetro y un variómetro para los sistemas de telemetría Frsky y Turnigy 9x.

Recomendado: