Caută cod

Extragerea Latitudinii și Longitudinii dintr-un Semnal GPS în Arduino

Extragerea Latitudinii și Longitudinii dintr-un Semnal GPS în Arduino

În acest tutorial, vom învăța cum să extragem datele de latitudine și longitudine dintr-un semnal GPS folosind Arduino și modulul GPS Ublox NEO-6M. Acest proiect este deosebit de util pentru aplicații care necesită urmărirea locației, cum ar fi robotica sau navigația în aer liber. La sfârșitul acestui tutorial, vei avea un program funcțional care citește datele GPS și afișează coordonatele în monitorul serial.

Înainte de a intra în detalii, s-ar putea să dorești să consulți videoclipul asociat pentru clarificări suplimentare privind cablarea și implementarea codului (în videoclip la 00:00).

Hardware Explicat

Componenta principală pentru acest proiect este modulul GPS Ublox NEO-6M. Acest modul este proiectat pentru a furniza date precise de poziționare folosind semnale de la sateliții GPS. Poate recepționa semnale de la mai mulți sateliți simultan, ceea ce permite urmărirea precisă a locației. Modulul comunică cu Arduino folosind comunicația serială, ceea ce îl face ușor de integrat în diverse proiecte.

Pe lângă modulul GPS, vei avea nevoie de o placă Arduino pentru a procesa datele GPS. Arduino va citi datele trimise de modulul GPS și va extrage valorile de latitudine și longitudine pentru utilizare ulterioară. Modulul GPS funcționează de obicei la 5V și oferă o ieșire serială pe care Arduino o poate citi prin pinul RX.

Detalii din Fișa Tehnică

Producătoru-blox
Număr de piesăNEO-6M
Tensiune logică/IO3.3V
Tensiune de alimentare3.0 până la 5.5V
Curent de ieșire≤ 50 mA
Sensibilitate GPS-165 dBm
Temperatură de operare-40 până la 85 °C
Rată de actualizare1 Hz (implicit)
Ambalaj25 x 35 x 4 mm
Note / varianteSunt disponibile diverse configurații

  • Asigură-te că modulul GPS este conectat la o sursă de alimentare stabilă (3.0 până la 5.5V).
  • Folosește o bibliotecă potrivită pentru a gestiona parsarea datelor GPS.
  • Păstrează antena departe de obstacole pentru o recepție mai bună a sateliților.
  • Verifică rata de transmisie a modulului GPS; funcționează de obicei la 9600 baud.
  • Ia în considerare utilizarea unui condensator pentru netezirea alimentării dacă modulul GPS este instabil.

Instrucțiuni de Cablare

Arduino wiring for Neo-6M GPS module
Arduino wiring for Neo-6M GPS module

Pentru a conecta modulul GPS NEO-6M la Arduino, începe prin conectarea pinului VCC al modulului GPS la pinul de 5V de pe Arduino. Apoi, conectează pinul GND al modulului GPS la pinul de masă (GND) de pe Arduino. Modulul GPS va comunica cu Arduino folosind pinii TX și RX. Conectează pinul TX al modulului GPS la pinul RX (de obicei pinul 0) de pe Arduino.

Dacă folosești un Arduino cu pini I2C dedicati, asigură-te că conectezi pinii SDA și SCL corespunzător (de obicei A4 pentru SDA și A5 pentru SCL pe plăcile Arduino standard). După cablare, verifică din nou toate conexiunile pentru a te asigura că sunt sigure și orientate corect.

Exemple de Cod și Explicații

Iată un scurt extras din cod pentru a inițializa comunicația serială și a configura șirul de intrare pentru datele GPS:

void setup() {
    Serial.begin(9600);
    inputString.reserve(200);
}

Acest cod inițializează comunicația serială la o rată de transmisie de 9600 și rezervă spațiu pentru șirul de date GPS primit.

În continuare, să ne uităm la partea din cod care procesează datele GPS primite și extrage latitudinea și longitudinea:

if (BB == signal) {
    String LAT = inputString.substring(7, 17);
    String LON = inputString.substring(20, 31);
    Serial.println(LAT);
    Serial.println(LON);
}

În acest fragment, programul verifică dacă datele primite corespund semnalului GPS așteptat. Dacă da, extrage valorile de latitudine și longitudine din șirul de intrare și le afișează în monitorul serial.

În cele din urmă, codul include o secțiune pentru a gestiona noile date care sosesc prin conexiunea serială:

void serialEvent() {
    while (Serial.available()) {
        char inChar = (char) Serial.read();
        inputString += inChar;
        if (inChar == '\\n') {
            stringComplete = true;
        }
    }
}

Această funcție citește caracterele primite de la portul serial și le adaugă la inputString. Odată ce este detectat un caracter de linie nouă, setează indicatorul stringComplete la true, indicând că a fost primit un șir complet de date.

Demonstrație / Ce să Te Aștepți

După încărcarea codului și rularea Arduino, ar trebui să vezi valorile de latitudine și longitudine afișate în monitorul serial. Este important să te asiguri că modulul GPS are o vedere clară a cerului pentru a recepționa eficient semnalele sateliților. Dacă modulul nu primește un semnal, este posibil să nu afișeze coordonate valide (în videoclip la 02:30).

Capcanele frecvente includ erori de cablare, alimentare insuficientă și recepție slabă a sateliților. Asigură-te că depanezi aceste aspecte dacă întâmpini probleme.

Marcaje Temporale din Videoclip

  • 00:00 - Introducere
  • 02:30 - Instrucțiuni de cablare
  • 05:00 - Explicația codului
  • 08:15 - Demonstrarea funcționalității GPS

Imagini

GPS antenna
GPS antenna
GPS module with antenna
GPS module with antenna
GPS modules
GPS modules
Arduino wiring for Neo-6M GPS module
Arduino wiring for Neo-6M GPS module
3-Extract latitude and longitude from a GPS signal in an Arduino NEO-6M
Limba: C++
/*
 * This is Arduino code for the Ublox NEO-6M GPS module.
 * This code extracts the GPS latitude and longitude so it can be used for other purposes.


 * 
 * Written by Ahmad Nejrabi for Robojax Video
 * Date: January 24, 2017, in Ajax, Ontario, Canada
 * Permission granted to share this code, given that this
 * note is kept with the code.
 * Disclaimer: This code is "AS IS" and for educational purposes only.
 * 
 */

// Written for RoboJax.com 
String inputString = ""; // a string to hold incoming data
boolean stringComplete = false; // whether the string is complete
String signal = "\$GPGLL";
void setup() {
    // initialize serial:
    Serial.begin(9600);
    // reserve 200 bytes for the inputString:
    inputString.reserve(200);
}

void loop() {
    // print the string when a newline arrives:
    if (stringComplete) {
        String BB = inputString.substring(0, 6);
        if (BB == signal) {
            String LAT = inputString.substring(7, 17);
            int LATperiod = LAT.indexOf('.');
            int LATzero = LAT.indexOf('0');
            if (LATzero == 0) {
                LAT = LAT.substring(1);
            }

            String LON = inputString.substring(20, 31);
            int LONperiod = LON.indexOf('.');
            int LONTzero = LON.indexOf('0');
            if (LONTzero == 0) {
                LON = LON.substring(1);
            }

            Serial.println(LAT);
            Serial.println(LON);

        }

        // Serial.println(inputString);
        // clear the string:
        inputString = "";
        stringComplete = false;
    }
}

/*
SerialEvent occurs whenever new data arrives via the
hardware serial RX. This routine runs between each
time loop() runs, so using delay inside loop can delay
response. Multiple bytes of data may be available.
*/
void serialEvent() {
    while (Serial.available()) {
        // get the new byte:
        char inChar = (char) Serial.read();
        // add it to the inputString:
        inputString += inChar;
        // if the incoming character is a newline, set a flag
        // so the main loop can do something about it:
        if (inChar == '\\n') {
            stringComplete = true;
        }
    }
}

Lucruri de care ai putea avea nevoie

Resurse și referințe

Încă nu sunt resurse.

Fișiere📁

Alte fișiere

  • GPS TinyGPSPlus NEO-7 DataSheet
    Datasheet for the u-blox NEO-7 GPS module, a compact GNSS receiver with high sensitivity and low power consumption. It provides positioning data via UART and is commonly used with Arduino and the TinyGPSPlus library.
    robojax_GPS_TinyGPSPlus_NEO-7_DataSheet.pdf 1.73 MB