Mục lục:

Arduino GPS Logger: 3 bước
Arduino GPS Logger: 3 bước

Video: Arduino GPS Logger: 3 bước

Video: Arduino GPS Logger: 3 bước
Video: First GPS Arduino Project by ChatGPT 2024, Tháng bảy
Anonim
Arduino GPS Logger
Arduino GPS Logger
Arduino GPS Logger
Arduino GPS Logger

Chào các cậu, Tôi đang rất hứng thú với những dự án nhỏ cho phép mọi người thực sự hiểu nhiều hơn về công nghệ mà chúng ta sử dụng hàng ngày.

Dự án này là về đột phá GPS và ghi nhật ký SD. Tôi đã học được rất nhiều chỉ khi xây dựng công cụ này.

Có rất nhiều khái niệm mà bạn sẽ đạt được sau hướng dẫn này và nhiều khái niệm khác theo liên kết mà tôi cung cấp để tìm hiểu sâu hơn về các chủ đề.

Vì vậy, những gì nó đó? Đơn giản: Là một công cụ theo dõi GPS ghi lại vị trí (với cả độ cao), tốc độ và ngày / giờ trên thẻ nhớ microSD.

Những gì bạn sẽ cần:

- Arduino Nano. một 5x7cm) - Dây

Tất cả những thành phần đó đều khá rẻ ngoại trừ mô-đun GPS. Đó là khoảng 30 - 40 đô la và Là phần đắt nhất. Ngay cả một bộ mỏ hàn mới cũng có thể có giá thấp hơn.

Cũng tồn tại một tấm chắn Adafruit với các mô-đun GPS và thẻ SD cùng nhau. Nếu bạn muốn sử dụng nó, hãy nhớ rằng nó được tạo cho Arduino UNO, do đó bạn sẽ cần UNO chứ không phải Nano. Không có sự khác biệt trong bản phác thảo.

Hãy đi xa hơn nữa…

Bước 1: Kết nối các thành phần

Kết nối các thành phần
Kết nối các thành phần
Kết nối các thành phần
Kết nối các thành phần
Kết nối các thành phần
Kết nối các thành phần
Kết nối các thành phần
Kết nối các thành phần

Vâng, sau khi bạn có các thành phần, bạn sẽ cần kết nối chúng. Ở đây bạn có thể tìm thấy các sơ đồ khá rõ ràng. Tuy nhiên, nó cũng là sơ đồ chân:

Đột phá về MicroSD

5V -> 5VGND -> GnnCLK -> D13DO -> D12DI -> D11CS -> D4 (Nếu bạn đang sử dụng lá chắn, nó được tích hợp trong D10)

Đột phá GPS

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

Ghi chú nhỏ về mô-đun đó: Hai cậu bé đó đang giao tiếp thông qua các con đường khác nhau với Arduino. GPS sử dụng Serial TTL, loại mà chúng tôi sử dụng khi giao tiếp với Arduino qua Serial Monitor, đó là lý do tại sao chúng tôi phải khai báo thông qua thư viện một chuỗi nối tiếp mới (Tx và Rx) vì GPS muốn sử dụng 9600 theo mặc định, và chúng tôi muốn sử dụng nó cũng được. Mô-đun GPS luôn truyền dữ liệu liên tục, nếu được cắm. Đây là phần khó giải quyết, bởi vì nếu chúng ta đọc một câu và hơn là in nó, chúng ta có thể mất câu tiếp theo, điều đó cũng cần thiết. Chúng ta phải ghi nhớ nó khi viết mã!

MicroSD giao tiếp thông qua SPI (Giao diện ngoại vi nối tiếp), một cách khác để giao tiếp với bo mạch. Loại mô-đun đó luôn sử dụng CLK trên D13, DO trên D12 và DI trên D11. Đôi khi những kết nối đó có tên khác nhau như CLK = SCK hoặc SCLK (Đồng hồ nối tiếp), DO = DOUT, SIMO, SDO, SO, MTSR (tất cả những kết nối đó chỉ ra Đầu ra chính) và DI = SOMI, SDI, MISO, MRST (Đầu vào chính). Cuối cùng, chúng tôi có CS hoặc SS cho biết chân mà chúng tôi gửi những gì chúng tôi muốn ghi trong MicroSD. Nếu bạn muốn sử dụng hai mô-đun SPI khác nhau, bạn chỉ cần phân biệt chân này để sử dụng cả hai. Ví dụ, màn hình LCD VÀ một MicroSd giống như màn hình chúng tôi đang sử dụng. Nó cũng sẽ hoạt động bằng cách sử dụng hai màn hình LCD khác nhau được kết nối với các CS khác nhau.

Hàn các phần này lại với nhau trong bảng và bạn đã sẵn sàng tải lên bản phác thảo!

Như bạn có thể thấy trong bản phác thảo, tôi hàn một số đầu nối cái dupont thay vì thành phần trực tiếp, đó là bởi vì trong tương lai tôi có thể muốn sử dụng lại thành phần hoặc thay đổi một cái.

Tôi cũng đã hàn mô-đun GPS với các đầu nối không đúng hướng, đó là lỗi của tôi và tôi không muốn, nhưng nó hoạt động và tôi không muốn mạo hiểm làm hỏng nó khi cố gắng làm hỏng những tên khốn đó! Chỉ cần hàn đúng cách và tất cả sẽ ổn!

Đây là một số video hữu ích về hàn: Hướng dẫn hàn cho người mới bắt đầu

Kênh Youtube Adafruit, rất nhiều thứ thú vị ở đó!

Khi bạn hàn, hãy cố gắng chỉ sử dụng lượng kim loại bạn cần, nếu không bạn sẽ làm một mớ hỗn độn. Đừng ngại làm điều đó, có thể bắt đầu với một thứ gì đó không quá đắt, và hơn là hàn những thứ khác nhau. Vật liệu phù hợp cũng tạo ra sự khác biệt!

Bước 2: Phác thảo

Tất nhiên, trước tiên, chúng tôi nhập thư viện và xây dựng các đối tượng của chúng để làm việc với: SPI.h là để giao tiếp với các mô-đun SPI, SD là thư viện MicroSD và Adafruit_GPS là thư viện của mô-đun GPS. SoftwareSerial.h là để tạo một cổng nối tiếp thông qua phần mềm. Cú pháp là "mySerial (TxPin, RxPin);". Đối tượng GPS cần phải được trỏ đến một chuỗi (trong ngoặc). Đây là liên kết của thư viện cho đột phá GPS Adafruit, đột phá MicroSD (để thực hiện công việc rõ ràng, bạn cũng nên định dạng SD bằng phần mềm này từ liên kết SD) và Thư viện phần mềm Serial (nó phải được bao gồm trong IDE).

LƯU Ý: Tôi gặp phải một số vấn đề khi cố gắng nối nhiều thông tin trong một tệp hoặc sử dụng nhiều hơn hai tệp trong bản phác thảo. Tôi đã không định dạng SD bằng phần mềm đó, có thể điều đó có thể giải quyết được vấn đề. Ngoài ra, tôi đã thử thêm một cảm biến khác vào thiết bị, BMP280 (mô-đun I2C), nhưng không thành công. Có vẻ như việc sử dụng mô-đun I2C làm cho bản phác thảo trở nên điên rồ! Tôi đã hỏi về nó trong diễn đàn Adafruit, nhưng tôi vẫn không có câu trả lời.

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

Bây giờ chúng ta cần tất cả các biến của chúng ta: Hai chuỗi là để đọc hai câu mà chúng ta cần tính toán một loạt thông tin hữu ích từ GPS. Char là để lưu trữ các câu trước khi phân tích cú pháp chúng, float để tính toán tọa độ theo độ (GPS gửi tọa độ sử dụng theo độ và phút, chúng tôi cần chúng theo độ để cho phép đọc trong google earth). ChipSelect là chân cắm CS của thẻ MicroSD. Trong trường hợp này là D4, nhưng nếu bạn đang sử dụng tấm chắn SD, bạn sẽ phải đặt D10 ở đây. Biến tệp là người sẽ lưu trữ thông tin của tệp chúng ta đang sử dụng trong quá trình phác thảo.

Chuỗi NMEA1;

Chuỗi NMEA2; ký tự c; độ nổi; phao degWhole; float degDec; int chipSelect = 4; Tệp mySensorData;

Bây giờ chúng tôi đang khai báo một vài hàm fo để làm cho bản phác thảo thanh lịch hơn và ít lộn xộn hơn:

Về cơ bản họ đang làm giống nhau: đọc các câu NMEA. clearGPS () đang bỏ qua ba câu và readGPS () đang lưu hai câu trong số đó trong các biến.

Hãy xem cách thực hiện: Một vòng lặp while đang kiểm soát nếu có các câu NMEA mới trên mô-đun và đọc luồng GPS cho đến khi có một câu. Khi một câu mới ở đó, chúng ta sẽ thoát khỏi vòng lặp while, nơi câu thực sự được đọc, phân tích cú pháp và lưu trữ trong các biến NMEA đầu tiên. Chúng tôi ngay lập tức làm điều tương tự cho cái tiếp theo, vì GPS liên tục phát trực tuyến, nó không đợi chúng tôi sẵn sàng, chúng tôi không có thời gian để in nó ngay lập tức

Cái này rất quan trọng! Đừng làm bất cứ điều gì trước khi bạn lưu trữ cả hai câu, nếu không câu thứ hai cuối cùng sẽ bị hỏng hoặc chỉ sai.

Sau khi chúng tôi có hai câu, chúng tôi in chúng trong bộ nối tiếp để kiểm soát điều đó đang diễn ra tốt đẹp.

void readGPS () {

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

Chà, bây giờ chúng ta đã hoàn tất, chúng ta có thể hoàn thành quá trình thiết lập ():

Đầu tiên: chúng tôi mở giao tiếp trên Serial 115200 cho Arduino PC và trên 9600 cho Arduino mô-đun GPS. Thứ hai: chúng tôi gửi ba lệnh đến mô-đun GPS: lệnh đầu tiên là tắt cập nhật ăng-ten, lệnh thứ hai là chỉ yêu cầu chuỗi RMC và GGA (chúng tôi sẽ chỉ sử dụng những lệnh này, có tất cả thông tin bạn cần. GPS), lệnh thứ ba và cuối cùng là đặt tốc độ cập nhật thành 1HZ, do Adafruit đề xuất.

Sau đó, chúng tôi đặt chân D10 thành OUTPUT, nếu và chỉ khi, chân CS của model SD của bạn khác với D10. Ngay sau đó, hãy đặt CS trên mô-đun SD trên chân chip Chọn.

Chúng tôi chạy các hàm readGPS () bao gồm cleanGPS ().

Bây giờ là lúc để viết một cái gì đó vào các tệp! Nếu tệp đã có trong thẻ Sd, hãy gắn dấu thời gian lên chúng. Bằng cách này, chúng tôi không phải theo dõi các phiên hoặc xóa tệp mọi lúc. Với dấu thời gian được viết trong chức năng thiết lập, chúng tôi chắc chắn chỉ thêm phân tách trong các tệp chỉ một lần mỗi phiên.

LƯU Ý: Thư viện SD khá nghiêm túc về việc mở và đóng tệp mọi lúc! Hãy ghi nhớ và đóng nó mọi lúc! Để tìm hiểu về thư viện, hãy làm theo liên kết này.

Ok, chúng tôi thực sự đã sẵn sàng để lấy cốt lõi của phần stream-và-log của bản phác thảo.

void setup () {

Serial.begin (115200); GPS.begin (9600); // Gửi lệnh đến mô-đun GPS GPS.sendCommand ("$ PGCMD, 33, 0 * 6D"); GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA); GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ); chậm trễ (1000); // chỉ khi chân CS của mô-đun SD của bạn không có trên chân D10

pinMode (10, OUTPUT);

SD.begin (chipSelect); readGPS (); 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.month); mySensorData.print ("."); mySensorData.print (GPS.year); mySensorData.print ("-"); mySensorData.print (GPS.hour); mySensorData.print (":"); mySensorData.print (GPS.minute); mySensorData.print (":"); mySensorData.print (GPS.seconds); 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.month); mySensorData.print ("."); mySensorData.print (GPS.year); mySensorData.print ("-"); mySensorData.print (GPS.hour); mySensorData.print (":"); mySensorData.print (GPS.minute); mySensorData.print (":"); mySensorData.print (GPS.seconds); mySensorData.println ("***"); mySensorData.close (); }}

Bây giờ chúng ta đang lấy cốt lõi của bản phác thảo.

Nó thực sự rất đơn giản.

Chúng ta sẽ đọc luồng GPS bằng hàm readGPS (), hơn chúng ta kiểm soát nếu chúng ta có giá trị bằng 1, t hat có nghĩa là chúng ta được kết nối với một vệ tinh e. Nếu chúng tôi có nó, chúng tôi sẽ viết thông tin của chúng tôi vào các tệp. Trong tệp đầu tiên "NMEA.txt", chúng tôi chỉ viết các câu thô. Trong tệp thứ hai, "GPDData.txt", chúng tôi thêm các tọa độ (được chuyển đổi với các chức năng chúng tôi đã thấy trước đây) và độ cao. Những thông tin đó đủ để biên dịch tệp.kml để tạo đường dẫn trên Google Earth. Lưu ý rằng chúng tôi đóng các tệp mỗi khi chúng tôi mở nó để viết một cái gì đó!

void loop () {

readGPS (); // Condizione if che Controllla se l'antenna ha segnale. Se si, thủ tục con la scrittura dei dati. if (GPS.fix == 1) {// Chỉ lưu dữ liệu nếu chúng ta có bản sửa lỗi mySensorData = SD.open ("NMEA.txt", FILE_WRITE); // Tệp Apre il per le frasi NMEA grezze mySensorData.println (NMEA1); // Scrive prima NMEA sul file mySensorData.println (NMEA2); // Scrive seconda NMEA sul file mySensorData.close (); // Tập tin Chiude !!

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

// Converte e scrive la longitudine allowLong (); mySensorData.print (deg, 4); // Scrive le toạ độ trong tập tin gradi sul mySensorData.print (","); // Scrive una virgola per partition i dati Serial.print (deg); Serial.print (","); // Converte e scrive la latitudine concLati (); mySensorData.print (deg, 4); // Scrive le toạ độ trong tập tin gradi sul mySensorData.print (","); // Scrive una virgola per partition i dati Serial.print (deg); Serial.print (","); // Scrive l'altitudine mySensorData.print (GPS.altitude); mySensorData.print (""); Serial.println (GPS.altitude); mySensorData.close (); }}

Bây giờ chúng ta đã hoàn tất, bạn có thể tải lên bản phác thảo, xây dựng thiết bị và tận hưởng nó!

Lưu ý rằng bạn cần sử dụng nó với borad GPS hướng lên bầu trời để sửa lỗi = 1 hoặc bạn có thể cắm ăng-ten bên ngoài cho nó.

Ngoài ra, hãy nhớ rằng nếu có sự cố, đèn đỏ sẽ nhấp nháy sau mỗi 15 giây, nếu không, đèn sẽ nhấp nháy nhanh hơn nhiều (cứ 2-3 giây một lần).

Nếu bạn muốn tìm hiểu thêm về các câu NMEA, chỉ cần làm theo bước tiếp theo của hướng dẫn này.

Bước 3: Câu NMEA và tệp.kml

Thiết bị và bản phác thảo đã hoàn thành, chúng đang hoạt động tốt. Hãy nhớ rằng để sửa chữa (để có kết nối với vệ tinh), đột phá phải hướng lên bầu trời.

Đèn đỏ nhỏ nhấp nháy 15 giây một lần khi bạn nhận được bản sửa lỗi

Nếu bạn muốn hiểu rõ hơn các câu NMEA, bạn có thể đọc thêm.

Trong bản phác thảo, chúng tôi chỉ sử dụng hai câu, GGA và RMC. Chúng chỉ là một vài câu mà mô-đun GPS đang phát trực tuyến.

Hãy xem những gì trong chuỗi đó:

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

RMC = Câu tối thiểu được đề xuất C 123519 = Khắc phục được thực hiện lúc 12:35:19 UTC A = Trạng thái A = hoạt động hoặc V = Void 4807.038, N = Vĩ độ 48 độ 07.038 'N 01131.000, E = Kinh độ 11 độ 31.000' E 022.4 = Tốc độ trên mặt đất tính bằng hải lý 084,4 = Góc theo dõi tính bằng độ Đúng 230394 = Ngày - 23 tháng 3 năm 1994 003,1, W = Biến thiên từ tính * 6A = Dữ liệu tổng kiểm tra, luôn bắt đầu bằng *

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

Dữ liệu sửa chữa hệ thống định vị toàn cầu GGA 123519 Bản sửa lỗi được thực hiện lúc 12:35:19 UTC 4807.038, N Vĩ độ 48 độ 07.038 'N 01131.000, E Kinh độ 11 độ 31.000' E 1 Sửa chữa chất lượng: 0 = không hợp lệ; 1 = sửa chữa GPS (SPS); 2 = sửa chữa DGPS; 3 = PPS sửa chữa; 4 = Động học thời gian thực; 5 = Phao RTK; 6 = ước tính (tính toán chết) (tính năng 2,3); 7 = Chế độ nhập bằng tay; 8 = Chế độ mô phỏng; 08 Số lượng vệ tinh đang được theo dõi 0,9 Độ pha loãng theo phương ngang của vị trí 545,4, Độ cao M, Mét, trên mực nước biển trung bình 46,9, M Chiều cao của geoid (mực nước biển trung bình) trên WGS84 ellipsoid (trường trống) thời gian tính bằng giây kể từ lần cập nhật DGPS cuối cùng (trường trống) Số ID trạm DGPS * 47 dữ liệu tổng kiểm tra, luôn bắt đầu bằng *

Như bạn có thể thấy, có nhiều thông tin hơn những gì bạn cần ở đó. Sử dụng thư viện của Adafruit, bạn có thể gọi một số trong số chúng, như GPS.latitude hoặc GPS.lat (bán cầu vĩ độ và vĩ độ) hoặc GPS.day/month/year/hour/minute/seconds/milliseconds … Hãy xem Adafruit trang web để biết thêm điều gì đó. Không rõ ràng lắm, nhưng làm theo một số gợi ý trong hướng dẫn của mô-đun GPS, bạn có thể tìm thấy thứ mình cần.

Chúng ta có thể làm gì với các tệp chúng ta có? Dễ dàng: biên dịch tệp kml để hiển thị đường dẫn trên Google Earth. Để làm điều đó, chỉ cần sao chép / dán mã bạn sẽ tìm thấy theo liên kết này (dưới Đường dẫn đoạn), đặt tọa độ của bạn từ tệp GPDData.txt giữa các thẻ, lưu tệp với phần mở rộng.kml và tải nó vào Ứng dụng bản đồ Google Earth.

LƯU Ý: Ngôn ngữ đánh dấu.kml rất đơn giản, nếu bạn đã biết ngôn ngữ đánh dấu là gì, hãy dành thời gian đọc liên kết trước và tài liệu bên trong, nó thực sự rất thú vị!

Sử dụng kml là biết tất cả các thẻ và đối số của nó. Tôi chỉ tìm thấy hướng dẫn từ Google, hướng dẫn mà tôi đã liên kết trước đó và phần thiết yếu là xác định kiểu giữa các thẻ và gọi nó bằng dấu # khi đến lúc viết tọa độ.

Tệp tôi đã thêm trong phần này là.kml, trong đó bạn có thể chỉ cần dán tọa độ của mình. hãy ghi nhớ để dán với cú pháp này: kinh độ, vĩ độ, độ cao

Đề xuất: