Inhaltsverzeichnis:

Arduino atmosphärisches Maßband / MS5611 GY63 GY86 Demonstration - Gunook
Arduino atmosphärisches Maßband / MS5611 GY63 GY86 Demonstration - Gunook

Video: Arduino atmosphärisches Maßband / MS5611 GY63 GY86 Demonstration - Gunook

Video: Arduino atmosphärisches Maßband / MS5611 GY63 GY86 Demonstration - Gunook
Video: PlasmaTEC X - Atmosphärisches Plasma System mit verbesserten Eigenschaften 2024, Juli
Anonim
Arduino atmosphärisches Maßband / MS5611 GY63 GY86 Demonstration
Arduino atmosphärisches Maßband / MS5611 GY63 GY86 Demonstration

Dies ist wirklich ein Barometer/Höhenmesser, aber Sie werden den Grund für den Titel sehen, wenn Sie sich das Video ansehen.

Der Drucksensor MS5611, der auf den Arduino GY63- und GY86-Breakout-Boards zu finden ist, liefert eine erstaunliche Leistung. An einem ruhigen Tag wird Ihre Körpergröße auf 0,2 m genau gemessen. Dies misst effektiv die Entfernung von Ihrem Kopf zum Weltraum und subtrahiert sie von der Entfernung Ihrer Füße zum Weltraum (durch Messen des Drucks – das ist das Gewicht der Luft darüber). Dieses spektakuläre Gerät hat eine Reichweite, die bequem die Höhe des Everest misst - und kann auch bis zu ein paar Zentimeter messen.

Dieses Projekt war wie folgt ausgerichtet: ein Schulprojekt, ein Beispiel für die Modifikation von Arduino-Code und ein guter Ausgangspunkt, um den MS5611-Sensor zu erkunden. Es gibt viele Forenfragen von denen, die Schwierigkeiten mit diesem Sensor haben. Der Ansatz hier macht die Verwendung sehr einfach. Nach Abschluss dieses Projekts sind Sie gut gerüstet, um andere druckbezogene Anwendungen zu entwickeln.

Jeder Sensor hat seine eigenen Kalibrierkonstanten, die gelesen und zur Korrektur der Daten verwendet werden müssen. Es steht eine Bibliothek zur Verfügung, um diese zu unterstützen. Der hier gezeigte Code verwendet die Bibliothek, um Messwerte zu erfassen, konvertiert sie dann in Höhe und zeigt sie auf einem LCD-Schild an.

Zunächst senden wir die Daten für erste Tests an den seriellen Monitor am PC/Laptop. Diese zeigen etwas Rauschen und daher fügen wir einen Filter hinzu, um sie zu glätten. Dann fügen wir ein LCD-Display hinzu, damit das Gerät unabhängig laufen kann und Sie versuchen können, Ihre Körpergröße zu messen – oder etwas anderes.

Beachten Sie, dass die GY63-Platine nur den MS5611-Drucksensor hat. Das GY86 wird als 10 Freiheitsgrad-Board bezeichnet und enthält auch einen 3-Achsen-Beschleunigungsmesser, einen 3-Achsen-Gyro und einen 3-Achsen-Magnetometer für nur ein paar $ mehr.

Du wirst brauchen:

1. Arduino UNO (oder ein anderes mit Standard-Pinout) und sein USB-Kabel

2. GY63 Breakout-Board oder GY86

3. 4 Dupont-Kabel männlich-weiblich - oder Anschlusskabel

4. Arduino LCD-Tastaturschild

5. 9V Batterie und Blei

6. 2,54 mm Steckdosenleiste (optional, aber empfohlen)

Vorbereitung

Laden Sie die Arduino IDE (integrierte Entwicklungsumgebung) herunter von:

Einige technische Bits für Interesse

Der MS5611 liefert seine hervorragende Leistung durch die Mittelung einer großen Anzahl von Messungen. Es kann 4096 3 Byte (24 Bit) analoge Messungen in nur 8 ms durchführen und den Durchschnittswert ausgeben. Es muss sowohl Druck als auch Temperatur messen, damit die Druckdaten um die Innentemperatur korrigiert werden können. Daher kann es etwa 60 Paare von Druck- und Temperaturmessungen pro Sekunde liefern.

Das Datenblatt ist verfügbar unter:

Die Kommunikation erfolgt über I2C. So können sich andere I2C-Sensoren den Bus teilen (wie es beim GY86 10DOF-Board der Fall ist, wo sich alle Chips auf I2C befinden).

Schritt 1: Holen Sie sich eine MS5611-Bibliothek

Viele der Arduino-Sensoren verwenden entweder eine Standardbibliothek, die in der Arduino-IDE enthalten ist, oder werden mit einer ZIP-Datei mit einer einfach zu installierenden Bibliothek geliefert. Dies ist bei den MS5611-Sensoren in der Regel nicht der Fall. Eine Suche ergab jedoch: https://github.com/gronat/MS5611, die eine Bibliothek für den MS5611 enthält, einschließlich der Durchführung der Temperaturkorrektur.

Option 1

Rufen Sie die obige Website auf, klicken Sie auf „Klonen oder Herunterladen“und wählen Sie „ZIP herunterladen“. Dies sollte MS5611-master.zip in Ihr Download-Verzeichnis liefern. Verschieben Sie es jetzt, wenn Sie möchten, in einen Ordner, in dem Sie es in Zukunft finden können. Ich verwende ein Verzeichnis namens "data", das zu meinen Arduino-Ordnern hinzugefügt wurde.

Leider enthält die heruntergeladene.zip-Datei keine Beispielskizzen und es wäre schön, die Bibliothek und Beispiele zur Arduino-IDE hinzuzufügen. In der Datei README.md befindet sich ein Mindestbeispiel, das kopiert und in eine Skizze eingefügt und gespeichert werden kann. Dies ist ein Weg, um loszulegen.

Option 2

Um es einfacher zu machen, den Code in diesem anweisbaren auszuführen, habe ich das obige Mindestbeispiel und die hier gezeigten Beispiele der Bibliothek hinzugefügt und eine.zip-Datei unten angehängt, die in die Arduino IDE installiert wird.

Laden Sie die Zip-Datei unten herunter. Verschieben Sie dies bei Bedarf in einen besseren Ordner.

Starten Sie die Arduino-IDE. Klicken Sie auf Skizze>Bibliothek einschließen>ZIP-Datei hinzufügen und wählen Sie die Datei aus. Starten Sie die IDE neu. Die IDE hat nun sowohl die Bibliothek als auch alle hier gezeigten Beispiele installiert. Überprüfen Sie, indem Sie auf Datei>Beispiele>>MS5611-Master klicken. Drei Skizzen sollten aufgelistet werden.

Schritt 2: Verbinden Sie den Sensor mit dem Arduino und testen Sie

Verbinden Sie den Sensor mit dem Arduino und testen Sie
Verbinden Sie den Sensor mit dem Arduino und testen Sie
Verbinden Sie den Sensor mit dem Arduino und testen Sie
Verbinden Sie den Sensor mit dem Arduino und testen Sie

Die GY63/GY86-Boards werden normalerweise mit Headern geliefert, die jedoch nicht verlötet sind. Es ist also Ihre Wahl, entweder die Header an Ort und Stelle zu löten und männlich-weibliche Dupont-Leitungen zu verwenden, oder (wie ich entschieden habe) Lötleitungen direkt an die Platine und fügen Sie der Leitung Pins hinzu, um sie in das Arduino einzustecken. Die letztere Option ist besser, wenn Sie denken, dass Sie die Platine später in ein Projekt einlöten möchten. Ersteres ist besser, wenn Sie das Board zum Experimentieren verwenden möchten. Das Ablöten von Kabeln ist viel einfacher als eine Stiftleiste.

Die erforderlichen Anschlüsse sind:

GY63/GY86 Arduino

VCC - 5V Power GND - GND Ground SCL - A5 I2C-Takt >SDA - A4 I2C-Daten

Befestigen Sie die Sensorplatine wie oben am Arduino und verbinden Sie den Arduino über sein USB-Kabel mit dem PC/Laptop. Decken Sie den Sensor auch mit etwas undurchsichtigem/schwarzem Material ab. Der Sensor ist lichtempfindlich (wie bei den meisten Sensoren dieser Art).

Starten Sie die Arduino-IDE. Klicken:

Datei>Beispiele>>MS5611-Master>MS5611data2serial.

Eine neue Instanz der IDE wird mit der Skizze angezeigt. Klicken Sie auf die Schaltfläche zum Hochladen (rechter Pfeil).

Als nächstes starten Sie den seriellen Plotter – klicken Sie auf Tools>Serial Plotter und stellen Sie ggf. die Baud auf 9600. Die gesendeten Daten sind der Druck in Pascal. Nach ungefähr einer Sekunde wird es neu skaliert und das Anheben und Absenken des Sensors um sagen wir 0,3 m sollte als Absenken und Anheben der Spur angezeigt werden (geringere Höhe ist höherer Druck).

Die Daten sind verrauscht. Siehe erste Handlung oben. Dies kann mit einem digitalen Filter (ein wirklich nützliches Werkzeug) geglättet werden.

Die Filtergleichung lautet:

Wert = Wert + K(Neuwert)

wobei „Wert“die gefilterten Daten und „neu“die zuletzt gemessenen Daten sind. Bei K=1 erfolgt keine Filterung. Für niedrigere Werte von K werden die Daten mit einer Zeitkonstante von T/K geglättet, wobei T die Zeit zwischen den Abtastungen ist. Hier beträgt T etwa 17 ms, so dass ein Wert von 0,1 eine Zeitkonstante von 170 ms oder etwa 1/6 s ergibt.

Der Filter kann hinzugefügt werden durch:

Fügen Sie vor setup() eine Variable für die gefilterten Daten hinzu:

Float gefiltert = 0;

Fügen Sie dann die Filtergleichung nach dem Druck hinzu = …. Leitung.

gefiltert = gefiltert + 0,1*(druckgefiltert);

Es empfiehlt sich, den gefilterten Wert auf den ersten Messwert zu initialisieren. Fügen Sie also eine 'if'-Anweisung um die obige Zeile hinzu, die dies tut, damit es wie folgt aussieht:

if(gefiltert != 0){

gefiltert = gefiltert + 0,1*(druckgefiltert); aufrechtzuerhalten. Sonst { gefiltert = Druck; // erste Lesung, also gefiltert auf Lesen setzen}

Der Test ‚!=‘ist ‚ungleich‘. Wenn „gefiltert“also ungleich 0 ist, wird die Filtergleichung ausgeführt, aber wenn ja, wird sie auf den Druckmesswert gesetzt.

Zuletzt müssen wir in der Serial.println-Anweisung „Druck“in „gefiltert“ändern, damit wir den gefilterten Wert sehen.

Das beste Lernen wird erreicht, indem die oben genannten Änderungen manuell vorgenommen werden. Diese habe ich jedoch in das Beispiel MS5611data2serialWfilter aufgenommen. Bei Problemen kann das Beispiel also geladen werden.

Laden Sie nun den Code auf den Arduino hoch und sehen Sie die Verbesserung. Siehe zweites Diagramm oben und beachten Sie, dass die Y-Skala um x2 erweitert wird.

Versuchen Sie einen niedrigeren Wert für die Filterkonstante, sagen wir 0,02 statt 0,1, und sehen Sie den Unterschied. Die Daten sind glatter, aber mit einer langsameren Reaktion. Dies ist ein Kompromiss, der bei der Verwendung dieses einfachen Filters gesucht werden muss. Die Charakteristik ist die gleiche wie bei einem RC-Filter (Widerstand und Kapazität), der häufig in elektronischen Schaltungen verwendet wird.

Schritt 3: Machen Sie es eigenständig

Jetzt fügen wir einen LCD-Tastaturschild hinzu, wandeln den Druck in die Höhe in Metern um und zeigen ihn auf dem Display an. Wir werden auch die Möglichkeit hinzufügen, den Wert auf Null zu setzen, indem Sie die Taste „Auswählen“auf der Tastatur drücken.

Mit dem LCD-Schild des Arduino muss der Sensor mit dem LCD-Schild verbunden werden. Leider kommen die LCD-Schirme meist ohne die entsprechenden Buchsen. Die Optionen sind also, Lötverbindungen herzustellen oder eine Buchsenleiste zu besorgen. Steckdosenleisten gibt es bei ebay für nicht viel mehr als die Versandkosten. Suchen Sie nach „2,54 mm Buchsenleiste“und suchen Sie nach solchen, die denen auf dem Arduino ähneln. Diese sind normalerweise in 36 oder 40 Pin-Längen erhältlich. Ich würde die gedrehten Stifte vermeiden, da sie für Standard-Dupont-Kabel nicht tief genug sind.

Die Steckdosenleiste muss abgelängt werden und der Schnitt muss an der gleichen Stelle wie ein Stift erfolgen. Also für eine 6-Stift-Leiste – entfernen Sie den 7. Stift mit einer feinen Zange und schneiden Sie dann an dieser Stelle mit einer Junior-Bügelsäge ab. Ich feile die Enden, um sie ordentlich zu machen.

Achten Sie beim Auflöten auf die Platine darauf, dass keine Lötbrücken vorhanden sind.

Mit der entsprechenden Entscheidung zum Anschluss des Sensors stecken Sie das LCD-Shield auf den Arduino und verbinden den Sensor mit den gleichen Pins – jetzt aber auf dem LCD-Shield.

Halten Sie auch die Batterie und das Blei bereit. Ich habe meinen Vorsprung aus Teilen in meiner Schrotttonne aufgebaut, aber sie sind auch bei ebay erhältlich – einschließlich einer schönen Option, die eine Batteriebox und einen Schalter beinhaltet. Suchen Sie nach „PP3 2,1 mm Leitung“.

Der Stromverbrauch liegt bei ca. 80mA. Wenn Sie also länger als ein paar Minuten laufen möchten, sollten Sie eine größere 9-V-Batterie als die PP3 in Betracht ziehen.

Schritt 4: Code für Höhe und LCD hinzufügen

Image
Image

Wir müssen etwas mehr codieren, um den Druck in die Höhe umzuwandeln und das Display zu steuern.

Fügen Sie am Anfang der Skizze die Anzeigebibliothek hinzu und teilen Sie mit, welche Pins verwendet werden:

#enthalten

// die Bibliothek mit den Nummern der Schnittstellenpins initialisieren LiquidCrystal lcd (8, 9, 4, 5, 6, 7);

Als nächstes brauchen wir einige Variablen und eine Funktion, um die Tasten der Tastatur zu lesen. Diese sind alle mit dem Analogeingang A0 verbunden. Jede Taste gibt A0 eine andere Spannung. Eine Suche nach 'arduino lcd Shield Buttons Code' fand guten Code unter:

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

Fügen Sie diesen Code vor setup() hinzu:

// Definiere einige Werte, die vom Panel und den Schaltflächen verwendet werden

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 // Lese die Schaltflächen int read_LCD_buttons() { adc_key_in = analogRead(0); // den Wert vom Sensor lesen // meine Tasten sind beim Lesen auf diese Werte zentriert: 0, 144, 329, 504, 741 // wir addieren ca. 50 zu diesen Werten und prüfen, ob wir nahe dran sind, wenn (adc_key_in > 1000) btnNONE zurückgeben; // Wir machen dies aus Geschwindigkeitsgründen zur ersten Option, da dies das wahrscheinlichste Ergebnis ist if (adc_key_in < 50) return 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; btnNONE zurückgeben; // wenn alle anderen fehlschlagen, gib dies zurück… }

Die Höhe wird normalerweise am Startpunkt auf Null gesetzt. Wir brauchen also Variablen sowohl für die Höhe als auch für die Referenz. Fügen Sie diese vor setup() und der obigen Funktion hinzu:

Schwimmer mtr;

Schwimmerref = 0;

Die Umrechnung von Druck in Pascal in Meter ist auf Meereshöhe fast genau eine Division durch 12. Diese Formel ist für die meisten bodenbasierten Messungen geeignet. Es gibt genauere Formeln, die für die Umrechnung in großen Höhen geeigneter sind. Verwenden Sie diese, wenn Sie damit die Höhe einer Ballonfahrt aufzeichnen möchten.

Die Referenz sollte auf den ersten Druckmesswert eingestellt werden, also beginnen wir mit der Nullhöhe und wenn die SELECT-Taste gedrückt wird. Fügen Sie nach dem Filtercode und vor der Serial.println-Anweisung hinzu:

if(ref == 0){

ref = gefiltert/12,0; aufrechtzuerhalten. Wenn (read_LCD_buttons() == btnSELECT) {ref = gefiltert / 12,0; }

Danach fügen Sie die Höhenberechnung hinzu:

mtr = ref - gefiltert/12,0;

Zuletzt ändern Sie die Serial.println-Anweisung, um ‚mtr‘anstelle von ‚gefiltert‘zu senden, und fügen Sie Code hinzu, um ‚mtr‘an das LCD zu senden:

Serial.println (mtr); // Druck seriell senden (UART)

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

Alle Änderungen hier sind im Beispiel MS5611data2lcd enthalten. Laden Sie diese wie in Schritt 2.

Es gibt eine letzte Mod, die hilfreich ist. Das Display ist bei einer 60-mal-Sekunde-Aktualisierung schlecht ablesbar. Unser Filter glättet die Daten mit einer Zeitkonstante von etwa 0,8s. Das Aktualisieren des Displays alle 0,3s scheint also ausreichend zu sein.

Fügen Sie also am Anfang der Skizze nach allen anderen Variablendefinitionen einen Zähler hinzu (z. B. nach float ref=0;):

int i = 0;

Fügen Sie dann Code hinzu, um 'i' und eine 'if'-Anweisung zu inkrementieren, die ausgeführt wird, wenn sie 20 erreicht, und setzen Sie sie dann auf Null zurück und verschieben Sie die Serial- und lcd-Befehle innerhalb der 'if'-Anweisung, sodass diese nur bei jedem 20. Lesen ausgeführt werden:

ich += 1;

Wenn (i> = 20) {Serial.println (mtr); // Druck über seriell (UART) senden lcd.setCursor (0, 1); // Zeile 2 lcd.print (mtr); ich = 0; }

Ich habe dieser letzten Modifikation kein Beispiel beigefügt, um die manuelle Eingabe des Codes zu fördern, was das Lernen erleichtert.

Dieses Projekt soll einen guten Ausgangspunkt zB für ein digitales Barometer geben. Für diejenigen, die die Verwendung in RC-Modellen in Betracht ziehen möchten, suchen Sie nach OpenXvario nach Code, der einen Höhenmesser und ein Variometer für Frsky- und Turnigy 9x-Telemetriesysteme ermöglicht.

Empfohlen: