Innehållsförteckning:

Arduino Atmospheric Tape Measure/ MS5611 GY63 GY86 Demonstration: 4 steg (med bilder)
Arduino Atmospheric Tape Measure/ MS5611 GY63 GY86 Demonstration: 4 steg (med bilder)

Video: Arduino Atmospheric Tape Measure/ MS5611 GY63 GY86 Demonstration: 4 steg (med bilder)

Video: Arduino Atmospheric Tape Measure/ MS5611 GY63 GY86 Demonstration: 4 steg (med bilder)
Video: Arduino Data Logger for Estes Rocket w/Plotted Altitude in Python 2024, November
Anonim
Arduino Atmospheric Tape Measure/ MS5611 GY63 GY86 Demonstration
Arduino Atmospheric Tape Measure/ MS5611 GY63 GY86 Demonstration

Detta är verkligen en barometer/höjdmätare men du kommer att se orsaken till titeln genom att titta på videon.

MS5611 trycksensorn, som finns på Arduino GY63 och GY86 breakout boards, levererar fantastisk prestanda. På en lugn dag mäter den din höjd till inom 0,2 m. Detta mäter effektivt avståndet från ditt huvud till yttre rymden och subtraherar det från avståndet från dina fötter till yttre rymden (genom att mäta tryck - det är luftens vikt ovanför). Denna spektakulära enhet har en räckvidd som bekvämt kan mäta Everests höjd - och kan också mäta ner till några tum.

Detta projekt syftade till: ett skolprojekt, ett exempel på att ändra Arduino -kod och en bra utgångspunkt för att utforska med MS5611 -sensorn. Det finns gott om forumfrågor från dem som har problem med den här sensorn. Tillvägagångssättet här gör det väldigt enkelt att använda det. Efter att ha gjort detta projekt kommer du att vara väl rustad för att utveckla andra tryckrelaterade applikationer.

Varje sensor har sina egna kalibreringskonstanter som måste läsas och användas för att korrigera data. Det finns ett bibliotek tillgängligt för att driva dessa. Koden som visas här använder biblioteket för att ta avläsningar och omvandlar dem sedan till höjd och visar dem på en LCD -skärm.

Först skickar vi data till den seriella bildskärmen på datorn/bärbara datorn för första test. Dessa visar lite brus och därför lägger vi till ett filter för att släta ut dem. Sedan lägger vi till en LCD -display så att enheten kan köras oberoende och du kan prova att mäta din höjd - eller något annat.

Observera att GY63 -kortet bara har MS5611 -trycksensorn. GY86 kallas en 10 graders frihetskort och inkluderar också en 3 -axlig accelerometer, 3 -axlig gyro och en 3 -axlig magnetometer för bara några $ mer.

Du kommer behöva:

1. Arduino UNO (eller annat med standard pinout) och dess USB -kabel

2. GY63 breakout board eller GY86

3. 4 Dupont leder han -hona - eller anslutningskabel

4. Arduino LCD -knappsatsskärm

5. 9v batteri och ledning

6. 2,54 mm hylsa (valfritt men rekommenderas)

Förberedelse

Ladda ner Arduino IDE (integrerad utvecklingsmiljö) från:

Några tekniska bitar för intresse

MS5611 levererar sin fantastiska prestanda genom ett genomsnitt av ett stort antal mätningar. Den kan göra 4096 3 -bytes (24bit) analoga mätningar på bara 8 ms och ge medelvärdet. Det måste mäta både tryck och temperatur så att tryckdata kan korrigeras för intern temperatur. Därför kan den leverera cirka 60 par tryck- och temperaturavläsningar per sekund.

Databladet finns tillgängligt på:

Kommunikation sker via I2C. Så andra I2C -sensorer kan dela bussen (som är fallet på GY86 10DOF -kortet där alla chips finns på I2C).

Steg 1: Skaffa ett MS5611 -bibliotek

Många av Arduino -sensorerna använder antingen ett standardbibliotek som ingår i Arduino IDE eller levereras med en zip -fil med ett bibliotek som enkelt kan installeras. Detta tenderar inte att vara fallet för MS5611 -sensorerna. Men en sökning hittade: https://github.com/gronat/MS5611 som har ett bibliotek för MS5611, inklusive temperaturkorrigering.

Alternativ 1

Gå till webbplatsen ovan, klicka på "Klona eller ladda ner" och välj "Ladda ner ZIP". Detta bör leverera MS5611-master.zip till din nedladdningskatalog. Nu, om du vill, flytta den till en mapp där du kan hitta den i framtiden. Jag använder en katalog som heter 'data' som läggs till i mina Arduino -mappar.

Tyvärr innehåller den nedladdade.zip -filen inga exempelskisser och det skulle vara trevligt att lägga till biblioteket och exempel till Arduino IDE. Det finns ett minsta exempel i filen README.md som kan kopieras och klistras in i en skiss och sparas. Detta är ett sätt att komma igång.

Alternativ 2

För att göra det enklare att köra koden i denna instruerbara har jag lagt till minimiexemplet ovan och exemplen som visas här i biblioteket och bifogat en.zip -fil nedan som installeras i Arduino IDE.

Ladda ner zip -filen nedan. Flytta detta till en bättre mapp om du vill.

Starta Arduino IDE. Klicka på Sketch> Inkludera bibliotek> Lägg till zip -fil och välj filen. Starta om IDE. IDE kommer nu både att ha biblioteket installerat plus alla exempel som visas här. Kontrollera genom att klicka på Arkiv> exempel >> MS5611-master. Tre skisser bör listas.

Steg 2: Anslut sensorn till Arduino och testa

Anslut sensorn till Arduino och testa
Anslut sensorn till Arduino och testa
Anslut sensorn till Arduino och testa
Anslut sensorn till Arduino och testa

GY63/GY86 -brädorna kommer vanligtvis med rubriker men inte lödda. Så det är ditt val att antingen löda rubrikerna på plats och använda manliga-kvinnliga Dupont-ledningar, eller (som jag bestämde) lödkablar direkt till brädet och lägga till stiften i ledningen för att ansluta till Arduino. Det senare alternativet är bättre om du tror att du kanske vill löda brädan i ett projekt senare. Det förstnämnda är bättre om du vill använda tavlan för experiment. Det är mycket lättare att lödda ledningar än en stifthuvud.

Anslutningarna som krävs är:

GY63/GY86 Arduino

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

Fäst sensorkortet på Arduino enligt ovan och anslut Arduino till datorn/bärbara datorn via dess USB -kabel. Täck också sensorn med lite ogenomskinligt/svart material. Sensorn är känslig för ljus (som är fallet för de flesta av denna typ av sensorer).

Starta Arduino IDE. Klick:

Arkiv> exempel >> MS5611-master> MS5611data2serial.

En ny instans av IDE visas med skissen. Klicka på uppladdningsknappen (högerpil).

Starta sedan seriell plotter - klicka på Verktyg> Seriell plotter och ställ vid behov in baud till 9600. Data som skickas är trycket i Pascals. Efter någon sekund kommer det att skala om och höja och sänka sensorn med 0,3 m ska visa som att sänka och höja spåret (lägre höjd är högre tryck).

Data har lite brus. Se första tomten ovan. Detta kan utjämnas med ett digitalt filter (ett riktigt användbart verktyg).

Filterekvationen är:

värde = värde + K (nytt värde)

där 'värde' är den filtrerade data, och 'ny' är den senaste mätningen. Om K = 1 finns det ingen filtrering. För lägre värden på K utjämnas data med en tidskonstant på T/K där T är tiden mellan samplen. Här är T cirka 17 ms så ett värde på 0,1 ger en tidskonstant på 170 ms eller cirka 1/6s.

Filtret kan läggas till genom att:

Lägg till en variabel för de filtrerade data före installationen ():

flottör filtrerad = 0;

Lägg sedan till filterekvationen efter trycket = …. linje.

filtrerat = filtrerat + 0,1*(tryckfiltrerat);

Det är en bra idé att initialisera det filtrerade värdet till den första avläsningen. Så lägg till ett "if" -uttalande runt raden ovan som gör detta så att det ser ut som:

om (filtrerat! = 0) {

filtrerat = filtrerat + 0,1*(tryckfiltrerat); } annat {filtrerat = tryck; // första läsningen, så inställt filtrerat till läsning}

Testet '! =' Är 'inte lika'. Så om 'filtrerat' inte är lika med 0 utförs filterekvationen men om det är det är det inställt på tryckavläsningen.

Slutligen måste vi ändra 'tryck' till 'filtrerat' i Serial.println -satsen så att vi ser det filtrerade värdet.

Det bästa lärandet uppnås genom att göra ändringarna ovan manuellt. Men jag inkluderade dessa i exemplet MS5611data2serialWfilter. Så om det finns problem kan exemplet laddas.

Ladda nu upp koden till Arduino och se förbättringen. Se andra diagrammet ovan och notera att Y -skalan är utökad x2.

Prova ett lägre värde för filterkonstanten, säg 0,02 istället för 0,1, och se skillnaden. Data är mjukare men med ett långsammare svar. Detta är en kompromiss som måste sökas när man använder detta enkla filter. Egenskapen är densamma som ett RC -filter (motstånd och kapacitans) som i stor utsträckning används i elektroniska kretsar.

Steg 3: Gör det fristående

Nu lägger vi till en LCD -knappsatsskärm, omvandlar trycket till höjd i meter och visar det på displayen. Vi kommer också att lägga till möjligheten att nollställa värdet genom att trycka på knapparna "Välj".

Med LCD -skärmen på Arduino måste sensorn anslutas till LCD -skärmen. Tyvärr kommer LCD -skärmarna vanligtvis utan lämpliga uttag. Så alternativen är att göra lödanslutningar eller att skaffa någon hylsa. Hylsor finns på ebay för inte mycket mer än portokostnaden. Sök på "2,54 mm hylsa" och leta efter sådana som liknar dem på Arduino. Dessa kommer vanligtvis i 36 eller 40 stiftslängder. Jag skulle undvika de vända stiften eftersom de inte är tillräckligt djupa för vanliga Dupont -ledningar.

Sockelremsan måste skäras i längd och skärningen måste göras på samma plats som en nål. Så för en 6 -stifts remsa - ta bort den 7: e stiftet med några fina tänger, skär sedan på det stället med en junior -bågfil. Jag filar ändarna för att göra dem snygga.

Se till att det inte finns några lödbroar när du lödar dem på brädet.

Med lämpligt beslut om att ansluta sensorn ansluter LCD -skärmen till Arduino och ansluter sensorn samma stift - men nu på LCD -skärmen.

Gör också batteriet och ledningen redo. Jag gjorde mitt bly från delar i min skräpkorg men de finns också på ebay - inklusive ett bra alternativ som innehåller en batterilåda och switch. Sök på "PP3 2,1 mm bly".

Den nuvarande förbrukningen är cirka 80ma. Därför, om du vill köra i mer än några minuter, överväg ett större 9v batteri än PP3.

Steg 4: Lägg till kod för höjd och LCD

Image
Image

Vi måste göra lite mer kodning för att omvandla trycket till höjd och driva displayen.

Lägg till bildskärmsbiblioteket i början av skissen och berätta för detta vilka pins som används:

#omfatta

// initiera biblioteket med numren på gränssnittsstiften LiquidCrystal lcd (8, 9, 4, 5, 6, 7);

Därefter behöver vi några variabler och en funktion för att läsa knappsatsens knappar. Dessa är alla anslutna till analog ingång A0. Varje knapp ger en annan spänning till A0. En sökning på 'arduino lcd shield buttons code' hittade bra kod på:

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

Lägg till den här koden före installationen ():

// definiera några värden som används av panelen och knapparna

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 // läs knapparna int read_LCD_buttons () {adc_key_in = analogRead (0); // läs värdet från sensorn // mina knappar vid läsning är centrerade vid dessa värden: 0, 144, 329, 504, 741 // vi lägger till cirka 50 till dessa värden och kontrollerar om vi är nära if (adc_key_in> 1000) retur btnNONE; // Vi gör detta till det första alternativet av hastighetsskäl eftersom det är det troligaste resultatet om (adc_key_in <50) returnerar 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; returnera btnNONE; // när alla andra misslyckas, lämna tillbaka detta …}

Höjd nollställs vanligtvis vid startpunkten. Så vi behöver variabler för både höjd och referens. Lägg till dessa innan setup () och funktionen ovan:

flyta mtr;

float ref = 0;

Omvandlingen från tryck i Pascals till meter är nästan exakt en division med 12 vid havsnivå. Denna formel är bra för de flesta markbaserade mätningar. Det finns mer exakta formler som är mer lämpliga för konvertering på höga höjder. Använd dessa om du ska använda detta för att registrera höjden på en ballongflygning.

Referensen bör ställas in på den första tryckavläsningen så att vi börjar på nollhöjd och när SELECT -knappen trycks in. Lägg till efter filterkoden och före Serial.println -satsen:

om (ref == 0) {

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

Lägg sedan till höjdberäkningen:

mtr = ref - filtrerad/12,0;

Ändra slutligen uttalandet Serial.println till att skicka 'mtr' istället för 'filtrerat' och lägg till kod för att skicka 'mtr' till LCD -skärmen:

Serial.println (mtr); // Skicka tryck via serie (UART)

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

Alla ändringar här ingår i exemplet MS5611data2lcd. Ladda detta som i steg 2.

Det finns en sista mod som är till hjälp. Displayen är svårläst när den uppdateras 60 gånger i sekunden. Vårt filter utjämnar data med en tidskonstant runt 0,8 sekunder. Så att uppdatera displayen var 0,3: e verkar tillräckligt.

Så lägg till en räknare efter alla andra variabeldefinitioner i början av skissen (t.ex. efter float ref = 0;):

int i = 0;

Lägg sedan till kod för att öka 'i' och ett 'if' -uttalande för att köra när det kommer till 20 och ställ sedan tillbaka det till noll och flytta Serial- och lcd -kommandona inom 'if' -satsen så att dessa bara körs var 20: e läsning:

i += 1;

if (i> = 20) {Serial.println (mtr); // Skicka tryck via seriell (UART) lcd.setCursor (0, 1); // rad 2 lcd.print (mtr); i = 0; }

Jag inkluderade inte ett exempel med den här senaste ändringen för att uppmuntra att ange koden manuellt vilket underlättar inlärning.

Detta projekt bör ge en bra utgångspunkt till exempel för en digital barometer. För dem som kanske vill överväga användning i RC -modeller - sök efter OpenXvario efter kod som möjliggör en höjdmätare och variometer för Frsky och Turnigy 9x telemetrisystem.

Rekommenderad: