Spisu treści:

Kompas cyfrowy i wyszukiwarka kierunku: 6 kroków
Kompas cyfrowy i wyszukiwarka kierunku: 6 kroków

Wideo: Kompas cyfrowy i wyszukiwarka kierunku: 6 kroków

Wideo: Kompas cyfrowy i wyszukiwarka kierunku: 6 kroków
Wideo: Jak ustawić antenę satelitarną na ASTRA i HOT BIRD miernikiem Satellite Finder + foto multifocus 2024, Listopad
Anonim
Cyfrowy kompas i wyszukiwarka kierunków
Cyfrowy kompas i wyszukiwarka kierunków

Autorski:

Cullan Whelan

Andrzej Luft

Blake Johnson

Podziękowanie:

Kalifornijska Akademia Morska

Evan Chang-Siu

Wstęp:

Podstawą tego projektu jest cyfrowy kompas ze śledzeniem kursu. Umożliwia to użytkownikowi śledzenie kursu na duże odległości za pomocą aparatu cyfrowego. Potocznie kurs jest kątem mierzonym zgodnie z ruchem wskazówek zegara od północy, który jest uważany za zero stopni, jak wskazuje kompas. Urządzenie ma dwie główne funkcje: pierwsza to wyświetlanie aktualnego kursu urządzenia na cyfrowym wskaźniku odniesienia, a druga to możliwość wprowadzenia żądanego przez użytkownika kursu, który będzie wyświetlany na pierścieniu diod LED na górze obudowa kompasu. Użytkownik mógłby wtedy dostosować orientację urządzenia w odniesieniu do podświetlonej diody LED. Gdy kierunek urządzenia zostanie zmieniony, dioda LED przesunie się do środkowej diody LED, wskazując w ten sposób, że ustanowiono prawidłowy kurs.

Kieszonkowe dzieci:

- Moduł GPS DIYmall 6M

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

- Pierścień Adafruit NeoPixel 16

- MakerFocus 4 szt. Akumulator litowy 3,7 V;

-Płyta ELEGOO MEGA 2560 R3

- Adafruit Mini Lipo z gniazdem Mini-B USB - Ładowarka USB LiIon/LiPoly - v1

- Wyświetlacz LCD TFT o przekątnej 2,8 cala z płytką zaciskową z ekranem dotykowym i gniazdem MicroSD

Krok 1: Projektowanie funkcjonalności projektu

Projektowanie Funkcjonalności Projektu
Projektowanie Funkcjonalności Projektu

Pierwszym krokiem jest zrozumienie logiki i ostatecznej funkcjonalności operacyjnej. Ten schemat logiczny przedstawia trzy stany urządzenia i dwa stany czujników.

Stan 1: Stan ładowania

Stan ładowania umożliwia Arduino Mega odzyskanie danych z dwóch czujników po uruchomieniu. Urządzenie wyświetli ładowanie na ekranie, wyczyści wszystkie wartości liczbowe na ekranie, a diody LED na pierścieniu NeoPixel zaświecą się w kółko.

Stan 2: Tryb kompasu

W tym stanie urządzenie będzie działać jak cyfrowy kompas. Pierścień NeoPixel zaświeci się, wskazując kierunek północny w odniesieniu do orientacji urządzenia. Prawdziwy nagłówek urządzenia będzie również wyświetlany na ekranie LCD wraz z szerokością i długością geograficzną urządzenia. W tym stanie użytkownik będzie mógł również wprowadzić nagłówek użytkownika, który będzie wyświetlany w stanie 3.

Stan 3: Tryb śledzenia kursu

W tym stanie urządzenie pomoże teraz użytkownikowi ustawić się na pożądanym kursie. Urządzenie wyświetli teraz kierunek urządzeń i użytkowników na ekranie LCD wraz z danymi o szerokości i długości geograficznej. Pierścień NeoPixel zaświeci się teraz, wskazując kierunek użytkowników w odniesieniu do orientacji urządzeń.

Zarówno w stanie 2, jak i w stanie 3 istnieją dwa stany czujnika, te stany czujnika umożliwiają urządzeniu pobieranie danych z czujnika, który zapewnia najdokładniejsze dane w zależności od stanu pracy urządzenia.

Stan czujnika 1: MPU

Jeśli urządzenie się nie porusza, dane kierunku zostaną pobrane z MPU, ponieważ są to najdokładniejsze dane, gdy urządzenie się nie porusza.

Stan czujnika 2: GPS

Jeśli urządzenie się porusza, dane kierunku zostaną pobrane z chipa GPS, ponieważ są to najdokładniejsze dane w tych warunkach.

Urządzenie może w dowolnym momencie przełączać się między tymi stanami a czujnikami, aby uwzględnić zmieniające się warunki użytkowania urządzenia. Jest to ważne dla działania urządzenia, ponieważ oba czujniki zastosowane w urządzeniu mają warunki, które wpływają na dokładność dostarczanych przez nie danych. W przypadku MPU na chip mogą łatwo wpływać lokalne pola magnetyczne wytwarzane przez samochody i metalowe materiały konstrukcyjne w budynkach. W ten sposób używany jest chip GPS, który może zapewnić znacznie dokładniejszy kurs, na który nie wpływają te same czynniki. Jednak GPS może dostarczać dane o kursie tylko podczas ruchu, ponieważ oblicza kierunek na podstawie zmian danych o szerokości i długości geograficznej. Dlatego chipy wzajemnie się uzupełniają i wykorzystując dwa stany czujników zapewniają najbardziej dokładną i niezawodną funkcjonalność urządzenia.

Krok 2: Konfiguracja i schemat połączeń

Konfiguracja i schemat połączeń
Konfiguracja i schemat połączeń
Konfiguracja i schemat połączeń
Konfiguracja i schemat połączeń
Konfiguracja i schemat połączeń
Konfiguracja i schemat połączeń

Projekt wykorzystuje płytkę klonu Arduino Mega podobną do powyższej płyty. Wszystkie komponenty w projekcie zostaną podłączone do tej płyty. Powyżej znajdują się szczegółowe diagramy, jak okablować komponenty do tego projektu. Przyciski nie mają szczegółowego obwodu, ponieważ można je skonfigurować na wiele sposobów. W tym projekcie używają rezystora ściągającego 100K i prostego przycisku do wysłania sygnału 3 V do przypisanego pinu.

Krok 3: Testowanie komponentów i podstawowego kodu

Projekt pobierze dane zarówno z układu MPU, jak i GPS, jak opisano wcześniej. Dołączone są trzy kody, które umożliwiają testowanie danych z MPU, GPS i MPU z ekranem do weryfikacji funkcjonalności części. Ważne jest, aby komponenty działały na tym etapie, ponieważ kod jest oddzielny dla każdego układu, a wszelkie problemy można rozwiązać bez obawy o spowodowanie nieprzewidzianych błędów w końcowym kodzie.

Wymagane Biblioteki:

Adafruit_ILI9341_Albert.h

SPI.h

Adafruit_GFX.h

Adafruit_ILI9341.h

TinyGPS++.h

Adafruit_NeoPixel.h

MPU9250.h

Wszystko to można znaleźć, przeszukując powyższe tytuły. Nie będę zamieszczał linków, ponieważ istnieje wiele kopii tych bibliotek z wielu źródeł i stosując się do standardu społeczności dotyczącego linkowania tylko do oryginałów, pozwolę ci je znaleźć dla siebie.

Krok 4: Kalibracja MPU

Kalibracja MPU
Kalibracja MPU

Nagłówek znaleziony przez MPU w Stanie 2 i Stanie 3 został podzielony na cztery ćwiartki. Było to konieczne, ponieważ nasza metoda kalibracji wymagała znalezienia minimalnej i maksymalnej wielkości z magnetometru wzdłuż jego osi x i y. Dokonano tego poprzez losowe obracanie urządzenia wokół jego trzech osi, wolne od jakichkolwiek znaczących pól elektromagnetycznych innych niż Ziemia. Następnie wzięliśmy wartości minimalne i maksymalne wzdłuż osi x i y i wstawiliśmy je do równania skalowania, aby ograniczyć wartości między wartościami ujemnymi jeden i jeden. Na powyższym rysunku BigX i BigY to maksymalne wartości danych magnetometru odpowiednio wzdłuż osi x i y, LittleX i LittleY to minimalne wartości danych magnetometru odpowiednio wzdłuż osi x i y, IMU.getMagX_uT() i IMU.getMagY_uT() to wartości pobierane z magnetometru w dowolnym momencie odpowiednio wzdłuż osi x i y, a Mx i My to nowe skalowane wartości używane do obliczania kierunku.

Krok 5: Kod końcowy

Kod końcowy
Kod końcowy
Kod końcowy
Kod końcowy
Kod końcowy
Kod końcowy
Kod końcowy
Kod końcowy

Ostatnim krokiem jest stworzenie ostatecznego kodu. Załączam kopię ostatecznego kodu projektu. W ramach notatek poczyniono, aby ułatwić poruszanie się po kodzie. Największym wyzwaniem tej sekcji było prawidłowe działanie kwadrantów. Wdrożenie kwadrantów okazało się bardziej żmudne i sprzeczne z logiką, niż mogliśmy się spodziewać. Początkowo zaimplementowaliśmy podstawowy arctan (My/Mx), a następnie przekonwertowaliśmy z radianów na stopnie, ponieważ Arduino domyślnie wyświetla w radianach. Jednak jedyny kwadrant, w którym działał, miał zakres od 90 stopni do 180 stopni, co dało nam wynik ujemny i ostatecznie okazało się, że jest to kwadrant III. Rozwiązaniem tego problemu było przyjęcie wartości bezwzględnej, ponieważ nadal prawidłowo się zwiększała. Wartość ta została następnie odjęta od 360, aby zaświecić prawidłową diodę NeoPixel w stanie 2, a podobna operacja matematyczna została użyta w stanie 3 w oparciu o to, czy nagłówek był większy czy mniejszy niż nagłówek wejściowy użytkownika, które można zobaczyć w powyższy kod. Na powyższych rysunkach Kurs odpowiada lampce NeoPixel, która będzie świecić w oparciu o różnicę między kierunkiem urządzenia a odchyleniem od północy w przypadku stanu 2 oraz od kierunku użytkownika. W tym przypadku 90 do 180 stopni odpowiada kwadrantowi III. W obu przypadkach tft.print powoduje, że ekran odczytuje kierunek urządzenia z północy.

W przypadku pozostałych trzech kwadrantów implementacja arctan (My/Mx) doprowadziła do odwrócenia inkrementacji w miarę obracania urządzenia, tj. kąt kursu będzie odliczał, gdy ma liczyć w górę i na odwrót. Rozwiązaniem tego problemu było odwrócenie arcus tangensa do postaci arctan (Mx/My). Chociaż rozwiązało to odwrócenie inkrementacji, nie podało prawidłowego nagłówka urządzenia, w którym w grę wchodzą kwadranty. Prostym rozwiązaniem tego problemu było dodanie przesunięcia w oparciu o odpowiednią ćwiartkę. Można to zobaczyć na poniższych rysunkach, które są ponownie fragmentami kodu ze Stanów 2 i 3 każdego kwadrantu.

Pierwsza instrukcja if jest wykonywana, jeśli nagłówek obliczony przez równanie MPU jest większy niż nagłówek użytkownika. W tych warunkach nagłówek wejściowy użytkownika jest dodawany do nagłówka urządzenia, a odpowiadająca mu wartość jest odejmowana od 360. Jeśli wykonywane jest polecenie else, równanie nagłówka MPU jest odejmowane od nagłówka wejściowego użytkownika. Warunki te zostały wprowadzone w celu nie tylko uzyskania dokładnej wartości dla NeoPixela, ale także uniknięcia uzyskania wartości poza dopuszczalnym zakresem, który wynosi od 0 do 359 stopni.

Zalecana: