Taula de continguts:

Cinta mètrica atmosfèrica Arduino / MS5611 GY63 GY86 Demostració: 4 passos (amb imatges)
Cinta mètrica atmosfèrica Arduino / MS5611 GY63 GY86 Demostració: 4 passos (amb imatges)

Vídeo: Cinta mètrica atmosfèrica Arduino / MS5611 GY63 GY86 Demostració: 4 passos (amb imatges)

Vídeo: Cinta mètrica atmosfèrica Arduino / MS5611 GY63 GY86 Demostració: 4 passos (amb imatges)
Vídeo: Arduino medir alturas de árboles 2024, Desembre
Anonim
Cinta mètrica atmosfèrica Arduino / MS5611 GY63 GY86 Demostració
Cinta mètrica atmosfèrica Arduino / MS5611 GY63 GY86 Demostració

Es tracta realment d’un baròmetre / altímetre, però veureu el motiu del títol mirant el vídeo.

El sensor de pressió MS5611, que es troba a les plaques Arduino GY63 i GY86, ofereix un rendiment increïble. En un dia tranquil, mesurarà la vostra alçada a menys de 0,2 m. Es tracta efectivament de mesurar la distància del cap a l’espai exterior i restar-la de la distància dels peus a l’espai exterior (mesurant la pressió, és a dir, el pes de l’aire situat a sobre). Aquest aparell espectacular té un abast que mesurarà còmodament l’alçada de l’Everest i també pot arribar a mesurar fins a uns quants centímetres.

Aquest projecte tenia com a objectiu: un projecte d’escoles, un exemple de modificació del codi Arduino i un bon lloc de partida per explorar mitjançant el sensor MS5611. Hi ha moltes preguntes al fòrum dels que tenen dificultats amb aquest sensor. L’enfocament aquí fa que sigui molt senzill utilitzar-lo. Després de fer aquest projecte, estareu ben equipat per desenvolupar altres aplicacions relacionades amb la pressió.

Cada sensor té les seves pròpies constants de calibratge que cal llegir i utilitzar per corregir les dades. Hi ha una biblioteca disponible per ajudar-los a impulsar-los. El codi que es mostra aquí utilitza la biblioteca per fer lectures i després les converteix en alçada i les mostra en un escut LCD.

Primer enviarem les dades al monitor sèrie del PC / portàtil per a les proves inicials. Aquests mostren una mica de soroll i, per tant, afegim un filtre per suavitzar-los. A continuació, afegirem una pantalla LCD perquè la unitat funcioni de forma independent i pugueu provar de mesurar la vostra alçada, o qualsevol altra cosa.

Tingueu en compte que la placa GY63 només té el sensor de pressió MS5611. El GY86 s’anomena tauler de 10 graus de llibertat i també inclou un acceleròmetre de 3 eixos, un giroscopi de 3 eixos i un magnetòmetre de 3 eixos per només uns pocs dòlars més.

Necessitarà:

1. Arduino UNO (o un altre amb pinout estàndard) i el seu cable USB

2. Tauler de sortida GY63 o GY86

3. 4 cables Dupont mascle-femella - o cable de connexió

4. Escut del teclat LCD Arduino

5. Bateria i plom de 9v

6. Tira de sòcol de 2,54 mm (opcional però recomanable)

Preparació

Descarregueu l'IDE Arduino (entorn de desenvolupament integrat) des de:

Alguns bits tècnics d'interès

El MS5611 ofereix un gran rendiment mitjançant la mitjana de nombroses mesures. Pot fer mesures analògiques de 4096 3 bytes (24 bits) en només 8 ms i donar el valor mitjà. Ha de mesurar tant la pressió com la temperatura perquè les dades de pressió es puguin corregir per a la temperatura interna. Per tant, pot oferir al voltant de 60 parells de lectures de pressió i temperatura per segon.

El full de dades està disponible a:

Les comunicacions es fan mitjançant I2C. Així, altres sensors I2C poden compartir el bus (com és el cas de la placa GY86 10DOF on tots els xips estan a I2C).

Pas 1: Obteniu una biblioteca MS5611

Molts dels sensors Arduino utilitzen una biblioteca estàndard que s'inclou amb l'IDE Arduino o es subministra amb un fitxer zip amb una biblioteca que es pot instal·lar fàcilment. Aquest no sol ser el cas dels sensors MS5611. No obstant això, s'ha trobat una cerca: https://github.com/gronat/MS5611 que té una biblioteca per al MS5611, inclosa la realització de la correcció de temperatura.

opció 1

Aneu al lloc web anterior, feu clic a "Clona o baixa" i seleccioneu "Baixa ZIP". Això hauria de lliurar MS5611-master.zip al directori de descàrregues. Ara, si ho desitgeu, moveu-lo a una carpeta on el pugueu trobar més endavant. Faig servir un directori anomenat ‘dades’ afegit a les meves carpetes Arduino.

Malauradament, el fitxer.zip descarregat no inclou cap esbós d’exemple i seria bo afegir la biblioteca i exemples a l’IDE Arduino. Hi ha un exemple mínim al fitxer README.md que es pot copiar i enganxar en un esbós i guardar-lo. Aquesta és una manera de començar.

Opció 2

Per facilitar l'execució del codi en aquest instructiu, he afegit l'exemple mínim anterior i els exemples que es mostren aquí a la biblioteca i he adjuntat un fitxer.zip a continuació que s'instal·larà a l'IDE Arduino.

Baixeu-vos el fitxer zip a continuació. Moveu-ho a una carpeta millor si ho desitgeu.

Inicieu l'IDE Arduino. Feu clic a Esbós> Inclou biblioteca> Afegeix un fitxer zip i seleccioneu el fitxer. Reinicieu l'IDE. Ara l'IDE tindrà la biblioteca instal·lada i tots els exemples que es mostren aquí. Comproveu-ho fent clic a Fitxer> exemples >> MS5611-master. S’han d’enumerar tres esbossos.

Pas 2: connecteu el sensor a l'Arduino i proveu

Connecteu el sensor a l'Arduino i proveu
Connecteu el sensor a l'Arduino i proveu
Connecteu el sensor a l'Arduino i proveu
Connecteu el sensor a l'Arduino i proveu

Les plaques GY63 / GY86 solen venir amb capçaleres però no soldades. Per tant, és la vostra opció soldar les capçaleres al lloc i utilitzar cables Dupont home-femella, o (com he decidit) cables de soldadura directament a la placa i afegir pins al cable per connectar-los a l’Arduino. Aquesta última opció és millor si creieu que és possible que vulgueu soldar el tauler en un projecte més endavant. El primer és millor si voleu utilitzar la pissarra per experimentar. La venda sense soldadura és molt més fàcil que una capçalera de pins.

Les connexions necessàries són:

GY63 / GY86 Arduino

VCC - 5v Power GND - GND Ground SCL - Rellotge A5 I2C> SDA - Dades A4 I2C

Connecteu la placa del sensor a l'Arduino com es descriu anteriorment i connecteu l'Arduino al PC / portàtil mitjançant el seu cable USB. Cobriu també el sensor amb material opac / negre. El sensor és sensible a la llum (com és el cas de la majoria d’aquest tipus de sensor).

Inicieu l'IDE Arduino. Feu clic a:

Fitxer> exemples >> MS5611-master> MS5611data2serial.

Apareixerà una nova instància de l'IDE amb l'esbós. Feu clic al botó de càrrega (fletxa dreta).

A continuació, inicieu el traçador en sèrie: feu clic a Eines> Plotter en sèrie i, si cal, configureu el baud a 9600. Les dades que s’envien són la pressió en Pascals. Al cap d’un segon més o menys, es tornarà a escalar i pujar i baixar el sensor, per exemple, 0,3 m, hauria de mostrar-se com baixar i pujar la traça (l’alçada inferior és una pressió més alta).

Les dades tenen una mica de soroll. Vegeu la primera trama anterior. Això es pot suavitzar mitjançant un filtre digital (una eina realment útil).

L'equació del filtre és:

valor = valor + K (valor nou)

on "valor" són les dades filtrades i "nou" és l'últim mesurat. Si K = 1 no hi ha cap filtratge. Per a valors més baixos de K, les dades es suavitzen amb una constant de temps de T / K on T és el temps entre mostres. Aquí T té al voltant de 17 ms, de manera que un valor de 0,1 dóna una constant de temps de 170 ms o aproximadament 1/6 s.

El filtre es pot afegir mitjançant:

Afegiu una variable per a les dades filtrades abans de configurar ():

float filtrat = 0;

A continuació, afegiu l'equació del filtre després de la pressió = …. línia.

filtrat = filtrat + 0,1 * (filtrat a pressió);

És una bona idea inicialitzar el valor filtrat a la primera lectura. Per tant, afegiu una sentència "si" al voltant de la línia de dalt que faci això perquè sembli:

if (filtrat = 0) {

filtrat = filtrat + 0,1 * (filtrat a pressió); } else {filtrat = pressió; // primera lectura de manera que es filtra a lectura}

La prova "! =" No és "igual". Per tant, si ‘filtrat’ no és igual a 0 s’executa l’equació del filtre, però si és així s’estableix en la lectura de pressió.

Per últim, hem de canviar la "pressió" a "filtrat" a la sentència Serial.println perquè vegem el valor filtrat.

El millor aprenentatge s’aconsegueix fent els canvis anteriors manualment. Tot i això, els he inclòs a l'exemple MS5611data2serialWfilter. Per tant, si hi ha problemes, es pot carregar l'exemple.

Ara pengeu el codi a l'Arduino i veureu la millora. Vegeu el segon gràfic anterior i observeu que l’escala Y s’expandeix x2.

Proveu un valor inferior per a la constant del filtre, diguem 0,02 en lloc de 0,1 i vegeu la diferència. Les dades són més suaus però amb una resposta més lenta. Aquest és un compromís que s’ha de buscar quan s’utilitza aquest senzill filtre. La característica és la mateixa que un filtre RC (resistència i capacitat) molt utilitzat en circuits electrònics.

Pas 3: feu que sigui independent

Ara afegirem un escut del teclat LCD, convertirem la pressió en alçada en metres i la mostrarem a la pantalla. També afegirem la possibilitat de posar a zero el valor prement el botó ‘Selecciona’ del teclat.

Amb l’escut LCD de l’Arduino, el sensor s’haurà de connectar a l’escut LCD. Malauradament, els escuts LCD solen venir sense els endolls adequats. Per tant, les opcions són fer connexions de soldadura o obtenir una tira de sòcol. La presa de corrent està disponible a ebay per no gaire més del cost del franqueig. Feu una cerca a ‘tira de sòcol de 2,54 mm’ i cerqueu-ne de similars als de l’Arduino. Aquests solen tenir una longitud de 36 o 40 pins. Evitaria els passadors girats, ja que no són prou profunds per als cables Dupont estàndard.

La tira de sòcol s’ha de tallar a la longitud i el tall s’ha de fer al mateix lloc que un passador. Així doncs, per a una tira de 6 pins: traieu el setè pin amb unes alicates fines i, a continuació, talleu-lo en aquell lloc amb una serra mecànica junior. Arxivo els extrems perquè quedin ordenats.

Assegureu-vos que no hi hagi ponts de soldadura en soldar-los al tauler.

Amb la decisió adequada sobre la connexió del sensor, connecteu el blindatge LCD a l'Arduino i connecteu el sensor als mateixos pins, però ara al blindatge LCD.

També prepareu la bateria i el plom. Vaig confeccionar el meu avantatge a partir de peces del contenidor de ferralla, però també estan disponibles a eBay, inclosa una bona opció que inclou una caixa de bateries i un interruptor. Cerqueu a "PP3 2,1 mm".

El consum actual ronda els 80ma. Per tant, si voleu funcionar més de pocs minuts, tingueu en compte una bateria de 9 V més gran que la PP3.

Pas 4: afegiu un codi per a Altitude i la pantalla LCD

Image
Image

Hem de fer una mica més de codificació per convertir la pressió en alçada i conduir la pantalla.

Al començament de l'esbós, afegiu la biblioteca de visualització i digueu-li quins pins s'utilitzen:

#incloure

// inicialitzeu la biblioteca amb els números dels pins de la interfície LiquidCrystal lcd (8, 9, 4, 5, 6, 7);

A continuació, necessitem algunes variables i una funció per llegir els botons del teclat. Tots ells estan connectats a l'entrada analògica A0. Cada botó dóna un voltatge diferent a A0. Una cerca al ‘codi de botons de pantalla LCD Arduino’ ha trobat un bon codi a:

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

Afegiu aquest codi abans de configurar ():

// defineix alguns valors que fan servir el panell i els botons

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 // llegeix els botons int read_LCD_buttons () {adc_key_in = analogRead (0); // llegeix el valor del sensor // els meus botons quan es llegeixen estan centrats en aquestes valies: 0, 144, 329, 504, 741 // afegim aproximadament 50 a aquests valors i comprovem si estem a prop si (adc_key_in> 1000) retorn btnNONE; // Fem d'aquesta la primera opció per motius de velocitat, ja que serà el resultat més probable si (adc_key_in <50) retorna btnRIGHT; if (adc_key_in <250) retorna btnUP; if (adc_key_in <450) retorna btnDOWN; if (adc_key_in <650) retorna btnLEFT; if (adc_key_in <850) retorna btnSELECT; tornar btnNONE; // quan tots els altres fallin, torneu això …}

Normalment, l’altitud es posa a zero al punt de partida. Per tant, necessitem variables tant per alçada com per referència. Afegiu-los abans de setup () i la funció anterior:

float mtr;

float ref = 0;

La conversió de la pressió en Pascals a metres és gairebé exactament una divisió per 12 al nivell del mar. Aquesta fórmula és adequada per a la majoria de mesures basades en el terreny. Hi ha fórmules més precises que són més adequades per a la conversió a gran altitud. Utilitzeu-les si voleu utilitzar-les per registrar l'altitud d'un vol en globus.

La referència s’ha d’establir a la primera lectura de pressió, de manera que comencem a l’alçada zero i quan es prem el botó SELECT. Afegiu, després del codi de filtre i abans de la sentència Serial.println:

if (ref == 0) {

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

Després d'això, afegiu el càlcul de l'alçada:

mtr = ref - filtrat / 12.0;

Per últim, canvieu la sentència Serial.println per enviar 'mtr' en lloc de 'filtrat' i afegiu codi per enviar 'mtr' a la pantalla LCD:

Serial.println (mtr); // Enviar pressió per sèrie (UART)

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

Tots els canvis aquí s’inclouen a l’exemple MS5611data2lcd. Carregueu-ho com al pas 2.

Hi ha una última modificació que és útil. La pantalla és difícil de llegir quan s’actualitza 60 vegades per segon. El nostre filtre permet suavitzar les dades amb una constant de temps al voltant de 0,8 s. Per tant, actualitzar la pantalla cada 0,3 s sembla suficient.

Per tant, afegiu un comptador després de totes les altres definicions de variables al començament de l’esbós (per exemple, després de float ref = 0;):

int i = 0;

A continuació, afegiu codi per incrementar 'i' i una sentència 'if' perquè s'executi quan arribi a 20 i, a continuació, torneu a posar-la a zero i moveu les ordres Serial i lcd dins de la sentència 'if' perquè només s'executin cada vintena lectura:

i + = 1;

if (i> = 20) {Serial.println (mtr); // Enviar pressió mitjançant sèrie (UART) lcd.setCursor (0, 1); // línia 2 lcd.print (mtr); i = 0; }

No he inclòs cap exemple amb aquesta última modificació per tal d'incentivar la introducció manual del codi que ajudi a l'aprenentatge.

Aquest projecte hauria de ser un bon punt de partida, per exemple, per a un baròmetre digital. Per a aquells que vulguin considerar l'ús en models RC: cerqueu OpenXvario per obtenir codi que permeti un altímetre i un variòmetre per als sistemes de telemetria Frsky i Turnigy 9x.

Recomanat: