İçindekiler:

Arduino GPS Kaydedici: 3 Adım
Arduino GPS Kaydedici: 3 Adım

Video: Arduino GPS Kaydedici: 3 Adım

Video: Arduino GPS Kaydedici: 3 Adım
Video: Arduino GSM/GPS Sim808 Tutorial #2 Receiving Location Info As a Message #PCBWAY 2024, Kasım
Anonim
Arduino GPS Kaydedici
Arduino GPS Kaydedici
Arduino GPS Kaydedici
Arduino GPS Kaydedici

Merhaba millet, İnsanların her gün sahip olduğumuz teknolojiden çok daha fazlasını anlamalarını sağlayan küçük projeler için çok heyecanlıyım.

Bu proje, GPS koparma ve SD kaydı ile ilgilidir. Sadece bu şeyleri inşa ederek çok şey öğrendim.

Bu öğreticiyi izleyerek kazanacağınız pek çok kavram ve konularda daha derine inmek için sağladığım bağlantıyı takip ederek çok daha fazlası var.

Peki, o ne? Basit: Konumları (yükseklikle de), hızı ve tarihi/saati microSD'ye kaydeden bir GPS izcidir.

Neye ihtiyacınız olacak:

- Arduino Nano (taslağı oluşturmak için aslında bir UNO kullandım, ama hepsi aynı!) - Adafruit nihai GPS koparma - MicroSD kart koparma - Lehimleme araçları (lehim için ihtiyacınız olan her şey) - Evrensel Stripboard (kullandım) 5x7cm)- Teller

GPS modülü dışında tüm bu bileşenler oldukça ucuz. Bu yaklaşık 30-40 dolar ve en pahalı kısmı. Yeni bir havya seti bile daha az maliyetli olabilir.

Ayrıca GPS ve SD kart modülleriyle birlikte Adafruit kalkanı da mevcuttur. Kullanmak istiyorsanız, bunun Arduino UNO için yapıldığını unutmayın, bu nedenle bir Nano'ya değil bir UNO'ya ihtiyacınız olacak. Yine de krokide bir fark yok.

Daha ileri gidelim…

Adım 1: Bileşenleri Bağlama

Bileşenleri Bağlama
Bileşenleri Bağlama
Bileşenleri Bağlama
Bileşenleri Bağlama
Bileşenleri Bağlama
Bileşenleri Bağlama
Bileşenleri Bağlama
Bileşenleri Bağlama

Bileşenleri aldıktan sonra, onları bağlamanız gerekecek. Burada oldukça açık olan fritzing şemalarını bulabilirsiniz. Ancak, burada da pinout:

MicroSD çıkışı

5V -> 5VGND -> GnnCLK -> D13DO -> D12DI -> D11CS -> D4 (Kalkan kullanıyorsanız bu D10'da yerleşiktir)

GPS koparma

Vin -> 5VGnn -> GnnRx -> D2Tx -> D3

Bu modül hakkında küçük notlar: Bu iki küçük çocuk Arduino ile farklı yollardan iletişim kuruyor. GPS, Seri Monitör aracılığıyla Arduino ile iletişim kurarken kullandığımız türde bir TTL Seri kullanır, bu yüzden bir kitaplık aracılığıyla yeni bir seri (Tx ve Rx) ilan etmek zorundayız çünkü GPS varsayılan olarak 9600'ü kullanmak istiyor ve biz onu da kullanmak ister. GPS modülü, takılıysa her zaman ve sürekli olarak veri akışı sağlar. Bu, uğraşılması zor olan kısımdır, çünkü bir cümleyi okuyup yazdırırsak, bir sonrakini kaybedebiliriz, buna da ihtiyaç vardır. Kod yazarken bunu aklımızda tutmalıyız!

MicroSD, kartla iletişim kurmanın başka bir yolu olan SPI (Seri Çevre Birimi Arayüzü) aracılığıyla iletişim kurar. Bu tür modüller her zaman D13'te CLK, D12'de DO ve D11'de DI kullanır. Bazen bu bağlantıların CLK = SCK veya SCLK (Seri Saat), DO = DOUT, SIMO, SDO, SO, MTSR (bütün bunlar Ana Çıkışı gösterir) ve DI = SOMI, SDI, MISO, MRST (Ana Giriş) gibi farklı adları vardır. Son olarak, MicroSD'de yazmak istediklerimizi gönderdiğimiz pimi gösteren CS veya SS'ye sahibiz. İki farklı SPI modülü kullanmak istiyorsanız, ikisini de kullanabilmek için bu pini farklılaştırmanız yeterlidir. Örneğin, LCD ekran VE kullandığımız gibi bir MicroSd. Farklı CS'lere bağlı iki farklı LCD kullanarak da çalışması gerekir.

Bu parçayı tahtada lehimleyin ve taslağı yüklemeye hazırsınız!

Çizimde görebileceğiniz gibi, doğrudan bileşen yerine bazı dupont dişi konektörleri lehimliyorum, çünkü gelecekte bileşeni yeniden kullanmak veya birini değiştirmek isteyebilirim.

Ayrıca GPS modülünü konektörlerle yanlış yönde lehimledim, bu benim hatamdı ve yapmak istemedim, ama işe yarıyor ve o küçük piçleri sökmeye çalışırken onu kırma riskini almak istemiyorum! Sadece doğru şekilde lehimleyin ve her şey yoluna girecek!

İşte bazı yararlı lehim videosu: Yeni başlayanlar için lehimleme kılavuzu Sökücü hakkında bir video

Adafruit Youtube kanalı, çok ilginç şeyler var!

Lehim yaparken, sadece ihtiyacınız olan miktarda metal kullanmaya çalışın, aksi takdirde bir karışıklık yaratacaksınız. Bunu yapmaktan korkmayın, belki o kadar pahalı olmayan bir şeyle başlayın ve farklı şeyleri lehimleyin. Doğru malzeme de fark yaratır!

Adım 2: Eskiz

İlk olarak, elbette, kütüphaneyi içe aktarır ve çalışmak için nesnelerini oluştururuz: SPI.h, SPI modülleri ile iletişim içindir, SD, MicroSD kütüphanesidir ve Adafruit_GPS, GPS modülünün kütüphanesidir. SoftwareSerial.h, yazılım aracılığıyla bir seri bağlantı noktası oluşturmak içindir. Sözdizimi "mySerial(TxPin, RxPin);" şeklindedir. GPS nesnesinin bir seriye işaret edilmesi gerekir (parantez içinde). İşte Adafruit GPS koparma, MicroSD koparma (temiz bir iş yapmak için SD'yi SD ilişkilendirmesinden bu yazılımla SD'yi de biçimlendirmelisiniz) için kitaplıkların bağlantıları ve Yazılım Seri kitaplığı (IDE'ye dahil edilmelidir).

NOT: Bir dosyaya çok fazla bilgi eklemeye çalışırken veya çizimde ikiden fazla dosya kullanırken bazı sorunlarla karşılaştım. SD'yi bu yazılımla biçimlendirmedim, belki bu sorunu çözebilir. Ayrıca, cihaza başka bir sensör olan bir BMP280 (I2C modülü) eklemeye çalıştım, başarılı olamadım. I2C modülünü kullanmak taslağı çıldırtıyor gibi görünüyor! Adafruit forumunda zaten bununla ilgili konuşmuştum, ama hala bir cevap alamadım.

#include "SPI.h"#include "SD.h"#include "Adafruit_GPS.h"#include "SoftwareSerial.h" SoftwareSerial mySerial(3, 2); Adafruit_GPS GPS(&mySerial);

Şimdi tüm değişkenlerimize ihtiyacımız var: İki dize, GPS'den bir sürü yararlı bilgiyi hesaplamamız gereken iki cümleyi okumak içindir. Karakter, cümleleri ayrıştırmadan önce stoklamak içindir, şamandıralar koordinatları derece cinsinden hesaplamak içindir (GPS, derece ve dakika cinsinden koordinatları gönderir, google earth'de okumasına izin vermek için onlara derece cinsinden ihtiyacımız vardır). ChipSelect, MicroSD kartın CS'sini taktığımız pimdir. Bu durumda D4'tür, ancak bir SD kalkanı kullanıyorsanız, buraya D10'u koymanız gerekecektir. Dosya değişkeni, çizim sırasında kullandığımız dosyanın bilgilerini depolayacak olandır.

NMEA1 dizisi;

NMEA2 dizisi; karakter c; yüzer derece; float dereceBütün; yüzer dereceDec; int chipSelect = 4; mySensorData dosyası;

Şimdi taslağı biraz daha zarif ve daha az dağınık hale getirmek için birkaç işlev bildiriyoruz:

Temelde aynı şeyi yapıyorlar: NMEA cümlelerini okumak. clearGPS() üç cümleyi yok sayıyor ve readGPS() ikisini değişkenlere kaydediyor.

Bakalım nasıl olacak: Bir while döngüsü, modülde yeni NMEA cümleleri olup olmadığını kontrol ediyor ve bir tane olana kadar GPS akışını okuyor. Yeni bir cümle olduğunda, cümlenin gerçekten okunduğu, ayrıştırıldığı ve ilk NMEA değişkenlerinde depolandığı while döngüsünün dışındayız. Hemen bir sonraki için aynısını yapıyoruz, çünkü GPS sürekli akış yapıyor, hazır olmamızı beklemiyor, hemen yazdırmak için zamanımız yok

Bu çok önemli! Her iki cümleyi de stoklamadan önce hiçbir şey yapmayın, aksi takdirde ikincisi eninde sonunda bozulur veya yanlış olur.

İki cümle bulduktan sonra, iyi gittiğini kontrol etmek için onları seriye yazdırıyoruz.

geçersiz readGPS() {

clearGPS(); while(!GPS.newNMEArecated()) { c=GPS.read(); } GPS.parse(GPS.lastNMEA()); NMEA1=GPS.lastNMEA(); while(!GPS.newNMEArecated()) { c=GPS.read(); } GPS.parse(GPS.lastNMEA()); NMEA2=GPS.lastNMEA(); Seri.println(NMEA1); Seri.println(NMEA2); } void clearGPS() { while(!GPS.newNMEAreceived()) { c=GPS.read(); } GPS.parse(GPS.lastNMEA()); while(!GPS.newNMEArecated()) { c=GPS.read(); } GPS.parse(GPS.lastNMEA());w while(!GPS.newNMEAreceived()) { c=GPS.read(); } GPS.parse(GPS.lastNMEA()); }

Pekala, artık hazır olduğumuza göre setup()'a geçebiliriz:

İlk olarak: Arduino PC için Seri 115200'de ve GPS modülü Arduino için 9600'de iletişimi açıyoruz. İkincisi: GPS modülüne üç komut gönderiyoruz: ilki anten güncellemesini kapatmak, ikincisi ise sadece RMC ve GGA dizisini istemek içindir (sadece ihtiyacınız olan tüm bilgilere sahip olanları kullanacağız). GPS), üçüncü ve son komut, Adafruit tarafından önerilen güncelleme oranını 1HZ'ye ayarlamaktır.

Bundan sonra, eğer ve sadece SD modelinizin CS pini D10'dan farklıysa, D10 pinini OUTPUT olarak ayarlıyoruz. Hemen ardından SD modülündeki CS'yi chipSelect pininde ayarlayın.

cleanGPS() içeren readGPS() fonksiyonlarını çalıştırıyoruz.

Şimdi dosyalara bir şeyler yazmanın zamanı geldi! Dosya zaten Sd karttaysa, üzerlerine bir zaman damgası ekleyin. Bu sayede her seferinde oturumları takip etmek veya dosyaları silmek zorunda kalmıyoruz. Kurulum işlevinde yazılan bir zaman damgasıyla, her oturumda yalnızca bir kez dosyalara bir ayırma ekleyeceğimizden eminiz.

NOT: SD kitaplığı, dosyayı her seferinde açıp kapatmak konusunda oldukça ciddidir! Aklınızda bulundurun ve her seferinde kapatın! Kütüphane hakkında bilgi almak için bu bağlantıyı takip edin.

Tamam, çizimin akış ve günlük bölümünün özünü elde etmeye gerçekten hazırız.

geçersiz kurulum() {

Seri.başla(115200); GPS.başlangıç(9600); //Komutları GPS modülüne gönder GPS.sendCommand("$PGCMD, 33, 0*6D"); GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); gecikme(1000); //yalnızca SD modülünüzün CS pini D10 pininde değilse

pinMode(10, ÇIKIŞ);

SD.begin(chipSelect); okumaGPS(); if (SD.exists("NMEA.txt")) { mySensorData = SD.open("NMEA.txt", FILE_WRITE); mySensorData.println(""); mySensorData.print("***"); mySensorData.print(GPS.day); mySensorData.print("."); mySensorData.print(GPS.ay); mySensorData.print("."); mySensorData.print(GPS.yıl); mySensorData.print(" -- "); mySensorData.print(GPS.saat); mySensorData.print(":"); mySensorData.print(GPS.dakika); mySensorData.print(":"); mySensorData.print(GPS.saniye); mySensorData.println("***"); mySensorData.close(); } if (SD.exists("GPSData.txt")) { mySensorData = SD.open("GPSData.txt", FILE_WRITE); mySensorData.println(""); mySensorData.println(""); mySensorData.print("***"); mySensorData.print(GPS.day); mySensorData.print("."); mySensorData.print(GPS.ay); mySensorData.print("."); mySensorData.print(GPS.yıl); mySensorData.print(" -- "); mySensorData.print(GPS.saat); mySensorData.print(":"); mySensorData.print(GPS.dakika); mySensorData.print(":"); mySensorData.print(GPS.saniye); mySensorData.println(" ***"); mySensorData.close(); }}

Şimdi eskizin özünü alıyoruz.

Gerçekten çok basit.

GPS akışını readGPS() işleviyle okuyacağız, bunun yerine 1'e eşit bir düzeltmemiz olup olmadığını kontrol edeceğiz, bu bir uyduya bağlı olduğumuz anlamına gelir. Alırsak bilgilerimizi dosyalara yazacağız. İlk dosya olan "NMEA.txt" içerisinde sadece ham cümleleri yazıyoruz. İkinci dosya olan "GPDData.txt" de koordinatları (daha önce gördüğümüz fonksiyonlarla dönüştürülmüş) ve yüksekliği ekliyoruz. Bu bilgiler, Google Earth'te bir yol oluşturmak için bir.kml dosyası derlemek için yeterlidir. Bir şeyler yazmak için her açtığımızda dosyaları kapattığımızı unutmayın!

boşluk döngüsü () {

okumaGPS(); // Antene ve segnale'yi kontrol etmek için koşul. Se si, con la scrittura dei dati. if(GPS.fix==1) { //Sadece bir düzeltmemiz varsa verileri kaydedin mySensorData = SD.open("NMEA.txt", FILE_WRITE); // Her frasi NMEA için ön il dosyası mySensorData.println(NMEA1); //Scrive ilk NMEA sul dosyası mySensorData.println(NMEA2); //İkinci NMEA sul dosyası mySensorData.close(); //Chiude dosyası!!

mySensorData = SD.open("GPSData.txt", FILE_WRITE);

// scrive la longitudine convLong(); mySensorData.print(derece, 4); // gradi sul dosyasındaki koordinatları çizin mySensorData.print(", "); // virgola'yı ayrı ayrı yazın Serial.print(derece); Seri.print(", "); // e scrive la latitudine convLati(); mySensorData.print(derece, 4); // gradi sul dosyasındaki koordinatları çizin mySensorData.print(", "); // virgola per ayrı ayrı virgola i veri Serial.print(derece); Seri.print(", "); // Scrive l'altitudine mySensorData.print(GPS.altitude); mySensorData.print(" "); Serial.println(GPS.altitude); mySensorData.close(); } }

Artık işimiz bittiğine göre, taslağı yükleyebilir, cihazı kurabilir ve keyfini çıkarabilirsiniz!

Sabit = 1 elde etmek için GPS boradı gökyüzüne bakacak şekilde kullanmanız gerektiğini veya harici bir anten takabileceğinizi unutmayın.

Ayrıca, bir düzeltme varsa, kırmızı ışığın her 15 saniyede bir yanıp söndüğünü, yoksa çok daha hızlı (2-3 saniyede bir) yanıp söndüğünü unutmayın.

NMEA cümleleri hakkında daha fazla şey öğrenmek istiyorsanız, bu kılavuzun bir sonraki adımını izlemeniz yeterlidir.

3. Adım: NMEA Cümleleri ve.kml Dosyası

Cihaz ve çizim tamamlandı, iyi çalışıyorlar. Bir düzeltme elde etmek için (uydularla bağlantı kurmak için) kopuşun gökyüzüne bakması gerektiğini unutmayın.

Bir düzeltme yaptığınızda küçük kırmızı ışık her 15 saniyede bir yanıp söner

NMEA cümlelerini daha iyi anlamak istiyorsanız, daha fazlasını okuyabilirsiniz.

Çizimde sadece iki cümle kullanıyoruz, GGA ve RMC. GPS modülünün aktardığı cümlelerden sadece birkaçı.

Bakalım bu dizide neler var:

$GPRMC, 123519, A, 4807.038, N, 01131.000, E, 022.4, 084.4, 230394, 003.1, W*6A

RMC = Önerilen Minimum cümle C 123519 = 12:35:19 UTC'de alınan düzeltme A = Durum A=etkin veya V=Void 4807.038, N = Enlem 48 derece 07.038' K 01131.000, E = Boylam 11 derece 31.000' D 022.4 = Hız zemin üzerinde düğümler halinde 084.4 = Derece olarak iz açısı True 230394 = Tarih - 23 Mart 1994 003.1, W = Manyetik Değişim *6A = Sağlama toplamı verileri, her zaman * ile başlar

$GPGGA, 123519, 4807.038, N, 01131.000, E, 1, 08, 0.9, 545.4, M, 46.9, M,, *47

GGA Global Konumlandırma Sistemi Düzeltme Verileri 123519 Düzeltme 12:35:19 UTC 4807.038, K Enlem 48 derece 07.038' K 01131.000, Doğu Boylam 11 derece 31.000' E 1 Düzeltme kalitesi: 0 = geçersiz; 1 = GPS düzeltmesi (SPS);2 = DGPS düzeltmesi; 3 = PPS düzeltmesi; 4 = Gerçek Zamanlı Kinematik; 5 = Kayan RTK; 6 = tahmini (ölü hesaplama) (2.3 özellik); 7 = Manuel giriş modu; 8 = Simülasyon modu; 08 İzlenen uydu sayısı 0.9 Konumun yatay seyrelmesi 545.4, M Rakım, Metre, ortalama deniz seviyesinin üstünde 46.9, M WGS84'ün üzerinde jeoidin yüksekliği (ortalama deniz seviyesi) elipsoidin (boş alan) son DGPS güncellemesinden bu yana geçen süre (boş alan)) DGPS istasyon kimlik numarası *47 sağlama toplamı verisi, her zaman * ile başlar

Gördüğünüz gibi, orada ihtiyacınız olandan çok daha fazla bilgi var. Adafruit kütüphanesini kullanarak, GPS.latitude veya GPS.lat (enlem ve enlem yarımküre) veya GPS.gün/ay/yıl/saat/dakika/saniye/milisaniye gibi bazılarını arayabilirsiniz. Adafruit'e bir göz atın. bir şey daha bilmek için web sitesi. O kadar net değil, ancak GPS modülleri kılavuzundaki bazı ipuçlarını takip ederek ihtiyacınız olanı bulabilirsiniz.

Elimizdeki dosyalarla ne yapabiliriz? Kolay: Google Earth'te bir yol göstermek için bir kml dosyası derleyin. Bunu yapmak için, bu bağlantıyı takip ederek bulacağınız kodu (Yol paragrafının altında) kopyalayıp yapıştırın, GPDData.txt dosyasındaki koordinatlarınızı etiketler arasına koyun, dosyayı.kml uzantılı kaydedin ve yükleyin. Google Earth.

NOT:.kml biçimlendirme dili basittir, zaten bir biçimlendirme dilinin ne olduğunu biliyorsanız, önceki bağlantıyı ve içindeki belgeleri okumak için zaman ayırın, gerçekten ilginç!

Kml'yi kullanmak, etiketlerini ve argümanlarını bilmekle ilgilidir. Google'dan sadece rehberi buldum, daha önce linkini verdiğim ve asıl kısım, etiketler arasındaki stili tanımlamak ve koordinatları yazma zamanı geldiğinde onu # işaretiyle çağırmak.

Bu bölümde eklediğim dosya sadece koordinatlarınızı yapıştırabileceğiniz bir.kml dosyasıdır. bu sözdizimiyle yapıştırmayı unutmayın: boylam, enlem, yükseklik

Önerilen: