Inhaltsverzeichnis:

Arduino & MPU6050 basierte digitale Wasserwaage - Gunook
Arduino & MPU6050 basierte digitale Wasserwaage - Gunook

Video: Arduino & MPU6050 basierte digitale Wasserwaage - Gunook

Video: Arduino & MPU6050 basierte digitale Wasserwaage - Gunook
Video: Odroid Go mit Kopfhöreranschluss nachrüsten mit I2S DAC am ESP32 GPIO Port 2024, Juli
Anonim
Image
Image
Die Rennbahn
Die Rennbahn

Willkommen zu meinem allerersten instructable! Ich hoffe, Sie finden es informativ. Bitte zögern Sie nicht, Feedback zu hinterlassen, egal ob positiv oder negativ.

Dieses Projekt soll eine digitale Wasserwaage auf Arduino- und MPU6050-Basis herstellen. Während das fertige Design und der Code von mir stammen, sind es das ursprüngliche Konzept und ein Großteil des Codes, mit dem ich gearbeitet habe, nicht. Ich bin kein Freund von Plagiaten, daher bin ich mehr als glücklich, den Ideen, auf denen ich aufgebaut habe, Anerkennung zu zollen. Die 2 Hauptleute, denen ich einen Gruß aussprechen möchte, sind Paul McWhorter und DroneBot Workshop von YouTuber. Ich füge Links zu ihnen in mein YouTube-PDF mit nützlichen Links ein. Vielen Dank auch an EEEnthusiast für sein informatives Video zur Verwendung des MPU6050 einschließlich des Einrichtens und Auslesens des Moduls ohne externe Bibliothek (sein Link befindet sich im selben PDF).

Das Projekt, das ich produziert habe, funktioniert "wie es ist" und ist märchenhaft, sicherlich bis zu 45% in beide Richtungen. Sie können es genau so verwenden, wie ich es entworfen habe, oder Sie können es nach Ihrem eigenen Geschmack anpassen. Die Klugen von Ihnen werden feststellen, dass mein Projekt fast identisch mit dem von der DroneBot-Werkstatt aussieht, aber seien Sie versichert, dass es erhebliche Unterschiede gibt, insbesondere wenn es um den Code zur Berechnung von Winkeln geht, sowie die Möglichkeit, Kalibrierungswerte in zu speichern Eeprom!

Einige Funktionen, die Ihren Appetit anregen:

Nick- und Rollwinkel sind bis auf 0,1 Grad verfügbar.

Automatische Erkennung der Ausrichtung der Kreiseleinheit (horizontal oder vertikal)

Vollständige Kalibrierung mit Ergebnissen, die automatisch im EEPROM gespeichert werden

LED-Anzeige von -2 bis +2 Grad (im Code änderbar)

Zusätzliche akustische Pegelanzeige (kann im laufenden Betrieb ein- und ausgeschaltet werden)

Kompakter Stromkreis mit minimalen Komponenten

Lass uns anfangen.

Lieferungen

Dieses Projekt (wie es ist) verwendet die folgenden Elemente:

1 x Arduino Nano (meiner ist ein Klon)

1 x MPU6050 Gyro-/Beschleunigungsmesser-Modul

1 x LCD - 16 x 2 + I2C-Anschluss

1 x Push-to-Make-Schalter

1 x Piezo-Summer

1 x grüne LED

2 x gelbe LEDs

2 x rote LEDs

5 x 220 Ohm Widerstände

Diverse Starthilfekabel

Steckbrett

Stromversorgung (meine verwendet eine 5-V-USB-Powerbank, wenn sie nicht an meinen PC angeschlossen ist, aber Sie können eine entsprechend angeschlossene Batterie verwenden)

Schritt 1: Die Schaltung

Die Rennbahn
Die Rennbahn
Die Rennbahn
Die Rennbahn

Vorausgesetzt, Sie haben alle Komponenten, müssen Sie Ihr Steckbrett bauen.

Ich zeige mein Setup als Anleitung, aber die Verbindungen sind wie folgt:

Der Arduino-Pin D2 ist mit einer Seite des Druckschalters verbunden. Die andere Seite des Druckschalters ist mit Masse verbunden

Der Arduino-Pin D3 ist mit einer Seite des 220-Ohm-Widerstands verbunden. Die andere Seite des Widerstands ist mit der Anode der roten LED verbunden. Kathode der roten LED geht auf Masse.

Der Arduino-Pin D4 ist mit einer Seite des 220-Ohm-Widerstands verbunden. Die andere Seite des Widerstands ist mit der Anode der gelben LED verbunden. Kathode der gelben LED geht auf Masse.

Der Arduino-Pin D5 ist mit einer Seite des 220-Ohm-Widerstands verbunden. Die andere Seite des Widerstands ist mit der Anode der grünen LED verbunden. Kathode der grünen LED geht auf Masse.

Der Arduino-Pin D6 ist mit einer Seite des 220-Ohm-Widerstands verbunden. Die andere Seite des Widerstands ist mit der Anode der gelben LED verbunden. Kathode der gelben LED geht auf Masse.

Der Arduino-Pin D7 ist mit einer Seite des 220-Ohm-Widerstands verbunden. Die andere Seite des Widerstands ist mit der Anode der roten LED verbunden. Kathode der roten LED geht auf Masse.

Der Arduino-Pin D8 ist mit einer Seite des Piezo-Summers verbunden. Die andere Seite des Summers ist mit Masse verbunden.

Der Arduino-Pin A4 wird mit den SDA-Pins des MPU6050 UND des LCD verbunden.

Arduino-Pin A5 verbindet sich mit den SCL-Pins des MPU6050 UND des LCD

5V Power und Gnd für MPU6050 und LCD kommen von den Arduino Nano 5V- bzw. GND-Pins.

Sobald es fertig ist, sollte es meinem gezeigten Setup ähneln. Ich habe Blu Tak unter die MPU6050 gelegt, um sie zu stoppen, und auch auf das LCD, um sie am Rand des Steckbretts zu halten.

Schritt 2: Der Code

Der beigefügte Code ist der Code, den ich für dieses Projekt verwendet habe. Die einzige Bibliothek, mit der Sie möglicherweise ein Problem haben, ist die

LiquidCrystal_I2C.h-Bibliothek, wie ich diese importiert habe, als ich anfing, mit LCDs zu arbeiten. Leider gibt es einige Bibliotheken, die dieselbe #include-Anweisung verwenden, sich jedoch geringfügig unterscheiden. Wenn Sie Probleme mit Ihrem haben, suchen Sie einen anderen LCD-Code, der für Sie funktioniert, und ändern Sie den Code entsprechend. Es ist wahrscheinlich nur das Setup, das sich unterscheidet. Alle 'print'-Befehle sollten gleich funktionieren.

Der gesamte Code wurde kommentiert und vorausgesetzt, ich habe es richtig gemacht, wird es auch ein Video geben, das alles erklärt, aber hier sind ein paar Punkte zu beachten:

LiquidCrystal_I2C lcd(0x27, 16, 2);

Der obige Code ist das Setup für mein LCD. Wenn Ihre Bibliothek anders ist, müssen Sie möglicherweise nicht nur Ihre Bibliothek, sondern auch diese Zeile ändern.

{ lcd.setCursor (0, 1); lcd.print("Horizontal!"); Ausrichtung = HORIZONTAL; // Lesen Sie die rohen Acc- und Gyro-Daten 1000 Mal von der MPU-6050 für (int cal_int = 0; cal_int < 1000; cal_int ++) {read_mpu_6050_data(); // Den Kreisel-X-Offset zur gyro_x_cal-Variablen hinzufügen gyro_x_cal += gyro_x; // Den Kreisel-Y-Offset zur gyro_y_cal-Variablen hinzufügen gyro_y_cal += gyro_y; // Den Kreisel-Z-Offset zur gyro_z_cal-Variablen hinzufügen gyro_z_cal += gyro_z; // Addiere den acc x-Offset zur acc_x_cal-Variablen acc_x_cal += acc_x; //Addiere den Acc y-Offset zur acc_y_cal-Variablen acc_y_cal += acc_y; } // Alle Ergebnisse durch 1000 teilen, um den durchschnittlichen Offset zu erhalten gyro_x_cal /= 1000.0; gyro_y_cal /= 1000.0; gyro_z_cal /= 1000.0; acc_x_cal /= 1000.0; acc_y_cal /= 1000.0; horizontale Kalibrierung = 255; eeprom_adresse = 0; EEPROM.put(eeprom_address, horizonalCalibration); eeprom_address += sizeof(int); EEPROM.put(eeprom_address, gyro_x_cal); eeprom_address += sizeof(float); EEPROM.put(eeprom_address, gyro_y_cal); eeprom_address += sizeof(float); EEPROM.put(eeprom_address, gyro_z_cal); eeprom_address += sizeof(float); EEPROM.put(eeprom_address, acc_x_cal); eeprom_address += sizeof(float); EEPROM.put(eeprom_address, acc_y_cal); eeprom_address += sizeof(float); // Beachten Sie, dass wir aufgrund der Schwerkraft keinen Offset für acc_z speichern! Verzögerung (500); }

Der obige Codeblock wird zur Kalibrierungsroutine ausgeführt. Dieser Code ist für die horizontale Kalibrierung. Es gibt einen nahezu identischen Code für die vertikale Kalibrierung (beachten Sie, dass der Code weiß, ob Ihr MPU6050 horizontal oder vertikal montiert ist!). MPU6050, wird 1000 Mal gelesen. geeignete Werte werden kumulativ addiert und dann durch 1000 geteilt, um einen durchschnittlichen "Offset"-Wert zu erhalten. Diese Werte werden dann im Nano-Eeprom gespeichert. Alle horizontalen Kalibrierungswerte werden beginnend bei Eeprom-Adresse 0 gespeichert. Alle vertikalen Werte werden beginnend bei Eeprom-Adresse 24 gespeichert. Die Kalibrierung MUSS auf einer vollständig ebenen Fläche durchgeführt werden, sonst bedeuten sie nichts.

/* * Die nächsten Zeilen verarbeiten die Rohdaten, um sie in Winkel umzuwandeln, die auf dem LCD und den LEDs ausgegeben werden können. * Der Wert von 4096, durch den die Beschleunigungsdaten geteilt werden, stammt aus dem MPU6050-Datenblatt und basiert auf der Abtastrate. * Der Wert von 9,8 ist die Schwerkraft * Die atan2-Funktion stammt aus dem Mathematikmodul und wird verwendet, um die Winkel aus den gegebenen Daten zu berechnen */ thetaM =-atan2((acc_x/4096.0)/9.8, (acc_z/4096.0)/9.8) /2/3,141592656 * 360; //Rohdaten phiM =-atan2((acc_y/4096.0)/9.8, (acc_z/4096.0)/9.8)/2/3.141592656 * 360; //Rohdaten dt=(millis()-millisOld)/1000.; millisAlt=millis(); /* * Dieser Abschnitt verwendet die Kreiseldaten, um das System reaktionsschneller zu machen * Der Wert von 65,5, durch den die Kreiseldaten geteilt werden, stammt aus dem MPU6050-Datenblatt und basiert auf der Abtastrate */ theta=(theta+(gyro_y/ 65,5)*dt)*,96 + thetaM*,04; //Tiefpassfilter phi=(phi+(gyro_x/65.5)*dt)*.96 + phiM*.04; //Tiefpassfilter

Der obige Code ist das Zeug, das die Winkel berechnet. Hoffentlich geben die Kommentare einen kleinen Einblick in die Funktionsweise, aber für eine ausführliche Erklärung sehen Sie sich das Video von Paul McWhorters an, auf das im angehängten PDF verlinkt ist. Was ich jedoch sagen werde, ist, dass Sie die Abtastrate für den Kreisel und den Beschleunigungsmesser ändern können (was in der Setup-Unterroutine MPU6050 am Ende meines Codes erfolgt). Wenn Sie die Abtastrate ändern, müssen Sie auch ändern, durch wie viel die Rohdaten geteilt werden. Für die Beschleunigungsmesserdaten beträgt der aktuelle Wert 4096. Für den Kreisel beträgt der aktuelle Wert 65,5.

In den beigefügten Datenblättern und dem Video von EEEntusiast (Link im beigefügten PDF) finden Sie ausführlichere Informationen darüber, wie die Abtast- und Offsetwerte ermittelt werden.

Schritt 3: Nächste Schritte

Zu diesem Zeitpunkt wird dieses Projekt hoffentlich geschafft sein, aber was nun?

Erstens, warum bauen Sie es nicht tatsächlich in eine Wasserwaage ein, die Sie verwenden können. Sie können eine billige Wasserwaage kaufen (stellen Sie sicher, dass es sich um den Boxtyp handelt), die Sie anpassen können, oder wenn Sie das Kit haben, drucken Sie Ihre eigene Wasserwaage / Box.

Spielen Sie vielleicht mit den Abtastraten des Kreisels und des Beschleunigungsmessers herum, um zu sehen, ob sie bei einer Rate besser funktionieren als bei einer anderen.

Versuchen Sie, den Code weiter zu verfeinern. Zum Beispiel ist der angegebene Winkel derzeit jenseits von 45 Grad, gelinde gesagt, grob. Gibt es einen Weg, es zu umgehen?

Wenn Sie Fragen haben, egal wie einfach sie erscheinen mögen, stellen Sie diese bitte. Wenn ich helfen kann, werde ich es tun.

Wenn Sie dieses instructable mögen, geben Sie ihm bitte ein Like, damit ich weiß.

Wenn Sie dies tun, zeigen Sie es mir bitte (insbesondere wenn es sich um einen funktionierenden Fall handelt).

DANKE SCHÖN

Empfohlen: