Innholdsfortegnelse:

Arduino målebåndsmåler/ MS5611 GY63 GY86 Demonstrasjon: 4 trinn (med bilder)
Arduino målebåndsmåler/ MS5611 GY63 GY86 Demonstrasjon: 4 trinn (med bilder)

Video: Arduino målebåndsmåler/ MS5611 GY63 GY86 Demonstrasjon: 4 trinn (med bilder)

Video: Arduino målebåndsmåler/ MS5611 GY63 GY86 Demonstrasjon: 4 trinn (med bilder)
Video: (Demo) Interface MS5611 Barometric Pressure Sensor with Arduino 2024, Juli
Anonim
Arduino målebåndsmåler/ MS5611 GY63 GY86 Demonstrasjon
Arduino målebåndsmåler/ MS5611 GY63 GY86 Demonstrasjon

Dette er egentlig et barometer/høydemåler, men du vil se årsaken til tittelen ved å se på videoen.

MS5611 trykksensor, som finnes på Arduino GY63 og GY86 breakout boards, leverer fantastisk ytelse. På en rolig dag vil den måle høyden din til 0,2 meter. Dette måler effektivt avstanden fra hodet til verdensrommet og trekker det fra fotens avstand til det ytre rom (ved å måle trykk - det vil si luftens vekt over). Denne spektakulære enheten har en rekkevidde som komfortabelt vil måle høyden til Everest - og kan også måle ned til noen få centimeter.

Dette prosjektet var rettet mot: et skoleprosjekt, et eksempel på å endre Arduino -kode og et godt utgangspunkt for å utforske ved hjelp av MS5611 -sensoren. Det er mange forumspørsmål fra de som har problemer med denne sensoren. Tilnærmingen her gjør det veldig enkelt å bruke det. Etter å ha gjort dette prosjektet vil du være godt rustet til å utvikle andre trykkrelaterte applikasjoner.

Hver sensor har sine egne kalibreringskonstanter som må leses og brukes til å korrigere dataene. Det er et bibliotek tilgjengelig for å drive disse. Koden som vises her bruker biblioteket til å ta avlesninger og konverterer dem deretter til høyde og viser dem på et LCD -skjerm.

Først sender vi dataene til den serielle skjermen på PC/bærbar PC for første test. Disse viser litt støy, og derfor legger vi til et filter for å jevne dem ut. Deretter legger vi til en LCD -skjerm slik at enheten kan kjøre uavhengig og du kan prøve å måle høyden din - eller noe annet.

Vær oppmerksom på at GY63 -kortet nettopp har trykksensoren MS5611. GY86 kalles et 10 -graders frihetsbrett og inkluderer også et 3 -akset akselerometer, 3 -akset gyro og et 3 -akset magnetometer for bare noen få dollar mer.

Du vil trenge:

1. Arduino UNO (eller annet med standard pinout) og USB -kabelen

2. GY63 breakout board eller GY86

3. 4 Dupont leder mann -hunn - eller forbindelseskabel

4. Arduino LCD -tastaturskjerm

5. 9v batteri og ledning

6. 2,54 mm stikkontakt (valgfritt, men anbefalt)

Forberedelse

Last ned Arduino IDE (integrert utviklingsmiljø) fra:

Noen tekniske biter for interesse

MS5611 leverer sin flotte ytelse ved å beregne et gjennomsnitt på et stort antall målinger. Den kan gjøre 4096 3 byte (24bit) analoge målinger på bare 8 ms og gi gjennomsnittsverdien. Den må måle både trykk og temperatur, slik at trykkdataene kan korrigeres for indre temperatur. Derfor kan den levere rundt 60 par trykk- og temperaturavlesninger per sekund.

Dataarket er tilgjengelig på:

Kommunikasjon skjer via I2C. Så andre I2C -sensorer kan dele bussen (som tilfellet er på GY86 10DOF -kortet hvor alle brikkene er på I2C).

Trinn 1: Få et MS5611 -bibliotek

Mange av Arduino -sensorene bruker enten et standardbibliotek som følger med Arduino IDE eller leveres med en zip -fil med et bibliotek som enkelt kan installeres. Dette har en tendens til ikke å være tilfelle for MS5611 -sensorene. Imidlertid fant et søk: https://github.com/gronat/MS5611 som har et bibliotek for MS5611, inkludert utføring av temperaturkorreksjon.

valg 1

Gå til nettstedet ovenfor, klikk "Klon eller nedlasting" og velg "Last ned ZIP". Dette bør levere MS5611-master.zip til nedlastingskatalogen. Hvis du vil, kan du flytte den til en mappe der du kan finne den i fremtiden. Jeg bruker en katalog kalt 'data' lagt til i Arduino -mappene mine.

Dessverre inneholder den nedlastede zip -filen ingen eksempler på skisser, og det ville være fint å legge til biblioteket og eksempler til Arduino IDE. Det er et minimumseksempel i filen README.md som kan kopieres og limes inn i en skisse og lagres. Dette er en måte å komme i gang.

Alternativ 2

For å gjøre det enklere å kjøre koden i denne instruksjonsfilen har jeg lagt til minimumseksemplet ovenfor og eksemplene vist her til biblioteket og lagt ved en.zip -fil nedenfor som installeres i Arduino IDE.

Last ned zip -filen nedenfor. Flytt dette til en bedre mappe hvis du ønsker det.

Start Arduino IDE. Klikk på Skisse> Inkluder bibliotek> Legg til zip -fil og velg filen. Start IDE på nytt. IDE vil nå begge ha biblioteket installert pluss alle eksemplene som vises her. Sjekk ved å klikke Fil> eksempler >> MS5611-master. Tre skisser bør listes opp.

Trinn 2: Koble sensoren til Arduino og test

Koble sensoren til Arduino og test
Koble sensoren til Arduino og test
Koble sensoren til Arduino og test
Koble sensoren til Arduino og test

GY63/GY86 -brettene kommer vanligvis med overskrifter, men ikke loddet. Så det er ditt valg å enten lodde hodene på plass og bruke mannlige-kvinnelige Dupont-ledninger, eller (som jeg bestemte meg) loddetinjer direkte til brettet og legge til pinner på ledningen for å plugge inn i Arduino. Det siste alternativet er bedre hvis du tror du kanskje vil lodde brettet inn i et prosjekt senere. Førstnevnte er bedre hvis du vil bruke brettet til eksperimentering. Å lodde ledninger er mye enklere enn en pin -overskrift.

Tilkoblingene som kreves er:

GY63/GY86 Arduino

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

Fest sensorkortet til Arduino som ovenfor og koble Arduino til PC/bærbar PC via USB -kabelen. Dekk også sensoren med noe ugjennomsiktig/svart materiale. Sensoren er følsom for lys (som er tilfellet for de fleste av denne typen sensorer).

Start Arduino IDE. Klikk:

Fil> eksempler >> MS5611-master> MS5611data2serial.

En ny forekomst av IDE vil vises med skissen. Klikk på opplastingsknappen (høyre pil).

Start deretter seriell plotter - klikk på Verktøy> Seriell plotter og sett om nødvendig baud til 9600. Dataene som sendes er trykket i Pascals. Etter et par sekunder vil det skalere på nytt, og heving og senking av sensoren med 0,3 m skal vise som senking og heving av sporet (lavere høyde er høyere trykk).

Dataene har noe støy. Se første plott ovenfor. Dette kan glattes ut ved hjelp av et digitalt filter (et veldig nyttig verktøy).

Filterligningen er:

verdi = verdi + K (ny verdi)

hvor 'verdi' er de filtrerte dataene, og 'ny' er den siste målte. Hvis K = 1 er det ingen filtrering. For lavere verdier av K blir dataene glattet med en tidskonstant på T/K hvor T er tiden mellom prøvene. Her er T rundt 17 ms, så en verdi på 0,1 gir en tidskonstant på 170 ms eller rundt 1/6s.

Filteret kan legges til ved å:

Legg til en variabel for de filtrerte dataene før oppsett ():

flyte filtrert = 0;

Legg deretter til filterligningen etter trykket =…. linje.

filtrert = filtrert + 0,1*(trykkfiltrert);

Det er en god idé å initialisere den filtrerte verdien til første avlesning. Så legg til en 'if' -setning rundt linjen ovenfor som gjør dette slik at det ser ut som:

hvis (filtrert! = 0) {

filtrert = filtrert + 0,1*(trykkfiltrert); } annet {filtrert = trykk; // første lesning, så sett filtrert til lesing}

Testen '! =' Er 'ikke lik'. Så hvis 'filtrert' ikke er lik 0, utføres filterligningen, men hvis det er det, er det satt til trykkavlesning.

Til slutt må vi endre 'trykk' til 'filtrert' i Serial.println -setningen, slik at vi ser den filtrerte verdien.

Den beste læringen oppnås ved å gjøre endringene ovenfor manuelt. Imidlertid inkluderte jeg disse i eksempelet MS5611data2serialWfilter. Så hvis det er problemer kan eksemplet lastes inn.

Last nå opp koden til Arduino og se forbedringen. Se andre plott ovenfor og merk at Y -skalaen er utvidet x2.

Prøv en lavere verdi for filterkonstanten, si 0,02 i stedet for 0,1, og se forskjellen. Dataene er jevnere, men med en tregere respons. Dette er et kompromiss som må søkes når du bruker dette enkle filteret. Karakteristikken er den samme som et RC (motstand og kapasitans) filter som er mye brukt i elektroniske kretser.

Trinn 3: Gjør det frittstående

Nå vil vi legge til et LCD -tastaturskjerm, konvertere trykket til høyde i meter og vise det på displayet. Vi vil også legge til muligheten til å nullstille verdien ved å trykke på tasten "Velg".

Med LCD -skjermen på Arduino må sensoren kobles til LCD -skjermen. Dessverre kommer LCD -skjermene vanligvis uten de riktige kontaktene. Så alternativene er å lage loddetilkoblinger eller å skaffe litt stikkontakt. Stikkontakt er tilgjengelig på ebay for ikke mye mer enn portokostnaden. Søk på "2,54 mm sokkelbånd" og se etter de som ligner de på Arduino. Disse kommer vanligvis i 36 eller 40 pinnelengder. Jeg ville unngå de dreide pinnene, ettersom de ikke er dype nok til standard Dupont -ledninger.

Stikkontakten må kuttes i lengden og kuttet må gjøres på samme sted som en pinne. Så for en 6 -pinners stripe - fjern den 7. pinnen med noen fine tang, og kutt deretter på det stedet med en junior baufil. Jeg arkiverer endene for å gjøre dem pene.

Sørg for at det ikke er loddebroer når du lodder dem på brettet.

Med riktig beslutning om å koble sensoren, kobler du LCD -skjermen til Arduino og kobler sensoren til de samme pinnene - men nå på LCD -skjermen.

Gjør også batteriet og ledningen klar. Jeg fant ledningen min fra deler i søppelbøtten min, men de er også tilgjengelige på ebay - inkludert et fint alternativ som inkluderer en batteriboks og bryter. Søk på ‘PP3 2,1 mm bly’.

Det nåværende forbruket er rundt 80ma. Derfor, hvis du vil kjøre i mer enn noen få minutter, bør du vurdere et større 9v batteri enn PP3.

Trinn 4: Legg til kode for høyde og LCD

Image
Image

Vi må gjøre litt mer koding for å konvertere trykket til høyde og drive displayet.

I begynnelsen av skissen legger du til visningsbiblioteket og forteller dette hvilke pins som brukes:

#inkludere

// initialiser biblioteket med tallene på grensesnittpinnene LiquidCrystal lcd (8, 9, 4, 5, 6, 7);

Deretter trenger vi noen variabler og en funksjon for å lese knappene på tastaturet. Disse er alle koblet til analog inngang A0. Hver knapp gir en annen spenning til A0. Et søk på 'arduino lcd shield buttons code' fant noen gode koder på:

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

Legg til denne koden før oppsett ():

// definere noen verdier som brukes av panelet og knappene

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 // les knappene int read_LCD_buttons () {adc_key_in = analogRead (0); // les verdien fra sensoren // knappene mine når du leser er sentrert i disse verdiene: 0, 144, 329, 504, 741 // vi legger til omtrent 50 til disse verdiene og sjekker om vi er nære hvis (adc_key_in> 1000) return btnNONE; // Vi gjør dette til det første alternativet av hastighetshensyn, siden det vil være det mest sannsynlige resultatet hvis (adc_key_in <50) returnerer 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; returner btnNONE; // når alle andre mislykkes, returner dette…}

Høyden nullstilles vanligvis ved utgangspunktet. Så vi trenger variabler for både høyde og referanse. Legg til disse før oppsett () og funksjonen ovenfor:

flyte mtr;

float ref = 0;

Konverteringen fra trykk i Pascals til meter er nesten nøyaktig en divisjon med 12 ved havnivå. Denne formelen er fin for de fleste bakkebaserte målinger. Det er mer nøyaktige formler som er mer passende for konvertering i store høyder. Bruk disse hvis du skal bruke dette til å registrere høyden på en ballongtur.

Referansen bør settes til den første trykkavlesningen, så vi starter på null høyde og når du trykker på SELECT -knappen. Legg til, etter filterkoden og før Serial.println -setningen:

hvis (ref == 0) {

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

Etter dette legger du til høydeberegningen:

mtr = ref - filtrert/12,0;

Endre til slutt Serial.println -setningen til å sende 'mtr' i stedet for 'filtrert', og legg til kode for å sende 'mtr' til LCD -skjermen:

Serial.println (mtr); // Send press via seriell (UART)

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

Alle endringene her er inkludert i eksempelet MS5611data2lcd. Last dette som i trinn 2.

Det er en siste mod som er nyttig. Displayet er vanskelig å lese når det oppdateres 60 ganger i sekundet. Filteret vårt jevner ut dataene med en tidskonstant på rundt 0,8 sekunder. Så å oppdatere skjermen hver 0,3 sekund virker nok nok.

Så legg til en teller etter alle de andre variabeldefinisjonene i begynnelsen av skissen (f.eks. Etter float ref = 0;):

int i = 0;

Legg deretter til kode for å øke 'i' og en 'hvis' -uttalelse for å kjøre når den kommer til 20, og sett den deretter tilbake til null og flytt kommandoene Serial og lcd i 'if' -setningen, slik at disse bare blir utført hver 20. lesning:

i += 1;

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

Jeg inkluderte ikke et eksempel med denne siste modifikasjonen for å oppmuntre til å skrive inn koden manuelt som hjelper læring.

Dette prosjektet bør gi et godt utgangspunkt for eksempel for et digitalt barometer. For de som kanskje vil vurdere bruk i RC -modeller - søk etter OpenXvario for kode som muliggjør en høydemåler og variometer for Frsky og Turnigy 9x telemetrisystemer.

Anbefalt: