Sadržaj:

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

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

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

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

Senzor tlaka MS5611, koji se nalazi na Arduino GY63 i GY86 pločama za probijanje, pruža nevjerojatne 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 nogu do svemira (mjerenjem tlaka - 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 je projekt imao za cilj: školski projekt, primjer izmjene Arduino koda i dobro početno mjesto za istraživanje pomoću senzora MS5611. Mnogo je pitanja na forumu onih koji imaju poteškoća s ovim senzorom. Pristup ovdje čini njegovu uporabu vrlo jednostavnom. Nakon što obavite ovaj projekt, bit ćete dobro opremljeni za razvoj drugih aplikacija vezanih za pritisak.

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

Prvo ćemo poslati podatke na serijski monitor na računalu/prijenosnom računalu radi početnih testova. Oni pokazuju određenu buku pa dodajemo filtar 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 ploča GY63 ima senzor tlaka 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 ispisom) i njegov USB kabel

2. GY63 probojna ploča ili GY86

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

4. Arduino LCD štitnik tipkovnice

5. 9v baterija i olovo

6. 2,54 mm utična traka (izborno, ali preporučeno)

Priprema

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

Neki tehnički detalji za kamatu

MS5611 daje svoje izvrsne performanse prosjekom 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 ispraviti za unutarnju temperaturu. Stoga može isporučiti oko 60 parova očitanja tlaka i temperature u sekundi.

Tehnički list dostupan je na:

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

Korak 1: Nabavite knjižnicu 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, pronađeno je pretraživanje: https://github.com/gronat/MS5611 koje ima knjižnicu za MS5611, uključujući i korekciju temperature.

opcija 1

Idite na gornju web stranicu, kliknite "Kloniraj ili preuzmi" i odaberite "Preuzmi ZIP". Ovo bi trebalo dostaviti 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 knjižnicu 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 izvođenje koda u ovom uputstvu, dodao sam gornji minimalni primjer i ovdje prikazane primjere u knjižnicu te ispod priložio.zip datoteku koja će se instalirati u Arduino IDE.

U nastavku preuzmite zip datoteku. Premjestite ovo u bolju mapu ako želite.

Pokrenite Arduino IDE. Pritisnite Sketch> Include Library> Add zip file i odaberite datoteku. Ponovo pokrenite IDE. IDE će sada imati instaliranu knjižnicu 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 koristiti muško-ženske Dupont vodiče, ili (kako sam odlučio) lemiti vodiče izravno na ploču i dodati igle na vodilicu za priključivanje na Arduino. Potonja je opcija bolja ako mislite da biste kasnije htjeli lemiti ploču u projekt. Prvi je bolji ako ploču želite koristiti za eksperimentiranje. Raspajkavanje kabela mnogo je lakše od zaglavlja iglice.

Potrebne veze su:

GY63/GY86 Arduino

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

Pričvrstite 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 svjetlo (kao što je slučaj za većinu ove vrste senzora).

Pokrenite Arduino IDE. Klik:

Datoteka> primjeri >> MS5611-master> MS5611data2serial.

Nova će se instanca IDE -a pojaviti sa skicom. Pritisnite gumb za prijenos (strelica desno).

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 ponovno će se skalirati te bi se podizanje i spuštanje senzora za recimo 0,3 m trebalo pokazati kao spuštanje i podizanje traga (niža visina veći je tlak).

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

Jednadžba filtra 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 s vremenskom konstantom 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.

Filtar se može dodati:

Dodajte varijablu za filtrirane podatke prije postavljanja ():

float filtrirano = 0;

Zatim dodajte jednadžbu filtra nakon pritiska =…. crta.

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

Dobra je ideja da filtriranu vrijednost inicijalizirate do prvog čitanja. Zato dodajte gornju liniju naredbu "ako" koja to čini tako da izgleda:

if (filtrirano! = 0) {

filtrirano = filtrirano + 0,1*(filtrirano pritiskom); } else {filtrirano = tlak; // 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 gornju plohu i imajte na umu da je Y ljestvica proširena x2.

Pokušajte s nižom vrijednošću za konstantu filtra, 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 filtra. 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 tipkovnice, pretvoriti tlak u visinu u metrima i prikazati ga na zaslonu. Također ćemo dodati mogućnost nuliranja vrijednosti pritiskom na tipku ‘Odaberi’ na tipkovnici.

S LCD zaslonom na Arduinu senzor će se morati spojiti na LCD ekran. 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. Utičnica je dostupna 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 duljinama od 36 ili 40 pinova. Izbjegao bih okrenute pin -ove jer nisu dovoljno duboki za standardne Dupont vodiče.

Traka utičnice mora biti odrezana na duljinu, a 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 uredila.

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

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

Pripremite i bateriju i olovku. Ja sam svoje tragove izradio iz dijelova u kanti za otpad, ali oni su također dostupni na ebayu - uključujući lijepu opciju koja uključuje kutiju za baterije i prekidač. Pretražite "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

Image
Image

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

Na početku skice dodajte knjižnicu zaslona i recite koje se igle koriste:

#uključi

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

Zatim su nam potrebne neke varijable i funkcija za čitanje tipki tipkovnice. Svi su spojeni na analogni ulaz A0. Svaki gumb daje drugačiji napon A0. Pretraživanje "koda arduino lcd gumb 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 ploča i 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 // čitanje gumba 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 dodamo približno 50 i provjeravamo jesmo li blizu ako (adc_key_in> 1000) return btnNONE; // Zbog brzine ovo činimo prvom opcijom 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; // kad svi drugi ne uspiju, vratite ovo …}

Nadmorska visina obično je na početnoj točki nula. Dakle, potrebne su nam varijable i za visinu i za referencu. Dodajte ih prije postavljanja () i gore navedene funkcije:

plovak mtr;

plovak ref = 0;

Pretvorba iz tlaka u Pascalima u metre gotovo je točno podjela za 12 na razini mora. Ova je formula dobra za većinu mjerenja na zemlji. Postoje točnije formule koje su prikladnije za pretvorbu na velikim nadmorskim visinama. Koristite ih ako ćete ovo koristiti za bilježenje visine leta balonom.

Referencu treba postaviti na prvo očitanje tlaka pa počinjemo s nultom visinom i kada se pritisne tipka SELECT. Dodajte, nakon koda filtra, a prije naredbe Serial.println:

ako (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 izraz Serial.println da pošalje 'mtr' umjesto 'filtrirano' i dodajte kôd za slanje 'mtr' na LCD:

Serijski.println (mtr); // Pošaljite pritisak serijski (UART)

lcd.setCursor (0, 1); // redak 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); // Pošaljite tlak putem serijskog (UART) lcd.setCursor (0, 1); // redak 2 lcd.print (mtr); i = 0; }

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

Ovaj bi projekt trebao 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 telemetrijske sustave Frsky i Turnigy 9x.

Preporučeni: