3D Robotics

Using the 5Hz Locosys GPS with Arduino/ArduPilot

Sparkfun is now selling the excellent 5Hz Locosys (Mediatek chipset) GPS that Dean Goedde uses in ArduPilot. We're developing a daughterboard that will allow this 3.3v module to be a plug-and-play replacement for the 5v, 1Hz EM406 GPS that we're currently using for ArduPilot. In the meantime, if you want to start playing with a 5Hz GPS with Arduino here's some code and instructions to get you started.
The code is Jordi's new NMEA parser for the Locosys GPS. It's checksum verified, rocksolid, continuous, no delays, loop rate is about 32000hz. It uses pointers, so it's efficient.

You have to configure the Locosys for the first time you use it. It's very easy, you just need an FTDI cable. Be sure to connect the GPS to a 3.3 volt source. (We'll do this setup for you in the commercial version)


Instructions (please use the picture above as reference):

1-Run Realterminal and open the port @4800bps, you should see all the NMEA stuff, is not check the connections..
2-Now make sure you have checked the options marked with the green arrow... +CR +LF
3-Copy and paste this code: $PMTK251,38400*27 to the box indicated with the red arrow.
4-Then click the "Send ASCII" button indicated with the blue arrow..
5-Then the NMEA should disappear, and starting showing strange values. Go back to the "Port tab" (yellow arrow),
close the port, and choose the Baud "38400", and open the port again. You should the NMEA data again... =)
6- Then go back to the "Send" tab, and copy&paste this code: $PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28 then click Send, this should turn Off all sentences except GGA and RMC
7-Copy&paste now this code: $PMTK220,200*2C This should increase the updates to 5hz... (WOW!!!)..
8- Now you are able to connect the GPS module to Arduino, (only connect the RX pin to the TX of the GPS)
9-Then upload the code above, and open the port monitor, you should see Lat, Lon, Course, Speed, Altitude, Fix Position... like this:
46024504 8050998 312 0 519 1 (and yes you now know the exact position of my Swiss Chalet =P)...

If you want other setup codes for this GPS, you can find them in this datasheet.

Code explanation

If you'd like to understand the NMEA parser code a bit better, here are some of the library functions that it calls (all from the standard C++ library):

  • First of all pointers, which are very easy. They just give you the memory address where a variable is allocated in the ram: info
  • Then the strncmp(), better know as String Comparator. We use it to compare the header of the NMEA string "$GPGGA": info
  • Then strtl(), which means String to Long Variable. It converts a string number into a long variable: info
  • Then the strtok(). This is the string tokens, which looks for tokens in a string, for example commas ",", the ones used to separate values in the NMEA sentence: info
  • The atoi() will convert strings to integers: info
  • If you want to know all the available functions, see the library called "strings.h", "stdlib.h": info and info
(All these libraries are already installed in the Arduino IDE.)
E-mail me when people leave their comments –

You need to be a member of diydrones to add comments!

Join diydrones

Comments

  • Thanks for the feedback. Just in case others are wondering about the intermediate component between the RS-232 and the TTL logic coming out of the LS20031 GPS I used a MAX232 chip from Texas Instruments. This chip will convert the TTL logic into workable RS232 voltage.
  • I hook my LS20031 to my FTDI Basic Breackout (sparkfun) which has a +3.3V connector. I soldered pigtails to the GPS instead of a connector.
    Any bauds rates up to 57600 will do as long as the serial Com port AND the GPS are set up the same. Default GPS is 9600 bds and 1Hz. The MTK instructions to set up the LS20031 are here: MTK NMEA PROPRIETARY COMMAND.pdf. I got them directly from LocoSys support.
    I hope this helps.
    https://storage.ning.com/topology/rest/1.0/file/get/3691918414?profile=original
  • I don't think you can hook it up to RS-232 given that the voltage levels from the locosys is 3 volts and RS-232 is+=12 volts if I remember correctly. I hooked mine up directly to the FTDI cable and used two AA batteries for the power source. That worked for getting data into the terminal program running on my PC. To hook it up to the Ardupilot I use the daughter board that takes care of the different voltage levels.

    -tychoc
  • LS20031My apologies it's actually LS 20031. I will look at my baudrate setting again, and perhaps try the real terminal software you used. Any other suggestions (now that I gave you accurate information) would be greatly appreciated. Thanks
  • 3D Robotics
    Geo: LS3001? I don't know that one. Are you sure you're using the right baud rate?
  • I bought this Lycosys LS3001 GPS and hooked the 3 pins in the back (TX, RX, GND) to a RS232 connector and I have a RS232 to USB connector (CP-US-03) from CP technologies and the fourth pin to a 3.3v power source so that I can use it on my laptop (laptop lacks RS232 connect). Does this configuration work? I mean the RS232 to USB because I have been having trouble trying to see anything out of the GPS. Although, admittedly, I am using the mini GPS software from sparkfun's website. I am new at this, any suggestions?
  • For those having problems getting the Locosys LS20031 GPS programmed, here’s how I did it:

    (1) Purchased a 3.3V USB TTL-232R cable (available from many sources).
    (2) Powered the GPS via the 3.3V output on an arduino board.
    (3) Plugged the TX/RX lines into the FTDI cable and followed the above directions, except my GPS was initially running at a default speed of 9600 baud.
    (4) I got nothing but garbage on the terminal program until I ran a common ground between GPS, arduino and cable.

    Worked like a charm. Thanks guys!
  • Yann: check NMEA reference
    NMEA data
    Explanation of NMEA sentences as used in GPS receivers.
  • Thanks Reto, I got it. It's just an XOR on received data...
  • You'll find an example for that calculation in the "GPS Navigation" tab of ArduPilot code. The answer is programing language dependent.
This reply was deleted.