Prog Shield GPS1

Fra Holstebro HTX Wiki
Skift til: navigering, søgning
Det blå GPS Modul

Dette modul kan bestemme positionen på jorden ved hjælp af GPS-satelitter. Selve modulet er beskrevet på Arduino GPS Modul.

Modulet kan f.x anskaffes ved aliexpress[1].

Specielt om det blå GPS-modul

Modulet kan have svært ved at fange satellitter og har det bedst i fri luft før det fanger noget.

Der sidder en grøn LED på modulet. Så længe den ikke lyser, så har modulet ikke bestemt satellitterne - når det sker, så begynder LED'en at blinke.

Software

Der ligger to eksempler på software til at læse GPS-resultaterne med, hvor den simple simple_GPS_test.ino er gennemgået her. Den angiver om der er kommunikation med modulet, ved at den skriver hvor mange karakterer der er kommunikeret. Det andet eksempel test_with_gps_device.ino printer blot en række stjerne hvis der ikke opnås et GPS-resultat, men til gengæld giver det flere informationer når der er forbindelse til satelitterne.
Filerne ligger i denne ZIP-fil.

Til tolkningen af det der læses i GPS-modulet anvendes et bibliotek fundet på GitHub[2]. Biblioteket kan hentes her GitHub TinyGPS. Biblioteket downloades og installeres som beskrevet under Arduinos biblioteker.

Anvendelsen af softwaren

Som alle andre biblioteker skal der sættes de grundlæggende ting op for at kontakte biblioteket og definere et objekt til at kommunikere med.

#include <SoftwareSerial.h>
#include <TinyGPS.h>

TinyGPS gps;
SoftwareSerial ss(8, 9);

Inde i setup() skal der sættes gang i objektet ved hjælp af begin-metoden som vist her, der printes desuden en velkomst:

void setup() {
  Serial.begin(9600);
  ss.begin(9600);
}

I loop() læses fra GPS-modulet, og der tolkes på om det er et gyldigt signal ifølge GPS-biblioteket. Hvert sekund printes resultatet. Hvis det er et gyldigt signal printes naturligvis dette, ellers printes blot aktiviteten på porten med GPS-modulet, eller at der ikke er modtaget noget.

void loop() {
  bool newData = false;
  unsigned long chars;
  unsigned short sentences, failed;

  // For one second we parse GPS data and report some key values
  for (unsigned long start = millis(); millis() - start < 1000;)
  {
    while (ss.available())
    {
      char c = ss.read();
      // Serial.write(c); // uncomment this line if you want to see the GPS data flowing
      if (gps.encode(c)) // Did a new valid sentence come in?
        newData = true;
    }
  }

  if (newData)
  {
    float flat, flon;
    unsigned long age;
    gps.f_get_position(&flat, &flon, &age);
    Serial.print("LAT=");
    Serial.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6);
    Serial.print(" LON=");
    Serial.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6);
    Serial.print(" SAT=");
    Serial.print(gps.satellites() == TinyGPS::GPS_INVALID_SATELLITES ? 0 : gps.satellites());
    Serial.print(" PREC=");
    Serial.print(gps.hdop() == TinyGPS::GPS_INVALID_HDOP ? 0 : gps.hdop());
  }
  
  gps.stats(&chars, &sentences, &failed);
  Serial.print(" CHARS=");
  Serial.print(chars);
  Serial.print(" SENTENCES=");
  Serial.print(sentences);
  Serial.print(" CSUM ERR=");
  Serial.println(failed);
  if (chars == 0)
    Serial.println("** No characters received from GPS: check wiring **");
}

Test af softwaren

Når man starter testen, så vil programmet outputte følgende:

Simple TinyGPS library v. 13
by Mikal Hart

 CHARS=327 SENTENCES=0 CSUM ERR=0
 CHARS=654 SENTENCES=0 CSUM ERR=0
 CHARS=981 SENTENCES=0 CSUM ERR=0
 CHARS=1316 SENTENCES=0 CSUM ERR=0
 CHARS=1643 SENTENCES=0 CSUM ERR=0
 CHARS=1944 SENTENCES=0 CSUM ERR=0

Som med alle andre GPS-modtagere, så skal denne også fange satellitter før den giver noget meningsfuldt, når den fanger satellitterne så vil den komme med et output som f.x.:

LAT=56.364513 LON=8.626262 SAT=5 PREC=276 CHARS=38166 SENTENCES=186 CSUM ERR=0
LAT=56.364521 LON=8.626279 SAT=5 PREC=276 CHARS=38627 SENTENCES=188 CSUM ERR=0
LAT=56.364532 LON=8.626306 SAT=5 PREC=276 CHARS=39086 SENTENCES=190 CSUM ERR=0

Yderligere muligheder i softwaren

Der ligger yderligere muligheder i klassen man kan anvende, hvis man ønsker andre måder at anvende GPS-modulet på:

  TinyGPS();
  bool encode(char c); // process one character received from GPS
  TinyGPS &operator << (char c) {encode(c); return *this;}

  // lat/long in MILLIONTHs of a degree and age of fix in milliseconds
  // (note: versions 12 and earlier gave lat/long in 100,000ths of a degree.
  void get_position(long *latitude, long *longitude, unsigned long *fix_age = 0);

  // date as ddmmyy, time as hhmmsscc, and age in milliseconds
  void get_datetime(unsigned long *date, unsigned long *time, unsigned long *age = 0);

  // signed altitude in centimeters (from GPGGA sentence)
  inline long altitude() { return _altitude; }

  // course in last full GPRMC sentence in 100th of a degree
  inline unsigned long course() { return _course; }

  // speed in last full GPRMC sentence in 100ths of a knot
  inline unsigned long speed() { return _speed; }

  // satellites used in last full GPGGA sentence
  inline unsigned short satellites() { return _numsats; }

  // horizontal dilution of precision in 100ths
  inline unsigned long hdop() { return _hdop; }

  void f_get_position(float *latitude, float *longitude, unsigned long *fix_age = 0);
  void crack_datetime(int *year, byte *month, byte *day, 
    byte *hour, byte *minute, byte *second, byte *hundredths = 0, unsigned long *fix_age = 0);
  float f_altitude();
  float f_course();
  float f_speed_knots();
  float f_speed_mph();
  float f_speed_mps();
  float f_speed_kmph();

  static int library_version() { return _GPS_VERSION; }

  static float distance_between (float lat1, float long1, float lat2, float long2);
  static float course_to (float lat1, float long1, float lat2, float long2);
  static const char *cardinal(float course);

#ifndef _GPS_NO_STATS
  void stats(unsigned long *chars, unsigned short *good_sentences, unsigned short *failed_cs);
#endif

Flere af disse metoder anvendes i det andet eksempel der ligger i ZIP-filen.

Layout

Det blå GPS moduls placering på programmerings-shieldet kan ses her:
Layout-gps1.png
Placering af Det blå GPS modul

Referencer