Inhaltsverzeichnis:

Digitaler Kompass und Kursfinder - Gunook
Digitaler Kompass und Kursfinder - Gunook

Video: Digitaler Kompass und Kursfinder - Gunook

Video: Digitaler Kompass und Kursfinder - Gunook
Video: Ausprobiert: Der AKAD Bildungskompass 2024, Juli
Anonim
Digitaler Kompass und Kursfinder
Digitaler Kompass und Kursfinder

Autoren:

Cullan Whelan

Andrew Luft

Blake Johnson

Danksagungen:

Kalifornische Maritime Akademie

Evan Chang-Siu

Einführung:

Grundlage dieses Projektes ist ein digitaler Kompass mit Kursverfolgung. Dies ermöglicht es dem Benutzer, unter Verwendung eines digitalen Geräts einem Kurs über große Entfernungen hinweg zu folgen. Umgangssprachlich ist ein Kurs ein von Norden im Uhrzeigersinn gemessener Winkel, der wie vom Kompass angezeigt als Null Grad angesehen wird. Das Gerät hat zwei Hauptfunktionen: Die erste zeigt den aktuellen Kurs des Geräts auf einer digitalen Anzeigereferenz an und die zweite ist die Möglichkeit, einen vom Benutzer angeforderten Kurs einzugeben, der auf einem LED-Ring oben auf dem Display angezeigt wird Kompassgehäuse. Der Benutzer würde dann die Ausrichtung des Geräts in Bezug auf die beleuchtete LED anpassen. Wenn die Richtung des Geräts geändert wird, wandert die LED zur mittleren LED und zeigt so an, dass der richtige Kurs festgelegt wurde.

Lieferungen:

- DIYmall 6M GPS-Modul

- HiLetgo MPU9250/6500 9-Achsen 9 DOF 16 Bit

- Adafruit NeoPixel-Ring 16

- MakerFocus 4 Stück 3,7 V Lithium-Akku

- ELEGOO MEGA 2560 R3 Platine

- Adafruit Mini Lipo mit Mini-B USB-Buchse - USB LiIon/LiPoly-Ladegerät - v1

- 2,8 TFT LCD mit Touchscreen Breakout Board mit MicroSD Sockel

Schritt 1: Entwerfen der Funktionalität des Projekts

Entwerfen der Funktionalität des Projekts
Entwerfen der Funktionalität des Projekts

Der erste Schritt besteht darin, die Logik und die endgültige Betriebsfunktionalität zu verstehen. Dieses Logikdiagramm zeigt die drei Gerätezustände und die beiden Sensorzustände.

Zustand 1: Ladezustand

Der Ladezustand wird verwendet, damit der Arduino Mega beim Start Daten von den beiden Sensoren zurückholen kann. Das Gerät zeigt das Laden auf dem Bildschirm an, löscht alle Zahlenwerte auf dem Bildschirm und die LEDs am NeoPixel-Ring leuchten in einem Kreis.

Zustand 2: Kompassmodus

In diesem Zustand verhält sich das Gerät wie ein digitaler Kompass. Der NeoPixel-Ring leuchtet auf, um die Nordrichtung in Bezug auf die Ausrichtung des Geräts anzuzeigen. Der wahre Gerätekurs wird zusammen mit dem Breiten- und Längengrad des Geräts auch auf dem LCD-Bildschirm angezeigt. In diesem Zustand kann der Benutzer auch die Benutzerüberschrift eingeben, die in Zustand 3 angezeigt werden soll.

Zustand 3: Kursverfolgungsmodus

In diesem Zustand hilft das Gerät dem Benutzer nun, sich auf dem gewünschten Kurs zu etablieren. Das Gerät zeigt nun den Gerätekurs und den Benutzerkurs auf dem LCD-Bildschirm zusammen mit den Breiten- und Längengraddaten an. Der NeoPixel-Ring leuchtet jetzt auf, um die Richtung des Benutzers in Bezug auf die Geräteausrichtung anzuzeigen.

Sowohl in Zustand 2 als auch in Zustand 3 gibt es zwei Sensorzustände. Diese Sensorzustände ermöglichen es dem Gerät, Daten von dem Sensor abzurufen, der je nach Betriebszustand des Geräts die genauesten Daten liefert.

Sensorzustand 1: MPU

Wenn sich das Gerät nicht bewegt, werden die Kursdaten von der MPU abgerufen, da dies die genauesten Daten sind, wenn sich das Gerät nicht bewegt.

Sensorstatus 2: GPS

Wenn sich das Gerät bewegt, werden die Kursdaten vom GPS-Chip abgerufen, da dies in diesem Zustand die genauesten Daten sind.

Zwischen diesen kann das Gerät jederzeit auf Sensorzustände umschalten, um den sich ändernden Einsatzbedingungen des Gerätes Rechnung zu tragen. Dies ist wichtig für den Betrieb des Geräts, da beide der beiden im Gerät verwendeten Sensoren Bedingungen haben, die die Genauigkeit der von ihnen bereitgestellten Daten beeinflussen. Bei der MPU kann der Chip leicht durch lokale Magnetfelder beeinflusst werden, die durch Autos und Metallbaustoffe in Gebäuden verursacht werden. Somit wird ein GPS-Chip verwendet, der einen viel genaueren Kurs liefern kann, der nicht von den gleichen Einflüssen beeinflusst wird. Das GPS kann jedoch nur bei Bewegung Kursdaten liefern, da es den Kurs anhand der Änderung der Breiten- und Längengraddaten berechnet. Daher ergänzen sich die Chips und bieten durch die Verwendung der beiden Sensorzustände die genaueste und zuverlässigste Gerätefunktionalität.

Schritt 2: Setup und Verdrahtungsplan

Aufbau und Verdrahtungsplan
Aufbau und Verdrahtungsplan
Aufbau und Verdrahtungsplan
Aufbau und Verdrahtungsplan
Aufbau und Verdrahtungsplan
Aufbau und Verdrahtungsplan

Das Projekt verwendet ein Arduino Mega-Clone-Board, das dem obigen Board ähnelt. Alle Komponenten im Projekt werden mit diesem Board verbunden. Oben finden Sie detaillierte Diagramme zum Verdrahten der Komponenten für dieses Projekt. Die Tasten haben keine detaillierte Schaltung, da diese auf viele Arten eingerichtet werden können. In diesem Projekt verwenden sie einen 100K-Pulldown-Widerstand und eine einfache Taste, um ein 3-Volt-Signal an den zugewiesenen Pin zu senden.

Schritt 3: Komponenten und Basiscode testen

Das Projekt wird Daten sowohl von der MPU als auch vom GPS-Chip abrufen, wie zuvor beschrieben. Angehängt sind drei Codes, die das Testen von Daten von MPU, GPS und MPU mit Bildschirm ermöglichen, um die Funktionalität der Teile zu überprüfen. Es ist wichtig, die Komponenten in dieser Phase betriebsbereit zu machen, da der Code für jeden Chip separat ist und alle Probleme behoben werden können, ohne befürchten zu müssen, dass im endgültigen Code unvorhergesehene Fehler verursacht werden.

Erforderliche Bibliotheken:

Adafruit_ILI9341_Albert.h

SPI.h

Adafruit_GFX.h

Adafruit_ILI9341.h

TinyGPS++.h

Adafruit_NeoPixel.h

MPU9250.h

All dies finden Sie, wenn Sie die Titel oben durchsuchen. Ich werde keine Links veröffentlichen, da es viele Kopien dieser Bibliotheken aus mehreren Quellen gibt und sich an den Gemeinschaftsstandard hält, nur auf Originale zu verlinken. Ich lasse Sie diese selbst finden.

Schritt 4: MPU-Kalibrierung

MPU-Kalibrierung
MPU-Kalibrierung

Der über die MPU in State 2 und State 3 gefundene Kurs wurde in vier Quadranten aufgeteilt. Dies war notwendig, da unser Kalibrierungsverfahren das Auffinden der minimalen und maximalen Magnituden des Magnetometers entlang seiner x- und y-Achsen erforderte. Dies geschah, indem das Gerät zufällig um seine drei Achsen gedreht wurde, frei von jeglichen signifikanten elektromagnetischen Feldern außer denen der Erde. Wir haben dann die minimalen und maximalen Werte entlang der x- und y-Achse genommen und sie in eine Skalierungsgleichung eingefügt, um die Beträge zwischen den Werten von negativ eins und eins einzuschränken. In der obigen Abbildung sind BigX und BigY die Maximalwerte der Magnetometerdaten entlang der x- bzw. y-Achse, LittleX und LittleY sind die Minimalwerte der Magnetometerdaten entlang der x- bzw. y-Achse, IMU.getMagX_uT() und IMU.getMagY_uT() sind die Werte, die jederzeit entlang der x- bzw. y-Achse vom Magnetometer gezogen werden, und Mx und My sind die neuen skalierten Werte, die zur Berechnung des Kurses verwendet werden.

Schritt 5: Endgültiger Code

Endgültiger Code
Endgültiger Code
Endgültiger Code
Endgültiger Code
Endgültiger Code
Endgültiger Code
Endgültiger Code
Endgültiger Code

Der letzte Schritt besteht darin, den endgültigen Code zu erstellen. Ich habe eine Kopie des endgültigen Codes des Projekts angehängt. Innerhalb des Codes wurden Notizen gemacht, um die Navigation zu erleichtern. Die größte Herausforderung in diesem Abschnitt bestand darin, die Quadranten zum korrekten Funktionieren zu bringen. Die Implementierung von Quadranten erwies sich als mühsamer und logischer, als wir es je erwartet hätten. Wir haben zunächst ein grundlegendes arctan (My/Mx) implementiert und dann von Radiant in Grad konvertiert, da Arduino standardmäßig im Radiant ausgibt. Der einzige Quadrant, in dem dies funktionierte, war jedoch von 90 Grad bis 180 Grad, was uns ein negatives Ergebnis lieferte und am Ende Quadrant III war. Die Lösung hierfür bestand darin, den absoluten Wert zu nehmen, da er immer noch korrekt inkrementiert wurde. Dieser Wert wurde dann von 360 subtrahiert, um die richtige NeoPixel-LED in Zustand 2 aufleuchten zu lassen, und eine ähnliche mathematische Operation wurde in Zustand 3 verwendet, basierend darauf, ob die Überschrift größer oder kleiner als die vom Benutzer eingegebene Überschrift war, die beide in der obiger Code. In den obigen Abbildungen entspricht Heading dem NeoPixel-Licht, das basierend auf der Differenz zwischen dem Gerätekurs und der Abweichung von Norden im Fall von Zustand 2 und von der des Benutzerkurses aufleuchtet. 90 bis 180 Grad entsprechen in diesem Fall Quadrant III. In beiden Fällen bewirkt tft.print, dass der Bildschirm die Richtung des Geräts von Norden liest.

Für die anderen drei Quadranten führte die Implementierung von arctan(My/Mx) zu einer Invertierung der Inkrementierung, wenn das Gerät gedreht wurde, d. h. der Kurswinkel würde rückwärts zählen, wenn er aufwärts zählen sollte und umgekehrt. Die Lösung für dieses Problem bestand darin, den Arkustangens in die Form arctan(Mx/My) umzudrehen. Dies löste zwar die Invertierungsinversion, lieferte jedoch nicht die richtige Geräteüberschrift, und hier kamen die Quadranten ins Spiel. Die einfache Lösung hierfür bestand darin, eine Verschiebung basierend auf dem entsprechenden Quadranten hinzuzufügen. Dies ist in den folgenden Abbildungen zu sehen, die wiederum Codestücke aus den Zuständen 2 und 3 jedes Quadranten sind.

Die erste if-Anweisung wird ausgeführt, wenn die von der MPU-Gleichung berechnete Überschrift größer als die Benutzerüberschrift ist. Unter dieser Bedingung wird die Eingabeüberschrift des Benutzers zur Geräteüberschrift hinzugefügt und der entsprechende Wert von 360 abgezogen. Wenn die else-Anweisung ausgeführt wird, wird die MPU-Überschriftsgleichung von der Eingabeüberschrift des Benutzers abgezogen. Diese Bedingungen wurden implementiert, um nicht nur einen genauen Wert für das NeoPixel zu erhalten, sondern auch einen Wert außerhalb des akzeptablen Bereichs von 0 bis 359 Grad zu vermeiden.

Empfohlen: