Arduino GPS

10$ alatti összegért beszerezhető a VK2828U7G5LF típusú GPS modul. Az olcsó húsnap persze néha picit híg a leve, viszont felfoghatjuk egyfajta kihívásként is, hogy hogyan tudjuk összekötni az Arduino-val.

A kábelek megerősítése

A legnagyobb problémát a vékony kapcsoló kábelek okozzák, melyeket valójában nemigazán lehet közvetlenül használni. Célszerű összeforrasztani a vékony kábelt egy vastagabbal, és a vastagabbat felhasználni arra, hogy a megfelelő lyukba dugjuk bele.

Közvetlen kipróbálás

Mielőtt programozni kezdenénk próbáljuk ki Arduino nélkül, hogy működik-e! Ehhez telepítsük az u-center nevű programot. Szükségünk van egy USB-soros átalakítóra, pl. használhatjuk a CH340 típusút, mely 1$ alatti összegért megvásárolható. Bekötés:

  • GPS G -> CH340 GND
  • GPS R -> CH340 RX
  • GPS T -> CH340 TX
  • GPS V -> CH340 5V

Itt tehát a TX-et a TX-re, az RX-et pedig az RX-re kapcsoljuk, mivel ezt most adattovábbításra fogjuk használni. Az u-center programban két paramétert kell beállítani:

  • Receiver -> Port: általában a legnagyobb sorszámú, de ha nem vagyunk biztosak benne, akkor indítsuk el az Eszközvezérlőt (Device Manager), és ott a Portokon belül találunk egy USB-SERIAL CH340-et, és zárójelben ott látható a port szám.
  • Receiver -> Baudrate: legyen 9600 bpt

Egy ideig várnunk kell, majd számos adat megjelenik, többek között a GPS koordinátánk is.

ucenter.png

Rákapcsolás az Arduino-ra: első lépések

A GPS modul rövid szöveges kódok formájában továbbítja a mért adatokat soros interfészen keresztül. Kössük rá a GPS-t az Arduino-ra a következőképpen:

  • GPS G -> Arduino GND
  • GPS R -> Arduino 5 (TX)
  • GPS T -> Arduino 3 (RX)
  • GPS V -> Arduino 5V

Most már tehát a TX-et az RX-re kötjük és fordítva. Töltsük fel a GPS-re a következő programot:

#include <SoftwareSerial.h>
 
#define rxGPS 3
#define txGPS 5
 
SoftwareSerial serialGPS = SoftwareSerial(rxGPS, txGPS);
 
void setup() {
  pinMode(rxGPS, INPUT);
  pinMode(txGPS, OUTPUT);
  serialGPS.begin(9600);
  digitalWrite(txGPS, HIGH);
  Serial.begin(9600);
}
 
void loop() {
    char c = serialGPS.read();
    if (c > 0) {
      Serial.print(c);
    }
}

Ez folyamatosan kiírja a soros portra a másik soros porton beolvasott értékeket. Az Arduino IDE-ben indítsuk el a soros monitort (Tools -> Serial Monitor), a baud-ot állítsuk 9600-ra, és figyeljük meg, hogy kb. másodpercenként egyszer kapun ehhez hasonló kódolt üzenetet:

$GPRMC,121032.00,A,4702.73095,N,01947.72694,E,0.214,,170319,,,A*75
$GPVTG,,T,,M,0.214,N,0.395,K,A*2B
$GPGGA,121032.00,4702.73095,N,01947.72694,E,1,06,1.80,124.8,M,38.4,M,,*5C
$GPGSA,A,3,24,19,17,12,15,13,,,,,,,4.08,1.80,3.67*08
$GPGSV,4,1,13,01,03,020,,06,06,121,20,10,10,299,,12,41,250,22*7D
$GPGSV,4,2,13,13,22,168,23,15,41,204,28,17,42,060,30,19,55,096,26*7A
$GPGSV,4,3,13,20,03,273,,24,73,302,27,25,06,249,,28,10,061,*7F
$GPGSV,4,4,13,32,00,329,*42
$GPGLL,4702.73095,N,01947.72694,E,121032.00,A,A*66

Az értelmezés részleteibe itt nem bocsátkozok, azt megtaláljuk a GPS modul adatlapján, pl. itt: https://github.com/CainZ/V.KEL-GPS/blob/master/VK2828U7G5LF%20Data%20Sheet%2020150902.pdf. A számunkra leglényegesebb információ maga a GPS koordináta, melyet a $GPGGA kezdetű sorban találjuk, a fenti példában ebben a formában: 4702.73095,N,01947.72694,E.

A pozíció kijelzése LCD-n

A fentiekben tehát megtaláltuk a GPS pozíciót, azt most kiírjuk egy I2C-vel ellátott LCD kijelzőre. Bekötés:

  • GPS: mint fent
  • LCD SCL -> Arduino A5
  • LCD SDA -> Arduino A4
  • LCD VCC -> Arduino 5V
  • LCD GND -> Arduino GND

A programkód:

#include <SoftwareSerial.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
 
#define rxGPS 3
#define txGPS 5
 
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
SoftwareSerial serialGPS = SoftwareSerial(rxGPS, txGPS);
String gpsMsg = "";
String prevLatitude = "";
String prevLongitude = "";
 
void setup() {
  pinMode(rxGPS, INPUT);
  pinMode(txGPS, OUTPUT);
  serialGPS.begin(9600);
  digitalWrite(txGPS, HIGH);
  lcd.begin(16, 2);
  lcd.clear(); 
}
 
void loop() {
  char c = serialGPS.read();
  if (c > 0) {
    gpsMsg += c;
    if (c == '\n') {
      if (gpsMsg.length() > 10 && gpsMsg.substring(0, 6) == "$GPGGA") {
        if (gpsMsg.length() > 70) {
          String latitude = gpsMsg.substring(28, 29) + gpsMsg.substring(17, 19) + char(223) + gpsMsg.substring(19, 25) + "'";
          String longitude = gpsMsg.substring(42, 43) + gpsMsg.substring(30, 33) + char(223) + gpsMsg.substring(33, 39) + "'";
          if (!prevLatitude.equals(latitude) || !prevLongitude.equals(longitude)) {
            lcd.clear(); 
            lcd.setCursor(0, 0);
            lcd.print(latitude);
            lcd.setCursor(0, 1);
            lcd.print(longitude);
            prevLatitude = latitude;
            prevLongitude = longitude;
          }
        } else {
          lcd.clear(); 
          lcd.setCursor(0, 0);
          lcd.print("Position");
          lcd.setCursor(0, 1);
          lcd.print("not available.");
        }
      }
      gpsMsg = "";
    }
  }
}

Ez a program kiírja a GPS koordinátákat az LCD kijelzőre.

Tippek a továbbfejlesztéshez:

  • Az Arduino ebben az állapotban folyamatosan a GPS-t figyeli, ami gondot okozna akkor, ha mást is szeretnénk vele csinálni. Ezt figyelembe véve szerkesszük át a kódot.
  • Meg lehessen neki adni egy koordinátát, és írja ki az aktuális pozíció és a megadott koordináta közötti távolságot. A hozzávetőleges irányt is írja ki.
  • Mentse el a nyomvonalat pl. egy TF kártyára.
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License