INHOUDSOPGAWE:

Arduino atmosferiese maatband/ MS5611 GY63 GY86 Demonstrasie: 4 stappe (met foto's)
Arduino atmosferiese maatband/ MS5611 GY63 GY86 Demonstrasie: 4 stappe (met foto's)

Video: Arduino atmosferiese maatband/ MS5611 GY63 GY86 Demonstrasie: 4 stappe (met foto's)

Video: Arduino atmosferiese maatband/ MS5611 GY63 GY86 Demonstrasie: 4 stappe (met foto's)
Video: Электронная рулетка из ардуино 2024, November
Anonim
Arduino atmosferiese maatband/ MS5611 GY63 GY86 Demonstrasie
Arduino atmosferiese maatband/ MS5611 GY63 GY86 Demonstrasie

Dit is regtig 'n barometer/hoogtemeter, maar u sal die rede vir die titel sien deur na die video te kyk.

Die MS5611 -druksensor op die Arduino GY63- en GY86 -uitbreekborde lewer uitstekende prestasie. Op 'n kalm dag meet dit u lengte tot 0,2 m. Dit meet die afstand van u kop tot die buitenste ruimte effektief en trek dit af van die afstand van u voete na die buitenste ruimte (deur druk te meet - dit is die gewig van die lug daarbo). Hierdie skouspelagtige toestel het 'n reeks wat gemaklik die hoogte van Everest kan meet - en kan ook tot 'n paar sentimeter meet.

Hierdie projek was bedoel as: 'n skoolprojek, 'n voorbeeld van die wysiging van die Arduino -kode en 'n goeie beginpunt om die MS5611 -sensor te ondersoek. Daar is baie forumvrae van diegene wat probleme ondervind met hierdie sensor. Die benadering hier maak die gebruik daarvan baie eenvoudig. Nadat u hierdie projek gedoen het, sal u goed toegerus wees om ander drukverwante toepassings te ontwikkel.

Elke sensor het sy eie kalibrasie -konstantes wat gelees en gebruik moet word om die data reg te stel. Daar is 'n biblioteek beskikbaar om hierdie te help bestuur. Die kode wat hier getoon word, gebruik die biblioteek om metings te neem en verander dit dan in hoogte en vertoon dit op 'n LCD -skerm.

Eerstens stuur ons die data na die seriële monitor op die rekenaar/skootrekenaar vir eerste toetse. Dit toon 'n mate van geraas, en daarom voeg ons 'n filter by om dit glad te maak. Dan voeg ons 'n LCD -skerm by sodat die eenheid onafhanklik kan werk en u u lengte kan meet - of enigiets anders.

Let daarop dat die GY63 -bord net die MS5611 -druksensor het. Die GY86 word 'n 10 grade of freedom board genoem en bevat ook 'n 3 -as versnellingsmeter, 3 -as gyro en 'n 3 -as magnetometer vir slegs 'n paar dollar meer.

Jy sal nodig hê:

1. Arduino UNO (of ander met standaard pinout) en sy USB -kabel

2. GY63 breakout board of GY86

3. 4 Dupont lei man -vrou - of verbindingsdraad

4. Arduino LCD -sleutelbordskerm

5. 9v battery en lood

6. 2,54 mm -voetstrook (opsioneel, maar word aanbeveel)

Voorbereiding

Laai die Arduino IDE (geïntegreerde ontwikkelingsomgewing) af van:

Enkele tegniese stukkies vir belangstelling

Die MS5611 lewer sy uitstekende prestasie deur middel van 'n gemiddelde hoeveelheid metings. Dit kan 4096 3 -byte (24bit) analoogmetings in slegs 8 ms maak en die gemiddelde waarde gee. Dit moet beide druk en temperatuur meet, sodat die drukdata vir interne temperatuur reggestel kan word. Daarom kan dit ongeveer 60 pare druk- en temperatuurmetings per sekonde lewer.

Die gegewensblad is beskikbaar by:

Kommunikasie is via I2C. So kan ander I2C -sensors die bus deel (soos die geval is op die GY86 10DOF -bord waar al die skyfies op I2C is).

Stap 1: Kry 'n MS5611 -biblioteek

Baie van die Arduino -sensors gebruik óf 'n standaardbiblioteek wat by die Arduino IDE ingesluit is, óf 'n zip -lêer met 'n biblioteek wat maklik geïnstalleer kan word. Dit is gewoonlik nie die geval met die MS5611 -sensors nie. Daar is egter 'n soektog gevind: https://github.com/gronat/MS5611 met 'n biblioteek vir die MS5611, insluitend die uitvoering van die temperatuurregstelling.

Opsie 1

Gaan na die webwerf hierbo, klik op 'kloon of aflaai' en kies 'aflaai zip'. Dit behoort MS5611-master.zip na u aflaaigids te lewer. As u wil, skuif dit dan na 'n gids waar u dit in die toekoms kan vind. Ek gebruik 'n gids genaamd 'data' wat by my Arduino -vouers gevoeg is.

Ongelukkig bevat die afgelaaide zip -lêer geen voorbeeldsketse nie, en dit sal aangenaam wees om die biblioteek en voorbeelde by die Arduino IDE te voeg. Daar is 'n minimum voorbeeld in die README.md -lêer wat in 'n skets gekopieer en geplak en gestoor kan word. Dit is een manier om aan die gang te kom.

Opsie 2

Om dit makliker te maak om die kode in hierdie instruksies uit te voer, het ek die minimum voorbeeld hierbo en die voorbeelde hier by die biblioteek bygevoeg en 'n.zip -lêer hieronder aangeheg wat in die Arduino IDE geïnstalleer kan word.

Laai die zip -lêer hieronder af. Skuif dit na 'n beter gids as u wil.

Begin die Arduino IDE. Klik op Skets> Sluit biblioteek in> Voeg zip -lêer by en kies die lêer. Herbegin die IDE. Die IDE sal nou albei die biblioteek geïnstalleer plus al die voorbeelde wat hier getoon word. Kontroleer deur op File> voorbeelde >> MS5611-master te klik. Drie sketse moet gelys word.

Stap 2: Koppel die sensor aan die Arduino en toets

Koppel die sensor aan die Arduino en toets
Koppel die sensor aan die Arduino en toets
Koppel die sensor aan die Arduino en toets
Koppel die sensor aan die Arduino en toets

Die GY63/GY86 -borde het gewoonlik kopstukke, maar nie gesoldeer nie. Dit is dus u keuse om die kopstukke op hul plek te soldeer en manlike-vroulike Dupont-leidings te gebruik, of (soos ek besluit het) soldeerkabels direk op die bord en penne aan die kabel voeg om in die Arduino aan te sluit. Laasgenoemde opsie is beter as u dink dat u die bord later in 'n projek wil soldeer. Eersgenoemde is beter as u die bord vir eksperimentering wil gebruik. Dit is baie makliker om leidrade te soldeer as 'n penkop.

Die vereiste verbindings is:

GY63/GY86 Arduino

VCC - 5v Power GND - GND Ground SCL - A5 I2C klok> SDA - A4 I2C data

Koppel die sensorbord soos hierbo aan die Arduino en koppel die Arduino via die USB -kabel aan die rekenaar/skootrekenaar. Bedek ook die sensor met 'n paar ondeursigtige/swart materiaal. Die sensor is sensitief vir lig (soos die geval is met die meeste van hierdie tipe sensors).

Begin die Arduino IDE. Klik:

Lêer> voorbeelde >> MS5611-master> MS5611data2serial.

'N Nuwe voorbeeld van die IDE verskyn saam met die skets. Klik op die oplaai -knoppie (pyltjie regs).

Begin dan met die reeksplotter - klik op Tools> Serial Plotter en stel indien nodig die baud op 9600. Die data wat gestuur word, is die druk in Pascals. Na 'n sekonde sal die sensor her-skaal word, en die verhoging en verlaging van die sensor met 0,3 m moet verskyn as die spoor verlaag en verhoog word (laer hoogte is hoër druk).

Die data het 'n bietjie geraas. Sien eerste plot hierbo. Dit kan glad gemaak word met 'n digitale filter ('n baie nuttige hulpmiddel).

Die filtervergelyking is:

waarde = waarde + K (nuwe waarde)

waar 'waarde' die gefiltreerde data is, en 'nuut' is die nuutste gemeet. As K = 1 is daar geen filter nie. Vir laer waardes van K word die data glad gemaak met 'n tydskonstante van T/K waar T die tyd tussen monsters is. Hier is T ongeveer 17 ms, so 'n waarde van 0.1 gee 'n tydskonstante van 170ms of ongeveer 1/6s.

Die filter kan bygevoeg word deur:

Voeg 'n veranderlike by vir die gefiltreerde data voor opstelling ():

vlot gefiltreer = 0;

Voeg dan die filtervergelyking by na die druk =…. lyn.

gefiltreer = gefiltreer + 0,1*(druk gefiltreer);

Dit is 'n goeie idee om die gefiltreerde waarde na die eerste lesing te initialiseer. Voeg dus 'n 'as' -verklaring by rondom die lyn hierbo wat dit doen, sodat dit lyk:

as (gefiltreer! = 0) {

gefiltreer = gefiltreer + 0,1*(druk gefiltreer); } anders {gefiltreer = druk; // eerste lesing, so gefiltreer op lees}

Die toets '! =' Is 'nie gelyk' nie. As 'gefiltreer' dus nie gelyk is aan 0 nie, word die filtervergelyking uitgevoer, maar as dit die geval is, word dit ingestel op die druklesing.

Laastens moet ons 'druk' verander na 'gefiltreer' in die Serial.println -verklaring, sodat ons die gefiltreerde waarde kan sien.

Die beste leer word behaal deur die wysigings hierbo met die hand te maak. Ek het dit egter in die voorbeeld MS5611data2serialWfilter ingesluit. As daar probleme is, kan die voorbeeld gelaai word.

Laai nou die kode op na die Arduino en sien die verbetering. Sien die tweede plot hierbo en let op die Y -skaal is uitgebrei x2.

Probeer 'n laer waarde vir die filterkonstante, sê 0,02 in plaas van 0,1, en sien die verskil. Die data is gladder, maar met 'n stadiger reaksie. Dit is 'n kompromie wat gesoek moet word by die gebruik van hierdie eenvoudige filter. Die kenmerk is dieselfde as 'n RC (weerstand en kapasitansie) filter wat wyd in elektroniese stroombane gebruik word.

Stap 3: Maak dit selfstandig

Nou voeg ons 'n LCD -sleutelbordskerm by, omskakel die druk in hoogte in meter en wys dit op die skerm. Ons sal ook die moontlikheid byvoeg om die waarde te nul deur op die 'Kies' -knoppie op die klavier te druk.

Met die LCD -skild op die Arduino moet die sensor aan die LCD -skerm gekoppel word. Ongelukkig kom die LCD -skerms gewoonlik sonder die toepaslike voetstukke. Die opsies is dus om soldeeraansluitings te maak of om 'n voetstuk te kry. Sokstrook is beskikbaar op eBay vir nie veel meer as die posgeld nie. Soek '2,54 mm -aansluitingstrook' en soek na soortgelyke een op die Arduino. Dit kom gewoonlik in lengtes van 36 of 40 penne voor. Ek sou die gedraaide penne vermy, aangesien hulle nie diep genoeg is vir standaard Dupont -leidings nie.

Die voetstuk moet in lengte gesny word en die snit moet op dieselfde plek as 'n pen gemaak word. Dus, vir 'n 6 -pen strook - verwyder die sewende pen met 'n fyn tang, en sny dan op die plek met 'n junior ystersaag. Ek vyl die punte aan om dit netjies te maak.

Maak seker dat daar geen soldeerbrue is wanneer u dit op die bord soldeer nie.

Met die toepaslike besluit om die sensor aan te sluit, steek die LCD -skild op die Arduino en verbind die sensor met dieselfde penne - maar nou op die LCD -skild.

Kry ook die battery en lood gereed. Ek het my voorsprong gemaak uit dele in my asblik, maar dit is ook op eBay beskikbaar - insluitend 'n goeie opsie wat 'n batterykas en skakelaar bevat. Soek op 'PP3 2.1mm lead'.

Die huidige verbruik is ongeveer 80ma. As u dus langer as 'n paar minute wil hardloop, moet u 'n groter 9v -battery as die PP3 oorweeg.

Stap 4: Voeg kode vir hoogte en die LCD by

Image
Image

Ons moet 'n bietjie meer kodering doen om die druk in hoogte te omskep en die skerm te bestuur.

Voeg aan die begin van die skets die vertoonbiblioteek by en vertel watter penne gebruik word:

#insluit

// initialiseer die biblioteek met die nommers van die koppelvlakpenne LiquidCrystal lcd (8, 9, 4, 5, 6, 7);

Vervolgens benodig ons 'n paar veranderlikes en 'n funksie om die knoppies van die klavier te lees. Dit is almal gekoppel aan analoog ingang A0. Elke knoppie gee 'n ander spanning aan A0. 'N Soektog na' arduino lcd shield buttons code 'het goeie kode gevind by:

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

Voeg hierdie kode by voor opstelling ():

// definieer 'n paar waardes wat deur die paneel en knoppies gebruik word

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 // lees die knoppies int read_LCD_buttons () {adc_key_in = analogRead (0); // Lees die waarde van die sensor 1000) retoer btnNONE; // Ons maak dit om spoedredes die eerste opsie, aangesien dit die mees waarskynlike resultaat sal wees as (adc_key_in <50) btnRIGHT terugkeer; as (adc_key_in <250) terugkeer btnUP; as (adc_key_in <450) terugkeer btnDOWN; as (adc_key_in <650) terugkeer btnLEFT; as (adc_key_in <850) terugkeer btnSELECT; terugkeer btnNONE; // as alle ander misluk, stuur dit terug…}

Hoogte word gewoonlik op die beginpunt op nul gestel. Ons benodig dus veranderlikes vir beide hoogte en verwysing. Voeg hierdie by voor opstelling () en die funksie hierbo:

dryf mtr;

float ref = 0;

Die omskakeling van druk in Pascals na meter is byna presies 'n afdeling met 12 op seevlak. Hierdie formule is goed vir die meeste grondmetings. Daar is meer akkurate formules wat meer geskik is vir omskakeling op groot hoogtes. Gebruik hierdie as u die hoogte van 'n ballonvlug gaan aanteken.

Die verwysing moet ingestel word op die eerste druklesing, sodat ons op nulhoogte begin en wanneer die SELECT -knoppie ingedruk word. Voeg by, na die filterkode, en voor die Serial.println -verklaring:

as (ref == 0) {

ref = gefiltreer/12.0; } if (read_LCD_buttons () == btnSELECT) {ref = gefiltreer/12.0; }

Voeg hierna die hoogteberekening by:

mtr = ref - gefiltreer/12.0;

Verander laastens die Serial.println -stelling om 'mtr' in plaas van 'gefiltreer' te stuur, en voeg kode by om 'mtr' na die LCD te stuur:

Serial.println (mtr); // Stuur druk via reeks (UART)

lcd.setCursor (0, 1); // reël 2 lcd.print (mtr);

Al die veranderinge hier is ingesluit in die voorbeeld MS5611data2lcd. Laai dit soos in stap 2.

Daar is 'n laaste mod wat nuttig is. Die skerm is moeilik om te lees as dit 60 keer per sekonde opgedateer word. Ons filter maak die data glad met 'n tydskonstante rondom 0,8s. Dit lyk dus genoeg om die skerm elke 0,3 sekondes by te werk.

Voeg dus 'n teller by na al die ander veranderlike definisies aan die begin van die skets (bv. Na float ref = 0;):

int i = 0;

Voeg dan kode by om 'i' en 'if' -verklaring te verhoog om te loop wanneer dit op 20 kom, en stel dit dan terug op nul en skuif die reeks- en lcd -opdragte binne die 'as' -verklaring, sodat dit slegs elke 20ste lesing uitgevoer word:

ek += 1;

as (i> = 20) {Serial.println (mtr); // Stuur druk via seriële (UART) lcd.setCursor (0, 1); // reël 2 lcd.print (mtr); ek = 0; }

Ek het nie 'n voorbeeld by hierdie laaste wysiging ingesluit om die kode handmatig in te voer wat leer help nie.

Hierdie projek moet 'n goeie beginpunt wees, byvoorbeeld vir 'n digitale barometer. Vir diegene wat dit in RC -modelle wil oorweeg - soek na OpenXvario vir kode wat 'n hoogtemeter en variometer vir Frsky en Turnigy 9x telemetrie stelsels moontlik maak.

Aanbeveel: