Problemas al usar el módulo GPS MT3329 SKM53

Compré un módulo GPS SKM53 hace unos meses. Me esforcé mucho para que funcionara, pero no pude sacar nada de eso. Estaba pensando que es una falla del dispositivo (en realidad, pensé que lo había quemado al no darle el suministro correctamente) . Así que no lo pensé mucho y pedí otro ( aquí ).

Recibí el segundo módulo (igual, SKM53) hoy. Bueno.. algo no esta bien, se comporta exactamente igual que el anterior! No estoy familiarizado con el módulo, pero pensé que era algo fácil de usar. Probé con el boceto de ejemplo "simple_test" que viene con la biblioteca principal de arduino, TinyGPS (ver más abajo). Al observar el monitor serial, todos los valores son cero. Además, el aparentemente LED (supuse) , al lado de '1206' (ver imagen), no se enciende.

ingrese la descripción de la imagen aquí

¿Significa todo eso que el módulo no funciona? Con la esperanza de que no, ¿qué puedo hacer para que funcione? (Probé en un terreno abierto donde el cielo es claramente visible).

Bosquejo (simple_test)

#include <SoftwareSerial.h>

#include <TinyGPS.h>

/* This sample code demonstrates the normal use of a TinyGPS object.
   It requires the use of SoftwareSerial, and assumes that you have a
   4800-baud serial GPS device hooked up on pins 10(rx) and 11(tx).
*/

TinyGPS gps;
SoftwareSerial ss(10, 11);

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

  Serial.print("Simple TinyGPS library v. "); 
  Serial.println(TinyGPS::library_version());
  Serial.println("by Mikal Hart");
  Serial.println();
}

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);
}

Salida observada

Simple TinyGPS library v. 12
by Mikal Hart

 CHARS=0 SENTENCES=0 CSUM ERR=0
 CHARS=0 SENTENCES=0 CSUM ERR=0
 CHARS=0 SENTENCES=0 CSUM ERR=0
 CHARS=0 SENTENCES=0 CSUM ERR=0
 CHARS=0 SENTENCES=0 CSUM ERR=0
 CHARS=0 SENTENCES=0 CSUM ERR=0
 CHARS=0 SENTENCES=0 CSUM ERR=0
 CHARS=0 SENTENCES=0 CSUM ERR=0
 CHARS=0 SENTENCES=0 CSUM ERR=0

EDITAR

Este es el código de trabajo que utilicé, editando un ejemplo que viene con TinyGPSlib. Utiliza serie de hardware, USART1, en lugar de serie de software.

#include <SoftwareSerial.h>

#include <TinyGPS.h>

/* This sample code demonstrates the normal use of a TinyGPS object.
 It requires the use of SoftwareSerial, and assumes that you have a
 4800-baud serial GPS device hooked up on pins 3(rx) and 4(tx).
 */

TinyGPS gps;

static void gpsdump(TinyGPS &gps);
static bool feedgps();
static void print_float(float val, float invalid, int len, int prec);
static void print_int(unsigned long val, unsigned long invalid, int len);
static void print_date(TinyGPS &gps);
static void print_str(const char *str, int len);

void setup()
{
  Serial1.begin(9600);     //GPS module is connected to USART1
  Serial.begin(9600);

  Serial.print("Testing TinyGPS library v. "); 
  Serial.println(TinyGPS::library_version());
  Serial.println("by Mikal Hart");
  Serial.println();
  Serial.print("Sizeof(gpsobject) = "); 
  Serial.println(sizeof(TinyGPS));
  Serial.println();
  Serial.println("Sats HDOP Latitude Longitude Fix  Date       Time       Date Alt     Course Speed Card  Distance Course Card  Chars Sentences Checksum");
  Serial.println("          (deg)    (deg)     Age                        Age  (m)     --- from GPS ----  ---- to London  ----  RX    RX        Fail");
  Serial.println("--------------------------------------------------------------------------------------------------------------------------------------");
}

void loop()
{
  bool newdata = false;
  unsigned long start = millis();

  // Every second we print an update
  while (millis() - start < 1000)
  {
    if (feedgps())
      newdata = true;
  }
  gpsdump(gps);
}

static void gpsdump(TinyGPS &gps)
{
  float flat, flon;
  unsigned long age, date, time, chars = 0;
  unsigned short sentences = 0, failed = 0;
  static const float LONDON_LAT = 51.508131, LONDON_LON = -0.128002;

  print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5);
  print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5);
  gps.f_get_position(&flat, &flon, &age);
  print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 9, 5);
  print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 10, 5);
  print_int(age, TinyGPS::GPS_INVALID_AGE, 5);

  print_date(gps);

  print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 8, 2);
  print_float(gps.f_course(), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
  print_float(gps.f_speed_kmph(), TinyGPS::GPS_INVALID_F_SPEED, 6, 2);
  print_str(gps.f_course() == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(gps.f_course()), 6);
  print_int(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0UL : (unsigned long)TinyGPS::distance_between(flat, flon, LONDON_LAT, LONDON_LON) / 1000, 0xFFFFFFFF, 9);
  print_float(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : TinyGPS::course_to(flat, flon, 51.508131, -0.128002), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
  print_str(flat == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON)), 6);

  gps.stats(&chars, &sentences, &failed);
  print_int(chars, 0xFFFFFFFF, 6);
  print_int(sentences, 0xFFFFFFFF, 10);
  print_int(failed, 0xFFFFFFFF, 9);
  Serial.println();
}

static void print_int(unsigned long val, unsigned long invalid, int len)
{
  char sz[32];
  if (val == invalid)
    strcpy(sz, "*******");
  else
    sprintf(sz, "%ld", val);
  sz[len] = 0;
  for (int i=strlen(sz); i<len; ++i)
    sz[i] = ' ';
  if (len > 0) 
    sz[len-1] = ' ';
  Serial.print(sz);
  feedgps();
}

static void print_float(float val, float invalid, int len, int prec)
{
  char sz[32];
  if (val == invalid)
  {
    strcpy(sz, "*******");
    sz[len] = 0;
    if (len > 0) 
      sz[len-1] = ' ';
    for (int i=7; i<len; ++i)
      sz[i] = ' ';
    Serial.print(sz);
  }
  else
  {
    Serial.print(val, prec);
    int vi = abs((int)val);
    int flen = prec + (val < 0.0 ? 2 : 1);
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
    for (int i=flen; i<len; ++i)
      Serial.print(" ");
  }
  feedgps();
}

static void print_date(TinyGPS &gps)
{
  int year;
  byte month, day, hour, minute, second, hundredths;
  unsigned long age;
  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
  if (age == TinyGPS::GPS_INVALID_AGE)
    Serial.print("*******    *******    ");
  else
  {
    char sz[32];
    sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d   ",month, day, year, hour, minute, second);
    Serial.print(sz);
  }
  print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
  feedgps();
}

static void print_str(const char *str, int len)
{
  int slen = strlen(str);
  for (int i=0; i<len; ++i)
    Serial.print(i<slen ? str[i] : ' ');
  feedgps();
}

static bool feedgps()
{
  while(Serial1.available()>0)
  {
    char c= Serial1.read();
    if (gps.encode(c))
      return true;
  }
  return false;
}
¿Tienes una foto de tu configuración?
¿Qué tipo de Arduino usas? arduino.cc/en/Reference/SoftwareSerial Mire las limitaciones.
Cuando lo enciende, ¿ve mensajes periódicos en la línea TX? Muchos dispositivos GPS están configurados para enviar mensajes automáticamente una vez que se encienden.
Mire TXD y RXD con un voltímetro, ¿suelen ser altos a 5V?
@jippie la configuración es bastante simple. Hice lo que sugiere el boceto de ejemplo. VCC a 5v, GND a tierra, NC y RC desconectados, (¡ vaya! ) Rx a 3 y Tx a 4. Estoy usando Arduino Mega, así que (revisé las limitaciones) cambié Rx a 10 y Tx 11 (y cambié el boceto en consecuencia). ¿Nada malo?
@kenny, ¿cómo puedo probarlo (supervisando directamente la salida del GPS)?
Debería estar enviando NMEA en la línea TX. ¿Quizás cambiaste entre los dos? Por lo general, están conectados de forma cruzada (TX a RX de uC y RX a TX de uC)
Actualice el boceto en su pregunta en consecuencia, como sugiere @GustavoLitovsky, verifique el orden TX/RX. Una imagen todavía puede ser útil.
@Anubis un alcance es la mejor manera, pero es posible que pueda arreglárselas con un DMM como sugiere Gustavo. La entrada/RX debe ser flotante y la salida/TX mayormente alta con un pulso de datos de vez en cuando.
@kenny creo que te voy a amar!! Acabo de intentar conectar GPS Tx a mis transmisores inalámbricos Rx. ¡Hombre! Empecé a recibir este extraño, pero aparentemente sensato resultado, '$GPRMC,171128.529,V,,,,,0.93,132.98,050113,,,N*4a= $GPGGA,171130.000,,,,,0,2,, ,M,,M,,*4F $GPGSA,A,1,,,,,,,,,,,,,,,*1E' ( etc... ) puedo ser feliz? el módulo está al menos funcionando? entonces probablemente la conjetura de Jippie era correcta. La falla puede estar en la configuración. esperando hasta que regrese ... (y el comentario anterior de kenny sigue siendo válido. ¿Cuál es la forma correcta de probarlo?)
lo siento chicos no vieron los nuevos comentarios. Qué debería hacer ahora ?
@Anubis parecen oraciones NMEA. Probablemente solo necesites los de GPRMC. Buena suerte.
@kenny espera! Entonces, ¿por qué Arduino no puede recibir el GPS Tx? (Esta es la salida directa de GPS). Necesito procesar datos GPS en uC..
@Anubis No entiendo tu pregunta. Conecte el GPS TX al RX de la uC con los mismos baudios/ajustes, y debería obtener esas frases de GPS/NMEA.
@Anubis ¿puedes publicar el nuevo código con la configuración serial del hardware??????? por favor y gracias
@ memo20080858 vea la publicación editada, he incluido el código que usé. Es bastante simple, solo tiene que configurar y usar algún módulo serial de hardware en lugar del objeto serial de software usado.

Respuestas (5)

Primero, será mejor que actualice el IDE a la última versión (si aún no lo ha hecho). Hay algunos errores en los IDE anteriores.

Como está utilizando Arduino mega, debe consultar los SoftwareSerial documentos de la biblioteca y averiguar qué pines se pueden usar en Mega. Como se menciona en uno de los comentarios, existen algunas limitaciones en la biblioteca. (No podrá usar directamente los ejemplos que vienen con el IDE ya que usan pines D2, D3 que no son compatibles con Mega)

Sin embargo, hay muchos módulos USART en Mega. ¿Por qué no usar hardware serial en lugar de virtual?

Tuve el mismo problema con ese módulo. Esto puede ser útil.

He seguido eso antes. Sin embargo, he descubierto el problema. El problema fue con la SoftwareSerialbiblioteca, como algunas personas sugirieron anteriormente, no es compatible con algunos de los pines de Arduino Mega. Después de cambiar el Txpin a 10, funcionó. Gracias por el apoyo de todos modos!

Trate de usar baudrate 9600. Lo hice funcionar, pero con algunas limitaciones. Elimina aleatoriamente algunas partes de las oraciones (tal vez debido a SoftwareSerial/NewSoftwareSerial que estoy usando. Aumentar el tamaño del búfer de SoftwareSerial no parece ayudar).

Gracias por la respuesta. El problema ya está solucionado. El problema era que no estaba usando los pines correctos con Arduino Mega. El módulo está funcionando perfectamente ahora. Sin embargo, como Arduino mega tiene varios módulos seriales de hardware, estoy usando uno de ellos con el módulo. Supongo que estás usando un software en serie con un código pesado. Si no lee el módulo lo suficientemente rápido, puede perder algunos de los bytes entrantes.

Encontré esta publicación muy útil, usted también puede serlo. http://hotresistor.blogspot.com/2014/11/arduino-interface-with-gps-tutorial.html

¿Puede editar algunos detalles más de ese enlace en su respuesta? Se desaconsejan las respuestas de solo enlace porque pueden volverse inútiles en el futuro si el enlace muere.

Prueba a alimentar el GPS con un regulador de voltaje externo usando la configuración del siguiente enlace http://competefornothing.com/l7805-voltage-regulator-for-arduino-5v-1amp/

¿Puede editar algunos detalles más de ese enlace en su respuesta? Se desaconsejan las respuestas de solo enlace porque pueden volverse inútiles en el futuro si el enlace muere.