Mengambil Data GNSS (Global Navigation Satellite System)

Pada project ini Anda akan diarahkan untuk mengambil data GNSS (Global Navigation Satellite System) berupa data lokasi dan waktu menggunakan board NB-LYNX-7000 yang dipasang dengan GPS Antenna.

Prasyarat

Material yang dibutuhkan mengikuti Prasyarat Umum pada laman sebelumnya. Jika Anda belum menyiapkan kebutuhan pada laman tersebut, maka Anda dapat mengunjungi laman berikut.

pagePrasyarat Umum NB-Lynx-7000

Langkah Kerja

1. Setup Peralatan

Hal yang perlu Anda lakukan pertama kali adalah melakukan setup peralatan dengan cara menghubungkan board NB-LYNX-7000 dengan GPS Antenna. Selanjutnya board dapat dihubungkan ke perangkat laptop/komputer Anda menggunakan kabel USB-C.

Anda perlu menghubungkan GPS Antenna pada port antena GPS yang terletak pada board NB-LYNX-7000

Berikut adalah rangkaian peralatan yang sudah dihubungkan ke laptop/komputer.

2. Jalankan Arduino IDE

3. Menginputkan Kode Program

Untuk mengambil data GNSS, Anda perlu menginputkan kode program di bawah pada Arduino IDE.

#include <Arduino.h>

// Configurable macros
#define SIM7000_POWER_KEY 27

String sendCommand(String command, uint32_t timeout, char delimiter)
{
 while (Serial2.available())
  Serial2.read();

 uint32_t T = millis();
 String res = "";
 Serial.print("[SYS CMD] ");
 Serial.print(command);
 Serial.println("=========");
 Serial2.print(command);
 while ((millis() - T) < timeout)
 {
  while (Serial2.available())
  {
   res = Serial2.readStringUntil(delimiter);
   res.trim();
   if (res.length() > 0)
   {
    Serial.print("[SYS RES] ");
    Serial.println(res);
    return res;
   }
  }
 }
 return "TIMEOUT";
}

String receiveAddCommand(int32_t timeout)
{
 String res = "";
 uint32_t T = millis();
 while ((millis() - T) < timeout)
 {
  while (Serial2.available())
  {
   res = Serial2.readStringUntil('\0');
   res.trim();
   if (res.length() > 0)
   {
    Serial.print("[SYS RES] ");
    Serial.println(res);
    return res;
   }
  }
 }
 return res;
}

bool checkResponse(String response, String expected_response)
{
 if (response.indexOf(expected_response) != -1)
  return true;
 else
  return false;
}

bool sim7000_powerOn()
{
 pinMode(SIM7000_POWER_KEY, OUTPUT);
 delay(100);
 digitalWrite(SIM7000_POWER_KEY, LOW);
 delay(1000);
 digitalWrite(SIM7000_POWER_KEY, HIGH);
 delay(1000);
 for (uint8_t i = 0; i < 5; i++)
 {
  String response = sendCommand("AT\r\n", 200, '\n');
  if (checkResponse(response, "AT"))
  {
   sendCommand("ATE0\r\n", 200, '\n');
  }
  else if (checkResponse(response, "OK"))
  {
   return true;
  }

  delay(1000);
 }
 return false;
}

bool sim7000_powerOnGNSS()
{
 if (!checkResponse(sendCommand("AT+CGNSPWR=1\r\n", 200, '\n'), "OK"))
  return false;
 if (!checkResponse(sendCommand("AT+CGNSURC=1\r\n", 200, '\n'), "OK"))
  return false;

 return true;
}

void sim7000_parseGNSS(String input)
{
 // Serial.println(input);
 int firstCommaIndex = input.indexOf(",");
 int secondCommaIndex = input.indexOf(",", firstCommaIndex + 1);
 int thirdCommaIndex = input.indexOf(",", secondCommaIndex + 1);
 int fourthCommaIndex = input.indexOf(",", thirdCommaIndex + 1);
 int fifthCommaIndex = input.indexOf(",", fourthCommaIndex + 1);
 int sixthCommaIndex = input.indexOf(",", fifthCommaIndex + 1);

 int isGnssRun = input.substring(0, firstCommaIndex).toInt();
 if (isGnssRun == 0)
 {
  Serial.println("[SIM7000] GNSS is not running");
  return;
 }
 
 int isGnssFix = input.substring(firstCommaIndex + 1, secondCommaIndex).toInt();
 if (isGnssFix == 0)
 {
  Serial.println("[SIM7000] GNSS is not fixed");
  return;
 }

 Serial.print("Latitude : ");
 Serial.println(input.substring(thirdCommaIndex + 1, fourthCommaIndex));
 Serial.print("Longitude : ");
 Serial.println(input.substring(fourthCommaIndex + 1, fifthCommaIndex));
 Serial.print("Altitude : ");
 Serial.println(input.substring(fifthCommaIndex + 1, sixthCommaIndex));

 Serial.print("Date & Time : ");
 String datetime = input.substring(secondCommaIndex + 1, thirdCommaIndex);
 Serial.print(datetime.substring(6, 8));
 Serial.print("/");
 Serial.print(datetime.substring(4, 6));
 Serial.print("/");
 Serial.print(datetime.substring(0, 4));
 Serial.print(" ");
 Serial.print(datetime.substring(8, 10));
 Serial.print(":");
 Serial.print(datetime.substring(10, 12));
 Serial.print(":");
 Serial.print(datetime.substring(12, 14));
 Serial.print("\n");
}

bool gnssSetup()
{
 Serial2.begin(9600);
 Serial2.flush();
 Serial.println("[SIM7000] Turning ON...");
 if (sim7000_powerOn())
  Serial.println("Success");
 else
 {
  Serial.println("Failed");
  Serial.println("Hold PWRKEY for 3 seconds and press RST");
  return false;
 }

 Serial.println("[SIM7000] Turning ON GNSS...");
 if (sim7000_powerOnGNSS())
  Serial.println("Success");
 else
 {
  Serial.println("Failed");
  return false;
 }

 return true;
}

void setup()
{
 Serial.begin(115200);
 if (!gnssSetup())
 {
  while (1)
   delay(1000);
 }
}

void loop()
{
 String res = "";
 while (Serial2.available())
 {
  res = Serial2.readStringUntil('\0');
  res.trim();
  if (checkResponse(res, "+UGNSINF:"))
  {
   res.replace("+UGNSINF:","");
   sim7000_parseGNSS(res);
  }
 }
}

4. Penjelasan Kode Program

Supaya board NB-LYNX-7000 dapat berkomunikasi dengan platform Antares, digunakan modul SIM7000. SIM7000 merupakan modul komunikasi seluler yang dikembangkan oleh SIMCom Wireless Solutions. Modul ini menerapkan beberapa protokol yang memungkinkan perangkat untuk terhubung ke jaringan menggunakan AT command. Berikut dijelaskan beberapa AT command yang digunakan pada kode program.

AT<CR><LF>

Pada kode program terdapat command "AT\r\n" yang dikirimkan sebagai starting point atau tahap inisialisasi modul SIM7000. \r merupakan carriage return , sedangkan \n merupakan line feed. Command ini dikirimkan untuk mendapatkan respons “OK”.

ATE0<CR><LF>

Pada kode program terdapat command "ATE0\r\n" yang dikirimkan setelah mendapatkan respons “OK”. Command ini digunakan untuk menonaktifkan echo mode yang menandakan bahwa inisialisasi telah berhasil.

AT+CGNSPWR=<mode><CR><LF>

Pada kode program terdapat command "AT+CGNSPWR=1\r\n" yang digunakan untuk melakukan power control modul GNSS. Parameter “1” digunakan untuk menyalakan power supply GNSS.

Berikut parameter <mode> lainnya yang dapat digunakan.

  • 0 = Mematikan power supply GNSS

  • 1 = Menyalakan power supply GNSS

AT+CGNSURC=<Navigation mode><CR><LF>

Pada kode program terdapat command "AT+CGNSURC=1\r\n" yang digunakan untuk menampilkan data navigasi. Parameter “1” digunakan untuk menampilkan data navigasi setiap kali GNSS menerima sinyal dari satelit.

Berikut beberapa parameter <Navigation mode> lain yang dapat digunakan

  • 0 = Mematikan data navigasi yang ditampilkan

  • 1 = Menampilkan data navigiasi setiap kali GNSS menerima sinyal

  • 2 = Menampilkan data navigasi sekali setiap GNSS telah menerima sinyal sebanyak 2 kali

  • 256 = Menampilkan data navigasi sekali setiap GNSS telah menerima sinyal sebanyak 256 kali

5. Upload Program ke Board NB-LYNX-7000

Pertama, Anda harus mengatur board yang digunakan dengan memilih ESP32 Dev Module pada bagian Tools > Board > esp32.

Setelah itu, Anda perlu mengatur port yang digunakan dengan membuka Tools > Port > COM(X). Nilai X menyesuaikan dengan nomor port yang digunakan oleh board NB-LYNX-7000.

Setelah Anda mempersiapkan kode program, selanjutnya Anda dapat meng-upload kode program tersebut dengan menekan tombol upload seperti ditunjukkan pada gambar di bawah.

Jika kode program sudah berhasil di-upload, Anda dapat membuka Serial Monitor dengan menekan icon seperti ditunjukkan pada gambar di bawah. Icon tersebut dapat Anda temukan pada bagian atas sebelah kanan.

Anda perlu mengatur baud rate Serial Monitor menjadi 115200 supaya output-nya dapat terbaca.

Tampilan Serial Monitor akan menjadi seperti pada gambar di bawah yang menandakan proses inisiasi modul SIM7000 dan proses menyalakan GNSS untuk mendapatkan data navigasi.

Selanjutnya, GPS Antenna akan bekerja untuk menerima sinyal dari satelit untuk mendapatkan data GNSS berupa informasi navigasi yang terdiri dari latitude, longtitude, altitude, dan date & time.

GPS Antenna terkadang membutuhkan waktu yang cukup lama untuk menerima sinyal dari satelit hingga pada akhirnya data GNSS berhasil diterima. Pada kondisi ini, Anda dapat menunggunya beberapa saat.

Jika sudah menunggu beberapa saat namun data GNSS belum berhasil diterima, maka besar kemungkinan GPS Antenna tidak menerima cukup sinyal dari satelit.

Ketika GPS Antenna tidak menerima cukup sinyal dari satelit, tampilan pada serial monitor akan menjadi seperti pada gambar di bawah.

Jika GPS Antenna tidak menerima cukup sinyal dari satelit, Anda dapat membawa GPS Antenna ke ruangan terbuka atau dengan mendekatkannya ke jendela.

Ketika antena telah menerima cukup sinyal, maka data GNSS yang akan ditampilkan pada serial monitor menjadi seperti pada gambar di bawah.

Pada kondisi ini, GPS Antenna akan terus menerus menerima sinyal dari satelit untuk menampilkan data GNSS pada serial montior.