Inhoudsopgave:

Arduino Atmosferische Meetlint / MS5611 GY63 GY86 Demonstratie - Ajarnpa
Arduino Atmosferische Meetlint / MS5611 GY63 GY86 Demonstratie - Ajarnpa

Video: Arduino Atmosferische Meetlint / MS5611 GY63 GY86 Demonstratie - Ajarnpa

Video: Arduino Atmosferische Meetlint / MS5611 GY63 GY86 Demonstratie - Ajarnpa
Video: How to make Arduino Tape Measure? #design #arduino #project #arduinoproject #diy #arduinonano 2024, Juli-
Anonim
Arduino Atmosferische Meetlint / MS5611 GY63 GY86 Demonstratie
Arduino Atmosferische Meetlint / MS5611 GY63 GY86 Demonstratie

Dit is eigenlijk een barometer/hoogtemeter, maar de reden voor de titel kun je zien aan de video.

De MS5611-druksensor, te vinden op de Arduino GY63- en GY86-breakoutboards, levert verbluffende prestaties. Op een rustige dag meet hij je lengte tot op 0,2 meter. Dit is effectief de afstand van je hoofd tot de ruimte meten en deze aftrekken van de afstand van je voeten tot de ruimte (door druk te meten - dat is het gewicht van de lucht erboven). Dit spectaculaire apparaat heeft een bereik dat comfortabel de hoogte van de Everest meet - en kan ook tot enkele centimeters meten.

Dit project was bedoeld als: een schoolproject, een voorbeeld van het aanpassen van Arduino-code en een goede startplaats om te verkennen met behulp van de MS5611-sensor. Er zijn tal van forumvragen van mensen die problemen hebben met deze sensor. De aanpak hier maakt het gebruik ervan heel eenvoudig. Na het uitvoeren van dit project ben je goed toegerust om andere drukgerelateerde toepassingen te ontwikkelen.

Elke sensor heeft zijn eigen kalibratieconstanten die moeten worden uitgelezen en gebruikt om de gegevens te corrigeren. Er is een bibliotheek beschikbaar om deze te helpen rijden. De hier getoonde code gebruikt de bibliotheek om metingen te doen en zet ze vervolgens om in hoogte en geeft ze weer op een LCD-scherm.

Eerst sturen we de gegevens naar de seriële monitor op de pc/laptop voor de eerste tests. Deze vertonen wat ruis en daarom voegen we een filter toe om ze glad te strijken. Dan voegen we een LCD-scherm toe zodat het apparaat onafhankelijk kan werken en u kunt proberen uw lengte te meten - of iets anders.

Merk op dat het GY63-bord alleen de MS5611-druksensor heeft. De GY86 wordt een 10 graden van vrijheidsbord genoemd en bevat ook een 3-assige accelerometer, 3-assige gyro en een 3-assige magnetometer voor slechts een paar $ meer.

Je zal nodig hebben:

1. Arduino UNO (of andere met standaard pinout) en zijn USB-kabel

2. GY63 breakout-bord of GY86

3. 4 Dupont leidt mannelijk-vrouwelijk - of verbindingsdraad

4. Arduino LCD-toetsenbordschild

5. 9v batterij en lood

6. 2,54 mm stekkerdoos (optioneel maar aanbevolen)

Voorbereiding

Download de Arduino IDE (geïntegreerde ontwikkelomgeving) van:

Enkele technische stukjes voor interesse

De MS5611 levert zijn geweldige prestaties door het gemiddelde van grote aantallen metingen. Het kan 4096 3 byte (24-bits) analoge metingen uitvoeren in slechts 8 ms en de gemiddelde waarde geven. Het moet zowel druk als temperatuur meten, zodat de drukgegevens kunnen worden gecorrigeerd voor interne temperatuur. Daarom kan het ongeveer 60 paar druk- en temperatuurmetingen per seconde leveren.

Het gegevensblad is beschikbaar op:

De communicatie verloopt via I2C. Dus andere I2C-sensoren kunnen de bus delen (zoals het geval is op het GY86 10DOF-bord waar alle chips op I2C zitten).

Stap 1: Verkrijg een MS5611-bibliotheek

Veel van de Arduino-sensoren gebruiken ofwel een standaardbibliotheek die wordt meegeleverd met de Arduino IDE of worden geleverd met een zipbestand met een bibliotheek die eenvoudig kan worden geïnstalleerd. Dit is meestal niet het geval voor de MS5611-sensoren. Echter een zoekopdracht gevonden: https://github.com/gronat/MS5611 die een bibliotheek heeft voor de MS5611, inclusief het uitvoeren van de temperatuurcorrectie.

Optie 1

Ga naar bovenstaande website, klik op ‘Clone or Download’ en selecteer ‘Download ZIP’. Dit zou MS5611-master.zip in uw downloadmap moeten brengen. Verplaats het nu, als je wilt, naar een map waar je het in de toekomst kunt vinden. Ik gebruik een map met de naam 'data' die is toegevoegd aan mijn Arduino-mappen.

Helaas bevat het gedownloade.zip-bestand geen voorbeeldschetsen en het zou leuk zijn om de bibliotheek en voorbeelden toe te voegen aan de Arduino IDE. Er is een minimaal voorbeeld in het README.md-bestand dat kan worden gekopieerd en geplakt in een schets en kan worden opgeslagen. Dit is een manier om aan de slag te gaan.

Optie 2

Om het gemakkelijker te maken om de code in deze instructable uit te voeren, heb ik het bovenstaande minimumvoorbeeld en de hier getoonde voorbeelden aan de bibliotheek toegevoegd en een.zip-bestand hieronder bijgevoegd dat in de Arduino IDE zal worden geïnstalleerd.

Download het zip-bestand hieronder. Verplaats dit naar een betere map als je wilt.

Start de Arduino-IDE. Klik op Sketch>Bibliotheek opnemen>Zipbestand toevoegen en selecteer het bestand. Start de IDE opnieuw. De IDE zal nu beide de bibliotheek hebben geïnstalleerd plus alle voorbeelden die hier worden getoond. Controleer dit door te klikken op Bestand>voorbeelden>>MS5611-master. Er moeten drie schetsen worden vermeld.

Stap 2: Sluit de sensor aan op de Arduino en test

Sluit de sensor aan op de Arduino en test
Sluit de sensor aan op de Arduino en test
Sluit de sensor aan op de Arduino en test
Sluit de sensor aan op de Arduino en test

De GY63/GY86-kaarten worden meestal geleverd met headers, maar niet gesoldeerd. Het is dus jouw keuze om ofwel de headers op hun plaats te solderen en mannelijke-vrouwelijke Dupont-draden te gebruiken, of (zoals ik besloot) soldeerdraden rechtstreeks op het bord en pinnen aan de lead toe te voegen om op de Arduino aan te sluiten. De laatste optie is beter als je denkt dat je het bord later misschien in een project wilt solderen. De eerste is beter als je het bord wilt gebruiken om te experimenteren. Het lossolderen van leads is veel eenvoudiger dan een pin-header.

De benodigde aansluitingen zijn:

GY63/GY86 Arduino

VCC - 5v Stroom GND - GND Aarde SCL - A5 I2C klok >SDA - A4 I2C data

Bevestig het sensorbord zoals hierboven aan de Arduino en sluit de Arduino via de USB-kabel aan op de pc/laptop. Bedek de sensor ook met wat ondoorzichtig/zwart materiaal. De sensor is gevoelig voor licht (zoals bij de meeste van dit type sensor).

Start de Arduino-IDE. Klik:

Bestand>voorbeelden>>MS5611-master>MS5611data2serial.

Een nieuw exemplaar van de IDE verschijnt met de schets. Klik op de uploadknop (pijl naar rechts).

Start vervolgens de seriële plotter - klik op Tools>Serial Plotter en stel indien nodig de baud in op 9600. De gegevens die worden verzonden, zijn de druk in Pascals. Na ongeveer een seconde zal het opnieuw worden geschaald en het verhogen en verlagen van de sensor met bijvoorbeeld 0,3 m zou moeten worden weergegeven als het verlagen en verhogen van het spoor (lagere hoogte is hogere druk).

De gegevens hebben wat ruis. Zie eerste plot hierboven. Dit kan worden gladgestreken met behulp van een digitaal filter (een erg handig hulpmiddel).

De filtervergelijking is:

waarde = waarde + K(nieuwe-waarde)

waarbij 'waarde' de gefilterde gegevens zijn en 'nieuw' de laatst gemeten gegevens. Als K=1 is er geen filtering. Voor lagere waarden van K worden de gegevens afgevlakt met een tijdconstante van T/K waarbij T de tijd tussen monsters is. Hier is T ongeveer 17 ms, dus een waarde van 0,1 geeft een tijdconstante van 170 ms of ongeveer 1/6s.

Het filter kan worden toegevoegd door:

Voeg een variabele toe voor de gefilterde gegevens vóór setup():

vlotter gefilterd = 0;

Voeg vervolgens de filtervergelijking toe na de druk = …. lijn.

gefilterd = gefilterd + 0,1*(drukgefilterd);

Het is een goed idee om de gefilterde waarde te initialiseren naar de eerste meting. Dus voeg een 'if'-statement toe rond de regel hierboven die dit doet, zodat het er als volgt uitziet:

if(gefilterd!= 0){

gefilterd = gefilterd + 0,1*(drukgefilterd); } else { gefilterd = druk; // eerste lezing dus zet gefilterd op lezen }

De toets ‘!=’ is ‘niet gelijk’. Dus als 'gefilterd' niet gelijk is aan 0, wordt de filtervergelijking uitgevoerd, maar als dit het geval is, wordt deze ingesteld op de drukmeting.

Ten slotte moeten we 'druk' wijzigen in 'gefilterd' in de Serial.println-instructie, zodat we de gefilterde waarde zien.

Het beste leerproces wordt bereikt door de bovenstaande wijzigingen handmatig aan te brengen. Ik heb deze echter opgenomen in het voorbeeld MS5611data2serialWfilter. Dus als er problemen zijn, kan het voorbeeld worden geladen.

Upload nu de code naar de Arduino en zie de verbetering. Zie tweede plot hierboven en merk op dat de Y-schaal x2 is uitgebreid.

Probeer een lagere waarde voor de filterconstante, zeg 0,02 in plaats van 0,1, en zie het verschil. De gegevens zijn vloeiender, maar met een langzamere respons. Dit is een compromis dat moet worden gezocht bij het gebruik van dit eenvoudige filter. Het kenmerk is hetzelfde als een RC-filter (weerstand en capaciteit) dat veel wordt gebruikt in elektronische circuits.

Stap 3: Maak het standalone

Nu zullen we een LCD-toetsenbordscherm toevoegen, de druk in meters naar hoogte converteren en op het display weergeven. We zullen ook de mogelijkheid toevoegen om de waarde op nul te zetten door op de knop 'Selecteren' op het toetsenbord te drukken.

Met het LCD-schild op de Arduino moet de sensor worden aangesloten op het LCD-schild. Helaas worden de LCD-schermen meestal zonder de juiste sockets geleverd. Dus de opties zijn om soldeerverbindingen te maken of om een stekkerdoos te krijgen. Stekkerdoos is op ebay verkrijgbaar voor niet veel meer dan de verzendkosten. Zoek op '2.54mm socket strip' en zoek naar degenen die vergelijkbaar zijn met die op de Arduino. Deze komen meestal in 36 of 40 pins lengtes. Ik zou de gedraaide pins vermijden omdat ze niet diep genoeg zijn voor standaard Dupont-leads.

De stekkerdoos moet op lengte worden gesneden en de snede moet op dezelfde plaats als een pin worden gemaakt. Dus voor een 6-pins strip - verwijder de 7e pin met een fijne tang en zaag op die plaats met een junior ijzerzaag. Ik vijl de uiteinden om ze netjes te maken.

Zorg ervoor dat er geen soldeerbruggen zijn wanneer u ze op het bord soldeert.

Met de juiste beslissing om de sensor aan te sluiten, sluit u het LCD-schild aan op de Arduino en sluit u de sensor aan op dezelfde pinnen - maar nu op het LCD-schild.

Leg ook de batterij en het lood klaar. Ik heb mijn lood gemaakt van onderdelen in mijn schrootbak, maar ze zijn ook verkrijgbaar op ebay - inclusief een leuke optie met een accubak en schakelaar. Zoek op ‘PP3 2.1mm lead’.

Het stroomverbruik ligt rond de 80ma. Dus als u langer dan een paar minuten wilt werken, overweeg dan een grotere 9v-batterij dan de PP3.

Stap 4: voeg code toe voor hoogte en het LCD-scherm

Image
Image

We moeten wat meer coderen om de druk om te zetten in hoogte en het display aan te sturen.

Voeg aan het begin van de schets de weergavebibliotheek toe en vertel deze welke pinnen worden gebruikt:

#erbij betrekken

// initialiseer de bibliotheek met de nummers van de interface-pinnen LiquidCrystal lcd (8, 9, 4, 5, 6, 7);

Vervolgens hebben we enkele variabelen en een functie nodig om de toetsen op het toetsenbord te lezen. Deze zijn allemaal aangesloten op analoge ingang A0. Elke knop geeft een andere spanning aan A0. Een zoekopdracht op 'arduino lcd shield buttons code' vond een goede code op:

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

Voeg deze code toe voor setup():

// definieer enkele waarden die worden gebruikt door het paneel en de knoppen

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 // lees de knoppen int read_LCD_buttons() {adc_key_in = analogRead(0); // lees de waarde van de sensor // mijn knoppen bij het lezen zijn gecentreerd op deze waarden: 0, 144, 329, 504, 741 // we voegen ongeveer 50 toe aan die waarden en controleren of we in de buurt zijn als (adc_key_in> 1000) retour btnNONE; // We maken dit de eerste optie om snelheidsredenen, aangezien dit het meest waarschijnlijke resultaat zal zijn als (adc_key_in < 50) btnRIGHT retourneert; if (adc_key_in < 250) retourneert btnUP; if (adc_key_in < 450) retourneert btnDOWN; if (adc_key_in < 650) retourneert btnLEFT; if (adc_key_in < 850) retourneert btnSELECT; retour btnNONE; // wanneer alle andere falen, retourneer dit … }

De hoogte wordt meestal op nul gesteld bij het startpunt. We hebben dus variabelen nodig voor zowel hoogte als referentie. Voeg deze toe vóór setup() en de bovenstaande functie:

vlotter meter;

vlotterref = 0;

De omrekening van druk in Pascal naar meter is bijna precies een deling door 12 op zeeniveau. Deze formule is prima voor de meeste metingen op de grond. Er zijn nauwkeurigere formules die geschikter zijn voor conversie op grote hoogte. Gebruik deze als u deze gaat gebruiken om de hoogte van een ballonvlucht vast te leggen.

De referentie moet worden ingesteld op de eerste drukmeting, dus we beginnen op nulhoogte en wanneer de SELECT-knop wordt ingedrukt. Voeg na de filtercode en vóór de instructie Serial.println toe:

als(ref == 0){

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

Voeg hierna de hoogteberekening toe:

mtr = ref - gefilterd/12,0;

Wijzig ten slotte de Serial.println-instructie om 'mtr' te verzenden in plaats van 'gefilterd', en voeg code toe om 'mtr' naar het LCD-scherm te sturen:

Serieel.println(mtr); // Stuur druk via serieel (UART)

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

Alle wijzigingen hier zijn opgenomen in het voorbeeld MS5611data2lcd. Laad deze zoals in stap 2.

Er is nog een laatste mod die nuttig is. Het display is moeilijk af te lezen als het 60 keer per seconde wordt bijgewerkt. Ons filter maakt de gegevens glad met een tijdconstante van ongeveer 0,8 s. Dus het scherm om de 0.3s bijwerken lijkt voldoende.

Voeg dus een teller toe na alle andere variabeledefinities aan het begin van de schets (bijvoorbeeld na float ref=0;):

int ik = 0;

Voeg vervolgens code toe om 'i' te verhogen en een 'if'-statement om uit te voeren wanneer het 20 bereikt en zet het dan terug op nul en verplaats de Serial en lcd-commando's binnen de 'if'-statement, zodat deze alleen elke 20e lezing worden uitgevoerd:

ik += 1;

if(i>=20) {Serial.println(mtr); // Stuur druk via seriële (UART) lcd.setCursor (0, 1); // regel 2 lcd.print(mtr); ik = 0; }

Ik heb bij deze laatste wijziging geen voorbeeld toegevoegd om het handmatig invoeren van de code te stimuleren, wat het leren bevordert.

Dit project moet een goed uitgangspunt geven voor bijvoorbeeld een digitale barometer. Voor degenen die het gebruik in RC-modellen willen overwegen - zoek naar OpenXvario voor code die een hoogtemeter en variometer mogelijk maakt voor Frsky en Turnigy 9x telemetriesystemen.

Aanbevolen: