GPS چطور موقعیت را میداند؟
ماژول NEO-6M (ساخت u-blox) یک گیرنده GPS است که از سیگنال حداقل ۴ ماهواره برای محاسبه موقعیت با دقت ~۲.۵m استفاده میکند. این ماژول داده را به فرمت NMEA از طریق UART (سریال) ارسال میکند — جملاتی مثل ,123519,A,4807.038,N,01131.000,E,022.4,084.4... که حاوی عرض جغرافیایی، طول جغرافیایی، سرعت و جهت است.
وقتی این داده را با LoRa به Ground Station ارسال کنیم، میتوانیم مسیر UGV را روی نقشه در زمان واقعی ببینیم.
🛠️ کارت پروژه
| دقت GPS | ~۲.۵m (NEO-6M استاندارد) |
| نرخ بهروزرسانی | ۱Hz پیشفرض (قابل ارتقا به ۵Hz) |
| برد ارسال LoRa | ۲–۵km |
BOM
| قطعه | قیمت |
|---|---|
| ماژول GPS NEO-6M با آنتن | ~۱۵۰K |
| ماژول LoRa Ra-02 ×۲ | ~۳۰۰K |
| Arduino Nano ×۲ | ~۲۰۰K |
| کانکتور JST و سیم | ~۳۰K |
اتصال GPS NEO-6M به Arduino
| NEO-6M | Arduino Nano |
|---|---|
| VCC | 3.3V |
| GND | GND |
| TX | D4 (SoftwareSerial RX) |
| RX | D3 (SoftwareSerial TX) |
کد: ارسال GPS از طریق LoRa
#include <SoftwareSerial.h>
#include <TinyGPS++.h>
#include <SPI.h>
#include <LoRa.h>
SoftwareSerial gpsSerial(4,3);
TinyGPSPlus gps;
void setup(){
gpsSerial.begin(9600);
LoRa.begin(433E6);
}
void loop(){
while(gpsSerial.available()) gps.encode(gpsSerial.read());
if(gps.location.isUpdated()){
float lat = gps.location.lat();
float lng = gps.location.lng();
float spd = gps.speed.kmph();
LoRa.beginPacket();
LoRa.print(lat,6); LoRa.print(',');
LoRa.print(lng,6); LoRa.print(',');
LoRa.print(spd,1);
LoRa.endPacket();
}
}
نمایش روی Google Earth
- گیرنده LoRa به کامپیوتر وصل است — با Python داده UART را بخوان.
- یک فایل KML بنویس و هر چند ثانیه با موقعیت جدید آپدیت کن.
- Google Earth را با Network Link به این فایل وصل کن — مسیر روی نقشه ظاهر میشود.
# Python: ذخیره KML از داده LoRa
import serial, time
ser = serial.Serial('COM3', 9600)
coords = []
while True:
line = ser.readline().decode().strip()
parts = line.split(',')
if len(parts)==3:
lat,lng,spd = parts
coords.append(f"{lng},{lat},0")
kml = f"""<?xml version="1.0"?>
<kml><Document><Placemark><LineString>
<coordinates>{chr(10).join(coords)}</coordinates>
</LineString></Placemark></Document></kml>"""
open('track.kml','w').write(kml)
time.sleep(1)