Arduino s GPS Neo-6 |
Konečně mi přišel (až na druhý pokus) z číny a těšila jsem se na něj skoro dva měsíce. Ale nakonec je doma, takže se mu podíváme na zoubek.
Z dat která dostaneme z modulu můžeme získat nejenom GPS souřadnice, ale taky i nadmořskou výšku, rychlost založenou na předchozí poloze, počet dostupných satelitů a datum a čas.
Pro optimální příjem signálu je doporučené aby anténa mířila kolmo nahoru na volnou oblohu. Při volném výhledu dokáže získat souřadnice za nějakých 20 - 30s, ale vysoké budovy, rf rušení a plechové překážky, nebo silnější kryty můžou ovlivnit přesnost měření a čas za který se modul zaměří až na několik jednotek minut.
Komunikace
probíhá po sériové lince UART, ale abysme nemuseli modul při každém nahrávání kódu do arduina odpojovat, použijeme SoftwareSerial a použijeme proto digitální piny 3 a 4. Někdo píše, že modul potřebuje napětí logiky 3,3V a jinde zase, že zvládá 5V. Tenhle opravdu bezproblémů funguje na logice 5V. Otestováno.Modul je standartně nastavený na rychlost 9600baud. Jde to změnit programem od výrobce, ale na většinu aplikací to je asi zbytečné.
Ovládací knihovnu použijeme TinyGPS, ke stažení je na GitHubu.
Zapojení
je naprosto jednoduché. Piny modulu Rx a Tx samozřejmě můžeme zapojit i na jiné piny arduina ale změna je potřeba i v kódu.Arduino | GPS Neo-6M |
5V | VCC |
GND | GND |
D3 (sw Rx) | Tx |
D4 (sw Tx) | Rx |
Rx a Tx se zapojují do kříže
Kód
vypadá složitě, ale je to jen získání dat z modulu a jejich tisk na serial monitor.// GPS modul NEO-6M #include <SoftwareSerial.h> #include <TinyGPS.h> // nastavení propojovacích pinů #define TX 4 // sem zapojíme RX z modulu #define RX 3 // a sem TX // 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); // výpis přijatých dat // 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(); }
Výpis v serial monitoru vypadá nějak takhle:
GPS modul NEO-6M můžete koupit na mém e-shopu www.vokolo.cz. Ještě sketch ke stažení a je to všechno.
Pěkné, spojit ten modul s chytrým vozitkem by bylo super.
OdpovědětVymazat