Komponen · 10 mnt baca

Modul GPS NEO-6M dengan Arduino: Pengkabelan, NMEA, dan TinyGPSPlus

Cara memakai modul GPS NEO-6M dengan Arduino: pengkabelan TX/RX, waktu fix pertama, kalimat $GPGGA dan $GPRMC, kode TinyGPSPlus, OLED dengan ESP32, dan MicroPython di Pico.

Modul GPS NEO-6M adalah penerima GPS yang murah dan sangat populer, yang menambahkan lintang, bujur, kecepatan, ketinggian, dan waktu UTC yang sangat presisi dari satelit ke proyek Arduino, ESP32, atau Raspberry Pi Pico-mu. Untuk memakainya dengan Arduino kamu hanya butuh empat kabel (VCC, GND, TX, RX): sekali per detik modul mengirim baris-baris teks yang disebut kalimat NMEA pada 9600 baud, dan library TinyGPSPlus mengubah baris-baris itu menjadi angka yang bisa langsung kamu pakai.

Di panduan ini kamu akan melihat langkah demi langkah cara kerja modul ini, cara menyambungkannya ke Arduino Uno, ESP32, dan Pico, kenapa fix posisi pertama kadang butuh beberapa menit, arti setiap kolom kalimat $GPGGA dan $GPRMC, cara mengubah lintang dan bujur menjadi tautan Google Maps, dan cara menampilkan posisi di layar OLED. Di bagian akhir kamu akan menemukan tabel penyebab dan solusi untuk dua masalah paling umum: “tidak ada data” dan “tidak ada fix”.

Modul GPS NEO-6M (u-blox NEO-6M)
Modul GPS NEO-6M: penerima u-blox NEO-6M di tengah, pin header di atas, EEPROM yang menyimpan pengaturan, dan LED PPS di kiri; bagian emas di sebelahnya adalah konektor SMA untuk antena eksternal.

Apa itu modul GPS NEO-6M dan bagaimana cara kerjanya?

GPS (Global Positioning System) terdiri dari lebih dari 30 satelit yang mengorbit di ketinggian sekitar 20.200 km. Setiap satelit terus-menerus memancarkan waktu dari jam atomnya dan data orbitnya sendiri. NEO-6M mengukur selisih antara momen sinyal meninggalkan satelit dan momen sinyal itu tiba, lalu dari situ menghitung jaraknya ke setiap satelit; begitu ia melihat minimal 4 satelit, ia bisa menghitung lintang, bujur, ketinggian, dan error jamnya sendiri. Dengan hanya 3 satelit ia bisa menghitung posisi dua dimensi (2D) tanpa ketinggian. Sinyal satelit sampai di permukaan bumi dalam keadaan sangat lemah (sekitar -130 dBm), dan beton, atap logam, bahkan rimbunnya pepohonan menghalangi sebagian besar sinyal itu. Karena itu aturan emas GPS sederhana: antena harus melihat langit.

FiturNilai
Chip penerimau-blox NEO-6M (mesin penentu posisi u-blox 6)
Kanal dan sinyal50 kanal, GPS L1 C/A (1575,42 MHz), SBAS: EGNOS, WAAS, MSAS
Akurasi horizontal2,5 m CEP (2,0 m dengan SBAS)
Akurasi kecepatan dan arah0,1 m/dtk dan 0,5 derajat
Waktu fix pertama (TTFF)Cold 27 dtk, warm 27 dtk, hot 1 dtk
SensitivitasTracking -161 dBm, cold start -147 dBm
Laju pembaruanBawaan 1 Hz, sampai 5 Hz
AntarmukaUART, bawaan 9600 baud 8N1, NMEA 0183
Catu dayaBoard: 3,3–5 V (dengan regulator); chip: 2,7–3,6 V
Arus~47 mA ketika mencari, ~39 mA ketika tracking
Suhu kerja-40 sampai +85 °C

Board yang kamu beli lebih dari sekadar chip NEO-6M berukuran 16×12 mm. Board GY-NEO6MV2 yang umum menambahkan antena patch keramik 25×25 mm, regulator yang memungkinkanmu memberi daya modul dari 3,3–5 V, EEPROM kecil yang menyimpan pengaturan, baterai cadangan isi ulang yang menyimpan waktu dan data satelit, serta LED yang berkedip begitu fix ditemukan. Beberapa board, seperti yang ada di foto di atas, juga punya konektor SMA atau u.FL mungil untuk antena eksternal dan port micro USB untuk tersambung langsung ke komputer.

Pengkabelan NEO-6M: Arduino Uno, ESP32, dan Raspberry Pi Pico

NEO-6M berkomunikasi lewat UART, yang bekerja seperti port serial komputer dan memakai dua jalur data. Aturannya sederhana: jalur datanya disilang. Pin TX (kirim) modul ke pin RX (terima) board, dan pin RX modul ke pin TX board. Satu-satunya port serial hardware Arduino Uno (pin 0 dan 1) dipakai untuk upload lewat USB dan untuk Serial Monitor, jadi kita menyambungkan GPS ke pin D4 dan D3 dengan SoftwareSerial. Kamu akan menemukan detail komunikasi serial di artikel komunikasi serial UART.

Pin NEO-6MArduino UnoESP32Raspberry Pi Pico
VCC5VVIN (5V) atau 3V3VBUS (5V) atau 3V3(OUT)
GNDGNDGNDGND
TXD4 (RX SoftwareSerial)GPIO 16 (RX2)GP1 (RX UART0)
RXD3, lewat pembagi 1 kΩ / 2 kΩGPIO 17 (TX2)GP0 (TX UART0)
PPS (jika ada)Boleh tidak disambungBoleh tidak disambungBoleh tidak disambung
Pin input chip NEO-6M paling tinggi hanya tahan 3,6 V. Pin TX Arduino Uno mengeluarkan 5 V, jadi jangan sambungkan D3 langsung ke pin RX modul: tambahkan pembagi tegangan (D3 → 1 kΩ → RX GPS, RX GPS → 2 kΩ → GND) atau pakai konverter level logika. Jika kamu hanya ingin membaca posisi, pin RX modul boleh tidak disambung; pin itu hanya dibutuhkan untuk mengirim perintah konfigurasi ke modul. ESP32 dan Pico sudah bekerja di 3,3 V, jadi tidak butuh pembagi.
Karena board punya regulator sendiri, beri daya VCC dari 5 V jika memungkinkan; beberapa board bekerja tidak andal di 3,3 V karena tegangan jatuh di regulatornya. Selama mencari satelit modul menarik sekitar 47 mA, jadi untuk proyek baterai hitung lama pemakaiannya dulu dengan kalkulator umur baterai.

Fix posisi pertama: cold, warm, dan hot start

Sangat wajar jika modul GPS tidak langsung melaporkan posisi ketika pertama kali kamu menyalakannya. Untuk menghitung posisi, modul butuh data orbit presisi (ephemeris) dari satelit yang terlihat, dan setiap satelit memancarkannya kira-kira setiap 30 detik; mengunduh almanak lengkap, yaitu daftar orbit kasar semua satelit, butuh 12,5 menit. Tergantung seberapa banyak yang masih disimpan dari sebelum dimatikan, modul mulai dengan salah satu dari tiga cara. Waktu di datasheet diukur dalam kondisi uji dengan sinyal kuat dari setiap satelit; dengan antena keramik kecil bawaan board, menunggu beberapa menit itu normal.

Jenis startData yang tersimpan di modulDatasheetDalam praktik (di luar ruangan)
Cold startTidak ada data waktu, posisi, atau satelit (pemakaian pertama atau baterai cadangan habis)27 dtk1–5 menit; bisa lebih dari 10 menit dengan sinyal lemah
Warm startAlmanak, perkiraan waktu dan posisi; ephemeris sudah usang (mati lebih dari sekitar 4 jam)27 dtk30 detik – 1 menit
Hot startEphemeris dan waktu terbaru (baru saja dimatikan, baterai cadangan terisi)1 dtkBeberapa detik
  • Keluar ruangan: Di dalam ruangan, terutama di gedung beton, modul sering sama sekali tidak menemukan posisi. Untuk pengujian, pakai balkon, halaman, atau minimal tempat di depan jendela yang terbuka.
  • Arahkan antena dengan benar: Sisi datar antena keramik yang berwarna terang harus menghadap langit; membaliknya atau menutupinya dengan tangan sangat melemahkan sinyal.
  • Jauhkan antena dari elektronik: Antena Wi-Fi ESP32, regulator switching, dan kabel USB panjang memancarkan noise; letakkan antena beberapa sentimeter dari board.
  • Sabar dan biarkan diam: Jangan putus dayanya selama fix pertama; setiap kali dinyalakan ulang, pencarian dimulai dari nol.
  • Perhatikan LED-nya: LED di board tetap gelap sampai fix ditemukan, lalu mulai berkedip sekali per detik.
  • Isi baterai cadangan: Jika baterainya habis, setiap kali dinyalakan adalah cold start. Membiarkan modul menyala beberapa jam akan mengisinya, dan start berikutnya turun menjadi hitungan detik.

Kalimat NMEA: cara membaca $GPGGA dan $GPRMC

NEO-6M mengirim semua yang ditemukannya sebagai baris teks biasa yang dipisahkan koma dalam standar NMEA 0183. Dengan pengaturan bawaan, enam jenis kalimat datang setiap detik: GGA, GLL, GSA, GSV, RMC, dan VTG; kalimat TXT biasanya hanya muncul ketika menyala dan membawa pesan informasi seperti versi firmware. Setiap kalimat dimulai dengan $; awalan GP berarti datanya berasal dari GPS, dan tiga huruf berikutnya menunjukkan jenis kalimatnya. Dua karakter setelah * di akhir baris adalah checksum, yang didapat dengan melakukan XOR pada setiap karakter di antara $ dan *, dan baris yang rusak disaring dengannya. Dua kalimat terpenting untuk posisi adalah: $GPGGA,092750.00,4100.82500,N,02858.74000,E,1,08,1.01,39.2,M,36.9,M,,*67 dan $GPRMC,092750.00,A,4100.82500,N,02858.74000,E,0.512,,281026,,,A*7E

Kolom $GPGGAContohArti
Waktu (UTC)092750.0009:27:50 UTC
Lintang4100.82500,N41 derajat 00,825 menit Utara
Bujur02858.74000,E28 derajat 58,74 menit Timur
Kualitas fix10 = tidak ada fix, 1 = GPS, 2 = dikoreksi diferensial (SBAS)
Satelit08Satelit yang dipakai dalam perhitungan posisi
HDOP1.01Penurunan presisi horizontal; di bawah 2 sangat bagus
Ketinggian39.2,M39,2 m di atas permukaan laut rata-rata
Selisih geoid36.9,MSelisih antara permukaan laut dan elipsoid WGS84
Kolom $GPRMCContohArti
Waktu (UTC)092750.00Jam, menit, detik
StatusAA = posisi valid, V = tidak ada fix
Lintang / bujur4100.82500,N / 02858.74000,EFormat sama dengan GGA
Kecepatan0.512Dalam knot (0,512 × 1,852 ≈ 0,95 km/jam)
Arah(kosong)Arah gerak dalam derajat; bisa kosong ketika diam
Tanggal281026Format ddmmyy: 28 Oktober 2026
ModeAA = otonom, D = diferensial, N = tidak ada data

Lintang dan bujur di NMEA bukan derajat desimal, melainkan derajat dan menit (ddmm.mmmm), sedangkan Google Maps dan kebanyakan software menginginkan derajat desimal. Untuk mengubahnya, ambil dua digit pertama lintang (tiga digit pertama bujur) sebagai derajat, lalu bagi sisa menitnya dengan 60 dan tambahkan: 4100.82500 → 41 + 0.825 / 60 = 41.013750; 02858.74000 → 28 + 58.74 / 60 = 28.979000. Nilai Selatan (S) dan Barat (W) ditulis sebagai angka negatif. Angka desimal keenam sesuai dengan sekitar 11 cm dan yang kelima 1,1 m; karena akurasi NEO-6M 2,5 m, enam angka desimal sudah lebih dari cukup.

Langkah demi langkah: melihat data GPS mentah dengan Arduino Uno

  1. Sambungkan NEO-6M seperti di tabel: VCC → 5V, GND → GND, TX GPS → D4, RX GPS → D3 lewat pembagi.
  2. Upload kode di bawah; tidak perlu library tambahan, SoftwareSerial sudah ikut dengan Arduino IDE.
  3. Buka Serial Monitor dan atur kecepatannya ke 115200 baud.
  4. Bawa modul ke luar ruangan atau ke jendela dan perhatikan baris-baris yang dimulai dengan $GP bergulir.
  5. Ketika kolom kedua baris $GPRMC berubah dari V menjadi A dan LED mulai berkedip, modul sudah menemukan posisinya.
C++ (Arduino IDE)
1#include <SoftwareSerial.h>
2
3SoftwareSerial gpsSerial(4, 3);   // RX, TX → GPS TX D4'e, GPS RX D3'e / GPS TX to D4, GPS RX to D3
4
5void setup() {
6  Serial.begin(115200);           // Seri Monitör hızı / Serial Monitor speed
7  gpsSerial.begin(9600);          // NEO-6M varsayılan hızı / NEO-6M default baud rate
8  Serial.println(F("NEO-6M ham NMEA / raw NMEA"));
9}
10
11void loop() {
12  while (gpsSerial.available()) {
13    Serial.write(gpsSerial.read());   // gelen her baytı aynen aktar / pass every byte through
14  }
15}

Di Serial Monitor kamu akan melihat satu blok berisi enam sampai sembilan baris setiap detik (makin banyak satelit yang terlihat, makin banyak baris yang dipakai kalimat GSV). Jika modul belum menemukan satelit, baris-barisnya penuh koma kosong, seperti $GPRMC,,V,,,,,,,,,,N*53 dan $GPGGA,,,,,,0,00,99.99,,,,,,*48; ini bukan error, melainkan tanda bahwa modul bekerja tapi belum bisa menghitung posisi. Di baris $GPGSV kamu bisa mengikuti jumlah satelit yang terlihat dan kekuatan sinyal (dB-Hz) masing-masing; nilai di atas 30 dB-Hz berarti sinyalnya bagus. Jika sama sekali tidak ada baris yang datang, cek pengkabelan; jika kamu mendapat karakter sampah, cek baud rate-nya.

Membaca lintang, bujur, kecepatan, dan waktu dengan TinyGPSPlus

Daripada memecah baris NMEA dengan tangan, jauh lebih praktis memakai library TinyGPSPlus buatan Mikal Hart. Cari “TinyGPSPlus” di Library Manager lalu instal; kami menjelaskan langkah-langkahnya di artikel Cara Menambahkan Library di Arduino. Hati-hati: contoh-contoh library ini memakai 4800 baud, sedangkan NEO-6M memakai 9600 baud. Jika kamu menjalankan contoh tanpa mengubah kecepatannya, lokasi selalu menunjukkan INVALID, karena library tidak bisa memecahkan satu kalimat pun dari karakter yang kacau. Kode di bawah mencetak posisi, kecepatan, ketinggian, jumlah satelit, tanggal, dan waktu sekali per detik, lalu mengubah posisi menjadi tautan Google Maps yang bisa kamu buka di browser:

C++ (Arduino IDE)
1#include <TinyGPSPlus.h>
2#include <SoftwareSerial.h>
3
4const int RX_PIN = 4;              // GPS TX → D4
5const int TX_PIN = 3;              // GPS RX ← D3 (bölücü üzerinden / through a divider)
6const uint32_t GPS_BAUD = 9600;    // NEO-6M varsayılanı / NEO-6M default
7
8TinyGPSPlus gps;
9SoftwareSerial gpsSerial(RX_PIN, TX_PIN);
10unsigned long lastPrint = 0;
11
12void setup() {
13  Serial.begin(115200);
14  gpsSerial.begin(GPS_BAUD);
15  Serial.println(F("NEO-6M + TinyGPSPlus"));
16}
17
18void loop() {
19  while (gpsSerial.available()) {
20    gps.encode(gpsSerial.read());        // her baytı ayrıştırıcıya ver / feed every byte to the parser
21  }
22  if (millis() - lastPrint >= 1000) {    // delay() yok, saniyede bir yaz / no delay(), print once per second
23    lastPrint = millis();
24    printInfo();
25  }
26}
27
28void printInfo() {
29  if (gps.charsProcessed() < 10) {
30    Serial.println(F("GPS verisi yok: kablolari ve baud hizini kontrol et / No GPS data: check wiring and baud"));
31    return;
32  }
33  Serial.print(F("Uydu / Sats: "));
34  Serial.println(gps.satellites.value());
35
36  if (gps.location.isValid()) {
37    Serial.print(F("Enlem / Lat: "));
38    Serial.println(gps.location.lat(), 6);
39    Serial.print(F("Boylam / Lng: "));
40    Serial.println(gps.location.lng(), 6);
41    Serial.print(F("Hiz / Speed: "));
42    Serial.print(gps.speed.kmph(), 1);
43    Serial.println(F(" km/h"));
44    Serial.print(F("Yukseklik / Alt: "));
45    Serial.print(gps.altitude.meters(), 1);
46    Serial.println(F(" m"));
47    // Google Haritalar bağlantısı / Google Maps link
48    Serial.print(F("https://www.google.com/maps/search/?api=1&query="));
49    Serial.print(gps.location.lat(), 6);
50    Serial.print(',');
51    Serial.println(gps.location.lng(), 6);
52  } else {
53    Serial.println(F("Konum yok, uydu araniyor / No fix yet, searching"));
54  }
55
56  if (gps.date.isValid() && gps.time.isValid()) {
57    char buf[32];
58    snprintf(buf, sizeof(buf), "%02d.%02d.%04d %02d:%02d:%02d UTC",
59             gps.date.day(), gps.date.month(), (int)gps.date.year(),
60             gps.time.hour(), gps.time.minute(), gps.time.second());
61    Serial.println(buf);                 // saat UTC'dir / time is UTC
62  }
63  Serial.println();
64}
FungsiYang dikembalikan
gps.encode(c)Dipanggil dengan setiap byte yang masuk; mengembalikan true ketika satu kalimat valid sudah lengkap
gps.location.lat() / lng() (lintang / bujur)Lintang dan bujur dalam derajat desimal
gps.location.isValid() / age() (validitas / umur data)Apakah ada posisi valid / milidetik sejak pembaruan terakhir
gps.speed.kmph() (kecepatan)Kecepatan di atas tanah dalam km/jam (ada juga mps() dan knots())
gps.course.deg() (arah)Arah gerak dalam derajat (0 = utara, 90 = timur)
gps.altitude.meters() (ketinggian)Ketinggian di atas permukaan laut dalam meter
gps.satellites.value() (jumlah satelit)Jumlah satelit yang dipakai untuk posisi
gps.hdop.hdop() (HDOP)Penurunan presisi horizontal (makin kecil makin baik)
gps.date.day() / gps.time.hour() (tanggal / jam)Kolom tanggal dan waktu UTC
TinyGPSPlus::distanceBetween(...)Jarak antara dua koordinat dalam meter
gps.failedChecksum()Jumlah kalimat yang rusak; jika terus naik, ada data yang hilang

Aturan terpenting di kode ini adalah jangan pernah memakai delay() di dalam loop(). GPS mengirim sekitar 500 byte per detik, tapi buffer penerima SoftwareSerial hanya 64 byte; selama delay() yang panjang buffer meluap, kalimat terpotong, dan TinyGPSPlus membuangnya dengan error checksum. Karena itu kita mencetak sekali per detik memakai millis(); lihat artikel millis() vs delay() untuk detailnya. Waktu GPS selalu UTC, jadi tambahkan selisih zona waktumu (misalnya +7 untuk WIB, +1 untuk CET di musim dingin, atau +3 untuk Turki). Di Arduino Uno, double sebenarnya adalah float 32 bit, jadi digit terakhir lintang dan bujur dibulatkan sampai sekitar setengah meter; dibanding akurasi modul yang 2,5 m, selisih itu tidak berarti.

SoftwareSerial andal di 9600 baud, tapi sesaat memblokir interupsi selama menerima. Jika proyekmu juga memakai library yang peka waktu seperti Servo, pilih library AltSoftSerial di Uno (RX = D8, TX = D9) atau port hardware Serial1 di Arduino Mega (RX1 = 19, TX1 = 18).

ESP32 dengan Serial2: menampilkan posisi di layar OLED

Di ESP32 kamu tidak butuh SoftwareSerial: chip ini punya tiga UART hardware dan Serial2 bisa dipetakan ke pin mana saja yang kamu mau. Di contoh di bawah GPS tersambung ke GPIO 16 (RX2) dan GPIO 17 (TX2); karena ESP32 bekerja di 3,3 V, pembagi juga tidak dibutuhkan. Posisi, kecepatan, dan waktu lokal ditampilkan di layar OLED SSD1306 0,96 inci yang tersambung lewat I2C ke GPIO 21 (SDA) dan GPIO 22 (SCL). Selain TinyGPSPlus, kodenya juga butuh library Adafruit SSD1306 dan Adafruit GFX.

C++ (Arduino IDE)
1#include <TinyGPSPlus.h>
2#include <Wire.h>
3#include <Adafruit_GFX.h>
4#include <Adafruit_SSD1306.h>
5
6#define GPS_RX 16                 // ESP32 RX2 ← GPS TX
7#define GPS_TX 17                 // ESP32 TX2 → GPS RX
8const int UTC_OFFSET = 3;         // Türkiye UTC+3, kendi saat dilimini yaz / set your own time zone
9
10TinyGPSPlus gps;
11Adafruit_SSD1306 display(128, 64, &Wire, -1);   // OLED: SDA 21, SCL 22
12unsigned long lastDraw = 0;
13
14String mapsLink() {
15  // Google Haritalar bağlantısı üret / build a Google Maps link
16  return "https://www.google.com/maps/search/?api=1&query=" +
17         String(gps.location.lat(), 6) + "," + String(gps.location.lng(), 6);
18}
19
20void drawScreen() {
21  display.clearDisplay();
22  display.setTextSize(1);
23  display.setCursor(0, 0);
24  display.print(F("Uydu/Sat: "));
25  display.print(gps.satellites.value());
26
27  if (gps.time.isValid()) {
28    int h = (gps.time.hour() + UTC_OFFSET + 24) % 24;   // yerel saat / local time
29    char t[12];
30    snprintf(t, sizeof(t), "%02d:%02d:%02d", h, gps.time.minute(), gps.time.second());
31    display.setCursor(80, 0);
32    display.print(t);
33  }
34
35  if (gps.location.isValid()) {
36    display.setCursor(0, 16);
37    display.print(F("Lat: "));
38    display.println(gps.location.lat(), 6);
39    display.print(F("Lng: "));
40    display.println(gps.location.lng(), 6);
41    display.setTextSize(2);                  // hız büyük yazılsın / speed in large digits
42    display.setCursor(0, 44);
43    display.print(gps.speed.kmph(), 1);
44    display.print(F(" km/h"));
45  } else {
46    display.setCursor(0, 24);
47    display.println(F("Uydu araniyor..."));
48    display.println(F("Searching for fix"));
49  }
50  display.display();
51}
52
53void setup() {
54  Serial.begin(115200);
55  Serial2.begin(9600, SERIAL_8N1, GPS_RX, GPS_TX);    // donanım UART2 / hardware UART2
56  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
57    Serial.println(F("OLED bulunamadi / OLED not found"));
58    while (true) delay(10);
59  }
60  display.setTextColor(SSD1306_WHITE);
61}
62
63void loop() {
64  while (Serial2.available()) {
65    gps.encode(Serial2.read());              // NMEA baytlarını çöz / decode NMEA bytes
66  }
67  if (millis() - lastDraw >= 1000) {         // saniyede bir güncelle / refresh once per second
68    lastDraw = millis();
69    drawScreen();
70    if (gps.location.isValid()) {
71      Serial.println(mapsLink());            // Telegram ya da SMS ile gönderilebilir / can be sent via Telegram or SMS
72    }
73  }
74}

Variabel UTC_OFFSET mengubah waktu GPS menjadi waktu lokal; nilainya 7 untuk WIB, 3 untuk Turki, dan 1 untuk waktu musim dingin Eropa Tengah. Fungsi mapsLink() mengubah posisi menjadi alamat Google Maps dengan parameter query=latitude,longitude. Kamu bisa menyalin tautan ini dari Serial Monitor dan membukanya di browser, mengirimnya ke ponselmu dengan bot Telegram, atau mengirimnya lewat SMS dengan modul GSM SIM800L. Di board ESP32-WROVER yang punya PSRAM, GPIO 16 dan 17 dipakai untuk memori, jadi sambungkan GPS ke, misalnya, GPIO 26 dan 27; di ESP32-C3, yang hanya punya dua UART, pakai Serial1 sebagai ganti Serial2.

Membaca GPS dengan Raspberry Pi Pico dan MicroPython

Di Raspberry Pi Pico kita menyambungkan GPS ke UART0: TX modul ke GP1 dan RX-nya ke GP0. Di MicroPython kita bisa memecah baris NMEA sendiri tanpa menginstal library apa pun, yang juga latihan bagus untuk mempelajari bagaimana kalimat-kalimat itu disusun. Kode mengecek checksum setiap baris, mengambil jumlah satelit dari GGA dan posisi, kecepatan, serta waktu dari RMC, lalu mengubah derajat-dan-menit menjadi derajat desimal. Pengaturan timeout=200 membuat readline() menunggu sampai 200 ms untuk akhir baris; jika setengah baris masih lolos ketika baru mulai, pengecekan checksum membuangnya. Karena jenis kalimat diambil dengan f[0][3:], kode juga mengenali baris $GNRMC dan $GNGGA yang dikirim modul yang memakai beberapa sistem satelit. Jika kamu belum tahu cara menjalankan kode dengan Thonny, lihat dulu artikel dasar-dasar MicroPython.

MicroPython
1from machine import UART, Pin
2
3# GP0 (TX) → GPS RX, GP1 (RX) ← GPS TX
4gps = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1), timeout=200, rxbuf=1024)
5
6def checksum_ok(line):
7    # $ ile * arasındaki karakterlerin XOR'u / XOR of the characters between $ and *
8    try:
9        body, cs = line[1:].split('*')
10        x = 0
11        for ch in body:
12            x ^= ord(ch)
13        return x == int(cs[:2], 16)
14    except ValueError:
15        return False
16
17def to_deg(value, hemi):
18    # ddmm.mmmm → ondalık derece / decimal degrees
19    dot = value.index('.')
20    deg = int(value[:dot - 2]) + float(value[dot - 2:]) / 60
21    return -deg if hemi in ('S', 'W') else deg
22
23sats = '0'
24while True:
25    raw = gps.readline()                       # bir NMEA satırı / one NMEA line
26    if not raw:
27        continue
28    try:
29        line = raw.decode().strip()
30    except UnicodeError:
31        continue                               # bozuk bayt / corrupted byte
32    if not line.startswith('$') or not checksum_ok(line):
33        continue
34    f = line.split('*')[0].split(',')
35    kind = f[0][3:]                            # GPRMC ya da GNRMC → RMC / GPRMC or GNRMC → RMC
36    if kind == 'GGA':
37        sats = f[7]                            # kullanılan uydu sayısı / satellites in use
38    elif kind == 'RMC':
39        if f[2] != 'A':
40            print('Uydu araniyor / searching, uydu/sats:', sats)
41            continue
42        lat = to_deg(f[3], f[4])
43        lon = to_deg(f[5], f[6])
44        kmh = float(f[7] or 0) * 1.852        # knot → km/sa / knots → km/h
45        t = f[1]
46        print('UTC {}:{}:{}  uydu/sats: {}'.format(t[0:2], t[2:4], t[4:6], sats))
47        print('Konum / position: {:.6f}, {:.6f}  {:.1f} km/h'.format(lat, lon, kmh))
48        print('https://www.google.com/maps/search/?api=1&query={:.6f},{:.6f}'.format(lat, lon))

Ide proyek dengan NEO-6M

  • Pelacak yang mengirim posisinya lewat SMS: Dengan NEO-6M dan SIM800L, buat pelacak mobil atau sepeda yang membalas SMS berisi “LOCATION” dengan tautan Google Maps.
  • Pencatat data GPS: Simpan rutemu setiap detik sebagai CSV di modul kartu SD, lalu gambar di peta di komputermu.
  • Speedometer sepeda: Tampilkan kecepatan sekarang dan tertinggi serta jarak total di layar OLED; jumlahkan jarak antara titik-titik berurutan dengan TinyGPSPlus::distanceBetween().
  • Jam yang tersinkron satelit: Ambil waktu dari GPS dan atur modul jam RTC sampai ke detiknya, tanpa internet.
  • Alarm geofence: Sistem yang membunyikan buzzer atau mengirim notifikasi ketika sesuatu bergerak lebih dari 100 meter dari titik yang kamu pilih.
  • Pelacakan jarak jauh: Kirim posisi ke penerima yang berjarak beberapa kilometer dengan modul LoRa, dan hemat energi baterai dengan deep sleep ESP32.

Tidak ada data atau tidak ada fix: masalah umum dan cara memperbaikinya

GejalaKemungkinan penyebabSolusi
Serial Monitor sepenuhnya kosongTX dan RX tertukar, tidak ada GND bersama, atau modul tidak mendapat dayaSambungkan TX GPS ke pin RX board (D4 di Uno), satukan ground-nya, ukur VCC
“No GPS detected: check wiring.”Dalam 5 detik bahkan 10 karakter pun tidak sampai ke libraryCek pengkabelan dan nomor pin di kode; coba tukar TX dan RX
Karakter sampahBaud rate tidak cocokPakai 9600 untuk GPS dan kecepatan kode di Serial Monitor; jika gagal, coba 4800 dan 38400
Baris datang tapi kolomnya kosong (,V,)Modul bekerja tapi belum menemukan satelitKeluar ruangan, arahkan antena ke langit, tunggu 5–15 menit
Jumlah satelit tertahan di 0–3Sinyal lemah, antena terbalik, konektor u.FL longgar, atau sumber noise di dekatnyaCek antena, tekan konektor sampai rapat, jauhkan antena dari ESP32 dan regulator
Data mentah menunjukkan posisi, TinyGPSPlus bilang INVALIDdelay() di loop() membuat buffer meluap; failedChecksum() terus naikHapus delay(), pakai millis(), panggil encode() terus-menerus
Waktunya meleset beberapa jamWaktu GPS adalah UTCTambahkan selisih zona waktumu
Posisi bergeser beberapa meter dan kecepatan tidak 0 ketika diamNoise GPS yang normal dan sinyal yang memantul dari gedungAnggap kecepatan di bawah 2 km/jam sebagai 0, lewati pembacaan dengan HDOP tinggi, rata-ratakan
Menunggu beberapa menit lagi setiap kali dinyalakanBaterai cadangan habis atau tidak adaBiarkan modul menyala beberapa jam untuk mengisi baterainya
Untuk mengetahui apakah masalahnya ada di modul atau di kodemu, sambungkan modul langsung ke komputermu dengan konverter USB-TTL dan buka di software gratis u-center dari u-blox. Software ini menampilkan kekuatan sinyal setiap satelit, status fix, dan posisi di peta; kamu juga bisa mengubah baud rate dan laju pembaruan (sampai 5 Hz) di sana dan menyimpan pengaturannya secara permanen di memori modul.

NEO-6M menambahkan jawaban atas “aku di mana, seberapa cepat aku bergerak, dan jam berapa sekarang” ke proyek-proyekmu dengan biaya sangat rendah; rahasianya adalah menunjukkan langit ke antena dan memberi fix pertama kesabaran yang dibutuhkannya. Untuk memahami komunikasi serial lebih baik, lihat artikel UART. Di aplikasi BlueGrays kamu akan menemukan proyek yang juga berguna untuk rakitan GPS, seperti komunikasi serial antara dua Arduino, layar OLED, pencatatan data ke microSD, deep sleep ESP32, dan alarm dengan notifikasi Telegram, masing-masing dengan skema rangkaian dan kode langkah demi langkah.

Pertanyaan umum

Apakah modul GPS NEO-6M bisa bekerja di dalam ruangan?

Biasanya tidak. Sinyal satelit sampai di permukaan bumi dalam keadaan sangat lemah, dan atap beton atau logam menghalangi sebagian besarnya. Di depan jendela yang terbuka modul mungkin menangkap beberapa satelit, tapi untuk fix yang andal antena butuh pandangan langsung ke langit; jika kamu butuh posisi di dalam ruangan, pakai antena aktif eksternal yang dipasang di atap atau di jendela.

Berapa lama NEO-6M butuh waktu untuk fix pertama?

Menurut datasheet, cold start butuh 27 detik dan hot start 1 detik. Dalam praktiknya, dengan antena keramik kecil di luar ruangan, fix pertama biasanya butuh 1–5 menit, dan pada pemakaian pertama atau dengan baterai cadangan yang habis bisa sampai 10–15 menit. Jika modul baru saja dimatikan, ia mengunci lagi dalam beberapa detik.

Seberapa akurat modul GPS NEO-6M?

Produsen menyebut akurasi horizontal 2,5 m CEP di bawah langit terbuka, atau 2,0 m dengan koreksi SBAS; artinya setengah dari pembacaan berjarak kurang dari 2,5 m dari titik sebenarnya. Di kota, sinyal yang memantul dari gedung bisa menaikkan error-nya sampai 5–10 meter. Ketinggian kurang akurat dibanding posisi horizontal.

Apakah NEO-6M bisa bekerja dengan 5V, dan bisakah aku menyambungkannya langsung ke Arduino?

Board GY-NEO6MV2 yang umum punya regulator, jadi VCC bisa diberi daya dari 5 V. Namun pin RX chip paling tinggi hanya tahan 3,6 V, jadi turunkan sinyal TX 5 V dari Arduino Uno dengan pembagi tegangan 1 kΩ dan 2 kΩ. Output TX modul adalah 3,3 V, yang dibaca Uno tanpa masalah.

Apakah modul GPS butuh internet atau kartu SIM?

Tidak. NEO-6M menghitung posisinya langsung dari sinyal satelit, gratis dan tanpa internet. Kamu hanya butuh internet atau kartu SIM ketika ingin mengirim posisi ke tempat lain, memakai Wi-Fi ESP32 atau modul GSM seperti SIM800L.

Apa bedanya NEO-6M dan NEO-M8N?

NEO-6M hanya memakai satelit GPS. NEO-M8N yang lebih baru bisa memakai satelit GLONASS, Galileo, atau BeiDou bersamaan dengan GPS; karena melihat lebih banyak satelit, ia mendapat fix yang lebih cepat dan lebih stabil di kota. Kalimat M8N biasanya dimulai dengan $GN, tapi TinyGPSPlus membaca keduanya dengan kode yang sama.

Lihat semua proyek
Komunikasi Satu Arah Antara 2 Arduino
#57Menengah
Premium

Komunikasi Satu Arah Antara 2 Arduino

Kamu membuat dua Arduino berbicara lewat satu kabel: tekan tombol di satu board dan LED di board lain menyala, tekan lagi dan LED mati. Board pengirim melaporkan tekanan tombol dengan pesan singkat, d

4.4(37)
50
Komunikasi Dua Arah Antara 2 Arduino
#58Menengah
Premium

Komunikasi Dua Arah Antara 2 Arduino

Dua Arduino disambung dengan kabel dan saling berbicara: tekan tombol di satu board dan lampu di board lain menyala, tekan lagi dan lampunya mati. Kedua board menjalankan program yang sama, jadi masin

4.5(20)
26
Pencatat Data Suhu ESP32 (DHT22 + RTC DS1307 + microSD + OLED)
#144Mahir
Premium

Pencatat Data Suhu ESP32 (DHT22 + RTC DS1307 + microSD + OLED)

Buat pencatat suhu bercap waktu dengan ESP32! Baca suhu/kelembapan DHT22 setiap menit, ambil waktu sebenarnya dari RTC DS1307, dan catat ke kartu microSD sebagai CSV. OLED menampilkan suhu langsung (font besar), kelembapan, cap waktu, dan penghitung catatan. File /temp_log.csv bisa dibuka di Excel, Google Sheets, atau Python pandas; cocok untuk rumah kaca, suhu kamar, data laboratorium, penyimpanan makanan, atau sarang lebah.

4.7(7)
12
HTTPClient + API Cuaca ESP32 (dengan Layar OLED SSD1306)
#134Mahir
Premium

HTTPClient + API Cuaca ESP32 (dengan Layar OLED SSD1306)

Di proyek ini, kita memakai ESP32 untuk melakukan panggilan REST API ke API cuaca (wttr.in) lewat internet dengan HTTPClient.h. Berbeda dengan versi LCD I2C sebelumnya, di sini kita memakai layar OLED SSD1306 (128×64), yang memungkinkan font besar, ikon vektor, dan tampilan visual yang kaya di satu layar. Tujuh ikon vektor untuk kondisi cuaca (cerah, berawan sebagian, berawan, hujan, salju, badai, berkabut) digambar ketika program berjalan (tanpa file bitmap).

4.3(10)
19
Deep Sleep ESP32: Hemat Baterai (OLED + Penghitung RTC RAM)
#135Mahir
Premium

Deep Sleep ESP32: Hemat Baterai (OLED + Penghitung RTC RAM)

Mode Deep Sleep ESP32 menurunkan konsumsi arus hingga ~10 µA dengan mematikan CPU dan sebagian besar periferal, sehingga sangat penting untuk perangkat IoT bertenaga baterai. Di proyek ini, kita memakai tiga sumber bangun yang berbeda: timer (15 detik), pin eksternal (EXT0, tombol GPIO 33), dan sentuhan (T0/GPIO 4). Variabel yang ditandai RTC_DATA_ATTR dipertahankan selama deep sleep; penghitung boot, penghitung bangun karena timer, dan penghitung bangun karena tombol terus dilacak.

4.3(10)
16
Jam Real-Time dari Internet lewat NTP ESP32
#128Mahir
Premium

Jam Real-Time dari Internet lewat NTP ESP32

ESP32 tersambung ke Wi-Fi dan mengambil waktu nyata dengan presisi milidetik dari server NTP (Network Time Protocol). Berkat fungsi configTzTime(), zona waktu Turki (TRT, UTC+3) otomatis diterapkan, dan pergantian DST di negara yang memakai waktu musim panas otomatis diatur dengan string POSIX TZ. Waktunya ditampilkan di Serial Monitor sekaligus di LCD I2C opsional. configTzTime() memulai layanan SNTP; sinkronisasi ulang berkala terjadi selama koneksi tersedia.

4.5(13)
21
Sistem Alarm Gerakan ESP32 (PIR + Buzzer + LED + Telegram)
#145Mahir
Premium

Sistem Alarm Gerakan ESP32 (PIR + Buzzer + LED + Telegram)

Sistem alarm keamanan pintar yang menyalakan buzzer dan LED ketika sensor PIR mendeteksi gerakan, sekaligus mengirim notifikasi instan ke pemilik lewat Telegram. Cooldown 30 detik membatasi seberapa sering alarm berulang; mekanisme ini tidak memvalidasi deteksi PIR atau menghilangkan pemicu palsu. Cocok untuk rumah, garasi, gudang, atau ruang kerja. Dengan ESP32-CAM bisa ditambahkan notifikasi berfoto; dengan ESP32 DevKit V1 klasik, notifikasinya berupa teks.

0.0(0)
9
Jam Digital dengan ESP32 dan RTC DS1307 (I2C + LCD)
#120Menengah
Premium

Jam Digital dengan ESP32 dan RTC DS1307 (I2C + LCD)

Di proyek ini, kita menampilkan waktu dan tanggal di layar LCD I2C 16x2 memakai modul jam real-time (RTC) DS1307. DS1307 adalah RTC berbaterai cadangan yang tetap menjaga waktu meskipun ESP32 dimatikan. Kedua modul berbagi bus I2C yang sama (SDA/SCL), sehingga kita belajar mengendalikan beberapa perangkat hanya dengan dua kabel sinyal. Lewat proyek ini kamu mendapat pengetahuan praktis tentang protokol komunikasi I2C, cara kerja modul RTC, dan tampilan data dinamis di LCD.

4.6(26)
40