Obsah:

Měření atmosférické pásky Arduino/ MS5611 GY63 GY86 Ukázka: 4 kroky (s obrázky)
Měření atmosférické pásky Arduino/ MS5611 GY63 GY86 Ukázka: 4 kroky (s obrázky)

Video: Měření atmosférické pásky Arduino/ MS5611 GY63 GY86 Ukázka: 4 kroky (s obrázky)

Video: Měření atmosférické pásky Arduino/ MS5611 GY63 GY86 Ukázka: 4 kroky (s obrázky)
Video: Měření atmosférického tlaku 2024, Červenec
Anonim
Měření atmosférické pásky Arduino/ MS5611 GY63 GY86 Demonstrace
Měření atmosférické pásky Arduino/ MS5611 GY63 GY86 Demonstrace

Toto je opravdu barometr/výškoměr, ale důvod názvu uvidíte pohledem na video.

Tlakový senzor MS5611, který najdete na deskách Arduino GY63 a GY86, poskytuje úžasný výkon. V klidném dni změří vaši výšku do 0,2 m. To efektivně měří vzdálenost od vaší hlavy do vesmíru a odečte ji od vzdálenosti vašich nohou do vesmíru (měřením tlaku - to je hmotnost vzduchu výše). Toto velkolepé zařízení má dosah, který pohodlně změří výšku Everestu - a může také měřit až několik palců.

Tento projekt byl zaměřen jako: školní projekt, příklad úpravy kódu Arduino a dobré výchozí místo k prozkoumání pomocí senzoru MS5611. Existuje spousta otázek na fóru od těch, kteří mají potíže s tímto senzorem. Díky tomuto přístupu je použití velmi jednoduché. Po provedení tohoto projektu budete dobře vybaveni k vývoji dalších aplikací souvisejících s tlakem.

Každý senzor má své vlastní kalibrační konstanty, které je třeba přečíst a použít k opravě dat. K dispozici je knihovna, která vám s jejich řízením pomůže. Zde zobrazený kód používá knihovnu k odečítání a poté je převádí na výšku a zobrazuje je na štítu LCD.

Nejprve odešleme data na sériový monitor na PC/notebooku k počátečním testům. Ty vykazují určitý hluk, a proto přidáváme filtr, který je vyhladí. Poté přidáme LCD displej, aby jednotka mohla běžet samostatně a můžete zkusit změřit svoji výšku - nebo cokoli jiného.

Všimněte si, že deska GY63 má pouze snímač tlaku MS5611. GY86 se nazývá deska 10 stupňů volnosti a také obsahuje 3osý akcelerometr, 3osý gyroskop a 3osý magnetometr za pouhých pár dolarů navíc.

Budete potřebovat:

1. Arduino UNO (nebo jiné se standardním vývodem) a jeho USB kabel

2. GY63 breakout board nebo GY86

3. 4 Dupont vede samec -samice - nebo připojovací vodič

4. Štít klávesnice LCD Arduino

5. 9v baterie a olovo

6. 2,54mm zásuvková lišta (volitelná, ale doporučená)

Příprava

Stáhněte si Arduino IDE (integrované vývojové prostředí) z:

Některé technické bity pro zajímavost

MS5611 poskytuje svůj skvělý výkon průměrováním velkého počtu měření. Dokáže provést 4096 analogových měření 3 bajtů (24 bitů) za pouhých 8 ms a poskytnout průměrnou hodnotu. Musí měřit tlak i teplotu, aby bylo možné údaje o tlaku korigovat na vnitřní teplotu. Proto může dodat přibližně 60 párů naměřených hodnot tlaku a teploty za sekundu.

Datový list je k dispozici na adrese:

Komunikace probíhá přes I2C. Sběrnici tedy mohou sdílet další senzory I2C (jak je tomu na desce GY86 10DOF, kde jsou všechny čipy na I2C).

Krok 1: Získejte knihovnu MS5611

Mnoho senzorů Arduino buď používá standardní knihovnu, která je součástí Arduino IDE, nebo je dodávána se souborem zip s knihovnou, kterou lze snadno nainstalovat. To u senzorů MS5611 obvykle neplatí. Bylo však nalezeno vyhledávání: https://github.com/gronat/MS5611, které má knihovnu pro MS5611, včetně provádění korekce teploty.

Možnost 1

Přejděte na výše uvedený web, klikněte na „Klonovat nebo Stáhnout“a vyberte „Stáhnout ZIP“. To by mělo doručit MS5611-master.zip do vašeho adresáře pro stahování. Pokud si to přejete, přesuňte ji do složky, kde ji v budoucnu najdete. Používám adresář s názvem „data“přidaný do mých složek Arduino.

Stažený soubor.zip bohužel neobsahuje žádné příklady skic a bylo by hezké přidat knihovnu a příklady do IDE Arduino. V souboru README.md existuje minimální příklad, který lze zkopírovat a vložit do skici a uložit. To je jeden způsob, jak začít.

Možnost 2

Aby bylo snazší spustit kód v tomto pokynu, přidal jsem do knihovny minimální výše uvedený příklad a zde uvedené příklady a níže připojený soubor.zip, který se nainstaluje do Arduino IDE.

Stáhněte si zip soubor níže. Pokud chcete, přesuňte to do lepší složky.

Spusťte Arduino IDE. Klikněte na Skica> Zahrnout knihovnu> Přidat zip soubor a vyberte soubor. Restartujte IDE. IDE nyní bude mít nainstalovanou knihovnu plus všechny zde uvedené příklady. Zkontrolujte kliknutím na Soubor> příklady >> MS5611-master. Měly by být uvedeny tři skici.

Krok 2: Připojte senzor k Arduinu a otestujte

Připojte senzor k Arduinu a vyzkoušejte
Připojte senzor k Arduinu a vyzkoušejte
Připojte senzor k Arduinu a vyzkoušejte
Připojte senzor k Arduinu a vyzkoušejte

Desky GY63/GY86 se obvykle dodávají se záhlavími, ale nejsou pájeny. Je tedy vaší volbou buď pájet záhlaví na místě a použít vodiče Dupont mužského a ženského pohlaví, nebo (jak jsem se rozhodl) pájecí vodiče přímo k desce a přidat kolíky do vodiče pro připojení k Arduinu. Druhá možnost je lepší, pokud si myslíte, že budete chtít desku později pájet do projektu. První z nich je lepší, pokud chcete desku použít k experimentování. Odpájení vývodů je mnohem snazší než kolíková hlavička.

Požadovaná připojení jsou:

GY63/GY86 Arduino

VCC - 5v napájení GND - GND Ground SCL - A5 I2C hodiny> SDA - A4 I2C data

Připojte desku senzoru k Arduinu, jak je uvedeno výše, a připojte Arduino k PC/notebooku pomocí kabelu USB. Senzor také zakryjte nějakým neprůhledným/černým materiálem. Senzor je citlivý na světlo (jako je tomu u většiny tohoto typu senzoru).

Spusťte Arduino IDE. Klikněte na:

Soubor> příklady >> MS5611-master> MS5611data2serial.

S náčrtem se objeví nová instance IDE. Klikněte na tlačítko pro nahrání (šipka vpravo).

Poté spusťte sériový plotter - klikněte na Nástroje> Sériový plotter a v případě potřeby nastavte přenosovou rychlost na 9600. Odesílaná data jsou tlakem v Pascalech. Asi po vteřině se měřítko změní a zvednutí a snížení senzoru o 0,3 m by se mělo projevit jako snížení a zvýšení stopy (nižší výška je vyšší tlak).

Data mají určitý šum. Viz první zápletka výše. To lze vyhladit pomocí digitálního filtru (opravdu užitečný nástroj).

Rovnice filtru je:

hodnota = hodnota + K (nová hodnota)

kde „hodnota“jsou filtrovaná data a „nová“je poslední naměřená hodnota. Pokud K = 1, neexistuje žádné filtrování. Pro nižší hodnoty K jsou data vyhlazena časovou konstantou T/K, kde T je čas mezi vzorky. Zde je T přibližně 17 ms, takže hodnota 0,1 udává časovou konstantu 170 ms nebo přibližně 1/6 s.

Filtr lze přidat:

Před nastavením () přidejte proměnnou pro filtrovaná data:

float filtrováno = 0;

Poté přidejte rovnici filtru po tlaku =…. čára.

filtrováno = filtrováno + 0,1*(filtrováno tlakem);

Je vhodné inicializovat filtrovanou hodnotu do prvního čtení. Přidejte tedy do řádku výše příkaz „if“, aby to vypadalo takto:

if (filtrováno! = 0) {

filtrováno = filtrováno + 0,1*(filtrováno tlakem); } else {filtrováno = tlak; // první čtení, takže nastaveno filtrováno na čtení}

Test „! =“Není „nerovný“. Pokud se tedy „filtrováno“nerovná 0, provede se rovnice filtru, ale pokud ano, nastaví se na hodnotu tlaku.

Nakonec musíme v příkazu Serial.println změnit „tlak“na „filtrováno“, abychom viděli filtrovanou hodnotu.

Nejlepšího učení se dosáhne provedením výše uvedených změn ručně. Tyto jsem však zahrnul do příkladu MS5611data2serialWfilter. Pokud se tedy vyskytnou problémy, lze příklad načíst.

Nyní nahrajte kód do Arduina a uvidíte vylepšení. Viz druhý graf výše a všimněte si, že měřítko Y je rozšířeno x2.

Zkuste nižší hodnotu pro konstantu filtru, řekněme 0,02 místo 0,1, a uvidíte rozdíl. Data jsou plynulejší, ale s pomalejší odezvou. Toto je kompromis, který je třeba při používání tohoto jednoduchého filtru hledat. Tato charakteristika je stejná jako RC (odporový a kapacitní) filtr, který se hojně používá v elektronických obvodech.

Krok 3: Udělejte to samostatně

Nyní přidáme štít LCD klávesnice, převedeme tlak na výšku v metrech a zobrazíme jej na displeji. Přidáme také možnost vynulovat hodnotu stisknutím tlačítka „Vybrat“na klávesnici.

S LCD štítem na Arduinu bude muset být senzor připojen k LCD stínění. LCD štíty se bohužel obvykle dodávají bez příslušných zásuvek. Možnosti jsou tedy provést pájené spoje nebo sehnat zásuvkový pásek. Zásuvkový proužek je k dispozici na ebay za mnohem více než náklady na poštovné. Vyhledejte „zásuvkový proužek 2,54 mm“a vyhledejte ty, které jsou podobné těm na Arduinu. Obvykle se dodávají v délce 36 nebo 40 pinů. Vyhnul bych se otočeným kolíkům, protože nejsou dostatečně hluboké pro standardní vodiče Dupont.

Zásuvkový pás musí být zkrácen na délku a řez musí být proveden na stejném místě jako kolík. Takže pro 6pinový proužek - odstraňte 7. kolík jemnými kleštěmi a na tomto místě ho nařežte pomocí juniorské pily. Zakončím konce, aby byly úhledné.

Při jejich pájení na desku se ujistěte, že nejsou žádné pájecí můstky.

S příslušným rozhodnutím o připojení senzoru zapojte stínění LCD na Arduino a připojte senzor ke stejným kolíkům - ale nyní na LCD štít.

Připravte si také baterii a olovo. Svůj olovo jsem vytvořil z dílů v mém šrotu, ale jsou také k dispozici na ebay - včetně pěkné možnosti, která obsahuje box na baterie a vypínač. Vyhledejte „PP3 2,1 mm svod“.

Aktuální spotřeba se pohybuje kolem 80ma. Pokud tedy chcete běžet déle než několik minut, zvažte větší 9v baterii než PP3.

Krok 4: Přidejte kód pro nadmořskou výšku a LCD

Image
Image

Potřebujeme udělat trochu více kódování, abychom převedli tlak na výšku a poháněli displej.

Na začátku skici přidejte knihovnu zobrazení a řekněte, jaké piny se používají:

#zahrnout

// inicializace knihovny čísly pinů rozhraní LiquidCrystal lcd (8, 9, 4, 5, 6, 7);

Dále potřebujeme nějaké proměnné a funkci pro čtení tlačítek klávesnice. Všechny jsou připojeny k analogovému vstupu A0. Každé tlačítko dává A0 jiné napětí. Hledání „kódu tlačítek štítu arduino lcd“našlo dobrý kód na:

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

Přidejte tento kód před instalací ():

// definujte některé hodnoty používané panelem a tlačítky

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 // přečíst tlačítka int read_LCD_buttons () {adc_key_in = analogRead (0); // načtěte hodnotu ze snímače // moje tlačítka při čtení jsou soustředěna na tyto hodnoty: 0, 144, 329, 504, 741 // k těmto hodnotám přidáme přibližně 50 a zkontrolujeme, zda jsme blízko, pokud (adc_key_in> 1000) vrátit btnNONE; // Děláme to jako 1. možnost z důvodů rychlosti, protože to bude nejpravděpodobnější výsledek, pokud (adc_key_in <50) vrátí btnRIGHT; if (adc_key_in <250) return btnUP; if (adc_key_in <450) return btnDOWN; if (adc_key_in <650) return btnLEFT; if (adc_key_in <850) return btnSELECT; vrátit btnNONE; // když všechny ostatní selžou, vraťte toto …}

Nadmořská výška je ve výchozím bodě obvykle vynulována. Potřebujeme tedy proměnné pro výšku i referenci. Přidejte je před setup () a výše uvedenou funkci:

float mtr;

float ref = 0;

Převod z tlaku v Pascalech na metry je téměř přesně dělením 12 na hladině moře. Tento vzorec je vhodný pro většinu pozemních měření. Existují přesnější vzorce, které jsou vhodnější pro převod ve vysokých nadmořských výškách. Použijte je, pokud se chystáte použít k záznamu nadmořské výšky letu balónem.

Odkaz by měl být nastaven na první hodnotu tlaku, takže začneme od nulové výšky a po stisknutí tlačítka SELECT. Přidejte za kód filtru a před příkaz Serial.println:

if (ref == 0) {

ref = filtrováno/12,0; } if (read_LCD_buttons () == btnSELECT) {ref = filtrováno/12.0; }

Poté přidejte výpočet výšky:

mtr = ref - filtrováno/12,0;

Nakonec změňte příkaz Serial.println na „mtr“místo „filtrováno“a přidejte kód pro odeslání „mtr“na LCD:

Serial.println (mtr); // Odeslání tlaku přes sériovou linku (UART)

lcd.setCursor (0, 1); // řádek 2 lcd.print (mtr);

Všechny zde uvedené změny jsou zahrnuty v příkladu MS5611data2lcd. Načtěte to jako v kroku 2.

Existuje jeden poslední režim, který je užitečný. Displej je obtížně čitelný, když je aktualizován 60krát za sekundu. Náš filtr vyhlazuje data s časovou konstantou kolem 0,8 s. Aktualizace displeje každých 0,3 s se zdá dostačující.

Přidejte tedy počátek po všech ostatních definicích proměnných na začátku skici (např. Po float ref = 0;):

int i = 0;

Poté přidejte kód pro přírůstek 'i' a příkazu 'if', který se spustí, až se dostane na 20, a poté jej nastavte zpět na nulu a přesuňte příkazy Serial a lcd do příkazu 'if', aby se tyto prováděly pouze každých 20. čtení:

i += 1;

if (i> = 20) {Serial.println (mtr); // Odeslání tlaku přes serial (UART) lcd.setCursor (0, 1); // řádek 2 lcd.print (mtr); i = 0; }

Nezahrnul jsem příklad s touto poslední úpravou, abych podpořil ruční zadávání kódu, což pomáhá při učení.

Tento projekt by měl poskytnout dobrý výchozí bod například pro digitální barometr. Pro ty, kteří by chtěli zvážit použití v RC modelech - hledejte v OpenXvario kód, který umožňuje výškoměr a variometr pro telemetrické systémy Frsky a Turnigy 9x.

Doporučuje: