Main Content

Read Serial Data from GPS Shield Using Arduino Hardware

This example shows how to use Simulink® Support Package for Arduino® Hardware to receive serial data from a GPS shield on the Arduino hardware.

Supported Hardware

  • Arduino Mega 2560

  • Arduino Mega ADK

  • Arduino Due

  • Arduino Leonardo

  • Arduino MKR1000

  • Arduino MKR WIFI 1010

  • Arduino MKR ZERO

  • Arduino Nano 33 IoT

  • Arduino Nano 33 BLE Sense

  • Arduino-derived boards having more than one serial port

Introduction

In this example, the Simulink models arduino_serial_gps and arduino_serial_gps_standalone are used to explain how to decode raw National Marine Electronics Association (NMEA) data from a GPS shield on an Arduino hardware.

NMEA Data from GPS Receiver on GPS Shield

The NMEA format is a specification that defines how data is transmitted between various marine electronic devices. GPS receiver, a marine electronic device, also transmits data in NMEA format. The data is transmitted in a sequence called a sentence. Each sentence contains information, such as latitude, longitude, speed, and time, as ASCII characters. A sentence can have a maximum of 80 characters. Each sentence is independent of other sentences from the receiver.

NMEA Sentence Format

    NMEA Header          | Value                               | Description
  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
    StartChar            | $                                   | ASCII for 36
    SentenceName         | For example, GPGGA                  | NMEA Sentence Identifier
    Separator            | ,                                   | ASCII for 44
    Data_1 to Data_N     | For example, 083445.00,1256.60109,N | Data fields, such as latitude and longitude
    CheckChar            | *                                   | ASCII for 42
    CheckSum             | For example, 7E                     | Hexadecimal number representing 8-bit exclusive OR
                         |                                     | of all characters between $ and *
    EndChar              | CR                                  | Carriage return

The u-blox Neo-6M GPS shield, used in this example, supports six types of NMEA sentences: $GPGSV, $GPGLL, $GPRMC, $GPVTG, $GPGGA, and $GPGSA. This example focuses on how to decode $GPGGA and $GPRMC NMEA sentences from the u-blox Neo-6M GPS shield on Arduino.

$GPGGA NMEA Sentence Nomenclature

$GPRMC NMEA Sentence Nomenclature

Required Hardware

To run this example, you must have the following hardware:

Step 1: Connect GPS Shield, GPS Antenna, and Arduino Hardware

Note: Before you start with this example, we recommend you complete the following:

1. Connect the pins on the u-blox NEO-6M GPS shield to the pins on your Arduino Mega 2560 board as shown in this table.

   u-blox NEO-6M GPS shield pin   | Arduino Mega 2560 pin
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
      5V                          |  5V
      GND                         |  GND
      Vin                         |  Vin
      3V                          |  3V
      RX    (pin 1)               |  TX1    (pin 18)
      TX    (pin 2)               |  RX1    (pin 19)

Note: If you are using any other Arduino board, the pin numbers that correspond to TX1 and RX1 pins on Arduino are different.

2. Connect the GPS antenna to the GPS shield.

3. Connect the Arduino board to your computer using a USB cable.

Wait for the GPS Fix LED on the GPS shield to start glowing. A glowing LED indicates that the GPS shield is acquiring satellite signals. Signals are acquired easily in locations that have a clear view of the sky. If you are using the shield for the first time, the shield might take a few minutes to acquire signals.

Step 2: Configure Serial Receive Block

This section explains how to configure the Serial Receive block to receive raw serial NMEA sentences from the GPS shield.

1. Open the arduino_serial_gps Simulink model.

This model is configured to run in External mode. In this model, the GPS Shield sends data to the Serial port 1 of the Arduino hardware. The received data is stored in MATLAB® Workspace variables.

Step 3: View Source Code of Decode Algorithm

To view the MATLAB System object™ source code of the decoding algorithm:

1. Double-click the GPS Parser block. This block is a custom block created using MATLAB System.

The block decodes raw NMEA sentences from the Serial Receive block using a decoding algorithm. The block outputs fields, such as status, time, latitude, longitude, and speed, from NMEA sentences.

The Output when disabled parameter in all the Outport blocks, data_rdy, time, latitude, longitude, and num_satellite, is set to reset. Selecting this option ensures that this block output values only when the $GPGGA_$GPRMC_Parser subsystem is enabled. If the subsystem is disabled, the block outputs 0.

2. In the Block Parameters dialog box, click the Source code link. The code:

a. Specifies NMEA sentence properties, such as StartChar and EndChar.

b. Uses the gps_parser.cpp and gps_parser.h| files. The beginning sections of these files explain the implementation of the decoding algorithm. The model uses the decoding algorithm to decode NMEA sentences from the GPS shield. This state diagram describes the decoding algorithm.

Step 4: Configure Simulink Model for Arduino Hardware

Note: If the u-blox Neo-6M GPS shield is connected to your Arduino Mega 2560 board using Serial port 1, you can skip this section.

1. To configure the model, click the Model Configuration Parameters button on the Simulink toolbar.

2. In the Configurations Parameters dialog box, select Hardware Implementation.

3. From the Hardware board list, select the type of Arduino board that you are using.

4. From the Groups list under Target hardware resources, select Serial port properties.

5. Set a baud rate of the serial port to which the GPS shield is connected. In this example, the Serial 1 baud rate parameter is set because the TX1 and RX1 pins connected to the GPS shield correspond to Serial port 1 of Arduino Mega 2650.

6. Select a baud rate that is same as the baud rate of the GPS shield. The baud rate of the GPS shield used in this example is 9600.

7. Click Apply. Click OK to close the dialog box.

Step 5: Run Simulink Model in External Mode (Monitor and Tune)

On the Hardware tab of the Simulink model, in the Mode section, select Run on board and then click Monitor & Tune. The lower left corner of the model window displays status while Simulink prepares, downloads, and runs the model on the hardware.

The TX pin of the GPS shield transmits raw NMEA sentences to the RX1 pin of the Arduino hardware. The algorithm decodes the data and stores the data in MATLAB Workspace variables data_rdy, time, latitude, longitude, num_satellite, and speed.

Note: If no data is received in MATLAB Workspace variables, verify the following:

  • The TX and RX pins of the GPS shield are connected to Arduino properly.

  • The GPS Fix LED on the GPS shield is still glowing.

Step 6: Deploy Simulink Model on Arduino Hardware

1. Open the arduino_serial_gps_standalone Simulink model.

In this model, the GPS Shield sends data to the Serial port 1 of the Arduino hardware. Arduino sends data to your computer over Serial port 0 (USB port). You can view the received data on any serial terminal in your computer. The models provided in this example are preconfigured for the Arduino Mega 2560 board. You can run these models on any of the boards listed in the Supported Hardware section by changing the Hardware board parameter in the Simulink model. For more information on how to change the Hardware board parameter, see the Step 4: Configure Simulink Model for Arduino Hardware section of this example.

2. In this model:

a. Double-click the GPS Parser block and select the NMEA fields to be displayed on the serial terminal. In this example, the GPS Parser block decodes only the latitude field of the NMEA sentence.

b. Double-click the Serial Transmit block and verify these parameter values:

     Parameter   | Value         | Description
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
     Send mode   | println       | Add a carriage return character '\r'(ASCII 13) and
                 |               | a newline character '\n'(ASCII 10) after every NMEA sentence.
     Label       | GPS_latitude  | The label of the data that you want to print.
     Format      | Decimal       | The format in which you want to print the data.
     Precision   | 5             | The precision value for the Decimal data format.

The Serial Transmit subsystem is enabled only when the status port of the $GPGGA_$GPRMC_Parser subsystem outputs |1|.

3. In the Configurations Parameters dialog box, go to Hardware Implementation > Target hardware resources > Groups > Serial port properties, and observe that the Serial 0 baud rate is set to 9600.

4. On the Hardware tab of the Simulink model, in the Mode section, select Run on board and then click Build, Deploy & Start. The lower left corner of the model window displays status while Simulink prepares, downloads, and runs the model on the hardware. Wait for the model to start running on the hardware.

The TX pin of the GPS shield transmits raw NMEA sentences to the RX1 pin of the Arduino hardware. The algorithm decodes the data and sends the data to the serial terminal on your computer.

5. Open the serial terminal on your computer (for example, Arduino IDE serial monitor).

When logging in to the serial terminal:

  • Specify the COM port number that corresponds to your serial connection. To learn how to find the COM port number, see Configure Host and Bootloader COM Port Manually.

  • Specify the baud rate same as the baud rate set in the Model Configuration Parameters dialog box. In this example, the baud rate is 9600.

After you login, you can see that the latitude coordinates are displayed with label 'GPS_latitude' on the serial terminal.

Other Things to Try

  • Using the same models, modify the gps_parser.cpp and gps_parser.h files to decode other types of NMEA sentences, such as $GPGSV and $GPGLL.

  • Create a model to decode messages from other sensors that follow a similar message format.