Geo-Fencing و GPS یعنی چه؟ (برای مبتدی)
Geo-Fencing (حصار جغرافیایی) یعنی تعریف یک محدوده فضایی روی نقشه و تشخیص خودکار ورود یا خروج از آن. وقتی یک UAV یا UGV از این محدوده خارج میشود، سیستم هشدار میدهد یا دستور RTL صادر میکند.
GPS (Global Positioning System) یک سیستم ناوبری ماهوارهای است. ماژول NEO-6M در ایران بسیار رایج است — با دقت ۲.۵ متر CEP موقعیت را گزارش میدهد. ماژول GPS از طریق UART با آردوینو ارتباط برقرار میکند و دادههای NMEA (مثل $GPRMC و $GPGGA) میفرستد که حاوی طول و عرض جغرافیایی هستند.
در این پروژه محاسبه فاصله از مرکز Geo-Fence با فرمول Haversine انجام میشود — این فرمول فاصله دقیق بین دو نقطه روی کره زمین را بر اساس عرض و طول جغرافیایی حساب میکند.
محصولی که میسازید
یک سیستم Geo-Fence که وقتی UAV بیشتر از ۱۰۰ متر از نقطه پرواز دور میشود، از طریق LoRa هشدار ارسال میکند.
- زمان ساخت: ۳ تا ۴ ساعت
- هزینه: ۶۰۰ تا ۹۰۰ هزار تومان
قطعات لازم (BOM)
| قطعه | تعداد |
|---|---|
| Arduino Nano | ۲ عدد |
| GPS NEO-6M | ۱ عدد (روی UAV) |
| ماژول LoRa Ra-02 | ۲ عدد |
| بازر Buzzer | ۱ عدد (زمین) |
| LED قرمز | ۱ عدد (هشدار بصری) |
کد Arduino — فرستنده روی UAV
#include <SPI.h>
#include <LoRa.h>
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
TinyGPSPlus gps;
SoftwareSerial gpsSerial(4, 3); // RX, TX
void setup() {
gpsSerial.begin(9600);
LoRa.begin(433E6);
LoRa.setSpreadingFactor(9);
}
void loop() {
while (gpsSerial.available()) gps.encode(gpsSerial.read());
if (gps.location.isUpdated()) {
String msg = String(gps.location.lat(), 6) + "," + String(gps.location.lng(), 6);
LoRa.beginPacket();
LoRa.print(msg);
LoRa.endPacket();
}
delay(1000);
}
کد Arduino — گیرنده زمین (Geo-Fence Check)
#include <SPI.h>
#include <LoRa.h>
#include <math.h>
const double HOME_LAT = 35.6892; // عرض جغرافیایی نقطه پرواز
const double HOME_LON = 51.3890; // طول جغرافیایی
const double FENCE_RADIUS = 100.0; // متر
const int BUZZER = 6, LED = 7;
double haversine(double lat1, double lon1, double lat2, double lon2) {
const double R = 6371000;
double dlat = radians(lat2 - lat1);
double dlon = radians(lon2 - lon1);
double a = sin(dlat/2)*sin(dlat/2) + cos(radians(lat1))*cos(radians(lat2))*sin(dlon/2)*sin(dlon/2);
return R * 2 * atan2(sqrt(a), sqrt(1-a));
}
void setup() {
pinMode(BUZZER, OUTPUT); pinMode(LED, OUTPUT);
LoRa.begin(433E6);
LoRa.setSpreadingFactor(9);
Serial.begin(115200);
}
void loop() {
int pkt = LoRa.parsePacket();
if (pkt) {
String data = "";
while (LoRa.available()) data += (char)LoRa.read();
int comma = data.indexOf(',');
double lat = data.substring(0, comma).toDouble();
double lon = data.substring(comma+1).toDouble();
double dist = haversine(HOME_LAT, HOME_LON, lat, lon);
Serial.print("Distance: "); Serial.print(dist); Serial.println(" m");
if (dist > FENCE_RADIUS) {
digitalWrite(BUZZER, 1); digitalWrite(LED, 1);
Serial.println("⚠ FENCE BREACH!");
} else {
digitalWrite(BUZZER, 0); digitalWrite(LED, 0);
}
}
}
چکلیست تست
| تست | نتیجه |
|---|---|
| GPS Fix گرفته؟ (چند ماهواره؟) | حداقل ۶ ماهواره |
| Serial Monitor فاصله درست نشان میدهد؟ | با Google Maps بسنجید |
| در ۱۱۰ متر بازر کار میکند؟ | بله |
| در داخل ۸۰ متر بازر خاموش است؟ | بله |