how to program Digital Pins as RXI/TXO? (to transmit GPS data@56700)

I am using Arduino Pro to read GPS data from GPS Receiver - LS20031 5Hz (66 Channel), and I am using from the examples the "simple test" that start with

#include <icrmacros.h>
//#include <NewSoftSerial.h>

#include <SoftwareSerial.h>

#include <TinyGPS.h>

and I am getting the following error
C:\Users\Enrique\Documents\Arduino\libraries\NewSoftSerial\NewSoftSerial.cpp:43:24: fatal error: WConstants.h: No such file or directory
#include "WConstants.h"
^
compilation terminated.
Error compiling.

I understand SoftwareSerial.h should have been corrected to include Arduino.h, but I cannot check it, since it is already installed from the Arduino IDE,

please help me with this... and/or direct me to a place where I can use a code to read Locosys LS20031 GPS module data with an Arduino Pro Mini

Thanks a lot,

Enrique

I cannot check it, since it is already installed from the Arduino IDE

That does not prevent you editing it if necessary.

The error clearly states that the problem is in a file included by NewSoftSerial, not SoftwareSerial...

The error clearly states that the problem is in a file included by NewSoftSerial, not SoftwareSerial...

Yes, but who know what icrmacros.h is getting up to.

Well then maybe he should examine icrmacros.h and make sure it's not also including NewSoftSerial.

But there's nothing to suggest that checking SoftwareSerial as you suggested - we know it's not trying to include NewSoftSerial!

But there's nothing to suggest that checking SoftwareSerial as you suggested

Where did I suggest that ?

What I actually said was

That does not prevent you editing it if necessary.

Note the last two words.

Thank you for the replies, unfortunately I was away yesterday. I must try to read the GPS info today. I am not including NewSoftSerial, but from UKHeliBob words we dont know if icrmacros.h is calling the NewSoftSerial. Can you suggest where I can get the code for SoftwareSerial? I cannot find it.

Also if anyone can pinpoint to me to a place where I can use a code to read Locosys LS20031 GPS module data with an Arduino Pro Mini that would help a lot.

Thank you...

I am not getting the error anymore, it seems that the reason was that I was using the code called from a folder created after uncompressing the TinyGPS-13, but what we are to do is to run the simple-test from the downloaded file, however I am not getting any sentences, only something like this:

CHARS=43322 SENTENCES=0 CSUM ERR=1447

can someone help me please? I have the digital pin 4 of Arduino Pro Mini connected to the Tx pin 3 of the GPS and digital pin 3 of the Arduino Pro Mini conneccted to the Rx pin 2 of the GPS.

Please post the code that you are running.

I am still not able to run my sketch, I am using the same pin connection that I already described (I have the digital pin 4 of Arduino Pro Mini connected to the Tx pin 3 of the GPS and digital pin 3 of the Arduino Pro Mini conneccted to the Rx pin 2 of the GPS.) I am getting the following error:

CHARS=43322 SENTENCES=0 CSUM ERR=1447

the code is:

#include <icrmacros.h>
//#include <NewSoftSerial.h>

#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 4(rx) and 3(tx).
*/

TinyGPS gps;
SoftwareSerial ss(4, 3);

void setup()
{
  Serial.begin(115200);
  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);
  if (chars == 0)
    Serial.println("** No characters received from GPS: check wiring **");
}

I am still not able to run my sketch,

Your program is running but you are not getting any GPS sentences, although you are getting plenty of data.

I am afraid that I am not familiar with the GPS module that you are using but I know that the UBLOX GPS units, which is what I have, can be configured to suppress some messages.

Try uncommenting this line and see what happens.

      // Serial.write(c); // uncomment this line if you want to see the GPS data flowing

I am using the GPS Receiver - LS20031 5Hz (66 Channel) https://www.sparkfun.com/tutorials/176, I did what you told me and I can see a lot of strange characters being printed, which is something already reported in that link I sent you.

I am able to see the correct NMEA characters and full sentences if I use the RXI from my Arduino Pro Mini, but as soon as I try to do the same by using a digital pin, I am getting the garbage, so I am suspecting that my problem is getting the right set up for any digital pin of my Arduino Pro Mini to behave exactly as its RXI, also I am not sure why we need to connect the RX pin of the GPS, anyway this is the code I am using to convert my working NMEA reading code from the Arduino RXI to the Arduino Digital Pins 2 and 3 as RXI and TXO, in summary: how do I program a pair of Digital Pins as RXI/TXO?:

#include <SoftwareSerial.h>
SoftwareSerial ss(2,3);

void setup() {
  Serial.begin(115200);
  ss.begin(57600);
}

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

should I start new subject that is more related to the GPS and or the digital pins not working for RX/TX?

Please, no.

I suggest changing the subject of the original post to better reflect your goal.

Thread moved to Project Guidance.

Thanks so very much for the guidance and valuable help here. This is an important project for my institution.

Just updated the original subject to a clearer and current issue.

enrique_acuna:
I am using the GPS Receiver - LS20031 5Hz (66 Channel) https://www.sparkfun.com/tutorials/176, I did what you told me and I can see a lot of strange characters being printed, which is something already reported in that link I sent you.

I am able to see the correct NMEA characters and full sentences if I use the RXI from my Arduino Pro Mini, but as soon as I try to do the same by using a digital pin, I am getting the garbage, so I am suspecting that my problem is getting the right set up for any digital pin of my Arduino Pro Mini to behave exactly as its RXI, also I am not sure why we need to connect the RX pin of the GPS, anyway this is the code I am using to convert my working NMEA reading code from the Arduino RXI to the Arduino Digital Pins 2 and 3 as RXI and TXO, in summary: how do I program a pair of Digital Pins as RXI/TXO?:

#include <SoftwareSerial.h>

SoftwareSerial ss(2,3);

void setup() {
  Serial.begin(115200);
  ss.begin(57600);
}

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

Pro Mini has no USB but perhaps you have an FTDI cable or equivalent to some kind of monitor?

I see you have Serial which uses TX0 and RX1 pins on the board. Those are the 328P USART TX and RX pins. If you connect GPS TX to the Pro Mini RX, whatever is connected to the Pro Mini Serial will also get that signal at what baud rate?

Can the GPS run fine at 38400 instead of 57600 baud? If you have an FTDI cable, can you breadboard it straight to the GPS serial? Also, the GPS is 5V?

Pro Mini has no USB but perhaps you have an FTDI cable or equivalent to some kind of monitor?

I am using the FTDI breakout to communicate with my computer.

I see you have Serial which uses TX0 and RX1 pins on the board. Those are the 328P USART TX and RX pins. If you connect GPS TX to the Pro Mini RX, whatever is connected to the Pro Mini Serial will also get that signal at what baud rate?

Your question here can help me to express more exactly what I need: I used the following code to verify that the GPS does send the correct data, and that it works at 57600. The code uses the library TinyGPS.h, which parses the NMEA GPS data to a nice table with latitude, longitude, etc, that confirms the right data position is being generated. This one works because it uses the RXI pin connected to the GPS TX, for this work this way all I need to do is to load the program first to my Arduino Pro Mini without connecting the RXI pin to the GPS TX, and once it is loaded I go ahead and connecct this pin to the TX of the GPS and everything works very well. All this at 57600! But what I really need to do is to do exactly the same this code is doing but USING TWO DIGITAL PINS to be connected to the RX/TX of the GPS, this is exactly my problem, I cannot achieve this,

#include <SoftwareSerial.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 4(rx) and 3(tx).
*/


// GPS_LS20031_TEST_USES_MONITOR

#include <TinyGPS.h> // You will need TinyGPS from Mikal Hart's web page if you don't have it.

/* This sample code demonstrates the normal use of a TinyGPS object.
  It DOES NOT requires the use of SoftwareSerial, and assumes that you have a
  57600-baud serial GPS device hooked up on pins (TX) and PIN 0(RX) of your Arduino.
  If you're using a MEGA you will have to use the correct RX pin for MEGA.
  
  IF you are already using PIN 0(RX)on your Arduino for something else
  then this program may not work for you. 
  
  Also you're going to need to remove the connection between your RX pin on your
  Arduino and the GPS every time you programming the Arduino.
  I forgot this issue a few times.

 The Circuit:
    Pin assignments for the LS20031 GPS: 
    • GPS Pin 5 (left-most when viewed from above) : No connection (or ground)
    • GPS Pin 4 : to Arduino ground (GND) pin
    • GPS Pin 3 : to Arduino pin 0
    • GPS Pin 2 : No connection
    • GPS Pin 1 (right-most when viewed from above) : to Arduino 3.3V pin

   Note: you can use your own GPS with this, just make sure it output from the GPS is connected to the RX pin on your Arduino.     
*/

TinyGPS gps;
// SoftwareSerial nss( RXPIN, TXPIN); // NOT NEEDED IN THIS EXAMPLE
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(57600);
 //nss.begin(57600); // -- NOT NEEDED IN THIS EXAMPLE
 
 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.print("Serial Buffer size = ");Serial.println(" ?? ");            //(_SS_MAX_RX_BUFF); I am not sure how to address this- comes
                                                                                              // directly from the RX buffer
 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);
 
 // Ternary operation --> condition ? value_if_true : value_if_false 
 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);
   // Ternary operation >>condition ? value_if_true : value_if_false 
   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) // Ternary operation --> condition ? value_if_true : value_if_false 
   Serial.print(i<slen ? str[i] : ' ');
 feedgps();
}

static bool feedgps()
{
  while (Serial.available())
   {
    if (gps.encode(Serial.read()));
   }
 return false;
}

Can the GPS run fine at 38400 instead of 57600 baud? If you have an FTDI cable, can you breadboard it straight to the GPS serial? Also, the GPS is 5V?

By now you can tell that my GPS and everything is working at 3V and at 57600 which is what Sparkfun, the provided suggests in this web page: https://www.sparkfun.com/products/8975

Please continue to help me with this, I really need any help.

If the Arduino is 5V you don't want it to transmit (TX) directly to GPS unless it has 5V tolerant inputs like the Teensy 3.2. There are at least 4 good ways to level voltage from 5V down to 3.3V, I've used 3 4.7K resistors to make a voltage divider or two but it's clunky compared to using a 30 cent chip to do 5 channels.
The 3 resistors can be 1K to 50K, more resists loss as well as limits user current, less opens up both.
I run the 5V signal into all 3 4.7K resistors in series to ground.
The point where the first and second resistors meet is where I tap 3.3V to signal device.
That is 5V output to 3.3V input, always protect. 3.3V output to 5V input works straight.

Use the latest libraries where possible.

I note that in loop() you have a local variable named start (isn't that reserved?) that probably should be static but is not. I really don't want to get into the rest of the code, it blocks bad in at least one part.

hello GoForSmoke, thanks for your reply, but perhaps I did not explain clearly enough in my previous message, the code I shared last is working well if I use the Arduino RXI line connected to the GPS TXO after uploading the program, the problem happens when I modify the code to use a the SoftwareSerial nss(RXPIN, TXPIN) to use two digital pins instead of the Arduino RXI. As my new subject says what I need help with is, then, on how to program Digital Pins as RXI/TXO? (to transmit GPS data@56700)