Innehållsförteckning:
- Steg 1: Skaffa ett MS5611 -bibliotek
- Steg 2: Anslut sensorn till Arduino och testa
- Steg 3: Gör det fristående
- Steg 4: Lägg till kod för höjd och LCD
Video: Arduino Atmospheric Tape Measure/ MS5611 GY63 GY86 Demonstration: 4 steg (med bilder)
2024 Författare: John Day | [email protected]. Senast ändrad: 2024-01-30 12:44
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
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
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:
Dr. Tape Head - Undead Media: 11 steg (med bilder)
Dr. Tape Head - Odöda medier: Dr. Tape Head är den perfekta läskiga följeslagaren när du arbetar sent på labbet! Han använder Amazons Polly -tjänst för att läsa upp text från ett Google Sheets -kalkylblad, fyllt av IFTTT -tjänsten och samlat från Twitter, SMS och kameramöte
Arbotix Reactor Robot Arm och Pixycam Demonstration: 11 steg
Arbotix Reactor Robot Arm och Pixycam Demonstration: Vi är 2 studenter från UCN college i Danmark. Vi fick i uppgift att göra en obetydlig som en del av vår utvärdering för vår klass, robot och vision. Kraven för projektet var att inkludera en eller flera robotar från arbotix och utföra en uppgift. Projicera
Dubbla 7 -segmentskärmar som styrs av potentiometer i CircuitPython - demonstration av Persistens i syn: 9 steg (med bilder)
Dubbla 7-segmentsdisplayer som styrs av potentiometer i CircuitPython-Demonstration of Persistence of Vision: Detta projekt använder en potentiometer för att styra displayen på ett par 7-segment LED-skärmar (F5161AH). När potentiometervredet vrids ändras det visade numret i intervallet 0 till 99. Endast en lysdiod lyser när som helst, mycket kort, men
Elektrisk motor demonstration: 5 steg (med bilder)
Elektrisk motor demonstration: Denna elmotor visar de grundläggande principerna för elektromagnetism. Denna demo är enkel att bygga och tar bara en helg att göra det. Dellista: 3D -skrivare Laserskärare Elektrisk tråd Magnettråd (1) Keramisk magnet Medium sandpapper (2) Corne
Demonstration Autosampler: 6 steg
Demonstration Autosampler: Denna instruerbara skapades för att uppfylla projektkravet för Makecourse vid University of South Florida (www.makecourse.com) Provtagning är en viktig aspekt av nästan alla våtbord eftersom de kan analyseras för att ge viktig information