Mục lục:

Tìm đường với GPS: 9 bước
Tìm đường với GPS: 9 bước

Video: Tìm đường với GPS: 9 bước

Video: Tìm đường với GPS: 9 bước
Video: Cách sử dụng Google Maps - Mới Nhất 2023 2024, Tháng bảy
Anonim
Tìm đường với GPS
Tìm đường với GPS

Một bài tập nhanh về hiểu và áp dụng dữ liệu GPS

  • Thời gian yêu cầu: 2 giờ
  • Chi phí: $ 75– $ 150

Đối với các nhà sản xuất, việc kết hợp dữ liệu không gian địa lý chất lượng cao vào các dự án điện tử đã trở nên khá rẻ. Và trong vài năm gần đây, các mô-đun thu GPS (Hệ thống Định vị Toàn cầu) đã phát triển đa dạng hơn, mạnh mẽ hơn và dễ dàng tích hợp với các bảng phát triển như Arduino, PIC, Teensy và Raspberry Pi. Nếu bạn đang nghĩ đến việc xây dựng xung quanh GPS, bạn đã chọn được thời điểm thích hợp để bắt đầu.

Bước 1: Cách thức hoạt động

Mô-đun GPS là một máy thu vô tuyến nhỏ có chức năng xử lý các tín hiệu được phát trên các tần số đã biết bởi một nhóm vệ tinh. Các vệ tinh này quay xung quanh Trái đất theo những quỹ đạo gần tròn, truyền dữ liệu về vị trí và đồng hồ cực kỳ chính xác xuống mặt đất bên dưới. Nếu bộ thu tín hiệu trên mặt đất có thể “nhìn thấy” đủ các vệ tinh này, nó có thể sử dụng chúng để tính toán vị trí và độ cao của chính nó.

Khi một tin nhắn GPS đến, đầu tiên người nhận sẽ kiểm tra dấu thời gian phát sóng của nó để xem thời điểm nó được gửi đi. Vì tốc độ của sóng vô tuyến trong không gian là một hằng số đã biết (c), máy thu có thể so sánh thời gian phát và nhận để xác định quãng đường mà tín hiệu đã truyền. Khi nó đã thiết lập khoảng cách với bốn hoặc nhiều vệ tinh đã biết, việc tính toán vị trí của chính nó là một bài toán khá đơn giản của phép tam giác 3D. Nhưng để thực hiện điều này một cách nhanh chóng và chính xác, bộ thu phải có khả năng xử lý số lượng từ lên đến 20 luồng dữ liệu cùng một lúc. - tốt hơn là hiển thị mọi lúc từ mọi điểm trên thế giới. Hiện có 32 vệ tinh GPS đang biểu diễn một vũ điệu được dàn dựng tỉ mỉ trong một đám mây thưa thớt ở độ cao 20.000 km.

Bước 2: Sự thật về người hâm mộ

GPS không thể hoạt động nếu không có thuyết tương đối của Einstein, vì phải bù cho 38 micro giây đồng hồ nguyên tử quay quanh quỹ đạo thu được mỗi ngày từ sự giãn nở thời gian trong trường hấp dẫn của Trái đất.

Bước 3: Bắt đầu

Bắt đầu
Bắt đầu

Bất kể dự án của bạn là gì, GPS rất dễ tích hợp. Hầu hết các mô-đun bộ thu giao tiếp với một giao thức nối tiếp đơn giản, vì vậy nếu bạn có thể tìm thấy một cổng nối tiếp dự phòng trên bảng điều khiển của mình, chỉ cần một số ít dây để tạo kết nối vật lý. Và ngay cả khi không, hầu hết các bộ điều khiển đều hỗ trợ chế độ nối tiếp “phần mềm” giả lập mà bạn có thể sử dụng để kết nối với các chân tùy ý.

Đối với người mới bắt đầu, mô-đun Adafruit’s Ultimate GPS Breakout là một lựa chọn tốt. Có rất nhiều sản phẩm cạnh tranh trên thị trường, nhưng Ultimate là một thiết bị biểu diễn chắc chắn với mức giá hợp lý, với các lỗ thông lớn dễ hàn hoặc kết nối với breadboard.

Đầu tiên, kết nối đất và nguồn. Theo thuật ngữ Arduino, điều này có nghĩa là kết nối một trong các chân GND của vi điều khiển với GND của mô-đun và chân + 5V với VIN của mô-đun. Để quản lý việc truyền dữ liệu, bạn cũng cần kết nối các chân TX và RX của mô-đun với Arduino. Tôi sẽ tùy ý chọn các chân Arduino 2 (TX) và 3 (RX) cho mục đích này, mặc dù các chân 0 và 1 được thiết kế đặc biệt để sử dụng làm “cổng nối tiếp phần cứng” hoặc UART. Bởi vì tôi không muốn lãng phí UART duy nhất mà các bộ xử lý AVR cấp thấp này có. Arduino’s UART được kết nối cố định với đầu nối USB tích hợp và tôi muốn kết nối nó với máy tính của mình để gỡ lỗi.

Bước 4: Một ngón chân trong dòng dữ liệu

Một ngón chân trong dòng dữ liệu
Một ngón chân trong dòng dữ liệu

Ngay khi bạn sử dụng nguồn điện, mô-đun GPS bắt đầu gửi các khối dữ liệu văn bản trên đường TX của nó. Nó có thể chưa nhìn thấy một vệ tinh duy nhất, ít có "bản sửa lỗi", nhưng vòi dữ liệu hoạt động ngay lập tức và thật thú vị khi xem những gì xuất hiện. Bản phác thảo đơn giản đầu tiên của chúng tôi (bên dưới) không làm gì khác ngoài hiển thị dữ liệu chưa xử lý này.

#include #define RXPin 2

#define TXPin 3 # xác định GPSBaud 4800

#define ConsoleBaud 115200

// Kết nối nối tiếp với thiết bị GPSSoftwareSerial ss (RXPin, TXPin);

void setup () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println ("Ví dụ GPS 1");

Serial.println ("Hiển thị dữ liệu NMEA thô được truyền bởi mô-đun GPS.");

Serial.println ("bởi Mikal Hart"); Serial.println ();

}

void loop ()

{if (ss.available ()> 0) // Khi mỗi ký tự đến…

Serial.write (ss.read ()); //… ghi nó vào bảng điều khiển

}

LƯU Ý: Bản phác thảo xác định chân nhận (RXPin) là 2, mặc dù chúng tôi đã nói trước đó rằng chân truyền (TX) sẽ được kết nối với chân 2. Đây là một nguồn nhầm lẫn phổ biến. RXPin là chân nhận (RX) theo quan điểm của Arduino. Đương nhiên, nó phải được kết nối với chân truyền (TX) của mô-đun và ngược lại.

Tải lên bản phác thảo này và mở Serial Monitor ở 115, 200 baud. Nếu mọi thứ đang hoạt động, bạn sẽ thấy một luồng dày đặc, vô tận các chuỗi văn bản được phân tách bằng dấu phẩy. Mỗi cái sẽ trông giống như hình thứ hai ở đầu đoạn văn.

Các chuỗi đặc biệt này được gọi là câu NMEA, được gọi như vậy vì định dạng được phát minh bởi Hiệp hội Điện tử Hàng hải Quốc gia. NMEA định nghĩa một số câu này cho dữ liệu điều hướng khác nhau, từ điều cần thiết (vị trí và thời gian), đến bí truyền (tỷ lệ tín hiệu vệ tinh trên nhiễu, phương sai từ tính, v.v.). Các nhà sản xuất không nhất quán về loại câu mà máy thu của họ sử dụng, nhưng GPRMC là điều cần thiết. Sau khi mô-đun của bạn được sửa chữa, bạn sẽ thấy một số lượng hợp lý các câu GPRMC này.

Bước 5: Tìm lại chính mình

Việc chuyển đổi đầu ra mô-đun thô thành thông tin mà chương trình của bạn có thể sử dụng thực sự không phải là chuyện nhỏ. May mắn thay, có một số thư viện tuyệt vời đã có sẵn để làm điều này cho bạn. Thư viện GPS Adafruit phổ biến của Limor Fried là một lựa chọn thuận tiện nếu bạn đang sử dụng Ultimate breakout của họ. Nó được viết để kích hoạt các tính năng duy nhất cho Ultimate (như ghi dữ liệu nội bộ) và thêm một số chuông và còi hấp dẫn của riêng nó. Tuy nhiên, thư viện phân tích cú pháp yêu thích của tôi - và tất nhiên ở đây tôi hoàn toàn không thiên vị - là thư viện tôi đã viết có tên là TinyGPS ++. Tôi đã thiết kế nó để toàn diện, mạnh mẽ, ngắn gọn và dễ sử dụng. Chúng ta hãy bắt đầu quay.

Bước 6: Mã hóa với TinyGPS ++

Theo quan điểm của lập trình viên, việc sử dụng TinyGPS ++ rất đơn giản:

1) Tạo một đối tượng gps.

2) Định tuyến từng ký tự đến từ mô-đun đến đối tượng bằng cách sử dụng gps.encode ().

3) Khi bạn cần biết vị trí hoặc độ cao hoặc thời gian hoặc ngày tháng, chỉ cần truy vấn đối tượng gps.

#include #include

#define RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// Kết nối nối tiếp với thiết bị GPSSoftwareSerial ss (RXPin, TXPin);

// Đối tượng TinyGPS ++

TinyGPSPlus gps;

void setup () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println ("Ví dụ GPS 2");

Serial.println ("Một trình theo dõi đơn giản sử dụng TinyGPS ++.");

Serial.println ("bởi Mikal Hart");

Serial.println ();

}

void loop () {

// Nếu có bất kỳ ký tự nào đến từ GPS, /

/ gửi chúng đến đối tượng TinyGPS ++

while (ss.available ()> 0)

gps.encode (ss.read ());

// Hãy hiển thị vị trí và độ cao mới

// bất cứ khi nào một trong số chúng được cập nhật

if (gps.location.isUpdated () || gps.altitude.isUpdated ())

{

Serial.print ("Vị trí:");

Serial.print (gps.location.lat (), 6);

Serial.print (",");

Serial.print (gps.location.lng (), 6);

Serial.print ("Cao độ:");

Serial.println (gps.altitude.meters ());

}

}

Ứng dụng thứ hai của chúng tôi liên tục hiển thị vị trí và độ cao của người nhận, sử dụng TinyGPS ++ để giúp phân tích cú pháp. Trong một thiết bị thực, bạn có thể ghi dữ liệu này vào thẻ SD hoặc hiển thị trên màn hình LCD. Lấy thư viện và phác thảo FindingYourself.ino (ở trên). Cài đặt thư viện, như thường lệ, trong thư mục thư viện Arduino. Tải bản phác thảo lên Arduino của bạn và mở Serial Monitor ở 115, 200 baud. Bạn sẽ thấy vị trí và độ cao của mình được cập nhật trong thời gian thực. Để xem chính xác vị trí của bạn, hãy dán một số vĩ độ / kinh độ kết quả vào Google Maps. Bây giờ hãy kết nối máy tính xách tay của bạn và đi dạo hoặc lái xe. (Nhưng hãy nhớ để mắt đến con đường của bạn!)

Bước 7: "KÍCH THƯỚC THỨ TƯ"

Mặc dù chúng tôi liên kết GPS với vị trí trong không gian, nhưng đừng quên những vệ tinh đó cũng đang truyền các dấu thời gian và dữ liệu. Đồng hồ GPS trung bình chính xác đến một phần mười triệu giây và giới hạn lý thuyết thậm chí còn cao hơn. Ngay cả khi bạn chỉ cần dự án của mình để theo dõi thời gian, mô-đun GPS vẫn có thể là giải pháp rẻ nhất và dễ dàng nhất.

Để biến FindingYourself.ino thành một chiếc đồng hồ siêu chính xác, chỉ cần thay đổi một vài dòng cuối cùng như sau:

if (gps.time.isUpdated ()) {

char buf [80];

sprintf (buf, "Thời gian là% 02d:% 02d:% 02d", gps.time.hour (), gps.time.minute (), gps.time.second ()); Serial.println (buf);

}

Bước 8: Tìm đường của bạn

Tìm đường của bạn
Tìm đường của bạn

Ứng dụng thứ ba và cũng là ứng dụng cuối cùng của chúng tôi là kết quả của một thử thách cá nhân để viết một bản phác thảo TinyGPS ++ có thể đọc được, trong ít hơn 100 dòng mã, sẽ hướng dẫn người dùng đến đích bằng cách sử dụng các hướng dẫn văn bản đơn giản như “giữ thẳng” hoặc “xoay trái”.

#include #include

#define RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// Kết nối nối tiếp với thiết bị GPSSoftwareSerial ss (RXPin, TXPin);

// Đối tượng TinyGPS ++ TinyGPSPlus gps;

unsigned long lastUpdateTime = 0;

# xác định EIFFEL_LAT 48.85823 # xác định EIFFEL_LNG 2.29438

/ * Ví dụ này cho thấy một khuôn khổ cơ bản về cách bạn có thể sử dụng khóa học và khoảng cách để hướng dẫn một người (hoặc một máy bay không người lái) đến đích. Điểm đến này là tháp Eiffel. Thay đổi nó theo yêu cầu

Cách dễ nhất để lấy tọa độ vĩ độ / kinh độ là nhấp chuột phải vào điểm đến trong Google Maps (maps.google.com) và chọn "Đây là gì?". Điều này đặt các giá trị chính xác trong hộp tìm kiếm

*/

void setup () {

Serial.begin (ConsoleBaud);

ss.begin (GPSBaud);

Serial.println ("Ví dụ GPS 3");

Serial.println ("Hệ thống Hướng dẫn Không quá toàn diện");

Serial.println ("bởi Mikal Hart");

Serial.println ();

}

void loop () {

// Nếu có bất kỳ ký tự nào đến từ GPS, // gửi chúng đến đối tượng TinyGPS ++ while (ss.available ()> 0) gps.encode (ss.read ());

// Cứ sau 5 giây, hãy cập nhật

if (millis () - lastUpdateTime> = 5000)

{

lastUpdateTime = millis ();

Serial.println ();

// Thiết lập trạng thái hiện tại của chúng tôi

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;

// gỡ lỗi Serial.print ("Gỡ lỗi: Course2Dest:");

Serial.print (courseToDestination);

Serial.print ("CurCourse:");

Serial.print (gps.course.deg ());

Serial.print ("Dir2Dest:");

Serial.print (directionToDestination);

Serial.print ("Truy cap:");

Serial.print (courseChangeNeeded);

Serial.print ("CurSpd:");

Serial.println (gps.speed.kmph ());

// Trong vòng 20 mét từ điểm đến? Đã từng ở đây

if (distanceToDestination <= 20.0)

{Serial.println ("XIN CHÚC MỪNG: Bạn đã đến nơi!");

thoát ra (1);

}

Serial.print ("DISTANCE:"); Serial.print (distanceToDestination);

Serial.println ("mét to go.");

Serial.print ("HƯỚNG DẪN:");

// Đứng yên? Chỉ cần chỉ ra hướng đi

if (gps.speed.kmph () <2.0)

{

Serial.print ("Đầu");

Serial.print (directionToDestination);

Serial.println (".");

trở lại;

}

if (courseChangeNeeded> = 345 || courseChangeNeeded <15) Serial.println ("Tiếp tục đi thẳng về phía trước!");

else if (courseChangeNeeded> = 315 && courseChangeNeeded <345)

Serial.println ("Chếch sang trái một chút.");

else if (courseChangeNeeded> = 15 && courseChangeNeeded <45)

Serial.println ("Chếch sang bên phải một chút.");

else if (courseChangeNeeded> = 255 && courseChangeNeeded <315)

Serial.println ("Quay sang trái.");

else if (courseChangeNeeded> = 45 && courseChangeNeeded <105)

Serial.println ("Xoay sang phải.");

khác

Serial.println ("Xoay quanh hoàn toàn.");

}

}

Cứ sau 5 giây, mã ghi lại vị trí và hướng đi của người dùng (hướng di chuyển) và tính toán hướng đi (hướng đến đích), sử dụng phương thức TinyGPS ++ courseTo (). So sánh hai vectơ tạo ra một gợi ý để tiếp tục đi thẳng hoặc rẽ, như được hiển thị bên dưới.

Sao chép bản phác thảo FindingYourWay.ino (ở trên) và dán nó vào Arduino IDE. Đặt điểm đến cách đó 1 km hoặc 2 km, tải bản phác thảo lên Arduino của bạn, chạy nó trên máy tính xách tay của bạn và xem liệu nó có hướng dẫn bạn đến đó không. Nhưng quan trọng hơn, hãy nghiên cứu mã và hiểu cách thức hoạt động của nó.

Bước 9: Tiến xa hơn

Tiềm năng sáng tạo của GPS là rất lớn. Một trong những điều hài lòng nhất mà tôi từng làm là một hộp xếp hình hỗ trợ GPS chỉ mở tại một vị trí được lập trình trước. Nếu nạn nhân của bạn muốn lấy kho báu bị khóa bên trong, cô ấy phải tìm ra vị trí bí mật đó ở đâu và mang chiếc hộp đến đó. Một ý tưởng phổ biến của dự án đầu tiên là một loại thiết bị ghi nhật ký ghi lại vị trí và độ cao từng phút từng phút của một người đi bộ đường dài trên Đường mòn Trans-Pennine. Hay một trong những thiết bị theo dõi từ tính lén lút mà các đặc vụ DEA trong Breaking Bad dính vào xe của kẻ xấu thì sao? Cả hai đều hoàn toàn khả thi và có lẽ sẽ rất thú vị khi xây dựng, nhưng tôi khuyến khích bạn suy nghĩ rộng hơn, ngoài những thứ bạn đã có thể mua trên Amazon. Đó là một thế giới rộng lớn ngoài kia. Đi lang thang xa và rộng nhất có thể.

Đề xuất: