GPS + BDS BeiDou Dual Module Flight Control Wiki - DFRobot

Introduction

This is a small-size positioning and navigation module based on the AT6558 (a real sixes in one multi-mode satellite navigation and positioning chip). It can provide real-time location information, and support a variety of satellite navigation systems, including 32 tracking channels. Besides, the module can receive GNSS signal from 6 satellite navigation systems simultaneously, which include China BDS (Beidou navigation satellite system), the American GPS, the Russian GLONASS, European GALILEO, Japan QZSS and SBAS satellite augmentation system (WAAS, EGNOS, GAGAN MSAS), and realize the joint positioning, navigation and timing.

In serial output mode, the module is compatible with various mainboards equipped with serial output: Arduino, Raspberry Pi, STM32 and so on. The positioning accuracy error is measured at about 3m, basically the same as smartphones. The module’s power consumption is as low as 0.1W, and it can work continuously for a long time with a small power supply.

TEL0132-01

The small size of the module allows it to be embedded in various types of drones and smart cars. Furthermore, this module can be very suitable for vehicle navigation, handheld positioning and wearable devices or be used as a replacement of Ublox MAX series module.

Specification

Board Overview

TEL0132-02

Name Function
VCC Power Input(5V)
GND Ground
TX Transmit
RX Receive
PPS Pulse Output Per Second

Module Introduction

TEL0132-03

TEL0132-04

TEL0132-05

Number Name I/O Description Electrical
1 GND I Ground
2 TXD O Navigation Data Output NMEA0183 Protocol
3 RXD I Interactive Command Input Configuration Command Input
4 1PPS O Second Pulse Output
5 ON/OFF I Module Shutoff control, active Low
6 VBAT I RTC and SRAM backup power supply Power with 1.5~3.6V to insure a warm start for the module
7 NC I
8 VCC I Module Power Input DC 3.3V±10%, 100mA
9 nRESET I Module Reset Input, active Low Left floating when not used
10 GND I Ground
11 RF_IN I Antenna Signal Input
12 GND I Ground
13 NC
14 VCC_RF O Power Output +3.3V, can be used as power for antenna
15 Reserve Left floating
16 SDA I/O I2C data interface Left floating
17 SCL O I2C clock interface Left floating
18 Reserve Left floating
  1. Limit Parameter
Parameters Symbol Maximum Minimum Unit
Power Supply Voltage (VCC) Vcc -0.3 3.6 V
Backup Battery Voltage (VBAT) Vbat -0.3 3.6 V
Digital Input Pin Voltage Vin -0.3 Vcc+0.2 V
Maximum acceptable ESD level VESD (HBM) 2000 V
  1. Operating Conditions
Parameter Symbol Maximum Typical Minimum Unit
Power Supply Voltage VCC 2.7 3.3 3.6 V
Vcc Peak Current(Antenna not included) Ipeak 100 mA
Backup Power Vbat 1.5 3.0 3.6 V
Backup Power(Vbat Current) Ibat 10 uA
Input Pin Vil 0.2*Vcc V
Input Pin Vih 0.7*Vcc V
Output Pin Vol
Io=-12mA
0.4 V
Output Pin Voh
Io=12mA
Vcc-0.5 V
Active Antenna Output Voltage VCC_RF 3.3 V
Antenna short circuit protection current
VCC_RF (=3.3V)
Lant Short 50 mA
Antenna open circuit current
Power from VCC_RF (=3.3V)
Lant Open 3 mA
Antenna Gain Gant 15 30 dB
Technical Paramter
Signal Receive BDS/GPS/GLONASS/GALILEO/QZSS/SBAS
Number of RF channels Three-channel RF, support the full sonstellation BDS, GPS and GLONASS receriving at the same time
Cold Start TTFF ≤35s
Hot Start TTFF ≤1s
Recapture TTFF ≤1s
Cold Start capture sensitivity -148dBm
Hot Start capture sensitivity -156dBm
Recapture sensitivity -160dBm
Tracking sensitivity -162dBm
Positioning precision <2m(1σ)
Speed measurement precision <0.1m/s(1σ)
Timing precision <30ns(1σ)
Positioning update rate 1Hz(default), Maximum 10Hz
Serial port characteristics Baud rate range:4800 bps~115200 bps, default
9600bps, 8 data bits, No check, 1 stop bit
Protocol NMEA0183
Max Height 18000m
Max Speed 515m/s
Max Acceleration 4g
Backup battery 1.5V ~ 3.6V
Supply Voltage 2.7V ~ 3.6V
GPS&BD Typical power consumption <25mA @3.3V
Working Temperature -40 to +85℃
Storage Temperature -45 to +125℃
Size 10.1mm×9.7mm×2.4mm
Weight 0.6g

Data Analysis

It is recommended to test this module in an outdoor open place since if the antenna is placed on a balcony, its signal may be influenced by the buildings around. The positioning can be done within one minute in open spaces. When the onboard LED keeps flashing at a regular frequency, the positioning is completed. The default baudrate is 9600. Now let us check the data in the serial monitor.

$GNGGA,084852.000,2236.9453,N,11408.4790,E,1,05,3.1,89.7,M,0.0,M,,*48

$GNGLL,2236.9453,N,11408.4790,E,084852.000,A,A*4C

$GPGSA,A,3,10,18,31,,,,,,,,,,6.3,3.1,5.4*3E

$BDGSA,A,3,06,07,,,,,,,,,,,6.3,3.1,5.4*24

$GPGSV,3,1,09,10,78,325,24,12,36,064,,14,26,307,,18,67,146,27*71

$GPGSV,3,2,09,21,15,188,,24,13,043,,25,55,119,,31,36,247,30*7F

$GPGSV,3,3,09,32,42,334,*43

$BDGSV,1,1,02,06,68,055,27,07,82,211,31*6A

$GNRMC,084852.000,A,2236.9453,N,11408.4790,E,0.53,292.44,1412 16,,,A7 5 $GNVTG,292.44,T,,M,0.53,N,0.98,K,A2D

$GNZDA,084852.000,14,12,2016,00,00*48

$GPTXT,01,01,01,ANTENNA OK*35

There are three data types in the data: GN, GP and BD, which respectively represent the dual-mode mode, GPS mode, and Beidou mode.

NMEA0318 protocol frame format content can refer to the following forms:

(1) $GPGGA (GPS location information)

Num Name Example Unit Description
Message ID $GPGGA GGA protocol header
<1> UTC Position 161229.487 hhmmss.sss
<2> Latitude 3723.2475 ddmm.mmmm
<3> Latitude Direction N N=north or S=south
<4> Longitude 12158.3416 dddmm.mmmm
<5> Longitude W E=east or W=west
<6> Position Fix Indicator 1 0: Fix not avilable or invalid
1: GPS SPS Mode, fix valid
2: Differential GPS, SPS Mode, fix valid
3: GPS PPS Mode, fix valid
<7> Number of satellites in use 07 Range 00 to 12
<8> Horizontal dilution of precision 1.0 Range: 0.5-99.9
<9> Sea level height 9.0 meters Range: -9999.9-9999.9
<10> Units M M stands for meter
<11> Geoid Separation meters Range: -999.9-9999.9
<12> Units M M stands for meter
<13> Age of correction data Seconds Empty when no differentoal data is presented
<14> Diff. Ref. Station ID 0000 Range: 0000-1023 (empty when no differential data is presented)
hh Checksum 18 Checksum of all characters ASCII codes between $ and *
(XOR each byte to get checksum, then convert it into ASCII characters in hexadecimal )
CR LF End of protocol frame

(2) $GPGLL (Geographic Position Information)

Num Name Example Units Description
Message ID $GPGLL GLL protocol header
<1> Latitude 3723.2475 ddmm.mmmm
<2> Latitude Direction N N: north; S: south
<3> Longitude 12158.3416 dddmm.mmmm
<4> Longitude Direction W W: west; E: east
<5> UTC Position 161229.487 hhmmss.sss
<6> Data Statu A A=data valid; V=data invalid
hh Checksum 2C

(3) $GPGSA (Current Satellites Information)

Num Name Example Unit Description
Message ID $GPGSA GSA Protocol Data header
<1> Position Mode A M: manually; A: automatically
<2> Posistion Type 3 1: fix not available
<3> PRN code number of satellite used on Channel 1 07 PRN(Pseudo Random Noise) Range: 01~32, can receive 12 satellites information at most.
<4> PRN code number of satellite used on Channel 2 02 Same as above
<5> PRN code number of satellite used on Channel 3 26 Same as above
<6> PRN code number of satellite used on Channel 4 27 Same as above
<7> PRN code number of satellite used on Channel 5 09 Same as above
<8> PRN code number of satellite used on Channel 6 04 Same as above
<9> PRN code number of satellite used on Channel 7 15 Same as above
<10> PRN code number of satellite used on Channel 8 Same as above
<11> PRN code number of satellite used on Channel 9 Same as above
<12> PRN code number of satellite used on Channel 10 Same as above
<13> PRN code number of satellite used on Channel 11 Same as above
<14> PRN code number of satellite used on Channel 12 Same as above
<15> HDOP(Position Dilution Precision) 1.8 Range: 0.5-99.9
<16> HDOP(Position Dilution Precision) 1.0 Range: 0.5-99.9
<17> HDOP(Position Dilution Precision) 1.5 Range: 0.5-99.9
hh Checksum 2C
CR LF End of protocol frame

(4) $GPGSV (Satellites in View)

Num Name Example Unit Description
Message ID $GPGSV GSV protocol header
<1> Number of Messages 2 Range: 1 to 3
<2> Message Serial Number 1 Range: 1 to 3
<3> Satellites in View 07 Range: 00-12
<4> Satellite ID 07 Range: 01-32
<5> Elevation 79 Degree Range: 00-90
<6> Azimuth Azimuth Degree Range: 000-359
<7> SNR (C/No) 42 dBHz Range 0 to 99, null when not tracking
<4> Satellite ID 02 Range: 01-32
<5> Elevation 51 Degree Range: 00-90
<6> Azimuth 062 Degree Range: 000-359
<7> SNR (C/No) 43 dBHz Range 0 to 99
<4> Satellite ID 26 Range: 01-32
<5> Elevation 36 Degree Range: 00-90
<6> Azimuth 256 Degree Range: 000-359
<7> SNR (C/No) 42 dBHz Range 0 to 99
<4> Satellite ID 27 Range: 01-32
<5> Elevation 27 Degree Range: 00-90
<6> Azimuth 138 Degree Range: 000-359
<7> SNR (C/No) 42 dBHz Range: 0 to 99
hh Checksum 71
CR LF End of protocol frame

(5) $GPRMC (Minimum GNSS Data)

Num Name Example Unit Description
Message ID $GPRMC RMC Protocol Header
<1> UTC Position 161229.487 hhmmss.sss
<2> Position Status A A: position; V: navigation
<3> Latitude 3723.2475 ddmm.mmmm
<4> Latitude Direction N N: north; S: south
<5> Longitude 12158.3416 dddmm.mmmm
<6> Longitude W W: west; E: east
<7> Speed Over Ground 0.13 Knots Range: 000.0-999.9
<8> Course Over Ground 309.62 Degree Taking due north as the reference datum, the two-dimensional direction points, which is equivalent to a two-dimensional compass
<9> Data Status A A: data valid; V: data invalid
<10> Magnetic Variation Degree Range: 000-180
<11> Magnetic declination direction E: east; W: west
hh Checksum 10
CR LF End of protocol frame

(6) $GPVTG (Ground Speed Information)

Num Name Example Unit Description
Message $GPVTG VTG protocol header
<1> Course Over Ground 309.62 Degree Taking due north as the reference datum, the two-dimensional direction points, which is equivalent to a two-dimensional compass
<2> T True north reference system
<3> Magnetic Variation Degree
<4> M Magnetic north reference system
<5> Speed over ground 0.13 Knots Range: 000.0-999.9
<6> N Knots
<7> Horizontal velocity 0.2
<8> K km/h
hh Checksum 6E
CR LF End of protocol frame

(7) Antenna Status Output

$GPTXT,01,01,01, ANTENNA OK*35

"Ok" means that the antenna has been detected, and "open" represents the antenna is disconnected.

(8) UTC time and Current time in Beijing

$GNGGA,084852.000,2236.9453,N,11408.4790,E,1,05,3.1,89.7,M,0.0,M,,*48

The numbers in bold represent UTC time. Its format is hhmmss.sss. The three digits after the decimal point should be omitted so the numbers above means that it is 08:48:52.

UTC + Time Zone Difference = Local Time

The time of eastern zone is positive, the western zone is negative. The time in Beijing follows the time offset of UTC+08:00 so the current time in Beijing is 16:48:52.

(9) Format of latitudes and longitudes

$GNRMC,084852.000,A,2236.9453,N,11408.4790,E,0.53,292.44,141216,,,A*7 5

Data format: ddd°mm.mmm’ Convert to the format of Google or Baidu Map. Latitude: ddmm.mmmm, Northern Latitude 2236.9453,22+(36.9453/60)= 22.615755 Longitude: dddmm.mmmm, East Longitude 11408.4790,114+(08.4790/60)=114.141317

(10) Description of hot start, warm start and cold start

The Cold Start refers to the process of starting GPS in an unfamiliar environment until it connects with the surrounding satellites and calculates coordinates.

The following three situations are all cold start:

  1. Use for the first time;

  2. Ephemeris information lost due to batterry depletion;

  3. Move the receiver more than 1000km in power off state. That is to say, the cold start is a mandatory start-up through hardware. When the GPS has cleared the internal positioning information since the last operation, and the GPS receiver has lost satellites parameters, or the navigator cannot work properly because existing parameters because the existing parameters are too different from the actual received satellite parameters, it is necessary for GPS to obtain the new coordinate data provided by the satellite. A vehicle startting a navigation from a basement is cold start. This is also the reason why it takes a long time to search for satellites from the basement.

Warm start refers to the start-up more than 2 hours from the last positioning time. The positioning time is between cold start and hot start. If you have used GPS positioning one day ago, the first startup of next day belongs to warm start, and the last position information will be displayed after startup. The latitude, longitude and altitude of the last operation are known, but since the shutdown time is too long, the ephemeris has changed and the previous cannot accept it. Several satellittes in the parameters have lost contact with the GPS receiver and have to continue searching for additional position information. Therefore, searching time for warm start is longer than that of hot start and shorter than cold start.

When starting GPS at the place where it was shut down last time, and the time from last positioning time is less than 2 hours, it is hot start. Some preparation work such as saving and closing can be done by software.

Tutorial

Requirements

Connection Diagram

TEL0132-Connection

Sample Code 1 (Read GPS Data)

#include <SoftwareSerial.h> 
SoftwareSerial GpsSerial(11, 12); //RX,TX

void setup()
{   
  Serial.begin(115200);  //Debug Serial 
  GpsSerial.begin(9600);  //Gps Serial   
} 

void loop()
{  while (GpsSerial.available() > 0)
  { 
    byte gpsData = GpsSerial.read(); 
   Serial.write(gpsData); 
  }
}

Expected Results 1

Result-1

Sample Code 2 ($GNRMC GPS Data Analysis)

#include <SoftwareSerial.h>
SoftwareSerial GpsSerial(12, 11);  //RX,TX

struct
{
  char GPS_DATA[80];
  bool GetData_Flag;      //Get GPS data flag bit
  bool ParseData_Flag;    //Parse completed flag bit 
  char UTCTime[11];       //UTC time
  char latitude[11];      //Latitude
  char N_S[2];            //N/S
  char longitude[12];     //Longitude
  char E_W[2];            //E/W
  bool Usefull_Flag;      //If the position information is valid flag bit 
} Save_Data;

const unsigned int gpsRxBufferLength = 600;
char gpsRxBuffer[gpsRxBufferLength];
unsigned int gpsRxLength = 0;

void setup()
{
  Serial.begin(115200);   //Debug Serial
  GpsSerial.begin(9600);  //Gps Serial

  Serial.println("DFRobot Gps");
  Serial.println("Wating...");

  Save_Data.GetData_Flag = false;
  Save_Data.ParseData_Flag = false;
  Save_Data.Usefull_Flag = false;
}

void loop()
{
  Read_Gps();         //Get GPS data 
  parse_GpsDATA();    //Analyze GPS data 
  print_GpsDATA();    //Output analyzed data 
}

void Error_Flag(int num)
{
  Serial.print("ERROR");
  Serial.println(num);
  while (1)
  {
    digitalWrite(13, HIGH);
    delay(500);
    digitalWrite(13, LOW);
    delay(500);
  }
}

void print_GpsDATA()
{
  if (Save_Data.ParseData_Flag)
  {
    Save_Data.ParseData_Flag = false;

    Serial.print("Save_Data.UTCTime = ");
    Serial.println(Save_Data.UTCTime);

    if(Save_Data.Usefull_Flag)
    {
      Save_Data.Usefull_Flag = false;
      Serial.print("Save_Data.latitude = ");
      Serial.println(Save_Data.latitude);
      Serial.print("Save_Data.N_S = ");
      Serial.println(Save_Data.N_S);
      Serial.print("Save_Data.longitude = ");
      Serial.println(Save_Data.longitude);
      Serial.print("Save_Data.E_W = ");
      Serial.println(Save_Data.E_W);
    }
    else
    {
      Serial.println("GPS DATA is not usefull!");
    }    
  }
}

void parse_GpsDATA()
{
  char *subString;
  char *subStringNext;
  if (Save_Data.GetData_Flag)
  {
    Save_Data.GetData_Flag = false;
    Serial.println("************************");
    Serial.println(Save_Data.GPS_DATA);

    for (int i = 0 ; i <= 6 ; i++)
    {
      if (i == 0)
      {
        if ((subString = strstr(Save_Data.GPS_DATA, ",")) == NULL)
          Error_Flag(1);    //Analysis error 
      }
      else
      {
        subString++;
        if ((subStringNext = strstr(subString, ",")) != NULL)
        {
          char usefullBuffer[2]; 
          switch(i)
          {
            case 1:memcpy(Save_Data.UTCTime, subString, subStringNext - subString);break;    //Get UTC time 
            case 2:memcpy(usefullBuffer, subString, subStringNext - subString);break;        //Get position status 
            case 3:memcpy(Save_Data.latitude, subString, subStringNext - subString);break;   //Get latitude information 
            case 4:memcpy(Save_Data.N_S, subString, subStringNext - subString);break;        //Get N/S
            case 5:memcpy(Save_Data.longitude, subString, subStringNext - subString);break;  //Get longitude information 
            case 6:memcpy(Save_Data.E_W, subString, subStringNext - subString);break;        //Get E/W

            default:break;
          }
          subString = subStringNext;
          Save_Data.ParseData_Flag = true;
          if(usefullBuffer[0] == 'A')
            Save_Data.Usefull_Flag = true;
          else if(usefullBuffer[0] == 'V')
            Save_Data.Usefull_Flag = false;
        }
        else
        {
          Error_Flag(2);    //Analysis error
        }
      }
    }
  }
}

void Read_Gps() 
{
  while (GpsSerial.available())
  {
    gpsRxBuffer[gpsRxLength++] = GpsSerial.read();
    if (gpsRxLength == gpsRxBufferLength)RST_GpsRxBuffer();
  }

  char* GPS_DATAHead;
  char* GPS_DATATail;
  if ((GPS_DATAHead = strstr(gpsRxBuffer, "$GPRMC,")) != NULL || (GPS_DATAHead = strstr(gpsRxBuffer, "$GNRMC,")) != NULL )
  {
    if (((GPS_DATATail = strstr(GPS_DATAHead, "\r\n")) != NULL) && (GPS_DATATail > GPS_DATAHead))
    {
      memcpy(Save_Data.GPS_DATA, GPS_DATAHead, GPS_DATATail - GPS_DATAHead);
      Save_Data.GetData_Flag = true;

      RST_GpsRxBuffer();
    }
  }
}

void RST_GpsRxBuffer(void)
{
  memset(gpsRxBuffer, 0, gpsRxBufferLength);      //Clear
  gpsRxLength = 0;

Result 2

Result-02

FAQ

For any questions, advice or cool ideas to share, please visit the DFRobot Forum.

More Documents