Tự học Arduino Phần 13: Dùng Arduino để định vị GPS

No Comments

Tự học Arduino Phần 13: Dùng Arduino để định vị GPS

Phần này gồm dự án 44, 45 và 46

Trong chương này bạn sẽ:

  • Biết cách để kết nối với một GPS shield
  • Tạo hiển thị hệ tọa độ GPS đơn giản
  • Hiện thị vị trí thực của hệ tọa độ GPS trên bản đồ
  • Dựng một đồng hồ chính xác
  • Ghi lại vị trí của một đối tượng chuyển động theo thời gian

Bạn sẽ học cách sử dụng một GPS sheild không đắt lắm để xác định vị trí, tạo một đồng hồ chính xác, và cũng làm một thiết bị ghi chép để ghi lại vị trí theo thời gian vào thẻ microSD, sau đó có thể vẽ lên bản đồ để hiển thị lịch sử di chuyển.

GPS là gì?

GPS là viết tắt của Global Positioning System có nghĩa là hệ thống định vị toàn cầu dựa trên dữ liệu gửi từ các vệ tinh quay quanh Trái đất để thiết bị nhận GPS trên mặt đất có thể sử dụng những dữ liệu đó để xác định vị trí và thời gian hiện tại ở bất kì đâu trên Trái Đất. Bạn có thể đã quen với các thiết bị định vị GPS đã sử dụng trên xe hơi hoặc trên điện thoại của bạn.

Mặc dù chúng ta không thể tạo ra hệ thống bản đồ định vị chi tiết với Arduino, chúng ta có thể sử dụng một mô đun GPS để xác định vị trí, và tốc độ gần đúng của bạn (nếu bạn đang di chuyển). Chúng ta sẽ làm điều này bằng cách sử dụng mô đun nhận GPS EM406 như trong hình 13-1.

Hình 13-1: Máy thu EM406 GPS

Để sử dụng máy thu này, bạn sẽ cần bộ kit GPS sheild từ SparkFun (RTL-1-709) như trong hình 13-2. Chi tiết này bao gồm máy thu, khớp với Arduino sheild và cáp kết nối.

Hình 13-2: Bộ GPS sheild hoàn chỉnh

Bạn cũng nên mua một dây cáp dài hơn như hình 13-3, để việc đặt máy thu đơn giản hơn.

Hình 13-3: Một dây cáp dài nối máy thu GPS tới sheild

Kiểm tra GPS sheild

Sau khi mua bộ kit GPS, bạn nên đảm bảo rằng nó đang hoạt động và bạn có thể nhận tín hiệu GPS. Máy thu GPS yêu cầu một đường ngắm lên trời, nhưng tín hiệu của chúng có thể thông qua cửa sổ. Tốt nhất là thực hiện thí nghiệm này ở ngoài trời, nhưng nó có thể hoạt động tốt thông qua một cửa sổ hoặc cửa trần không bị cản trở. Để kiểm tra việc tiếp nhận, bạn sẽ thiết lập mạch và chạy một sketch đơn giản hiển thị dữ liệu thô nhận được.

Để tiến hành thử nghiệm, đầu tiên bạn kết nối máy thu GPS thông qua cáp tới sheild, và sau đó đính bộ này lên Arduino của bạn. Chú ý bật công tắc nhỏ trên GPS sheild, như trong hình 13-4.

Hình 13-4: chuyển mạch dữ liệu GPS sheild

Khi đến lúc nạp và chạy các sketch trên sheild GPS của bạn, di chuyển công tắc sang vị trí DLINE, và sau đó chuyển nó lại UART và đản bảo bật công tắc nguồn cho máy thu.

Nhập và nạp sketch trong Listing 13-1.

 

// Listing 13-1

void setup()

{

(1) Serial.begin(4800);

}

void loop()

{

byte a

(2) if ( Serial.available() > 0 )

{

a = Serial.read(); // get the byte of data from the GPS

(3) Serial.write(a);

}

}

Listing 13-1: Basic test sketch

Sketch này nghe cổng nối serial tại (2), và khi một byte dữ iệu được nhận từ mô đun GPS, nó sẽ gửi tới Serial Monitor tại (3). (Chú ý chúng ta bắt đầu Serial tại 4,800 bps tại (1) để tương thích với tốc độ dữ liệu của máy thu GPS).

Một khi bạn đã nạp sketch, di chuyển chuyển mạch dữ liệu trở lại UART. Bây giờ kiểm tra LED bật trên máy thu GPS, báo cho chúng ta biết trạng thái của nó.

Nếu LED nhạt, GPS đang cố gắng khóa các tín hiệu vệ tinh. Sao khoảng 30 giây LED bắt đầu nháy, chỉ rằng nó đang nhận dữ liệu từ vệ tinh. Sau khi LED bắt đầu nháy, mở cửa sổ Serial Monitor trên IDE và đặt tốc độ dữ liệu là 4,800 baud. Bạn sẽ thấy một dòng số của dữ liệu giống nhau trên màn hình như trong hình 13-5.

Hình 13-5: Dữ liệu thô từ các vệ tinh GPS

Dữ liệu được gửi từ máy thu GPS tới Arduino từng kí tự, và sao đó nó sẽ gửi lên Serial Monitor. Nhưng các dữ liệu này không thực sự hữu ích, do đó chúng ta cần sử dụng một thư viện để xuất các thông tin từ dữ liệu thô này và chuyển nó thành dạng có thể sử dụng. Để làm điều này, tải về và cài đặt thư viện TinyGPS từ http://www.arduiniana.org/libraries/tinygps/ bằng cách sử dụng phương pháp đã được mô tat trong “Mở rộng các sketch với các thư viện (Expanding Sketches with Libraries)” ở phần trước.

Tự học Arduino_Dự án 44: Tạo một máy thu GPS đơn giản

Bây giờ hãy tạo một máy thu GPS đơn giản. Nhưng đầu tiên, vì bạn sẽ thường sử dụng GPS ngoài trời – và để làm các thứ đơn giản hơn – chúng ta sẽ thêm một mô đun LCD để hiển thị dữ liệu, thông thường sử dụng một mô đun như trong hình 13-6.

Hình 13-6: Freetronics LCD & Keypad

NOTE Các ví dụ của chúng ta dựa trên việc sử dụng Freetronics LCD & Keypad sheil. Để có thêm thông tin về sheild này, xem ở http://www.freetronics.com/collections/

display/products/lcd.keypad.shield/. Nếu bạn chọn sử dụng một mô đun hiển thị khác, hãy đảm bảo thay thế chính xác các giá trị hàm LiquidCrystal trong sketch của bạn

Để hiển thị hệ tọa độ vị trí hiện tại nhận được bằng GPS trên LCD, chúng ta sẽ tạo mộ GPS xách tay rất cơ bản có thể được cấp nguồn bằng một pin 9V và các kết nối.

Phần cứng

Phần cứng yêu cầu tối thiểu như sau:

  • Arduino và cáp USB
  • Mô đun LCD hoặc Fretronisc LCD sheild (được nhắc đến ở trên)
  • Một pin 9V để ổ cắp cáp
  • Một kit GPS sheild

Sketch

Nhập và nạp sketch sau:

 

// Project 44 – Creating a Simple GPS Receiver

(1) #include <TinyGPS.h>

#include <LiquidCrystal.h>

LiquidCrystal lcd( 8, 9, 4, 5, 6, 7 );

// Create an instance of the TinyGPS object

TinyGPS gps;

Figure 13-6: The Freetronics

LCD & Keypad shield

262 Chapter 13

(2) void getgps(TinyGPS &gps);

void setup()

{

Serial.begin(4800);

lcd.begin(16, 2);

}

void getgps(TinyGPS &gps)

// The getgps function will display the required data on the LCD

{

float latitude, longitude;

//decode and display position data

(3) gps.f_get_position(&latitude, &longitude);

lcd.setCursor(0,0);

lcd.print(“Lat:”);

lcd.print(latitude,5);

lcd.print(” “);

lcd.setCursor(0,1);

lcd.print(“Long:”);

lcd.print(longitude,5);

lcd.print(” “);

delay(3000); // wait for 3 seconds

lcd.clear();

}

void loop()

{

byte a;

if ( Serial.available() > 0 ) // if there is data coming into the serial line

{

a = Serial.read(); // get the byte of data

if(gps.encode(a)) // if there is valid GPS data…

{

(4) getgps(gps); // grab the data and display it on the LCD

}

}

}

Từ (1) tới (2), sketch giới thiệu các thư viện được yêu cầu cho LCD và GPS. Trong void loop tại (4), chúng ta gửi các kí tự nhận được từ máy thu GPS tới hàm getgps() tại (3), nơi sử dụng gps.f_get_position() để chèn các giá trị vị trí trong các biến byte &latitude và &longitude (cái mà chúng ta hiển thị lên LCD).

 

Hiển thị vị trí lên LCD

Sau khi sketch đã được nạp và GPS bắt đầu nhận dữ liệu, vị trí hiện tại của bạn trong vĩ độ và kinh độ nên được hiển thị lên LCD, như hình 13-7.

Kinh độ và Vĩ độ hiển thị từ Project 44.

Nhưng đây là đâu trên Trái Đất? Chúng ta có thể xác định chính xác ở đâu bằng cách sử dụng Google Maps (http://maps.google.com/). Trên website, nhập vĩ độ và kinh độ, được phân tách bằng dấu phẩy và dấu cách, vào ô tìm kiếm, và Google Maps sẽ trả về vị trí. Ví dụ, sử dụng hệ tọa độ được trả về trong hình 13-7 sinh ra bản đồ giống như một bản đồ hiển thị trong hình 13-8.

Hình 13-8: Địa điểm của vị trí được hiển thị trong hình 13-7.

 

Tự học Arduino_Dự án 45: Tạo một Đồng hồ chính xác dựa trên GPS

Có nhiều thứ trên GPS hơn việc tìm vị trí; hệ thống cũng chuyển dữ liệu thời gian có thể được sử dụng làm một đồng hồ rất chính xác.

Phần cứng

Cho project này, chúng ta sẽ sử dụng phần cứng tương tự như project 44.

Sketch

Nhập sketch sau đây để dựng một đồng hồ GPS:

 

// Project 45 – Creating an Accurate GPS-based Clock

#include <TinyGPS.h>

#include <LiquidCrystal.h>

LiquidCrystal lcd( 8, 9, 4, 5, 6, 7 );

// Create an instance of the TinyGPS object

TinyGPS gps;

void getgps(TinyGPS &gps);

void setup()

{

Serial.begin(4800);

lcd.begin(16, 2);

}

void getgps(TinyGPS &gps)

{

int year,a,t;

byte month, day, hour, minute, second, hundredths;

  • crack_datetime(&year,&month,&day,&hour,&minute,&second,&hundredths);

(2) hour=hour+10; // correct for your time zone

if (hour>23)

{

hour=hour-24;

}

lcd.setCursor(0,0); // print the date and time

(3) lcd.print(“Current time: “);

lcd.setCursor(4,1);

if (hour<10)

{

lcd.print(“0”);

}

lcd.print(hour, DEC);

lcd.print(“:”);

if (minute<10)

{

lcd.print(“0”);

}

lcd.print(minute, DEC);

lcd.print(“:”);

if (second<10)

{

lcd.print(“0”);

}

lcd.print(second, DEC);

}

void loop()

{

byte a;

if ( Serial.available() > 0 ) // if there is data coming into the serial line

{

a = Serial.read(); // get the byte of data

if(gps.encode(a)) // if there is valid GPS data…

{

getgps(gps); // then grab the data and display it on the LCD

}

}

}

 

Ví dụ này làm việc trong một cách tương tự với Project 44, ngoại trừ thay cho việc xuất các dữ liệu vị trí, sketch xuất thời gian (luôn luôn tại GMT – Greenwich Mean Time, thường được gọi là UTC) tại (1). Tại (2), bạn có thể cộng hoặc trừ một số giờ để mang đồng hồ tới múi giờ hiện tại của bạn. Thời gian sau đó nên được định dạng rõ ràng và hiển thị lên LCD tại (3). Hình 13-9 thể hiện một ví dụ của đồng hồ.

Hình 13-9: Project 45

 

Tự học Arduino_Dự án 46: Ghi lại vị trí và đối tượng di chuyển theo thời gian

Bây giờ bạn biết cách để nhận hệ tọa độ GPS và chuyển chúng thành các biến bình thường, chúng ta có thể sử dụng thông tin này với thẻ microSD shield từ chương 8 để dựng một máy ghi GPS. Máy ghi của chúng ta sẽ ghi lại vị trí theo thời gian bằng cách ghi lại dữ liệu GPS theo thời gian. Ngoài ra mạch microSD sẽ cho phép bạn ghi lại chuyển động của xe hơi, xe tải, thuyền hoặc bất kì đối tượng chuyển động nào cho phép tiếp nhận tín hiệu GPS; sau đó, bạn có thể xem lại thông tin trên máy tính.

Phần cứng

Phần cứng yêu cầu tương tự như đã sử dụng cho các ví dụ trước, ngoài trừ bạn cần thay thể mạch LCD bằng mạch microSD ở chương 8, và bạn sẽ sử dụng nguồn ngoài. Trong ví dụ của chúng ta, chúng ta sẽ ghi thông tin thời gian, vị trí và ước tính tốc độ di chuyển.

Sketch

Sau khi lắp ghép phần cứng của bạn, nhập vào và nạp sketch sau:

 

// Project 46 – Recording the Position of a Moving Object over Time

#include <SD.h>

#include <TinyGPS.h>

// Create an instance of the TinyGPS object

TinyGPS gps;

void getgps(TinyGPS &gps);

void setup()

{

pinMode(10, OUTPUT);

Serial.begin(9600);

// check that the microSD card exists and can be used

if (!SD.begin(8)) {

Serial.println(“Card failed, or not present”);

// stop the sketch

return;

}

Serial.println(“microSD card is ready”);

}

void getgps(TinyGPS &gps)

{

float latitude, longitude;

int year;

byte month, day, hour, minute, second, hundredths;

//decode and display position data

gps.f_get_position(&latitude, &longitude);

File dataFile = SD.open(“DATA.TXT”, FILE_WRITE);

// if the file is ready, write to it

(1) if (dataFile)

{

(2) dataFile.print(“Lat: “);

dataFile.print(latitude,5);

dataFile.print(” “);

dataFile.print(“Long: “);

dataFile.print(longitude,5);

dataFile.print(” “);

// decode and display time data

gps.crack_datetime(&year,&month,&day,&hour,&minute,&second,&hundredths);

// correct for your time zone as in Project 45

hour=hour+11;

if (hour>23)

{

hour=hour-24;

}

Using GPS with Your Arduino 267

if (hour<10)

{

dataFile.print(“0”);

}

dataFile.print(hour, DEC);

dataFile.print(“:”);

if (minute<10)

{

dataFile.print(“0”);

}

dataFile.print(minute, DEC);

dataFile.print(“:”);

if (second<10)

{

dataFile.print(“0″);

}

dataFile.print(second, DEC);

dataFile.print(” “);

dataFile.print(gps.f_speed_kmph());

(3) dataFile.println(“km/h”);

dataFile.close();

(4) delay(30000); // record a measurement every 30 seconds

}

}

void loop()

{

byte a;

if ( Serial.available() > 0 ) // if there is data coming into the serial line

{

a = Serial.read(); // get the byte of data

if(gps.encode(a)) // if there is valid GPS data…

{

(5) getgps(gps); // then grab the data and display it on the LCD

}

}

}

 

Sketch này sử dụng code giống với đã dùng trong Project 44 và 45 trong void loop() để nhận dữ liệu tà máy thu GPS và chuyển nó tới các hàm khác. Tại (5), văn bản từ máy thu GPS được chuyển vào thư viện TiniGPS để giải mã dữ liệu thành các biến dùng được. Tại (1), thẻ microSD được kiểm tra để xác định có dữ liệu được ghi vào đó, và từ (2) tới (3), dữ liệu GPS thực tế được ghi thành file văn bản trong thẻ microSD. Vì file được đóng sau mỗi lần ghi, bạn có thể ngắt nguồn khỏi Arduino mà không làm hại đến sketch, và bạn nên làm vậy trước khi chèn hoặc lấy thẻ microSD. Cuối cùng, bạn có thể đặt khoảng giữa ghi dữ liệu tại (4) bằng việc thay đổi giá trị trong hàm delay().

 

Hiển thị vị trí trên bản đồ

Sau khi vận hành máy ghi GPS của bạn, file văn bản kết quả sẽ trông như hình 13-10.

Hình 13-10: Kết quả từ Project 46

Một khi bạn có dữ liệu này, bạn có thể nhập nó vào Google Maps bằng tay và xem đường đi do máy ghi GPS thực hiện được, điểm tới điểm. Nhưng một phương pháp thú vị hơn là hiển thị toàn bộ tuyến đường trên một bản đồ. Để làm điểu này, mở file văn bản như một bẳng tính, mỗi dữ liệu vị trí trên một hàng và thêm hàng tiêu đề, như trong hình 13-11. Sau đó lưu lại với file .csv.

Hình 13-11: Dữ liệu vị trí ghi được.

Bây giờ vào website GPS Visualizer (http://www.gpsvisualizer.com/). Trong hộp Get Started Now, click vào Choose File và chọn tới file dữ liệu của bạn. Chọn Google Maps làm định dạng đầu ra, sau đó click Go!. Sự di chuyển của máy ghi GPS của bạn sẽ được hiện lên bản đồ giống như một bản đồ trong hình 13-12, bạn có thể điều chỉnh và nghiên cứu.

Hình 13-12: Bản đồ dữ liệu máy ghi GPS

Nhìn về phía trước

Như bạn thấy, nhiều thứ bạn có thể đã nghĩ quá phức tạp, như làm việc với máy thu GPS, có thể được làm một cách tương đối đơn giản với Arduino của bạn. Tiếp tục với chủ đề đó, trong chương tiếp bạn sẽ học cách tạo các liên kết dữ liệu không dây của riêng bạn và điều khiển mọi thứ thông qua điều khiển từ xa.

 

Sản phẩm được quan tâm

Nhận bài viết mới

Các bài viết chia sẻ đến cộng đồng rất chât lượng, mang lại rất nhiều kiến thức mới. Đừng bỏ lỡ bất kỳ bài viết nào của chung tối, hãy đăng ký để nhận bài viết mới qua Mail của bạn

Đăng ký để không bỏ lỡ bài viết nào!

Fields marked with an * are required

Danh mục




More from our blog

See all posts
No Comments
 

Leave a Comment