Kazalo:

Arduino atmosferski trak/ MS5611 GY63 GY86 Predstavitev: 4 koraki (s slikami)
Arduino atmosferski trak/ MS5611 GY63 GY86 Predstavitev: 4 koraki (s slikami)

Video: Arduino atmosferski trak/ MS5611 GY63 GY86 Predstavitev: 4 koraki (s slikami)

Video: Arduino atmosferski trak/ MS5611 GY63 GY86 Predstavitev: 4 koraki (s slikami)
Video: Arduino Nano - MPL3115A2 Precision Altimeter Sensor Tutorial 2024, Julij
Anonim
Arduino atmosferski trak/ demonstracija MS5611 GY63 GY86
Arduino atmosferski trak/ demonstracija MS5611 GY63 GY86

To je res barometer/višinomer, vendar boste razlog za naslov videli, če pogledate video.

Senzor tlaka MS5611, ki ga najdemo na ploščah Arduino GY63 in GY86, prinaša neverjetne zmogljivosti. V mirnem dnevu bo izmeril vašo višino do 0,2 m. To učinkovito meri razdaljo od glave do vesolja in jo odšteje od razdalje stopal do vesolja (z merjenjem tlaka - to je teža zraka zgoraj). Ta spektakularna naprava ima doseg, ki bo udobno meril višino Everesta - in lahko meri tudi do nekaj centimetrov.

Namen tega projekta je bil: šolski projekt, primer spreminjanja kode Arduino in dobro izhodišče za raziskovanje s senzorjem MS5611. Obstaja veliko vprašanj na forumu tistih, ki imajo težave s tem senzorjem. Zaradi tega pristopa je uporaba zelo enostavna. Po tem projektu boste dobro opremljeni za razvoj drugih aplikacij, povezanih s pritiskom.

Vsak senzor ima svoje umeritvene konstante, ki jih je treba prebrati in uporabiti za popravljanje podatkov. Za pomoč pri teh je na voljo knjižnica. Koda, prikazana tukaj, uporablja knjižnico za odčitavanje, nato pa jih pretvori v višino in prikaže na LCD zaslonu.

Najprej bomo podatke poslali v serijski monitor na osebnem računalniku/prenosnem računalniku za začetne teste. Ti kažejo nekaj hrupa, zato jim dodamo filter, da jih izravnamo. Nato bomo dodali LCD zaslon, da bo enota delovala neodvisno in lahko poskusite izmeriti svojo višino - ali karkoli drugega.

Upoštevajte, da ima plošča GY63 samo senzor tlaka MS5611. GY86 se imenuje deska za 10 stopinj svobode in vključuje le še 3 osni merilnik pospeška, 3 -osni žiroskop in 3 -osni magnetometer.

Boste potrebovali:

1. Arduino UNO (ali drug s standardnim izhodom) in njegov kabel USB

2. Odklopna plošča GY63 ali GY86

3. 4 Dupont vodi moški -ženski - ali priključna žica

4. Arduino ščit za tipkovnico LCD

5. 9v baterija in svinec

6. 2,54 mm vtični trak (neobvezno, vendar priporočljivo)

Priprava

Prenesite Arduino IDE (integrirano razvojno okolje) s:

Nekaj tehničnih podrobnosti za obresti

MS5611 prinaša svoje odlične zmogljivosti s povprečjem velikega števila meritev. Lahko izvede 4096 3 -bajtnih (24 -bitnih) analognih meritev v samo 8 ms in poda povprečno vrednost. Meriti mora tlak in temperaturo, tako da je mogoče podatke o tlaku popraviti glede na notranjo temperaturo. Tako lahko odda približno 60 parov odčitkov tlaka in temperature na sekundo.

Podatkovni list je na voljo na:

Komunikacija poteka prek I2C. Tako lahko drugi senzorji I2C delijo vodilo (kot je to na plošči GY86 10DOF, kjer so vsi čipi na I2C).

1. korak: Pridobite knjižnico MS5611

Mnogi senzorji Arduino uporabljajo standardno knjižnico, ki je vključena v Arduino IDE, ali pa so opremljeni z zip datoteko s knjižnico, ki jo je mogoče enostavno namestiti. To običajno ne velja za senzorje MS5611. Vendar je iskanje našlo: https://github.com/gronat/MS5611, ki ima knjižnico za MS5611, vključno s korekcijo temperature.

Možnost 1

Pojdite na zgornje spletno mesto, kliknite »Kloniraj ali prenesi« in izberite »Prenesi ZIP«. To bi moralo dostaviti MS5611-master.zip v vaš imenik za prenos. Zdaj, če želite, ga premaknite v mapo, kjer ga boste lahko našli v prihodnosti. Uporabljam imenik, imenovan "podatki", dodan v moje mape Arduino.

Naložena datoteka.zip žal ne vsebuje primerov skic, zato bi bilo lepo dodati knjižnico in primere v Arduino IDE. Najmanjši primer v datoteki README.md, ki ga je mogoče kopirati in prilepiti v skico in shraniti. To je eden od načinov za napredovanje.

Možnost 2

Za lažji zagon kode v tem navodilu sem knjižnici dodal minimalni zgornji primer in primere, prikazane tukaj, spodaj pa priložil datoteko.zip, ki se bo namestila v Arduino IDE.

Spodaj prenesite datoteko zip. Če želite, ga premaknite v boljšo mapo.

Zaženite Arduino IDE. Kliknite Skica> Vključi knjižnico> Dodaj datoteko zip in izberite datoteko. Znova zaženite IDE. IDE bo imel zdaj nameščeno knjižnico in vse primere, prikazane tukaj. Preverite tako, da kliknete Datoteka> primeri >> MS5611-master. Navesti je treba tri skice.

2. korak: Senzor priključite na Arduino in preizkusite

Senzor priključite na Arduino in preizkusite
Senzor priključite na Arduino in preizkusite
Senzor priključite na Arduino in preizkusite
Senzor priključite na Arduino in preizkusite

Plošče GY63/GY86 imajo običajno glave, vendar niso spajkane. Zato je vaša izbira, da bodisi spajkate glave na mestu in uporabite moško-ženske Dupont vodila, ali (kot sem se odločil) spajkate vodila neposredno na ploščo in dodate zatiče na vodilo za priključitev na Arduino. Slednja možnost je boljša, če mislite, da bi ploščo kasneje želeli spajati v projekt. Prvi je boljši, če želite ploščo uporabiti za eksperimentiranje. Odpajkanje vodnikov je veliko lažje kot zatič.

Potrebne povezave so:

GY63/GY86 Arduino

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

Pritrdite senzorsko ploščo na Arduino, kot je opisano zgoraj, in povežite Arduino z osebnim računalnikom/prenosnikom prek USB kabla. Senzor pokrijte tudi z neprozornim/črnim materialom. Senzor je občutljiv na svetlobo (kot velja za večino te vrste senzorjev).

Zaženite Arduino IDE. Kliknite:

Datoteka> primeri >> MS5611-master> MS5611data2serial.

S skico se bo pojavil nov primerek IDE. Kliknite gumb za nalaganje (puščica desno).

Nato zaženite serijski ploter - kliknite Orodja> Serijski ploter in po potrebi nastavite hitrost na 9600. Poslani podatki so tlak v paskalih. Čez kakšno sekundo se bo ponovno merilo in dvig in spuščanje senzorja za recimo 0,3 m bi se moralo prikazati kot spuščanje in dvig sledi (nižja višina je višji tlak).

Podatki imajo nekaj hrupa. Glej prvi zaplet zgoraj. To lahko zgladite z digitalnim filtrom (res uporabno orodje).

Enačba filtra je:

vrednost = vrednost + K (nova vrednost)

kjer je „vrednost“filtrirani podatki, „novo“pa so zadnji izmerjeni podatki. Če je K = 1, filtriranja ni. Za nižje vrednosti K so podatki zglajeni s časovno konstanto T/K, kjer je T čas med vzorci. Tu je T okoli 17 ms, zato vrednost 0,1 daje časovno konstanto 170 ms ali okoli 1/6s.

Filter lahko dodate:

Pred nastavitvijo () dodajte spremenljivko za filtrirane podatke:

plavajoče filtrirano = 0;

Nato po tlaku =… dodajte enačbo filtra. vrstica.

filtrirano = filtrirano + 0,1*(filtrirano pod tlakom);

Filtrirano vrednost je dobro začeti pri prvem branju. Zato okoli zgornje vrstice dodajte stavek "if", da bo videti tako:

if (filtrirano! = 0) {

filtrirano = filtrirano + 0,1*(filtrirano pod tlakom); } else {filtrirano = tlak; // tako prvo filtriranje nastavljeno na branje}

Test '! =' Ni 'enak'. Torej, če "filtrirano" ni enako 0, se enačba filtra izvede, če pa je, se nastavi na odčitek tlaka.

Nazadnje moramo v stavku Serial.println spremeniti »pritisk« na »filtrirano«, da vidimo filtrirano vrednost.

Najboljše učenje se doseže z ročnim izvajanjem zgornjih sprememb. Vendar sem jih vključil v primer MS5611data2serialWfilter. Torej, če obstajajo težave, se lahko primer naloži.

Zdaj naložite kodo v Arduino in si oglejte izboljšavo. Oglejte si drugo risbo zgoraj in upoštevajte, da je Y lestvica razširjena x2.

Poskusite nižjo vrednost za konstanto filtra, recimo 0,02 namesto 0,1, in poglejte razliko. Podatki so bolj gladki, vendar s počasnejšim odzivom. To je kompromis, ki ga je treba iskati pri uporabi tega preprostega filtra. Značilnost je enaka kot RC (upor in kapacitivnost) filter, ki se pogosto uporablja v elektronskih vezjih.

Korak: Naj bo samostojen

Zdaj bomo dodali ščit za tipkovnico LCD, pretvorili pritisk v višino v metrih in ga prikazali na zaslonu. Dodali bomo tudi možnost ničelne vrednosti s pritiskom na gumb 'Izberi' na tipkovnici.

Z zaslonom LCD na Arduinu bo treba senzor priključiti na zaslon LCD. Žal LCD zasloni običajno prihajajo brez ustreznih vtičnic. Torej so možnosti, da naredite spajkalne povezave ali dobite nekaj vtičnic. Vtičnica je na ebayu na voljo za nič več kot stroški poštnine. Poiščite »2,54 mm vtični trak« in poiščite tiste, ki so podobni tistim na Arduinu. Običajno so te dolžine 36 ali 40 čepov. Izognil bi se obrnjenim zatičem, saj niso dovolj globoki za standardne kable Dupont.

Vtičnico je treba razrezati na dolžino, rez pa na istem mestu kot zatič. Torej za 6 -polni trak - odstranite 7. zatič z nekaj finimi kleščami, nato pa na tem mestu izrežite z mlajšo žago. Konce spilim, da so čedni.

Pri spajkanju na ploščo se prepričajte, da ni spajkalnih mostov.

Z ustrezno odločitvijo o priključitvi senzorja priključite zaslon LCD na Arduino in senzor priključite na iste nožice - zdaj pa na zaslon LCD.

Pripravite tudi baterijo in svinec. Svoje vodstvo sem sestavil iz delov v košu za odpadke, vendar so na voljo tudi na ebayu - vključno z lepo možnostjo, ki vključuje škatlo za baterije in stikalo. Iščite po 'PP3 2.1mm lead'.

Trenutna poraba je okoli 80 ma. Zato, če želite teči več kot nekaj minut, razmislite o večji 9v bateriji kot PP3.

4. korak: Dodajte kodo za nadmorsko višino in LCD

Image
Image

Nekaj več kodiranja moramo pretvoriti tlak v višino in poganjati zaslon.

Na začetku skice dodajte knjižnico zaslona in povejte, kateri zatiči se uporabljajo:

#vključi

// inicializiramo knjižnico s številkami vmesniških zatičev LiquidCrystal lcd (8, 9, 4, 5, 6, 7);

Nato potrebujemo nekaj spremenljivk in funkcijo za branje tipk na tipkovnici. Vsi so povezani z analognim vhodom A0. Vsak gumb daje drugačno napetost A0. Iskanje po "kodi gumbov arduino lcd shield" je našlo nekaj dobre kode na:

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

To kodo dodajte pred nastavitvijo ():

// določimo nekatere vrednosti, ki jih uporabljajo plošča in gumbi

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 // branje gumbov int read_LCD_buttons () {adc_key_in = analogRead (0); // preberemo vrednost s senzorja // moji gumbi ob branju so centrirani na teh vrednostih: 0, 144, 329, 504, 741 // tem vrednostim dodamo približno 50 in preverimo, če smo blizu, če (adc_key_in> 1000) vrnitev btnNONE; // Zaradi hitrosti je to prva možnost, saj bo najverjetnejši rezultat, če (adc_key_in <50) vrne btnRIGHT; če (adc_key_in <250) vrne btnUP; if (adc_key_in <450) vrne btnDOWN; if (adc_key_in <650) vrne btnLEFT; if (adc_key_in <850) vrne btnSELECT; vrni btnNONE; // ko vsi drugi ne uspejo, vrnite to …}

Nadmorska višina je običajno na začetni točki nič. Zato potrebujemo spremenljivke za višino in referenco. Dodajte jih pred setup () in zgornjo funkcijo:

plovec mtr;

float ref = 0;

Pretvorba iz tlaka v Pascalih v metre je skoraj natančno deljenje za 12 na morski gladini. Ta formula je dobra za večino zemeljskih meritev. Obstajajo natančnejše formule, ki so primernejše za pretvorbo na velikih nadmorskih višinah. Uporabite jih, če želite to uporabiti za beleženje nadmorske višine leta z balonom.

Referenco je treba nastaviti na prvo merjenje tlaka, tako da začnemo pri ničelni višini in ko pritisnemo gumb SELECT. Za kodo filtra in pred stavkom Serial.println dodajte:

če (ref == 0) {

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

Po tem dodajte izračun višine:

mtr = ref - filtrirano/12,0;

Nazadnje spremenite stavek Serial.println tako, da pošlje "mtr" namesto "filtrirano", in dodajte kodo za pošiljanje "mtr" na LCD:

Serial.println (mtr); // pošiljanje pritiska prek serijske enote (UART)

lcd.setCursor (0, 1); // vrstica 2 lcd.print (mtr);

Vse tukaj navedene spremembe so vključene v primer MS5611data2lcd. Naložite to kot v 2. koraku.

Obstaja še zadnji mod, ki je v pomoč. Zaslon je težko brati, ko se posodablja 60 -krat na sekundo. Naš filter zgladi podatke s časovno konstanto okoli 0,8 s. Zato se zdi posodabljanje zaslona vsakih 0,3 s dovolj.

Zato dodajte števec po vseh drugih definicijah spremenljivk na začetku skice (npr. Po float ref = 0;):

int i = 0;

Nato dodajte kodo prirastku 'i' in stavek 'if', ki naj se zažene, ko pride na 20, nato pa ga nastavite nazaj na nič in ukaze Serial in lcd premaknite v stavek 'if', tako da se ti izvedejo le vsako 20. branje:

i += 1;

če (i> = 20) {Serial.println (mtr); // Pošlji tlak prek serijskega (UART) lcd.setCursor (0, 1); // vrstica 2 lcd.print (mtr); i = 0; }

S to zadnjo spremembo nisem vključil primera, da bi spodbudil ročno vnos kode, ki pomaga pri učenju.

Ta projekt bi moral dati dobro izhodišče, na primer za digitalni barometer. Za tiste, ki bi želeli razmisliti o uporabi v modelih RC - poiščite OpenXvario za kodo, ki omogoča višinomer in variometer za telemetrične sisteme Frsky in Turnigy 9x.

Priporočena: