Sadržaj:

Arduino mjerač atmosferske trake/ MS5611 GY63 GY86 Demonstracija: 4 koraka (sa slikama)
Arduino mjerač atmosferske trake/ MS5611 GY63 GY86 Demonstracija: 4 koraka (sa slikama)

Video: Arduino mjerač atmosferske trake/ MS5611 GY63 GY86 Demonstracija: 4 koraka (sa slikama)

Video: Arduino mjerač atmosferske trake/ MS5611 GY63 GY86 Demonstracija: 4 koraka (sa slikama)
Video: ❓ Обязательно к просмотру начинающему в Arduino IDE (ошибка компилятора) 2024, Juli
Anonim
Arduino mjerač atmosferske trake/ MS5611 GY63 GY86 Demonstracija
Arduino mjerač atmosferske trake/ MS5611 GY63 GY86 Demonstracija

Ovo je zaista barometar/visinomjer, ali razlog za naslov vidjet ćete gledajući video.

Senzor pritiska MS5611, koji se nalazi na Arduino GY63 i GY86 probojnim pločama, pruža nevjerovatne performanse. U mirnom danu izmjerit će vašu visinu unutar 0,2 m. Ovo učinkovito mjeri udaljenost vaše glave do svemira i oduzima je od udaljenosti vaših stopala do svemira (mjerenjem pritiska - to je težina zraka iznad). Ovaj spektakularni uređaj ima raspon koji će udobno mjeriti visinu Everesta - a može se mjeriti i do nekoliko centimetara.

Ovaj projekt imao je za cilj: školski projekt, primjer izmjene Arduino koda i dobro početno mjesto za istraživanje pomoću senzora MS5611. Postoji mnogo pitanja na forumu od onih koji imaju poteškoća s ovim senzorom. Pristup ovdje čini njegovu upotrebu vrlo jednostavnom. Nakon što obavite ovaj projekt, bit ćete dobro opremljeni za razvoj drugih aplikacija vezanih za pritisak.

Svaki senzor ima svoje konstante kalibracije koje je potrebno očitati i koristiti za ispravljanje podataka. Dostupna je biblioteka koja vam pomaže u upravljanju ovim. Ovdje prikazani kôd koristi biblioteku za čitanje očitanja, a zatim ih pretvara u visinu i prikazuje na LCD ekranu.

Prvo ćemo poslati podatke na serijski monitor na računaru/laptopu radi početnih testova. Oni prikazuju određenu buku pa dodajemo filter kako bismo ih ublažili. Zatim ćemo dodati LCD zaslon kako bi jedinica mogla samostalno raditi i možete pokušati izmjeriti svoju visinu - ili bilo što drugo.

Imajte na umu da GY63 ploča ima samo senzor pritiska MS5611. GY86 se naziva ploča od 10 stupnjeva slobode i također uključuje troosni akcelerometar, troosni žiroskop i troosni magnetometar za samo nekoliko dolara više.

Trebat će vam:

1. Arduino UNO (ili drugi sa standardnim pinout -om) i njegov USB kabel

2. GY63 razvodna ploča ili GY86

3. 4 Dupont vodi muško -žensko - ili spojnu žicu

4. Štitnik Arduino LCD tastature

5. 9v baterija i olovo

6. 2,54 mm utična traka (opcionalno, ali preporučljivo)

Priprema

Preuzmite Arduino IDE (integrirano razvojno okruženje) sa:

Neki tehnički detalji za kamatu

MS5611 daje svoje odlične performanse usrednjavanjem velikog broja mjerenja. Može napraviti 4096 analognih mjerenja od 3 bajta (24 bita) u samo 8 ms i dati prosječnu vrijednost. Mora mjeriti i tlak i temperaturu kako bi se podaci o tlaku mogli korigirati za unutrašnju temperaturu. Stoga može isporučiti oko 60 parova očitanja tlaka i temperature u sekundi.

Tehnički list je dostupan na:

Komunikacija je putem I2C. Dakle, drugi I2C senzori mogu dijeliti sabirnicu (kao što je slučaj na GY86 10DOF ploči gdje su svi čipovi na I2C).

Korak 1: Nabavite biblioteku MS5611

Mnogi Arduino senzori koriste standardnu biblioteku koja je uključena u Arduino IDE ili su opremljeni zip datotekom s bibliotekom koja se može lako instalirati. To obično ne vrijedi za senzore MS5611. Međutim, pretraživanje je pronašlo: https://github.com/gronat/MS5611 koje ima biblioteku za MS5611, uključujući i korekciju temperature.

Opcija 1

Idite na gornju web lokaciju, kliknite "Kloniraj ili preuzmi" i odaberite "Preuzmi ZIP". Ovo bi trebalo isporučiti MS5611-master.zip u vaš direktorij za preuzimanje. Sada, ako želite, premjestite ga u mapu u kojoj ćete ga moći pronaći u budućnosti. Koristim direktorij pod nazivom "podaci" dodan u moje Arduino mape.

Nažalost, preuzeta.zip datoteka ne sadrži primjere skica i bilo bi lijepo dodati biblioteku i primjere u Arduino IDE. U datoteci README.md postoji minimalni primjer koji se može kopirati i zalijepiti u skicu i spremiti. Ovo je jedan od načina da krenete.

Opcija 2

Da bih olakšao pokretanje koda u ovoj instrukciji, dodao sam gornji minimalni primjer i primjere koji su ovdje prikazani u biblioteku te ispod priložio.zip datoteku koja će se instalirati u Arduino IDE.

U nastavku preuzmite zip datoteku. Premjestite ovo u bolji folder ako želite.

Pokrenite Arduino IDE. Kliknite Sketch> Include Library> Add zip file i odaberite datoteku. Ponovo pokrenite IDE. IDE će sada imati instaliranu biblioteku plus sve primjere prikazane ovdje. Provjerite klikom na Datoteka> primjeri >> MS5611-master. Treba navesti tri skice.

Korak 2: Spojite senzor na Arduino i testirajte

Spojite senzor na Arduino i testirajte
Spojite senzor na Arduino i testirajte
Spojite senzor na Arduino i testirajte
Spojite senzor na Arduino i testirajte

Ploče GY63/GY86 obično dolaze s zaglavljima, ali nisu lemljene. Dakle, vaš je izbor ili zalemiti zaglavlja na mjestu i upotrijebiti muško-ženske Dupont vodiče, ili (kako sam odlučio) lemiti vodiče direktno na ploču i dodati igle na vodilicu za uključivanje u Arduino. Potonja opcija je bolja ako mislite da biste kasnije željeli lemiti ploču u projekt. Prvi je bolji ako želite koristiti ploču za eksperimentiranje. Raspajkavanje elektroda je mnogo lakše od zaglavlja iglice.

Potrebne veze su:

GY63/GY86 Arduino

VCC - 5v Napajanje GND - GND Uzemljenje SCL - A5 I2C sat> SDA - A4 I2C podaci

Priključite ploču senzora na Arduino kao što je gore i povežite Arduino na računalo/prijenosno računalo putem USB kabela. Također prekrijte senzor nekim neprozirnim/crnim materijalom. Senzor je osjetljiv na svjetlost (kao što je slučaj za većinu ove vrste senzora).

Pokrenite Arduino IDE. Kliknite:

Datoteka> primjeri >> MS5611-master> MS5611data2serial.

Nova instanca IDE -a pojavit će se sa skicom. Pritisnite dugme za otpremanje (strelica nadesno).

Zatim pokrenite serijski ploter - kliknite Alati> Serijski ploter i po potrebi postavite brzinu prijenosa na 9600. Podaci koji se šalju su tlak u Pascalima. Nakon otprilike sekunde, ponovo će se skalirati i podizanje i spuštanje senzora za recimo 0,3m bi se trebalo pokazati kao spuštanje i podizanje traga (niža visina je veći pritisak).

Podaci imaju određenu buku. Vidi prvi zaplet gore. To se može izravnati pomoću digitalnog filtera (zaista koristan alat).

Jednačina filtera je:

vrijednost = vrijednost + K (nova vrijednost)

gdje je 'vrijednost' filtrirani podatak, a 'novo' je posljednje izmjereno. Ako je K = 1 nema filtriranja. Za niže vrijednosti K podaci se zaglađuju vremenskom konstantom od T/K gdje je T vrijeme između uzoraka. Ovdje je T oko 17 ms pa vrijednost 0,1 daje vremensku konstantu od 170 ms ili oko 1/6s.

Filter se može dodati:

Dodajte varijablu za filtrirane podatke prije postavljanja ():

float filtrirano = 0;

Zatim dodajte jednadžbu filtera nakon pritiska =…. linija.

filtrirano = filtrirano + 0,1*(filtrirano pritiskom);

Dobra je ideja inicirati filtriranu vrijednost do prvog čitanja. Zato dodajte naredbu "ako" oko gornje linije koja to čini tako da izgleda:

if (filtrirano! = 0) {

filtrirano = filtrirano + 0,1*(filtrirano pritiskom); } else {filtrirano = pritisak; // prvo čitanje pa filtrirano na čitanje}

Test '! =' Nije 'jednak'. Dakle, ako "filtrirano" nije jednako 0, jednadžba filtra se izvršava, ali ako jest, postavlja se na očitanje tlaka.

Na kraju, moramo promijeniti "pritisak" u "filtrirano" u naredbi Serial.println kako bismo vidjeli filtriranu vrijednost.

Najbolje učenje postiže se ručnim unošenjem gore navedenih promjena. Međutim, uključio sam ih u primjer MS5611data2serialWfilter. Dakle, ako postoje problemi, primjer se može učitati.

Sada prenesite kod na Arduino i pogledajte poboljšanje. Pogledajte gornji grafikon i imajte na umu da je Y ljestvica proširena x2.

Pokušajte s nižom vrijednošću za konstantu filtera, recimo 0,02 umjesto 0,1, i vidite razliku. Podaci su glatkiji, ali sa sporijim odgovorom. Ovo je kompromis koji se mora tražiti pri korištenju ovog jednostavnog filtera. Karakteristika je ista kao i RC (otpor i kapacitet) filter koji se naširoko koristi u elektroničkim krugovima.

Korak 3: Neka to bude samostalno

Sada ćemo dodati štitnik LCD tastature, pretvoriti pritisak u visinu u metrima i prikazati ga na ekranu. Također ćemo dodati mogućnost nuliranja vrijednosti pritiskom na tipku ‘Odaberi’ na tipkovnici.

S LCD zaslonom na Arduinu, senzor će morati biti povezan s LCD zaslonom. Nažalost, LCD ekrani obično dolaze bez odgovarajućih utičnica. Dakle, opcije su da napravite spojeve za lemljenje ili nabavite neku utičnicu. Traka za utičnice dostupna je na ebayu za ne više od cijene poštarine. Pretražite "2,54 mm utičnicu" i potražite slične onima na Arduinu. Obično dolaze u 36 ili 40 pinova. Izbjegao bih okrenute igle jer nisu dovoljno duboke za standardne Dupont vodiče.

Traka utičnice mora biti odrezana po dužini i rez mora biti napravljen na istom mjestu kao igla. Dakle, za 6 -polnu traku - uklonite 7. iglu s nekim finim kliještima, a zatim izrežite na tom mjestu pomoću mlađe pile. Turpijem krajeve kako bih ih uredio.

Pazite da nema lemljenih mostova kada ih lemite na ploču.

Uz odgovarajuću odluku o povezivanju senzora, priključite LCD ekran na Arduino i spojite senzor sa istim pinovima - ali sada na LCD štit.

Pripremite i bateriju i elektrodu. Ja sam svoje tragove izradio iz dijelova u kanti za otpad, ali oni su dostupni i na ebayu - uključujući lijepu opciju koja uključuje kutiju za baterije i prekidač. Pretražujte „PP3 2.1 mm olovo“.

Trenutna potrošnja je oko 80 mA. Stoga, ako želite raditi duže od nekoliko minuta, razmislite o većoj 9v bateriji od PP3.

Korak 4: Dodajte kôd za visinu i LCD ekran

Image
Image

Moramo napraviti još malo kodiranja kako bismo pritisak pretvorili u visinu i pokrenuli zaslon.

Na početku skice dodajte biblioteku prikaza i recite ovo koji se pinovi koriste:

#include

// inicijalizira biblioteku brojevima pinova sučelja LiquidCrystal lcd (8, 9, 4, 5, 6, 7);

Zatim su nam potrebne neke varijable i funkcija za čitanje tipki na tipkovnici. Svi su spojeni na analogni ulaz A0. Svako dugme daje drugačiji napon A0. Pretraživanje "koda arduino lcd štitnika gumba" našlo je dobar kod na:

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

Dodajte ovaj kôd prije postavljanja ():

// definiramo neke vrijednosti koje koriste panel i tipke

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 // pročitajte gumbe int read_LCD_buttons () {adc_key_in = analogRead (0); // očitavam vrijednost sa senzora // moji gumbi pri čitanju su centrirani na ovim vrijednostima: 0, 144, 329, 504, 741 // tim vrijednostima dodajemo približno 50 i provjeravamo jesmo li blizu ako (adc_key_in> 1000) return btnNONE; // Ovo činimo prvom opcijom iz razloga brzine jer će to biti najvjerojatniji rezultat ako (adc_key_in <50) vrati btnRIGHT; if (adc_key_in <250) vrati btnUP; if (adc_key_in <450) vrati btnDOWN; if (adc_key_in <650) vrati btnLEFT; if (adc_key_in <850) vrati btnSELECT; return btnNONE; // kada svi drugi ne uspiju, vratite ovo …}

Nadmorska visina se obično nultira na početnoj tački. Dakle, potrebne su nam varijable i za visinu i za referencu. Dodajte ih prije postavke () i gore navedene funkcije:

float mtr;

plovak ref = 0;

Pretvorba iz pritiska u Pascalima u metre gotovo je podjela za 12 na razini mora. Ova formula je dobra za većinu mjerenja na zemlji. Postoje preciznije formule koje su prikladnije za konverziju na velikim nadmorskim visinama. Koristite ih ako ćete ovo koristiti za snimanje visine leta balonom.

Referencu treba postaviti na prvo očitavanje tlaka kako bismo započeli na nultoj visini i kada se pritisne tipka SELECT. Dodajte, nakon koda filtra, a prije naredbe Serial.println:

if (ref == 0) {

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

Nakon toga dodajte izračun visine:

mtr = ref - filtrirano/12,0;

Na kraju promijenite naredbu Serial.println da pošalje 'mtr' umjesto 'filtrirano' i dodajte kod za slanje 'mtr' na LCD:

Serial.println (mtr); // Pošaljite pritisak putem serijskog (UART)

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

Sve ovdje navedene promjene uključene su u primjer MS5611data2lcd. Učitajte ovo kao u koraku 2.

Postoji još jedan posljednji mod koji je od pomoći. Zaslon je teško čitati ako se ažurira 60 puta u sekundi. Naš filter zaglađuje podatke s vremenskom konstantom oko 0,8 s. Stoga se čini da je ažuriranje zaslona svakih 0,3 s dovoljno.

Dakle, dodajte brojač nakon svih ostalih definicija varijabli na početku skice (npr. Nakon float ref = 0;):

int i = 0;

Zatim dodajte kod za povećanje 'i' i 'if' naredbu za pokretanje kada dođe do 20, a zatim je vratite na nulu i premjestite naredbe Serial i lcd unutar naredbe 'if' tako da se one izvršavaju samo svako 20. čitanje:

i += 1;

if (i> = 20) {Serial.println (mtr); // Slanje pritiska putem serijskog (UART) lcd.setCursor (0, 1); // red 2 lcd.print (mtr); i = 0; }

Nisam naveo primjer s ovom posljednjom izmjenom kako bih potaknuo ručni unos koda koji pomaže u učenju.

Ovaj projekt trebao bi dati dobro polazište, na primjer za digitalni barometar. Za one koji bi mogli razmisliti o upotrebi u RC modelima - potražite OpenXvario za kôd koji omogućuje visinomjer i variometar za Frsky i Turnigy 9x telemetrijske sisteme.

Preporučuje se: