Spisu treści:

Rejestrator GPS Arduino: 3 kroki
Rejestrator GPS Arduino: 3 kroki

Wideo: Rejestrator GPS Arduino: 3 kroki

Wideo: Rejestrator GPS Arduino: 3 kroki
Wideo: ArduBlock 2.0 - GPS Модуль, время, координаты, скорость 2024, Listopad
Anonim
Rejestrator GPS Arduino
Rejestrator GPS Arduino
Rejestrator GPS Arduino
Rejestrator GPS Arduino

Cześć chłopaki, Jestem bardzo podekscytowany małymi projektami, które pozwalają ludziom zrozumieć znacznie więcej technologii, z którymi mamy do czynienia na co dzień.

Ten projekt dotyczy przerwania GPS i rejestrowania SD. Wiele się nauczyłem, budując te rzeczy.

Istnieje wiele pojęć, które zyskasz po zapoznaniu się z tym samouczkiem, a wiele więcej, korzystając z podanego przeze mnie linku, aby zagłębić się w tematy.

Więc co to jest? Prosty: to urządzenie śledzące GPS, które rejestruje pozycje (również z wysokością), prędkość i datę/godzinę na karcie microSD.

Czego będziesz potrzebować:

- Arduino Nano (właściwie użyłem UNO do zbudowania szkicu, ale są dokładnie takie same!) - Przełom w ostatecznym GPS Adafruit - Przełamanie karty MicroSD - Narzędzia do lutowania (wszystko, czego potrzebujesz do lutowania) - Universal Stripboard (użyłem a 5x7cm)-Przewody

Wszystkie te komponenty są dość tanie, z wyjątkiem modułu GPS. To około 30-40 dolarów i jest najdroższą częścią. Nawet nowy zestaw lutownicy może kosztować mniej.

Istnieje również osłona Adafruit z modułami GPS i kart SD razem. Jeśli chcesz go użyć, pamiętaj, że jest przeznaczony dla Arduino UNO, dlatego będziesz potrzebować UNO, a nie Nano. Nie ma jednak różnicy w szkicu.

Chodźmy dalej…

Krok 1: Podłączanie komponentów

Podłączanie komponentów
Podłączanie komponentów
Podłączanie komponentów
Podłączanie komponentów
Podłączanie komponentów
Podłączanie komponentów
Podłączanie komponentów
Podłączanie komponentów

Cóż, po zdobyciu komponentów musisz je połączyć. Tutaj znajdziesz schematy fryzowania, które są całkiem jasne. Jednak heres pinout też:

Wybuch MicroSD

5V -> 5VGND -> GnnCLK -> D13DO -> D12DI -> D11CS -> D4 (jeśli używasz osłony, jest ona wbudowana w D10)

Podział GPS

Vin -> 5VGnn -> GnnRx -> D2Tx -> D3

Małe uwagi na temat tego modułu: Ci dwaj mali chłopcy komunikują się z Arduino różnymi drogami. GPS używa TTL Serial, tego samego, którego używamy, gdy komunikujemy się z Arduino przez Serial Monitor, dlatego musimy zadeklarować za pośrednictwem biblioteki nowy numer seryjny (Tx i Rx), ponieważ GPS domyślnie chce używać 9600, a my też chcesz z niego skorzystać. Moduł GPS zawsze i stale przesyła dane, jeśli jest podłączony. Jest to trudna część do załatwienia, ponieważ jeśli przeczytamy zdanie, a potem je wydrukujemy, możemy stracić następne, co też jest potrzebne. Musimy o tym pamiętać podczas kodowania!

MicroSD komunikuje się przez SPI (Serial Peripheral Interface), inny sposób komunikacji z płytą. Tego rodzaju moduły zawsze używają CLK na D13, DO na D12 i DI na D11. Czasami połączenia te mają inną nazwę, np. CLK = SCK lub SCLK (zegar szeregowy), DO = DOUT, SIMO, SDO, SO, MTSR (wszystkie te oznaczają wyjście główne) oraz DI = SOMI, SDI, MISO, MRST (wejście główne). Wreszcie mamy CS lub SS, który wskazuje pin, na który wysyłamy to, co chcemy napisać w MicroSD. Jeśli chcesz użyć dwóch różnych modułów SPI, wystarczy rozróżnić ten pin, aby używać ich obu. Na przykład ekran LCD ORAZ MicroSD, taki jak ten, którego używamy. Powinien działać również przy użyciu dwóch różnych wyświetlaczy LCD podłączonych do różnych CS.

Przylutuj te części do tablicy i gotowe do przesłania szkicu!

Jak widać na szkicu, zamiast bezpośredniego komponentu lutuję niektóre żeńskie złącza dupontowe, ponieważ w przyszłości mogę chcieć ponownie użyć komponentu lub zmienić jeden.

Wlutowałem też moduł GPS ze złączami w złym kierunku, to była moja wina i nie chciałem, ale działa i nie chcę ryzykować, że go złamię próbując wylutować te małe dranie! Po prostu lutuj we właściwy sposób i wszystko będzie dobrze!

Oto kilka przydatnych filmów o lutowaniu: Poradnik lutowania dla początkujących Film o wylutowywaniu

Kanał Adafruit na YouTube, jest tam dużo ciekawych rzeczy!

Podczas lutowania staraj się używać tylko takiej ilości metalu, jakiej potrzebujesz, w przeciwnym razie narobisz bałaganu. Nie bój się tego robić, może zacznij od czegoś nie tak drogiego, a następnie lutuj różne rzeczy. Właściwy materiał również robi różnicę!

Krok 2: Szkic

Najpierw oczywiście importujemy biblioteki i budujemy ich obiekty do pracy z: SPI.h służy do komunikacji z modułami SPI, SD to biblioteka MicroSD, a Adafruit_GPS to biblioteka modułu GPS. SoftwareSerial.h służy do tworzenia portu szeregowego za pomocą oprogramowania. Składnia to „mySerial(TxPin, RxPin);”. Obiekt GPS należy wskazać na numer seryjny (w nawiasach). Oto linki bibliotek dla przerwania GPS Adafruit, przerwania MicroSD (aby wykonać czystą pracę, należy również sformatować SD za pomocą tego oprogramowania ze stowarzyszenia SD) i Biblioteka oprogramowania Serial (powinna być zawarta w IDE).

UWAGA: napotkałem pewien problem, gdy próbowałem dołączyć wiele informacji w jednym pliku lub użyć więcej niż dwóch plików w szkicu. Nie sformatowałem SD za pomocą tego oprogramowania, może to mogłoby rozwiązać problem. Próbowałem też dodać kolejny czujnik w urządzeniu, BMP280 (moduł I2C), bez powodzenia. Wygląda na to, że użycie modułu I2C sprawia, że szkic staje się szalony! Już o tym pytałem na forum Adafruit, ale nadal nie otrzymałem odpowiedzi.

#include "SPI.h"#include "SD.h"#include "Adafruit_GPS.h"#include "SoftwareSerial.h" SoftwareSerial mySerial(3, 2); Adafruit_GPS GPS(&mySerial);

Teraz potrzebujemy wszystkich naszych zmiennych: Dwa ciągi znaków służą do odczytywania dwóch zdań, których potrzebujemy do obliczenia wielu przydatnych informacji z GPS. Znak służy do przechowywania zdań przed ich przetworzeniem, pływaki służą do obliczania współrzędnych w stopniach (wysyłanie GPS używa współrzędnych w stopniach i minutach, potrzebujemy ich w stopniach do odczytu w Google Earth). ChipSelect to pin, do którego podłączamy CS karty MicroSD. W tym przypadku jest to D4, ale jeśli używasz osłony SD, będziesz musiał umieścić tutaj D10. Zmienna pliku to ta, która będzie przechowywać informacje o pliku, którego używamy podczas szkicu.

Ciąg NMEA1;

Ciąg NMEA2; znak c; stopnie pływaka; pływak stopnia Całość; zmiennoprzecinkowy degDec; int chipWybierz = 4; Plik mySensorData;

Teraz deklarujemy kilka funkcji, aby szkic był nieco bardziej elegancki i mniej bałaganiarski:

Robią w zasadzie to samo: czytają zdania NMEA. clearGPS() ignoruje trzy zdania, a readGPS() zapisuje dwa z nich w zmiennych.

Zobaczmy, jak: Pętla while kontroluje, czy są nowe sentencje NMEA w module i odczytuje strumień GPS, dopóki nie będzie. Kiedy pojawia się nowe zdanie, wychodzimy z pętli while, w której zdanie jest faktycznie czytane, analizowane i umieszczane w pierwszych zmiennych NMEA. Od razu robimy to samo z następnym, ponieważ GPS ciągle streamuje, nie czeka na nas, aż będziemy gotowi, nie mamy czasu na wydrukowanie go od razu

To jest bardzo ważne! Nie rób nic, zanim nie uzupełnisz obu zdań, w przeciwnym razie drugie zostanie ostatecznie uszkodzone lub po prostu błędne.

Po otrzymaniu dwóch zdań wypisujemy je w serialu, aby sprawdzić, czy wszystko idzie dobrze.

nieważny odczyt GPS() {

wyczyść GPS(); while(!GPS.newNMEAreceived()) { c=GPS.odczyt(); } GPS.parse(GPS.lastNMEA()); NMEA1=GPS.ostatniNMEA(); while(!GPS.newNMEAreceived()) { c=GPS.odczyt(); } GPS.parse(GPS.lastNMEA()); NMEA2=GPS.ostatniNMEA(); Serial.println(NMEA1); Serial.println(NMEA2); } void clearGPS() { while(!GPS.newNMEAreceived()) { c=GPS.read(); } GPS.parse(GPS.lastNMEA()); while(!GPS.newNMEAreceived()) { c=GPS.odczyt(); } GPS.parse(GPS.lastNMEA());w while(!GPS.newNMEAreceived()) { c=GPS.read(); } GPS.parse(GPS.lastNMEA()); }

Cóż, teraz, gdy wszyscy jesteśmy gotowi, możemy przejść przez setup():

Po pierwsze: otwieramy komunikację na Serial 115200 dla Arduino PC i 9600 dla modułu GPS Arduino. Po drugie: wysyłamy do modułu GPS trzy komendy: pierwsza to wyłączenie aktualizacji anteny, druga to zapytanie tylko RMC i GGA string (będziemy używać tylko tych, które mają wszystkie potrzebne informacje GPS), trzecie i ostatnie polecenie to ustawienie częstotliwości aktualizacji na 1 Hz, sugerowane przez Adafruit.

Następnie ustawiamy pin D10 na OUTPUT, wtedy i tylko wtedy, gdy pin CS twojego modelu SD jest inny niż D10. Zaraz potem ustaw CS na module SD na pinie chipSelect.

Uruchamiamy funkcje readGPS(), które zawierają cleanGPS().

Teraz czas na napisanie czegoś w plikach! Jeśli plik znajduje się już na karcie SD, dołącz do nich sygnaturę czasową. W ten sposób nie musimy za każdym razem śledzić sesji ani kasować plików. Dzięki znacznikowi czasu zapisanemu w funkcji konfiguracji jesteśmy pewni, że dodamy separację do plików tylko raz na sesję.

UWAGA: Biblioteka SD bardzo poważnie podchodzi do otwierania i zamykania pliku za każdym razem! Pamiętaj o tym i zamykaj za każdym razem! Aby dowiedzieć się więcej o bibliotece, kliknij ten link.

Ok, naprawdę wszyscy jesteśmy gotowi, aby uzyskać rdzeń części szkicu związanej ze strumieniowaniem i logowaniem.

pusta konfiguracja () {

Serial.początek(115200); GPS.początek (9600); //Wyślij polecenia do modułu GPS GPS.sendCommand("$PGCMD, 33, 0*6D"); GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA); GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ); opóźnienie (1000); //tylko jeśli pin CS modułu SD nie znajduje się na pinie D10

pinMode(10, WYJŚCIE);

SD.begin(chipSelect); odczyt GPS(); if (SD.exists("NMEA.txt")) { mySensorData = SD.open("NMEA.txt", FILE_WRITE); mySensorData.println(""); mySensorData.print("***"); mySensorData.print(GPS.dzień); mySensorData.print("."); mySensorData.print(GPS.miesiąc); mySensorData.print("."); mySensorData.print(GPS.rok); mySensorData.print(" -- "); mySensorData.print(GPS.godzina); mySensorData.print(":"); mySensorData.print(GPS.minuta); mySensorData.print(":"); mySensorData.print(GPS.sekundy); mySensorData.println("***"); mySensorData.close(); } if (SD.exists("GPSData.txt")) { mySensorData = SD.open("GPSData.txt", FILE_WRITE); mySensorData.println(""); mySensorData.println(""); mySensorData.print("***"); mySensorData.print(GPS.dzień); mySensorData.print("."); mySensorData.print(GPS.miesiąc); mySensorData.print("."); mySensorData.print(GPS.rok); mySensorData.print(" -- "); mySensorData.print(GPS.godzina); mySensorData.print(":"); mySensorData.print(GPS.minuta); mySensorData.print(":"); mySensorData.print(GPS.sekundy); mySensorData.println("***"); mySensorData.close(); }}

Teraz otrzymujemy rdzeń szkicu.

To naprawdę bardzo proste.

Będziemy czytać strumień GPS funkcją readGPS(), wtedy kontrolujemy, czy mamy poprawkę równą 1, co oznacza, że jesteśmy połączeni z satelitą. Jeśli to otrzymamy, zapiszemy nasze informacje w plikach. W pierwszym pliku "NMEA.txt" piszemy tylko surowe zdania. W drugim pliku „GPDData.txt” dołączamy współrzędne (przeliczone na funkcje, które widzieliśmy wcześniej) oraz wysokość. Te informacje wystarczą do skompilowania pliku.kml w celu utworzenia ścieżki w Google Earth. Zauważ, że zamykamy pliki za każdym razem, gdy je otwieraliśmy, aby coś napisać!

pusta pętla () {

odczyt GPS(); // Condizione if che controlla se l'antenna ha segnale. Se si, procede con la scrittura dei dati. if(GPS.fix==1) { //Zapisz dane tylko wtedy, gdy mamy poprawkę mySensorData = SD.open("NMEA.txt", FILE_WRITE); //Przejdź do pliku dla frasi NMEA Grezze mySensorData.println(NMEA1); //Zapisz pierwszy plik NMEA w pliku mySensorData.println(NMEA2); //Zapisz drugi plik NMEA w pliku mySensorData.close(); //Plik Chiude!!

mySensorData = SD.open("GPSData.txt", FILE_WRITE);

// Konwertuj i zapisuj długość convLong(); mySensorData.print(stopnie, 4); // Zapisz współrzędne w stopniowanym pliku mySensorData.print(", "); // Zapisz virgolę dla oddzielnych danych Serial.print(deg); Serial.print(", "); // Konwertuj i zapisuj latitudine convLati(); mySensorData.print(stopnie, 4); // Zapisz współrzędne w stopniowanym pliku mySensorData.print(", "); // Zapisz virgolę dla oddzielnych danych Serial.print(deg); Serial.print(", "); // Zapisz l'altitudine mySensorData.print(GPS.altitude); mySensorData.print(" "); Serial.println(GPS.wysokość); mySensorData.close(); } }

Teraz, gdy wszystko jest gotowe, możesz przesłać szkic, zbudować urządzenie i cieszyć się nim!

Pamiętaj, że musisz go używać z tablicą GPS skierowaną w niebo, aby uzyskać fix=1, lub możesz podłączyć do niego antenę zewnętrzną.

Pamiętaj też, że jeśli masz poprawkę, czerwone światło miga co 15 sekund, jeśli nie, znacznie szybciej (co 2-3 sekundy).

Jeśli chcesz dowiedzieć się czegoś więcej o zdaniach NMEA, wykonaj kolejny krok tego przewodnika.

Krok 3: Zdania NMEA i plik.kml

Urządzenie i szkic są gotowe, działają bez zarzutu. Pamiętaj, że aby uzyskać poprawkę (aby mieć połączenie z satelitami), wybicie powinno być skierowane w stronę nieba.

Małe czerwone światło miga co 15 sekund, gdy masz poprawkę

Jeśli chcesz lepiej zrozumieć zdania NMEA, możesz przeczytać dalej.

W szkicu używamy tylko dwóch zdań, GGA i RMC. To tylko kilka zdań, które przesyła moduł GPS.

Zobaczmy, co jest w tych ciągach:

$GPMC, 123519, A, 4807.038, N, 01131.000, E, 022.4, 084.4, 230394, 003.1, W*6A

RMC = Zalecane zdanie minimalne C 123519 = Poprawka pobrana o 12:35:19 UTC A = Status A=aktywny lub V=Brak 4807.038, N = Szerokość geograficzna 48 st. 07.038' N 01131.000, E = Długość geograficzna 11 st. 31.000' E 022.4 = Prędkość nad ziemią w węzłach 084.4 = Kąt toru w stopniach Prawda 230394 = Data - 23 marca 1994 003.1, W = Deklinacja magnetyczna *6A = Dane sumy kontrolnej, zawsze zaczynają się od *

$GPGGA, 123519, 4807.038, N, 01131.000, E, 1, 08, 0,9, 545,4, M, 46,9, M,, *47

Dane poprawek GGA Global Positioning System 123519 Ustalono o 12:35:19 UTC 4807.038, N Latitude 48 stopni 07.038' N 01131.000, E Długość 11 stopni 31.000' E 1 Jakość ustalenia: 0 = nieprawidłowa; 1 = pozycja GPS (SPS);2 = pozycja DGPS; 3 = naprawa PPS; 4 = Kinematyka w czasie rzeczywistym; 5 = pływak RTK; 6 = szacowany (dead reckoning) (2,3 cecha); 7 = tryb wprowadzania ręcznego; 8 = tryb symulacji; 08 Liczba śledzonych satelitów 0,9 Poziome rozmycie pozycji 545,4, M Wysokość, metry, nad średnim poziomem morza 46,9, M Wysokość geoidy (średni poziom morza) powyżej elipsoidy WGS84 (puste pole) czas w sekundach od ostatniej aktualizacji DGPS (puste pole) Numer ID stacji DGPS *47 dane sumy kontrolnej, zawsze zaczyna się od *

Jak widać, informacji jest o wiele więcej niż potrzebujesz. Korzystając z biblioteki Adafruit, możesz wywołać niektóre z nich, takie jak GPS.latitude lub GPS.lat (półkula szerokości geograficznej i szerokości geograficznej) lub GPS.day/miesiąc/rok/godzina/minuta/sekundy/milisekundy… Spójrz na Adafruit stronę internetową, aby dowiedzieć się czegoś więcej. Nie jest to takie jasne, ale postępując zgodnie z kilkoma wskazówkami w przewodniku po modułach GPS, możesz znaleźć to, czego potrzebujesz.

Co możemy zrobić z plikami, które posiadamy? Łatwo: skompiluj plik kml, aby wyświetlić ścieżkę w Google Earth. W tym celu wystarczy skopiować/wkleić kod, który znajdziesz pod tym linkiem (pod paragrafem Ścieżka), umieścić między tagami współrzędne z pliku GPDData.txt, zapisać plik z rozszerzeniem.kml i wczytać go na Google Earth.

UWAGA: Język znaczników.kml jest prosty, jeśli już wiesz, czym jest język znaczników, poświęć trochę czasu na przeczytanie poprzedniego linku i dokumentacji w środku, to naprawdę interesujące!

Korzystanie z kml polega na poznaniu jego tagów i argumentów. Znalazłem tylko przewodnik od Google, ten, który połączyłem wcześniej, a istotną częścią jest zdefiniowanie stylu między tagami i wywołanie go znakiem #, gdy nadejdzie czas na zapisanie współrzędnych.

Plik, który dodałem w tej sekcji, to.kml, w którym możesz po prostu wkleić swoje współrzędne. pamiętaj, aby wkleić za pomocą tej składni: długość geograficzna, szerokość geograficzna, wysokość

Zalecana: