Arduino GPS modul je vstupní modul pro Arduino. GPS modulů se prodává několik různých druhů, kdy tato varianta obsahuje čip Neo-7M od firmy U-blox. Přímo na desce modulu se nachází pasivní anténa, avšak můžeme osadit i dodávaný SMA konektor pro externí antény.
Pro komunikaci slouží sériová linka s výchozí rychlostí 9600 baudů. Modul pracuje s napájecím napětím 3,3 Voltu, přičemž stejné napětí by mělo být použito i pro komunikační vodiče.

Arduino GPS modul Neo-7M

Pro úspěšné propojení GPS modulu Neo-7M s Arduinem stačí propojit celkem čtyři vodiče. Propojíme VCC s 3V3 Arduina, GND se zemí Arduina, TX s pinem D4 a RX s pinem D3. Pokud ale chcete použít Arduino s 5V úrovněmi, je doporučeno použít level shifter nebo alespoň jednoduchý odporový dělič s poměrem přibližně 1:2, jak vidíte na obrázku. Já jsem použil odpory 4k7 a 10k.
Co se týká datových pinů RX a TX, lze využít také jiné volné piny, ale je nutné tuto volbu také provést na začátku programu.

Arduino GPS modul Neo-7M

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-7M nastaven na rychlost 9600, je tedy dobré tento údaj neměnit, pokud tak neučiníte v konfiguraci modulu.
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é sekundy 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 tedy 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 na místě dat, 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 komunikace GPS modulu s Arduinem, vytiskneme načtené údaje a zkontrolujeme počet detekovaných znaků. Pokud program nedokáže detekovat žádné znaky, tak je pravděpodobné, že je špatně zapojený.

// GPS modul NEO-7M
// navody.dratek.cz

// 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-7M 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: 07/30/2019 9:00:00
Detekovane znaky: 956, slova: 4, chyby pri kontrole dat: 0

Arduino GPS modul Neo-7M je šikovný modul, který nám umožňuje pracovat s GPS systémem na Arduinu. Výhodou tohoto modulu je již integrovaná pasivní anténa, která pro venkovní použití stačí a lze s ní po chvíli chytnout signál například i u okna v budově. Tento modul se tak může hodit do projektů jako například GPS navigace, sledovač pohybu či poziční alarm. Při běžném venkovním použití lze GPS signál chytnout přibližně do 30 sekund, ale je potřeba si dát pozor na to, aby pasivní anténa nebyla stíněná.

Seznam použitých komponent:

http://dratek.cz/arduino/1511-original-arduino-uno-rev3-1485165418.html
https://dratek.cz/arduino/1733-gps-satelitni-urceni-polohy-neo-7m-modul-pro-arduino-stm32-c51.html

FB tw

Další podobné články