Arduino UNO and SKM53 GPS Module, for Low Cost Blindman Stick.

I am building Blindman Stick, I have Arduino UNO, SKM53 GPS Module and Ultrasound Sensor. Uno with Ultrasound sensor is working fine but since 1 month I am trying to connect UNO with GPS but no help.

I read in one post about testing SKM53 with following code But I have problems

Problem: Serial Port shows no data when I hook GPS to Pin 2 and 3.

BUT when I hook GPS with Pins 0(Rx) and 1)Tx). Then I receive complete valid data stream by pressing RESET BUTTON only. Without pressing no data is showing.

I need continuous stream of GPS data. and parse it to get lat, long.

I will be thankful if some one guide me in proper direction.

CODE Used:

#include "TinyGPS.h"
#include "SoftwareSerial.h"
#define HEMISPHERE_PIN 13
#define GPS_RX_PIN 2
#define GPS_TX_PIN 3
TinyGPS gps; // create a TinyGPS object
SoftwareSerial ss(GPS_RX_PIN, GPS_TX_PIN); // create soft serial object
void setup()
{
Serial.begin(9600); // for debugging
ss.begin(9600); // Use Soft Serial object to talk to GPS
pinMode(HEMISPHERE_PIN, OUTPUT);
digitalWrite(HEMISPHERE_PIN, LOW); // turn off LED to start
}
void loop()
{
while (ss.available())
{
int c = ss.read();
Serial.write(c); // display NMEA data for debug
}
}

When you hook it to pins 0/1, the GPS is directly connected to goes directly to the USB converter chip (ATmega16U2), which forwards it to your PC, which displays it in the Serial Monitor Window.

The CPU chip (ATmega328P) is also connected to the USB converter chip. Normally, the CPU and the GPS would “fight” over what gets sent to the PC, but you are pressing the reset button, which keeps the CPU quiet. This allows the GPS data to “win”, and it gets sent to the PC.

The good news is that your GPS device is working. The bad news is you are not connecting it correctly. The GPS RX should be connected to Arduino TX, and GPS TX should be connected to Arduino RX. According to your code, you should connect

GPS RX to Arduino pin 3
GPS TX to Arduino pin 2
GPS VCC to Arduino 5V
GPS GND to Arduino GND

HOWEVER, the specification for the SKM53 says:

The serial connections are at 2.85V LVTTL logic levels, if need different voltage levels, use appropriate level shifters.

This means you should not connect the Arduino TX/RX pins directly to the GPS RX/TX pins. It could damage the GPS device. There are two ways to do this “level shifting”: buy a cheap level-shifting module, or use a few resistors and a diode. Description here.

I would suggest using NeoSWSerial instead of SoftwareSerial. NeoSWSerial is much more efficient, and it will not interfere with other parts of your program like SoftwareSerial does.

I also wrote NeoGPS, a GPS library that is smaller and faster than all the other libraries. If you plan on adding other features to your sketch, like SD logging or wireless communications, the NeoGPS examples a structured much better than other libraries’ examples. Many people have trouble modifying the TinyGPS examples to do other things.

Here is a simple NeoGPS example:

#include <Arduino.h>
#include "NMEAGPS.h"
#include <NeoSWSerial.h>

NeoSWSerial gps_port( 2, 3 ); // connected to GPS TX, GPS RX
NMEAGPS  gps; // This parses the GPS characters

void setup()
{
  Serial.begin(9600);
  while (!Serial)
    ;

  Serial.println( F("Looking for GPS device...") );

  gps_port.begin(9600);
}

//--------------------------

void loop()
{
  while (gps.available( gps_port ))
    doSomeWork( gps.read() );
}

//--------------------------

void doSomeWork( const gps_fix & fix )
{
  //  This is the best place to do your time-consuming work, right after
  //    the RMC sentence was received.  If you do too many other things
  //    in "loop()", you could cause GPS characters to be lost, and you 
  //    will not get a good lat/lon.
  //  If you print too much data here, this routine will not get back 
  //    to "loop()" in time to process the next set of GPS data.

  if (fix.valid.location) {

    if ( fix.dateTime.seconds < 10 )
      Serial.print( '0' );
    Serial.print( fix.dateTime.seconds );
    Serial.print( ',' );

    Serial.print( fix.latitude(), 6 ); // floating-point display
    Serial.print( ',' );
    Serial.print( fix.longitude(), 6 ); // floating-point display

    Serial.print( ',' );
    if (fix.valid.satellites)
      Serial.print( fix.satellites );

    Serial.print( ',' );
    Serial.print( fix.speed(), 2 );
    Serial.print( F(" kn = ") );
    Serial.print( fix.speed_mph(), 2 );
    Serial.print( F(" mph") );

  } else {
    // No valid location data yet!
    Serial.print( '?' );
  }

  Serial.println();

} // doSomeWork

It is based on NMEAloc.ino. If you want to try it, be sure to follow the Installation instructions.

You would normally try NMEA.ino first, and then NMEAdiagnostic.ino if that doesn’t work (yours probably will work). Then try NMEAorder.ino and modify the NMEAGPS_cfg.h file. Then try NMEA.ino again or any other example, like NMEAloc.ino.

Cheers,
/dev

Thanks /Dev for your guidance.

As I understand, to attach SKM53 GPS with Arduino's ( Rx, TX, 2, 3 or any pin) I need level-shifting module. So missing link is level-shifting module.

I bought Arduino UNO as SKM53 was not working with ATMEGA 2560.

I will arrange/build level-shifting module and test it and get back with results.

Thanks.

Reg