Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting GPS to Work on SIM5320A 3G/GPS Module

Tags:

gps

I have a Adafruit FONA 3G/GPS module (American Version). I have gotten the cellular functionality to work but I am struggling with GPS. I have tried both passive and active antennas.

This is a list of AT commands that are available to the SIM5320A module (pdf). The Adafruit example code uses AT commands that don't run on this SIM module. I send the following sequence:

AT+CGPS=1,1

AT+CGPSINFO

and I am receiving:

+CGPSINFO: ,,,,,,,,

AmpI/AmpQ: 4xx/4xx

What exactly is going wrong? I am connected but am not getting any data out. Also, I understand the mathematical significance of AmpI/AmpQ but what does that mean in terms of connection to GPS network?

like image 295
eegonzales Avatar asked Dec 05 '25 15:12

eegonzales


1 Answers

First, if you're using the FONATest example from Adafruit, you need to look around line 48. Comment out the line that declares a variable of type Adafruit_FONA and uncomment the line that declares a variable of type Adafruit_FONA_3G.

Also, if you haven't run the FONA_3G setbaud program to set the baud rate to something other than 115,200, you need to run it. (This isn't made very clear by Adafruit, and I thought my board was bad before I found that information.)

Second, unless you bridge the pads labeled bias on the board, you will have to use a passive GPS antenna. The SIMCOM module's GPS is pretty sensitive though. I had a uFL-to-SMA adapter plugged into the board, and stuck a 5-inch jumper wire into the SMA's center pin. The GPS acquired a position within a minute!

I tried the following command: AT+CGPS=1 and then used AT+CGPS? to query the GPS status. It reported +CGPS: 1,1 back to me.

The first few attempts at sending AT+CGPSINFO gave me the same info that you got, i.e. no position.

However, after a few minutes with a wire (or passive antenna), AT+CGPSINFO started returning valid time and position information.

Hope this helps.

UPDATE:

You've asked for code, and I'm happy to oblige. This code is designed to just be a terminal-like relay for serial data between the Arduino (using Tools -> Serial Monitor) and the Fona. So the commands I described above, I just entered by hand. Still, some folks may find it useful.

#include <Adafruit_FONA.h>
#include <SoftwareSerial.h>

#define RX_FROM_FONA 2
#define TX_TO_FONA 3
#define FONA_RST 4
#define FONA_PWR_KEY 5
#define FONA_PWR_STATUS 7

Adafruit_FONA fona = Adafruit_FONA(FONA_RST);

SoftwareSerial fonaSerial = SoftwareSerial(TX_TO_FONA, RX_FROM_FONA);

void setup() {
    pinMode(FONA_RST, OUTPUT);
    pinMode(FONA_PWR_KEY, OUTPUT);
    pinMode(FONA_PWR_STATUS, INPUT_PULLUP);

    pinMode(LED_BUILTIN, OUTPUT);

    digitalWrite(FONA_RST, HIGH);
    digitalWrite(FONA_PWR_KEY, HIGH);

    resetFona();

    Serial.begin(115200);

    fonaSerial.begin(4800); 
}

void resetFona() {
    digitalWrite(LED_BUILTIN, HIGH);
    digitalWrite(FONA_RST, LOW);
    delay(200);
    digitalWrite(LED_BUILTIN, LOW);
    digitalWrite(FONA_RST, HIGH);
    delay(1000);
    digitalWrite(LED_BUILTIN, HIGH);
    digitalWrite(FONA_PWR_KEY, LOW);
    delay(5000);
    digitalWrite(LED_BUILTIN, LOW);
    digitalWrite(FONA_PWR_KEY, HIGH);
    delay(100);
}

char buffer[255];
int crIndex = 0;
int bufferIndex = 0;
int foundCR = 0;

void loop() {

    if (Serial.available()) { 
        buffer[bufferIndex++] = Serial.read(); 
        if (buffer[bufferIndex - 1] == 13) { 
            crIndex = bufferIndex - 1;
            foundCR = 1; 
        }
    }

    if (bufferIndex > 255) { bufferIndex = 0; }

    while (fonaSerial.available()) { Serial.write(fonaSerial.read()); }

    if (foundCR > 0) {
        for (int i = 0; i <= crIndex; i++) {
            fonaSerial.write(buffer[i]);
        }

        foundCR = 0;
        bufferIndex = 0;
        crIndex = 0;
    }
}
like image 143
wintermute Avatar answered Dec 10 '25 11:12

wintermute