Gstar MTK GPS 3329 with Arduino UNO - How to get it working?

Hello, I have a MultiWii PRO Flight Controller w/MTK GPS Module from hobbyking Radio Control Planes, Drones, Cars, FPV, Quadcopters and more - Hobbyking

After putting shrink wrap around the GPS's wires and flashing new firmware onto the Multiwii FC, GPS isn't working anymore.
I'd like to test it with my Arduino, but I can't find any working code or libraries for it. Could someone give me some advice which code or library I can use?

At the moment I am using TinyGPS, but get no results:

This is my GPS:

And this is the code:

#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;
SoftwareSerial nss(3, 4);

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()
{
Serial.begin(115200);
nss.begin(4800);

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 = ' ';

  • 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 = ' ';_
    * 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 : ' ');
    feedgps();
    }
    static bool feedgps()
    {
    while (nss.available())
    {
    if (gps.encode(nss.read()))
    return true;
    }
    return false;
    }*
    Thank you,_

Bump, anyone?

se this one
http://forum.arduino.cc/index.php?topic=215308.msg1575710#msg1575710

knut_ny:
se this one
Trouble Saving Data - #5 by knut_ny - Interfacing w/ Software on the Computer - Arduino Forum

Hello, thank you for the code. I've uploaded it to my Arduino UNO, connected TX of GPS to pin 10, and RX to pin 11 (RX is not needed right?), Anyway, in Serial Monitor of Arduino, it stays empty. So nothing happens? That means that GPS is not available..

What could be the reason?

The GPS red light burns on the GPS itself.

Can I power the arduino uno + gps with only the USB or do I need an external battery for it?

Default speed may be 4800 or 9600 baud. Try both values.
minimum code for testing

// minimum test code for serial gps

#include <SoftwareSerial.h>

SoftwareSerial gps(3,4); // RX, TX  Connect GPS TX to pi 3
void setup()
{
  Serial.begin(115200);
  gps.begin(9600);  // may be 4800

}

void loop()
{
  if (gps.available())  Serial.write(gps.read());
}

knut_ny:
Default speed may be 4800 or 9600 baud. Try both values.
minimum code for testing

// minimum test code for serial gps

#include <SoftwareSerial.h>

SoftwareSerial gps(3,4); // RX, TX  Connect GPS TX to pi 3
void setup()
{
 Serial.begin(115200);
 gps.begin(9600);  // may be 4800

}

void loop()
{
 if (gps.available())  Serial.write(gps.read());
}

Hello, What baud should I use if I set the GPS baud at 9600 in the serial monitor? Also at 9600 or at 115200, because serial begins at 115200? Hey, I was connecting RX to pin 3, that's why it did not work. STUPID ME. Anyway, I get strange ascii like figures, any idea?
GPS baud set at 4800 and also tried 9600.
at baud 4800 in serial monitor
ÿÐÐþÂôÐòþðúÐýøÂðìÿ?ÙíF[ÿô?ËîËÞæ6ñòËüÆö­xÀûÓÒýÆþûÉÆìÛönÿìÐþÂä?ÿÆþÿøüÓòfÿäðÐ?ÿìðêðÑúõòø$ÀôýðäòôÈúöèø

On the Arduino playground it says: Arduino Playground - HomePage
"Note: if you are using an Andruino Uno, keep in mind that you can't use the GPS module at the same time as your computer is connected on the USB port." How can I test it then?

U use Softwareserial. I can see you get something.
Keep serial speed 115200 for IDE. (remenber to change IDE speed also to 115200)
Most Serial gps use 9600 baud, but this value is users choice.
Try all possible values.. 1200,2400,......,19200, 38400 Tha datasheet will tell you which speeds is supported, and how to send commands to change it (if you have to)

found this in a datasheet for 3329
I/O
Signal Output 8 data bits, no parity, 1 stop bit
Available Baud Rates Default:9600bps
(4800/9600/38400/57600/115200 bps by customization)

Hey, The baud rates that should work are 9600, 115200, 38400. Non work correctly. I get only some strange ASCII characters... I hate this gps module

I hope you have this

Serial.begin(115200); // !!!! and when open serial window , lower right corner change to 115200 (must match programcode)
gps.begin(nn); where nn is a value (4800/9600/38400/57600/115200) Stange that 19200 is missing

dos this match your tests ?

knut_ny:
I hope you have this

Serial.begin(115200); // !!!! and when open serial window , lower right corner change to 115200 (must match programcode)
gps.begin(nn); where nn is a value (4800/9600/38400/57600/115200) Stange that 19200 is missing

dos this match your tests ?

Only baud I did not test was 57600, is this correct?
$GPGGA,hhmmss.ss,llll.ll,a,yyyyy.yy,a,x,xx,x.x,x.x,M,x.x,M,x.x,xxxx*hh

I think you fixed it :smiley: Could you help me translate this? THANK YOU!!!

EUREKA!!!
Read wiki NMEA-kodes. http://aprs.gids.nl/nmea/
Then you will be able tu fully understand what you get

The RMC sentence in the most interesting.

knut_ny:
EUREKA!!!
Read wiki NMEA-kodes. Then you will be able tu fully understand what you get

The RMC sentence in the most interesting.

Now I know where you live..
52 deg min North 004 deg min ,East
I'm at 68N 16E

Come by, we could work on a quadcopter or arduino project :smiley: If you don't mind, I will remove the important parts of my location, could you also please remove it from your comment? :D. I have found this website and am decoding the numbers etc. GPS - NMEA sentence information

Thank you very much!! Now I know that there is nothing wrong with my GPS at least.

have a great night :smiley:

knut_ny:
EUREKA!!!

Hey! Wanted to let you know, that thanks to you, I even got GPS fixed on my MultiWii Quadcopter! It was all about the wrong baud rate, 57600 seems to work great now!

Thank you!