Arduino GPS modul obsahuje integrovaný obvod Neo-6M. Tento komunikační modul od firmy U-blox komunikuje se svým okolím pomocí rozhraní UART a dokáže pracovat s napájecím napětím v rozsahu 3 až 5 Voltů. Co se týká komunikace, tak některé zdroje uvádí nutnost komunikovat v napěťových úrovních 3,3 Voltů, ale z mé zkušenosti lze při napájení 5 Volty bezproblémově komunikovat s GPS modulem pomocí Arduina bez převodníků.
Pro úspěšné propojení GPS modulu Neo-6M s Arduinem stačí propojit celkem čtyři vodiče. Propojíme VCC s 5 V Arduina, RX s pinem D3, TX s pinem D4 a GND se zemí Arduina. Co se týká datových pinů RX a TX, lze využít i jiné volné digitální piny, ale je nutné tuto volbu také provést na začátku programu. Na deskách Mega a Mega 2560 je možné pro pin RX využít pouze tyto piny: 10, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8 (62), A9 (63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69). A na deskách Leonardo a Micro lze pro pin RX využít tyto piny: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).
Pro správnou funkci uvedeného ukázkového kódu je nutné stáhnout a naimportovat knihovnu TinyGPS, návod jak na to je uveden zde. Ukázkový kód obsahuje na svém začátku připojení potřebných knihoven, nastavení propojovacích pinů GPS modulu a inicializaci GPS modulu společně s komunikací po softwarové sériové lince. V podprogramu setup zahájíme nejprve komunikaci po sériové lince pro tištění údajů do počítače a také komunikaci s GPS modulem po softwarové sériové lince. Co se týká rychlosti, standardně je GPS modul Neo-6M nastaven na rychlost 9600, je tedy dobré tuto rychlost neměnit, pokud tak neučiníte v konfiguračním programu od výrobce. Na začátku nekonečné smyčky loop se nachází jako první vytvoření dočasných proměnných pro načtení informací o komunikaci s GPS modulem, které jsou vytištěny po každém běhu na konci smyčky. Následně se dostaneme do for smyčky, v které po dobu jedné vteřiny probíhá kontrola aktivity softwarové komunikace s GPS modulem. Pokud je nějaká aktivita detekována, načteme do pomocné proměnné přijatou zprávu a pomocí funkce gps.encode si zkontrolujeme, jestli neobsahuje platná data. V případě detekování platných dat si pro další práci nastavíme proměnnou označující nová data. Po for smyčce proběhne kontrola proměnné novaData a v případě splnění podmínky se dostaneme na vytištění všech dostupných informací z GPS modulu. Nejprve si vytvoříme pomocné proměnné pro ukládání výsledků a následně jako první načteme GPS pozici do příslušných proměnných ve funkci. V následujícím kódu se nachází vytištění všech dostupných údajů, kdy si vždy nejprve zkontrolujeme, jestli máme platné údaje. Pokud nejsou platné, vytiskneme 0, ale pokud máme platná data, vytiskneme je společně s popiskem, o jaká data se jedná. Po vytištění všech GPS údajů společně s datem a časem si načteme informace o komunikaci GPS modulu s Arduinem, vytiskneme načtené údaje a zkontrolujeme počet detekovaných znaků. Pokud program nedokáže detekovat žádné znaky, je pravděpodobné, že máme modul špatně zapojený a proto vytiskneme tuto informaci uživateli.
// GPS modul NEO-6M // připojení potřebných knihoven #include <SoftwareSerial.h> #include <TinyGPS.h> // nastavení propojovacích pinů #define TX 3 #define RX 4 // inicializace GPS a komunikace po softwarové sériové lince TinyGPS gps; SoftwareSerial swSerial(RX, TX); void setup() { // zahájení komunikace po sériové lince Serial.begin(9600); // zahájení komunikace s GPS modulem po softwarové sériové lince swSerial.begin(9600); } void loop() { // vytvoření dočasných proměnných pro načtení informací o komunikaci s GPS modulem bool novaData = false; unsigned long znaky; unsigned short slova, chyby; // po dobu jedné vteřiny budeme kontrolovat příjem dat z GPS for (unsigned long start = millis(); millis() - start < 1000;) { // kontrola aktivity softwarové komunikace while (swSerial.available()) { // vytvoření proměnné pro uložení načtených dat z GPS char c = swSerial.read(); //Serial.write(c); // pro výpis přijatých dat odkomentujte tento řádek // dekódování přijaté zprávy s kontrolou platných dat if (gps.encode(c)) { // pokud jsou přijatá data platná, nastavíme proměnnou pro tištění dat novaData = true; } } } // pokud proběhl příjem nových dat, vytiskneme všechny dostupné informace if (novaData) { // vytvoření dočasných proměnných pro načtení dat z GPS modulu float zSirka, zDelka; unsigned long stariDat; int rok; byte mesic, den, hodina, minuta, sekunda, setinaSekundy; // načtení GPS pozice do proměnných gps.f_get_position(&zSirka, &zDelka, &stariDat); // vytištění informací po sériové lince Serial.println("::Dostupne GPS udaje::"); Serial.print("Zemepisna sirka: "); // nejprve zkontrolujeme, jestli máme platné údaje // (zSirka == TinyGPS::GPS_INVALID_F_ANGLE), // pokud nejsou validní (platné), vytiskneme nulu, // v opačném případě vytiskneme obsah proměnné s přesností 6 desetinných míst, // podobným způsobem se pracuje i s ostatními údaji Serial.print(zSirka == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : zSirka, 6); Serial.print(" delka: "); Serial.print(zDelka == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : zDelka, 6); Serial.print(" Pocet satelitu: "); Serial.println(gps.satellites() == TinyGPS::GPS_INVALID_SATELLITES ? 0 : gps.satellites()); Serial.print("Presnost: "); Serial.print(gps.hdop() == TinyGPS::GPS_INVALID_HDOP ? 0 : gps.hdop()); Serial.print(" Stari dat: "); Serial.print(stariDat == TinyGPS::GPS_INVALID_AGE ? 0 : stariDat); Serial.print(" Nadmorska vyska: "); Serial.print(gps.f_altitude() == TinyGPS::GPS_INVALID_F_ALTITUDE ? 0 : gps.f_altitude()); Serial.print(" Rychlost v km/h: "); Serial.println(gps.f_speed_kmph() == TinyGPS::GPS_INVALID_F_SPEED ? 0 : gps.f_speed_kmph()); // načtení data a času z GPS modulu do proměnných gps.crack_datetime(&rok, &mesic, &den, &hodina, &minuta, &sekunda, &setinaSekundy, &stariDat); // kontrola platnosti dat if (stariDat == TinyGPS::GPS_INVALID_AGE) { Serial.println("Nelze nacist datum a cas."); } else { // vytvoření proměnné pro vytištění data a času char datumCas[32]; Serial.print("Datum a cas: "); // poskládání celé zprávy do proměnné datumCas a poté její vytištění, // %02d znamená desetinné číslo uvedené za uvozovkami s přesností na 2 číslice sprintf(datumCas, "%02d/%02d/%02d %02d:%02d:%02d", mesic, den, rok, hodina, minuta, sekunda); Serial.println(datumCas); } } // načtení a vytištění informací o komunikaci s GPS modulem gps.stats(&znaky, &slova, &chyby); Serial.print("Detekovane znaky: "); Serial.print(znaky); Serial.print(", slova: "); Serial.print(slova); Serial.print(", chyby pri kontrole dat: "); Serial.println(chyby); // kontrola chyb při komunikaci skrze detekci přijatých znaků if (znaky == 0) { Serial.println("Chyba pri prijmu dat z GPS, zkontrolujte zapojeni!"); } Serial.println(); }
Po nahrání ukázkového kódu do Arduino desky s připojeným GPS modulem Neo-6M dostaneme například tento výsledek:
::Dostupné GPS udaje:: Zemepisna sirka: 49.2***** delka: 16.5***** Pocet satelitu: 5 Presnost: 690 Stari dat: 418 Nadmorska vyska: 213.40 Rychlost v km/h: 0.11 Datum a cas: 03/07/2017 9:00:00 Detekovane znaky: 956, slova: 4, chyby pri kontrole dat: 0
Arduino GPS modul Neo-6M je zajímavým vstupním modulem, který nám umožňuje obohatit naše zařízení o získávání GPS souřadnic. Můžeme tedy poměrně snadno vytvořit různá zařízení jako například vlastní sledovací zařízení při spojení s GSM modulem či doplnit svoje přenosné měřící zařízení o GPS souřadnice místa měření. Je však důležité zdůraznit, že dodávaná GPS anténa je poměrně velká, citlivá a je nutné ji umístit na viditelném místě s pokud možno přímou viditelností na oblohu. Pokud bychom schovali anténu za silnější materiál nebo ještě hůře kovovou plochu, můžeme mít problémy s navázáním spolehlivého spojení a tedy se získáním GPS souřadnic. Co se týká doby načtení prvních souřadnic, tak ta se v ideálním případě pohybuje okolo 30 sekund od připojení napájení, ale se špatnou viditelností na oblohu se můžeme dostat až na jednotky minut.
Seznam použitých komponent:
http://dratek.cz/arduino/1511-original-arduino-uno-rev3-1485165418.html
http://dratek.cz/arduino/906-arduino-gps-modul-1420740709.html
nebo
http://dratek.cz/arduino/1510-gps-neo-6m-gyneo6mv2-modul-s-antenou-1484866512.html