Indholdsfortegnelse:

Arduino atmosfærisk målebånd/ MS5611 GY63 GY86 Demonstration: 4 trin (med billeder)
Arduino atmosfærisk målebånd/ MS5611 GY63 GY86 Demonstration: 4 trin (med billeder)

Video: Arduino atmosfærisk målebånd/ MS5611 GY63 GY86 Demonstration: 4 trin (med billeder)

Video: Arduino atmosfærisk målebånd/ MS5611 GY63 GY86 Demonstration: 4 trin (med billeder)
Video: Arduino Nano, BME280 и SSD1306 OLED-метеостанция 2024, November
Anonim
Arduino atmosfærisk målebånd/ MS5611 GY63 GY86 Demonstration
Arduino atmosfærisk målebånd/ MS5611 GY63 GY86 Demonstration

Dette er virkelig et barometer/højdemåler, men du vil se årsagen til titlen ved at se på videoen.

MS5611 tryksensoren, der findes på Arduino GY63 og GY86 breakout boards, leverer fantastisk ydeevne. På en rolig dag vil den måle din højde til inden for 0,2 m. Dette måler effektivt afstanden fra dit hoved til det ydre rum og fratrækker det fra dine fødders afstand til det ydre rum (ved at måle tryk - det er vægten af luften over). Denne spektakulære enhed har en rækkevidde, der komfortabelt vil måle Everests højde - og kan også måle ned til et par centimeter.

Dette projekt var rettet som: et skoleprojekt, et eksempel på ændring af Arduino -kode og et godt udgangspunkt for at udforske ved hjælp af MS5611 -sensoren. Der er masser af forumspørgsmål fra dem, der har problemer med denne sensor. Fremgangsmåden her gør det meget ligetil at bruge det. Efter at have udført dette projekt vil du være godt rustet til at udvikle andre trykrelaterede applikationer.

Hver sensor har sine egne kalibreringskonstanter, der skal læses og bruges til at korrigere dataene. Der er et bibliotek til rådighed for at hjælpe med at drive disse. Koden vist her bruger biblioteket til at foretage aflæsninger og konverterer dem derefter til højden og viser dem på et LCD -skærm.

Først sender vi dataene til den serielle skærm på pc'en/den bærbare computer til indledende test. Disse viser noget støj, og derfor tilføjer vi et filter for at udjævne dem. Derefter tilføjer vi et LCD -display, så enheden kan køre uafhængigt, og du kan prøve at måle din højde - eller noget andet.

Bemærk GY63 -kortet har netop MS5611 -trykføleren. GY86 kaldes et 10 -graders frihedsbræt og indeholder også et 3 -akset accelerometer, 3 -akset gyro og et 3 -akset magnetometer til blot et par dollars mere.

Du får brug for:

1. Arduino UNO (eller andet med standard pinout) og dets USB -kabel

2. GY63 breakout board eller GY86

3. 4 Dupont fører han -hun - eller forbindelseskabel

4. Arduino LCD -tastaturskærm

5. 9v batteri og bly

6. 2,54 mm stikdåse (valgfri, men anbefales)

Forberedelse

Download Arduino IDE (integreret udviklingsmiljø) fra:

Nogle tekniske ting til interesse

MS5611 leverer sin store ydeevne ved i gennemsnit at beregne et stort antal målinger. Det kan foretage 4096 3 byte (24bit) analoge målinger på bare 8 ms og give den gennemsnitlige værdi. Det skal måle både tryk og temperatur, så trykdataene kan korrigeres for intern temperatur. Derfor kan den levere omkring 60 par tryk- og temperaturaflæsninger pr. Sekund.

Dataarket er tilgængeligt på:

Kommunikation sker via I2C. Så andre I2C -sensorer kan dele bussen (som det er tilfældet på GY86 10DOF -kortet, hvor alle chips er på I2C).

Trin 1: Få et MS5611 -bibliotek

Mange af Arduino -sensorerne bruger enten et standardbibliotek, der følger med Arduino IDE eller leveres med en zip -fil med et bibliotek, der let kan installeres. Dette har en tendens til ikke at være tilfældet for MS5611 -sensorerne. Men en søgning fandt: https://github.com/gronat/MS5611, der har et bibliotek til MS5611, herunder udførelse af temperaturkorrektion.

Mulighed 1

Gå til webstedet ovenfor, klik på 'Klon eller download', og vælg 'Download ZIP'. Dette skulle levere MS5611-master.zip til din downloads bibliotek. Nu, hvis du ønsker det, skal du flytte det til en mappe, hvor du kan finde det i fremtiden. Jeg bruger et bibliotek kaldet 'data' tilføjet til mine Arduino -mapper.

Desværre indeholder den downloadede.zip -fil ingen eksempler på skitser, og det ville være rart at tilføje biblioteket og eksempler til Arduino IDE. Der er et minimumseksempel i filen README.md, der kan kopieres og indsættes i en skitse og gemmes. Dette er en måde at komme i gang.

Mulighed 2

For at gøre det lettere at køre koden i denne instruerbare har jeg tilføjet minimumseksemplet ovenfor og eksemplerne vist her til biblioteket og vedhæftet en.zip -fil herunder, der installeres i Arduino IDE.

Download zip -filen herunder. Flyt dette til en bedre mappe, hvis du ønsker det.

Start Arduino IDE. Klik på Skitse> Inkluder bibliotek> Tilføj zip -fil, og vælg filen. Genstart IDE. IDE vil nu begge have biblioteket installeret plus alle eksemplerne vist her. Kontroller ved at klikke på Filer> eksempler >> MS5611-master. Tre skitser skal angives.

Trin 2: Tilslut sensoren til Arduino og test

Tilslut sensoren til Arduino og test
Tilslut sensoren til Arduino og test
Tilslut sensoren til Arduino og test
Tilslut sensoren til Arduino og test

GY63/GY86 -pladerne leveres normalt med overskrifter, men ikke loddet. Så det er dit valg at enten lodde overskrifterne på plads og bruge han-hun-Dupont-elektroder, eller (som jeg besluttede) loddekabler direkte til brættet og tilføje stifter til ledningen for at tilslutte Arduino. Sidstnævnte mulighed er bedre, hvis du tror, at du måske vil lodde brættet ind i et projekt senere. Førstnævnte er bedre, hvis du vil bruge tavlen til eksperimentering. Ulodning af leads er meget lettere end en pin -header.

De nødvendige forbindelser er:

GY63/GY86 Arduino

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

Sæt sensorbrættet på Arduino som ovenfor, og tilslut Arduino til pc'en/den bærbare computer via dets USB -kabel. Dæk også sensoren med noget uigennemsigtigt/sort materiale. Sensoren er lysfølsom (som det er tilfældet for de fleste af denne sensortype).

Start Arduino IDE. Klik:

Fil> eksempler >> MS5611-master> MS5611data2serial.

En ny forekomst af IDE vises med skitsen. Klik på upload -knappen (højre pil).

Start derefter seriel plotter - klik på Værktøjer> Seriel plotter, og indstil om nødvendigt baud til 9600. De data, der sendes, er trykket i Pascals. Efter et sekund eller deromkring vil det skalere og hæve og sænke sensoren med 0,3 m skal vise sig at sænke og hæve sporet (lavere højde er højere tryk).

Dataene har noget støj. Se første plot ovenfor. Dette kan udjævnes ved hjælp af et digitalt filter (et virkelig nyttigt værktøj).

Filterligningen er:

værdi = værdi + K (ny værdi)

hvor 'værdi' er de filtrerede data, og 'ny' er den seneste målte. Hvis K = 1 er der ingen filtrering. For lavere værdier af K udglattes dataene med en tidskonstant på T/K, hvor T er tiden mellem prøverne. Her er T omkring 17 ms, så en værdi på 0,1 giver en tidskonstant på 170 ms eller omkring 1/6s.

Filteret kan tilføjes ved at:

Tilføj en variabel for de filtrerede data før opsætning ():

float filtreret = 0;

Tilføj derefter filterligningen efter trykket =…. linje.

filtreret = filtreret + 0,1*(trykfiltreret);

Det er en god idé at initialisere den filtrerede værdi til den første læsning. Så tilføj en 'if' -sætning omkring linjen ovenfor, der gør dette, så det ser ud som:

hvis (filtreret! = 0) {

filtreret = filtreret + 0,1*(trykfiltreret); } andet {filtreret = tryk; // første læsning, så sæt filtreret til læsning}

Testen '! =' Er 'ikke lige'. Så hvis 'filtreret' ikke er lig med 0, udføres filterligningen, men hvis det er det, indstilles det til trykaflæsningen.

Endelig skal vi ændre 'tryk' til 'filtreret' i Serial.println -sætningen, så vi ser den filtrerede værdi.

Den bedste læring opnås ved at foretage ovenstående ændringer manuelt. Jeg inkluderede dem dog i eksemplet MS5611data2serialWfilter. Så hvis der er problemer, kan eksemplet indlæses.

Upload nu koden til Arduino og se forbedringen. Se det andet plot ovenfor, og bemærk, at Y -skalaen er udvidet x2.

Prøv en lavere værdi for filterkonstanten, sig 0,02 i stedet for 0,1, og se forskellen. Dataene er glattere, men med et langsommere svar. Dette er et kompromis, der skal søges, når du bruger dette enkle filter. Karakteristikken er den samme som et RC (modstand og kapacitans) filter, der i vid udstrækning bruges i elektroniske kredsløb.

Trin 3: Gør det standalone

Nu tilføjer vi et LCD -tastaturskjold, konverterer trykket til højden i meter og viser det på displayet. Vi tilføjer også muligheden for at nulstille værdien ved at trykke på tasten ‘Vælg’.

Med LCD -skærmen på Arduino skal sensoren tilsluttes LCD -skjoldet. Desværre kommer LCD -skærmene normalt uden de passende stikkontakter. Så mulighederne er at lave loddetilslutninger eller at få noget fatningsbånd. Stikkontakt fås på ebay til ikke meget mere end portoomkostningerne. Søg efter ‘2,54 mm sokkelstrimmel’, og kig efter dem, der ligner dem på Arduino. Disse kommer normalt i længder på 36 eller 40 ben. Jeg ville undgå dem med drejede ben, da de ikke er dybe nok til standard Dupont -elektroder.

Stikkontakten skal skæres i længden, og snittet skal foretages samme sted som en nål. Så for en 6 -benet strimmel - fjern den 7. pin med nogle fine tænger, og skær derefter på det sted ved hjælp af en junior nedstryger. Jeg arkiverer enderne for at gøre dem pæne.

Sørg for, at der ikke er loddebroer, når du lodder dem på brættet.

Med den passende beslutning om at tilslutte sensoren skal LCD -skærmen tilsluttes Arduino og tilslutte sensoren de samme ben - men nu på LCD -skærmen.

Få også batteriet og ledningen klar. Jeg tog mit bly fra dele i min skraldespand, men de er også tilgængelige på ebay - herunder en god mulighed, der indeholder en batteriboks og switch. Søg på ‘PP3 2,1 mm bly’.

Det nuværende forbrug er omkring 80ma. Derfor, hvis du vil køre i mere end et par minutter, skal du overveje et større 9v batteri end PP3.

Trin 4: Tilføj kode for højde og LCD

Image
Image

Vi skal lave lidt mere kodning for at konvertere trykket til højde og drive displayet.

I begyndelsen af skitsen tilføj displaybiblioteket og fortæl dette, hvilke pins der bruges:

#omfatte

// initialiser biblioteket med numrene på grænsefladestifterne LiquidCrystal lcd (8, 9, 4, 5, 6, 7);

Dernæst har vi brug for nogle variabler og en funktion til at læse tastaturets knapper. Disse er alle forbundet til analog indgang A0. Hver knap giver en anden spænding til A0. En søgning på 'arduino lcd shield buttons code' fandt en god kode på:

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

Tilføj denne kode før opsætning ():

// definer nogle værdier, der bruges af panelet og knapperne

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 knapperne int read_LCD_buttons () {adc_key_in = analogRead (0); // læs værdien fra sensoren // mine knapper ved læsning er centreret ved disse værdier: 0, 144, 329, 504, 741 // vi tilføjer cirka 50 til disse værdier og kontrollerer, om vi er tæt på hvis (adc_key_in> 1000) return btnNONE; // Vi gør dette til den første mulighed af hastighedsgrunde, da det vil være det mest sandsynlige resultat, hvis (adc_key_in <50) returnerer btnRIGHT; hvis (adc_key_in <250) returnerer btnUP; hvis (adc_key_in <450) returnerer btnDOWN; hvis (adc_key_in <650) returnerer btnLEFT; hvis (adc_key_in <850) returnerer btnSELECT; returner btnNONE; // når alle andre fejler, skal du returnere dette…}

Højden nulstilles normalt ved udgangspunktet. Så vi har brug for variabler til både højde og reference. Tilføj disse før opsætning () og funktionen ovenfor:

flyde mtr;

float ref = 0;

Omdannelsen fra tryk i Pascals til meter er næsten præcist en division med 12 ved havets overflade. Denne formel er fin til de fleste jordbaserede målinger. Der er mere præcise formler, der er mere egnede til konvertering i store højder. Brug disse, hvis du vil bruge dette til at registrere højden af en ballonflyvning.

Referencen skal indstilles til den første trykaflæsning, så vi starter i nulhøjde, og når der trykkes på SELECT -knappen. Tilføj efter filterkoden og før Serial.println -sætningen:

hvis (ref == 0) {

ref = filtreret/12,0; } hvis (read_LCD_buttons () == btnSELECT) {ref = filtreret/12,0; }

Herefter tilføjes højdeberegningen:

mtr = ref - filtreret/12,0;

Til sidst skal du ændre Serial.println -sætningen til at sende 'mtr' i stedet for 'filtreret', og tilføje kode for at sende 'mtr' til LCD'et:

Serial.println (mtr); // Send tryk via seriel (UART)

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

Alle ændringerne her er inkluderet i eksemplet MS5611data2lcd. Indlæs dette som i trin 2.

Der er en sidste mod, der er nyttig. Displayet er svært at læse, når det opdateres 60 gange i sekundet. Vores filter udjævner dataene med en tidskonstant omkring 0,8 sek. Så at opdatere displayet hver 0,3 sekund virker nok nok.

Så tilføj en tæller efter alle de andre variable definitioner i starten af skitsen (f.eks. Efter float ref = 0;):

int i = 0;

Tilføj derefter kode til inkrement 'i' og en 'if' -udsætning, der skal køres, når den når 20, og sæt den derefter tilbage til nul, og flyt kommandoerne Serial og lcd inden for 'if' -sætningen, så disse udføres kun hver 20. læsning:

i += 1;

hvis (i> = 20) {Serial.println (mtr); // Send tryk via seriel (UART) lcd.setCursor (0, 1); // linje 2 lcd.print (mtr); i = 0; }

Jeg inkluderede ikke et eksempel med denne sidste ændring for at tilskynde til at indtaste koden manuelt, hvilket hjælper med at lære.

Dette projekt bør give et godt udgangspunkt for eksempel til et digitalt barometer. For dem, der måske vil overveje brug i RC -modeller - søg efter OpenXvario for kode, der muliggør en højdemåler og variometer for Frsky og Turnigy 9x telemetri systemer.

Anbefalede: