İçindekiler:

GPS ile Yolunuzu Bulma: 9 Adım
GPS ile Yolunuzu Bulma: 9 Adım

Video: GPS ile Yolunuzu Bulma: 9 Adım

Video: GPS ile Yolunuzu Bulma: 9 Adım
Video: Apple Watch Series 9 inceleme! - 14.999 TL'ye değer mi? 2024, Temmuz
Anonim
GPS ile Yolunuzu Bulma
GPS ile Yolunuzu Bulma

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

Başlarken
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

Veri Akışında Bir Ayak
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

Kendi yolunu bulmak
Kendi yolunu bulmak

Üçü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: