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ů.

Arduino GPS modul Neo-6M“ width=

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).

Schéma zapojení Arduino GPS modulu Neo-6M“ width=

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

FB tw

Další podobné články