Kategória: Arduino.
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.
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.