Ublox Neo-6M from E-bay
Hi All,
(First time trying this so please forgive if it's in the wrong place/format/whatever)
Just received a couple of Ublox Neo-6M GPS boards from E-bay
and thought I would try a quick review for anyone interested.
Board: GY-GPS6MV2 with Ublox Neo-6M
Seller: Worldchips
Shipping: included
Price: 17USD(+/-)
Apparently this board contains a voltage regulator (5 pin
chip to left of RX/TX pins) and can be powered off of a 5V supply. I am using
the 3.3V source from a Nearduino Uno (made from only the finest Chinesium).
The board appears to be well made. Soldering is good, antenna
connection is tight and assembled with a nice click/pop.
GPS TX is connected to digital pin 4 on Uno. Online
literature indicates that 3.3V will read as high. (It seems to work OK)
GPS RX is connected to a dropping resistor pair (4.7K + 10K) giving
3.4V. (It also seems to work OK)
Detailed directions here
http://www.ayomaonline.com/iot/gy-gps6mv2-neo6mv2-neo-6m-gps-module-with-arduino-usb-ttl/
VCC is attached to 3.3V supply of Uno.
GND is attached to Uno Gnd.
Serial monitor connection rate is set to 115200.
TX/RX rate between GPS and UNO is set to 9600. (note that the older GPS
chips were set to 4800bps)
Sketch is from TINYGPS examples on github: https://github.com/mikalhart/TinyGPS
When you first start up the GPS, it does take awhile before it starts
producing data. Be patient is can take up to 60 seconds to acquire lock.
It also does not work well indoors. I stuck mine on the window sill and
it was able to acquire a lock fairly quickly.
I checked my location using Google maps and it was within 6’ of true position.
I left the unit running for three hours and rechecked it. Indicated position
had drifted to about 15’-20’ from true position.
Not perfect, but for $17 I can probably live with it.
For those looking to delve a little deeper, here is information on the
NEMA data that the GPS can output. http://www.gpsinformation.org/dale/nmea.htm
Code from TinyGPS example
#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
9600-baud serial GPS device
hooked up on pins 4(rx) and 3(tx).
*/
TinyGPS gps;
SoftwareSerial ss(4, 3);
static void smartdelay(unsigned long ms);
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);
Serial.print("Testing
TinyGPS library v. "); Serial.println(TinyGPS::library_version());
Serial.println("by Mikal
Hart");
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("-------------------------------------------------------------------------------------------------------------------------------------");
ss.begin(9600);
}
void loop()
{
float flat, flon;
unsigned long age, date, time,
chars = 0;
unsigned short sentences = 0,
failed = 0;
static const double 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, 10, 6);
print_float(flon,
TinyGPS::GPS_INVALID_F_ANGLE, 11, 6);
print_int(age,
TinyGPS::GPS_INVALID_AGE, 5);
print_date(gps);
print_float(gps.f_altitude(),
TinyGPS::GPS_INVALID_F_ALTITUDE, 7, 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 ? 0xFFFFFFFF : (unsigned
long)TinyGPS::distance_between(flat, flon, LONDON_LAT, LONDON_LON) / 1000,
0xFFFFFFFF, 9);
print_float(flat ==
TinyGPS::GPS_INVALID_F_ANGLE ? TinyGPS::GPS_INVALID_F_ANGLE :
TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON), 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();
smartdelay(1000);
}
static void smartdelay(unsigned long ms)
{
unsigned long start = millis();
do
{
while (ss.available())
gps.encode(ss.read());
} while (millis() - start <
ms);
}
static void print_float(float val, float invalid, int len, int prec)
{
if (val == invalid)
{
while (len-- > 1)
Serial.print('*');
Serial.print(' ');
}
else
{
Serial.print(val, prec);
int vi = abs((int)val);
int flen = prec + (val <
0.0 ? 2 : 1); // . and -
flen += vi >= 1000 ? 4 :
vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
for (int i=flen; i<len;
++i)
Serial.print(' ');
}
smartdelay(0);
}
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);
smartdelay(0);
}
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);
smartdelay(0);
}
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] : ' ');
smartdelay(0);
}