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!
Bài mới
- Giáo trình Robocon
- Giới thiệu các loại board Esp8266 dành cho IoT và thiết lập cơ bản cho người mới học
- Hướng dẫn sử dụng LoraEasyV1
- Tài liệu tự học Python tiếng Việt cho người mới bắt đầu
- Tương lai của kết nối IoT (Internet of Things) tiềm năng và sự đa dạng
- HƯỚNG DẪN LẤP RÁP XE MÔ HÌNH 4 BÁNH
- HƯỚNG DẪN LẮP RÁP XE CHẠY BẰNG NĂNG LƯỢNG MẶT TRỜI
Danh mục