İçindekiler:
2025 Yazar: John Day | [email protected]. Son düzenleme: 2025-01-23 15:13
GPS verilerini anlama ve uygulama konusunda hızlı bir alıştırma
- Gerekli Süre: 2 Saat
- Maliyet: 75–150$
Üreticiler için, yüksek kaliteli coğrafi verileri elektronik projelere dahil etmek oldukça ucuz hale geldi. Ve son birkaç yılda, GPS (Küresel Konumlandırma Sistemi) alıcı modülleri çok daha çeşitli, güçlü ve Arduino, PIC, Teensy ve Raspberry Pi gibi geliştirme kartlarıyla entegrasyonu kolay hale geldi. GPS üzerine inşa etmeyi düşünüyorsanız, başlamak için iyi bir zaman seçtiniz.
Adım 1: Nasıl Çalışır?
GPS modülü, bir uydu filosu tarafından bilinen frekanslarda yayınlanan sinyalleri işleyen küçük bir radyo alıcısıdır. Bu uydular, Dünya'nın etrafında kabaca dairesel yörüngelerde dönerek, son derece hassas konum ve saat verilerini aşağıdaki yere iletir. Yeryüzündeki alıcı bu uyduları yeterince "görebiliyorsa", kendi konumunu ve yüksekliğini hesaplamak için bunları kullanabilir.
Bir GPS mesajı geldiğinde, alıcı önce ne zaman gönderildiğini görmek için yayın zaman damgasını inceler. Bir radyo dalgasının uzaydaki hızı bilinen bir sabit (c) olduğundan, alıcı, sinyalin kat ettiği mesafeyi belirlemek için yayın ve alım sürelerini karşılaştırabilir. Bilinen dört veya daha fazla uydudan uzaklığını belirledikten sonra, kendi konumunu hesaplamak oldukça basit bir 3B üçgenleme problemidir. Ancak bunu hızlı ve doğru bir şekilde yapmak için, alıcının aynı anda 20'ye kadar veri akışından gelen sayıları çevik bir şekilde kırabilmesi gerekir. GPS sisteminin yayınlanmış bir hedefi olan Dünya'nın her yerinde kullanılabilir olma hedefi olduğundan, sistem en az dört uydunun bulunmasını sağlamalıdır. - tercihen daha fazlası - dünyanın her noktasından her zaman görülebilir. Şu anda 20.000 kilometre yüksekliğindeki seyrek bir bulutta titizlikle koreografisi yapılmış bir dans gerçekleştiren 32 GPS uydusu var.
2. Adım: Hayran Gerçeği
GPS, Einstein'ın görelilik teorisi olmadan çalışamazdı, çünkü yörüngedeki atomik saatlerin her gün Dünya'nın yerçekimi alanındaki zaman genişlemesinden kazandığı 38 mikrosaniye için telafi yapılması gerekir.
3. Adım: Başlarken
Projeniz ne olursa olsun, GPS'in entegrasyonu kolaydır. Çoğu alıcı modülü, basit bir seri protokolle iletişim kurar, bu nedenle denetleyici kartınızda yedek bir seri bağlantı noktası bulabilirseniz, fiziksel bağlantıyı yapmak için yalnızca bir avuç kablo gerekir. Ve olmasa bile, çoğu denetleyici, rastgele pinlere bağlanmak için kullanabileceğiniz öykünmüş bir "yazılım" seri modunu destekler.
Yeni başlayanlar için Adafruit'in Ultimate GPS Breakout modülü iyi bir seçimdir. Piyasada çok sayıda rakip ürün var, ancak Ultimate, lehimlenmesi veya bir devre tahtasına bağlanması kolay büyük geçiş delikleriyle makul bir fiyata sağlam bir performans sergiliyor.
İlk önce, toprak ve gücü bağlayın. Arduino terimleriyle bu, mikrodenetleyici GND pinlerinden birini modülün GND'sine ve + 5V pinini modülün VIN'ine bağlamak anlamına gelir. Veri aktarımını yönetmek için modülün TX ve RX pinlerini Arduino'ya da bağlamanız gerekir. 0 ve 1 pinleri “donanım seri portu” veya UART olarak kullanılmak üzere özel olarak tasarlanmış olsa da, bu amaç için keyfi olarak Arduino pinleri 2 (TX) ve 3 (RX) seçeceğim. Neden? Çünkü bu düşük kaliteli AVR işlemcilerin sahip olduğu tek UART'ı boşa harcamak istemiyorum. Arduino'nun UART'ı yerleşik USB konektörüne bağlı ve hata ayıklama için bilgisayarıma bağlı tutmayı seviyorum.
Adım 4: Veri Akışında Bir Ayak
Güç uyguladığınız anda, bir GPS modülü TX hattına metin verisi parçaları göndermeye başlar. Henüz tek bir uydu görmeyebilir, bir "düzeltme" daha az olabilir, ancak veri musluğu hemen devreye girer ve neyin ortaya çıktığını görmek ilginçtir. İlk basit çizimimiz (aşağıda) bu işlenmemiş verileri göstermekten başka bir şey yapmıyor.
#include #define RXPin 2
#define TXPin 3#define GPSBaud 4800
#define ConsoleBaud 115200
// GPS cihazına seri bağlantıSoftwareSerial ss(RXPin, TXPin);
geçersiz kurulum(){
Serial.begin(ConsoleBaud);
ss.begin(GPSBaud);
Serial.println("GPS Örneği 1");
Serial.println("GPS modülü tarafından iletilen ham NMEA verilerinin görüntülenmesi.");
Serial.println("Mikal Hart tarafından"); Seri.println();
}
boşluk döngüsü()
{ if (ss.available() > 0) // Her karakter geldiğinde…
Seri.write(ss.read()); // … konsola yaz
}
NOT: Daha önce iletme (TX) pininin pin 2'ye bağlanacağını söylememize rağmen, çizim alma pinini (RXPin) 2 olarak tanımlar. Bu yaygın bir karışıklık kaynağıdır. RXPin, Arduino'nun bakış açısından alma pinidir (RX). Doğal olarak, modülün iletim (TX) pinine bağlı olmalıdır ve bunun tersi de geçerlidir.
Bu çizimi yükleyin ve 115, 200 baud'da Seri Monitörü açın. Her şey çalışıyorsa, yoğun, sonsuz bir virgülle ayrılmış metin dizeleri akışı görmelisiniz. Her biri paragrafın başındaki ikinci resim gibi görünecek.
Bu ayırt edici dizeler, NMEA cümleleri olarak bilinir, çünkü bu biçim Ulusal Denizcilik Elektroniği Birliği tarafından icat edilmiştir. NMEA, temelden (yer ve zaman), ezoterik (uydu sinyal-gürültü oranı, manyetik varyans, vb.) arasında değişen seyrüsefer verileri için bu cümlelerin bir kısmını tanımlar. Üreticiler, alıcılarının hangi cümle türlerini kullandığı konusunda tutarsızdır, ancak GPRMC esastır. Modülünüz bir kez düzeldiğinde, bu GPRMC cümlelerinin adil bir kısmını görmelisiniz.
Adım 5: Kendinizi Bulmak
Ham modül çıktısını programınızın gerçekten kullanabileceği bilgilere dönüştürmek önemsiz değildir. Neyse ki, bunu sizin için yapabilecek harika kütüphaneler var. Limor Fried'in popüler Adafruit GPS Kitaplığı, Ultimate koparmalarını kullanıyorsanız uygun bir seçimdir. Ultimate'a özgü özellikleri (dahili veri kaydı gibi) etkinleştirmek için yazılmıştır ve kendine özgü bazı şık ziller ve ıslıklar ekler. Ancak en sevdiğim ayrıştırma kitaplığı - ve burada elbette tamamen tarafsızım - TinyGPS++ adında yazdığım kitaplık. Kapsamlı, güçlü, özlü ve kullanımı kolay olacak şekilde tasarladım. Bir tur atalım.
Adım 6: TinyGPS++ ile Kodlama
Programcının bakış açısından TinyGPS++ kullanmak çok basittir:
1) Bir nesne gps oluşturun.
2) Modülden gelen her karakteri gps.encode() kullanarak nesneye yönlendirin.
3) Konumunuzu veya irtifanızı veya saatinizi veya tarihinizi bilmeniz gerektiğinde, gps nesnesini sorgulamanız yeterlidir.
#include #include
#define RXPin 2
#define TXPin 3
#define GPSBaud 4800
#define ConsoleBaud 115200
// GPS cihazına seri bağlantıSoftwareSerial ss(RXPin, TXPin);
// TinyGPS++ nesnesi
TinyGPSPlus gps;
geçersiz kurulum(){
Serial.begin(ConsoleBaud);
ss.begin(GPSBaud);
Serial.println("GPS Örneği 2");
Serial.println("TinyGPS++ kullanan basit bir izleyici.");
Serial.println("Mikal Hart tarafından");
Seri.println();
}
boşluk döngüsü(){
// GPS'den herhangi bir karakter geldiyse, /
/ onları TinyGPS++ nesnesine gönder
while (ss.available() > 0)
gps.encode(ss.read());
// Yeni konumu ve rakımı gösterelim
// bunlardan herhangi biri güncellendiğinde
if (gps.location.isUpdated() || gps.altitude.isUpdated())
{
Serial.print("Yer: ");
Serial.print(gps.location.lat(), 6);
Seri.print(", ");
Serial.print(gps.location.lng(), 6);
Serial.print(" Rakım: ");
Serial.println(gps.altitude.meters());
}
}
İkinci uygulamamız, ayrıştırmaya yardımcı olması için TinyGPS++ kullanarak alıcının konumunu ve yüksekliğini sürekli olarak görüntüler. Gerçek bir cihazda, bu verileri bir SD karta kaydedebilir veya bir LCD'de görüntüleyebilirsiniz. Kütüphaneyi alın ve FindingYourself.ino'yu (yukarıda) çizin. Kütüphaneyi her zamanki gibi Arduino kütüphaneleri klasörüne kurun. Krokiyi Arduino'nuza yükleyin ve 115, 200 baud'da Seri Monitörü açın. Konumunuzu ve rakım güncellemenizi gerçek zamanlı olarak görmelisiniz. Tam olarak nerede durduğunuzu görmek için, elde edilen enlem/boylam koordinatlarından bazılarını Google Haritalar'a yapıştırın. Şimdi dizüstü bilgisayarınızı bağlayın ve bir gezintiye veya arabaya binin. (Ama gözlerinizi yoldan ayırmayı unutmayın!)
7. Adım: "DÖRDÜNCÜ BOYUT"
GPS'i uzaydaki konumla ilişkilendirsek de, bu uyduların da zaman ve tarih damgaları ilettiğini unutmayın. Ortalama GPS saati, saniyenin on milyonda birine kadar doğrudur ve teorik sınır daha da yüksektir. Projenizin sadece zamanı takip etmesine ihtiyacınız olsa bile, bir GPS modülü hala en ucuz ve en kolay çözüm olabilir.
FindingYourself.ino'yu süper hassas bir saate dönüştürmek için son birkaç satırı şu şekilde değiştirmeniz yeterlidir:
if (gps.time.isUpdated()) {
karakter buf[80];
sprintf(buf, "Saat %02d:%02d:%02d", gps.time.hour(), gps.time.minute(), gps.time.second()); Seri.println(tampon);
}
8. Adım: Yolunuzu Bulma
Üçüncü ve son uygulamamız, 100 satırdan daha az kodla, "düz dur" veya "sola dön" gibi basit metin talimatlarını kullanarak kullanıcıyı bir hedefe yönlendirecek, okunabilir bir TinyGPS++ taslağı yazmak için kişisel bir zorluğun sonucudur.
#include #include
#define RXPin 2
#define TXPin 3
#define GPSBaud 4800
#define ConsoleBaud 115200
// GPS cihazına seri bağlantıSoftwareSerial ss(RXPin, TXPin);
// TinyGPS++ nesnesi TinyGPSPlus gps;
imzasız uzun lastUpdateTime = 0;
#define EIFFEL_LAT 48.85823#define EIFFEL_LNG 2.29438
/* Bu örnek, bir kişiyi (veya bir dronu) bir varış noktasına yönlendirmek için rotayı ve mesafeyi nasıl kullanabileceğinize ilişkin temel bir çerçeveyi gösterir. Bu hedef Eyfel Kulesi. Gerektiği gibi değiştirin
Enlem/boylam koordinatını almanın en kolay yolu, Google Haritalar'da (maps.google.com) hedefi sağ tıklayıp "Burada ne var?" seçeneğini seçmektir. Bu, tam değerleri arama kutusuna yerleştirir
*/
geçersiz kurulum(){
Serial.begin(ConsoleBaud);
ss.begin(GPSBaud);
Serial.println("GPS Örneği 3");
Serial.println("O kadar da kapsamlı olmayan bir Rehberlik Sistemi");
Serial.println("Mikal Hart tarafından");
Seri.println();
}
boşluk döngüsü(){
// GPS'den herhangi bir karakter geldiyse, // bunları TinyGPS++ nesnesine gönderin while (ss.available() > 0) gps.encode(ss.read());
// Her 5 saniyede bir güncelleme yapın
if (millis() - lastUpdateTime >= 5000)
{
lastUpdateTime = millis();
Seri.println();
// Mevcut durumumuzu belirle
double DistanceToDestination = TinyGPSPlus::distanceBetween
gps.location.lat(), gps.location.lng(), EIFFEL_LAT, EIFFEL_LNG);
double CourseToDestination = TinyGPSPlus::courseTo
gps.location.lat(), gps.location.lng(), EIFFEL_LAT, EIFFEL_LNG);
const char *directionToDestination = TinyGPSPlus::cardinal(courseToDestination);
int CourseChangeNeeded = (int)(360 + CourseToDestination - gps.course.deg()) % 360;
// hata ayıklama Serial.print("DEBUG: Course2Dest: ");
Serial.print(courseToDestination);
Serial.print(" CurCourse: ");
Seri.print(gps.course.deg());
Serial.print(" Dir2Dest: ");
Serial.print(directionToDestination);
Serial.print(" RelCourse: ");
Serial.print(dersChangeNeeded);
Serial.print("CurSpd:");
Serial.println(gps.speed.kmph());
// Hedefin 20 metre yakınında mı? Buradaydı
if (distanceToDestination <= 20.0)
{ Serial.println("Tebrikler: Geldiniz!");
çıkış(1);
}
Serial.print("MESAFE:"); Serial.print(distanceToDestination);
Serial.println("gidecek metreler.");
Serial.print("TALİMAT: ");
// Hareketsiz mi duruyorsun? Sadece hangi yöne gideceğinizi belirtin
if (gps.speed.kmph() < 2.0)
{
Serial.print("Kafa");
Serial.print(directionToDestination);
Seri.println(".");
dönüş;
}
if (courseChangeNeeded >= 345 ||courseChangeNeeded < 15) Serial.println("Düz devam edin!");
else if (courseChangeNeeded >= 315 && CourseChangeNeeded < 345)
Serial.println("Biraz sola kay.");
else if (courseChangeNeeded >= 15 && CourseChangeNeeded < 45)
Serial.println("Biraz sağa sapın.");
else if (courseChangeNeeded >= 255 && CourseChangeNeeded < 315)
Serial.println("Sola dönün.");
else if (courseChangeNeeded >= 45 && CourseChangeNeeded < 105)
Serial.println("Sağa dönün.");
Başka
Serial.println("Tamamen dön.");
}
}
Kod, her 5 saniyede bir, TinyGPS++ CourseTo() yöntemini kullanarak kullanıcının konumunu ve rotasını (seyahat yönü) yakalar ve yönü (hedefe olan yön) hesaplar. İki vektörün karşılaştırılması, aşağıda gösterildiği gibi düz gitmeye veya dönmeye devam etmek için bir öneri üretir.
FindingYourWay.ino (yukarıda) taslağını kopyalayın ve Arduino IDE'ye yapıştırın. 1 km veya 2 km uzaklıkta bir hedef belirleyin, taslağı Arduino'nuza yükleyin, dizüstü bilgisayarınızda çalıştırın ve sizi oraya götürüp götürmeyeceğini görün. Ama daha da önemlisi, kodu inceleyin ve nasıl çalıştığını anlayın.
9. Adım: Daha İleri Gitmek
GPS'in yaratıcı potansiyeli çok büyük. Şimdiye kadar yaptığım en tatmin edici şeylerden biri, yalnızca önceden programlanmış bir konumda açılan GPS özellikli bir bulmaca kutusuydu. Kurbanınız hazineyi içeride kilitlemek istiyorsa, o gizli yerin nerede olduğunu bulması ve kutuyu fiziksel olarak oraya getirmesi gerekir. Popüler bir ilk proje fikri, örneğin Trans-Pennine Patikasında yürüyen bir yürüyüşçünün dakika dakika konumunu ve yüksekliğini kaydeden bir tür kayıt cihazıdır. Ya da Breaking Bad'deki DEA ajanlarının kötü adamların arabalarına yapıştığı o sinsi manyetik izcilerden birine ne demeli? Her ikisi de tamamen uygulanabilir ve muhtemelen inşa etmek eğlenceli olurdu, ancak Amazon'da satın alabileceğiniz şeylerin ötesinde daha kapsamlı düşünmenizi tavsiye ederim. Dışarıda büyük bir dünya var. Olabildiğince uzağa ve geniş dolaşın.
Önerilen:
Adım Adım Arduino Uno ile Akustik Kaldırma (8 adım): 8 Adım
Arduino Uno ile Akustik Kaldırma Adım Adım (8 adım): ultrasonik ses dönüştürücüler L298N erkek dc pinli Dc dişi adaptör güç kaynağı Arduino UNOBreadboardBu nasıl çalışır: İlk olarak, Arduino Uno'ya kod yüklersiniz (dijital ile donatılmış bir mikrodenetleyicidir) ve kodu dönüştürmek için analog bağlantı noktaları (C++)
Arduino Bulma: 4 Adım
Arduino Bulgusu: Bu benim Arduino çalışmam. Bu, uyandığımda eşyalarımı bulmama yardımcı olabilecek bir makine. Düğmeye bastığımda ışık değişecek ve ışıklar bir düzende dönecek
Boş Yer Bulma Acısını Çözmek İçin Park Sensörü Nasıl Yapılır: 12 Adım
Boş Yer Bulma Acısını Çözmek İçin Park Sensörü Nasıl Yapılır: Bu projede Raspberry Pi kullanarak basit bir park sensörü oluşturacağız. Görünüşe göre her sabah şu soruyla yüzleşmek zorunda kalıyorum: Ofisimin önündeki SADECE park yeri zaten dolu mu? Çünkü gerçekte olduğu zaman, etrafta dolaşmak zorundayım
ESP32 ile PWM - Arduino IDE ile ESP 32'de PWM ile LED Karartma: 6 Adım
ESP32 ile PWM | Arduino IDE ile ESP 32'de PWM ile LED Karartma: Bu talimatta Arduino IDE & PWM temel olarak herhangi bir MCU'dan analog çıkış üretmek için kullanılır ve bu analog çıkış 0V ile 3.3V (esp32 durumunda) arasında herhangi bir şey olabilir & itibaren
Arduino ve Bluetooth ile Kayıp Bir TV Kumandasını Bulma: 5 Adım
Arduino ve Bluetooth ile Kayıp Bir TV Uzaktan Kumandası Bulma: Kayıp Bir Televizyon uzaktan kumandası bulmak çok basit bir devre ve kod çok basit, sadece Arduino Nano'yu Bluetooth modüllü ve 3.7v'den 5v'ye kadar pil güçlendiricili küçük sesli uyarıcı kullanarak ve bir uygulama oluşturdum MIT App Inventor'da * bağlanabilirsiniz