Iteadstudio GPS Shield
บทความนี้เราจะลองมาใช้งาน GPS Shield กับ บอร์ด Arduino UNO กัน แต่ก่อนจะเข้าเรื่องผมขออธิบายหลักการเบื้องต้นของ GPS ซะหน่อยนะครับ GPS (Global Positioning System) เป็นระบบบอกพิกัดบนโลกที่อาศัยตำแหน่งของดาวเทียม GPS เป็นพิกัดอ้างอิง โดยเครื่องรับ GPSสามารถคำนวณตำแหน่งบนพื้นโลกได้จากการวัดระยะทางระหว่างเครื่องรับและดาวเทียม GPS ซึ่งต้องมีอย่างน้อย 4 ดวง (ดูภาพที่ 1) เพื่อที่จะสามารถนำเอาความสัมพันธ์ไปสร้างเป็นสมการ 4 สมการซึ่งจำเป็นสำหรับการคำนวณหาตัวแปล 4 ตัว (Xr, Yr, Zr และ cdt)
ภาพที่ 1: ระยะทางระหว่างดาวเทียม 4 ดวงและเครื่องรับสัญญาณ GPS
โดยการประมวลสัญญาณและการคำนวณทั้งหมดจะเกิดขึ้นใน GPS module (GPS antenna + GPS shield) ซึ่งสุดท้ายแล้วข้อมูลสำคัญต่างๆที่คำนวณได้ไม่ว่าจะเป็น Latitude, Longitude เวลา จำนวนดาวเทียมที่เครื่องรับมองเห็น และอื่นๆ จะถูกจับรวมกันให้อยู่ใน Format มาตรฐานที่เรียกว่า NMEA (ดูตัวอย่างในภาพที่ 2) ซึ่งมีด้วยกันอยู่หลายรูปแบบ โดยรายละเอียดของ NMEA สามารถดูได้ที่
http://www.gpsinformation.org/dale/nmea.htm
การที่จะดึงข้อมูล (Parsing) แต่ละค่าที่อยู่ในประโยค NMEA ออกมาใช้งานได้นั้น เราจำเป็นต้องมีโปรแกรมหรือฟังชั่นช่วยจัดการ
ภาพที่ 2: ตัวอย่างประโยค NMEA และความหมายของข้อมูลแต่ละส่วนในประโยค
ในตอนที่ 1 ของบทความนี้จะอธิบายไลบรารี่ที่ชื่อว่า TinyGPS (ดาวน์โหลด) ที่ถูกพัฒนาขึ้นเพื่อใช้ในการจัดการข้อมูลในประโยค NMEA และจะทำการทดสอบไลบรารี่นี้ โดยที่ยังไม่จำเป็นต้องต่อบอร์ด Arduino เข้ากับ GPS Shield ส่วนในตอนที่ 2 ของบทความจะอธิบายการใช้งานTinyGPS ร่วมกับGPS Shield ซึ่งจะนำเสนอในครั้งถัดไป
หลังจากดาวน์โหลดไลบรารี่ TinyGPSPlus มาแล้วให้ติดตั้งตามที่เคยอธิบายไว้ในบทความเรื่อง "การติดตั้ง Library บน Arduino IDE" หลังจากติดตั้งไลบรารี่ TinyGPSPlus เรียบร้อยแล้วจะสามารถลองเล่นกับตัวอย่าง Sketch ที่มาพร้อมกับไลบรารี่นี้ได้ ซึ่งในเวอร์ชั่นล่าสุด (v9.3) จะมีตัวอย่างให้มาทั้งหมด 7 ตัวอย่าง แต่ในบทความตอนที่ 1 นี้ เราจะทดสอบตัวอย่างที่ชื่อว่า BasicExample ซึ่งจะเอาไว้ check ว่า TinyGPSPlus ทำงานได้ปกติหรือเปล่า
โปรแกรมที่ 1: BasicExample.ino
#include <TinyGPS++.h>
/*
This sample sketch should be the first you try out when you are testing a TinyGPS++
(TinyGPSPlus) installation. In normal use, you feed TinyGPS++ objects characters from
a serial NMEA GPS device, but this example uses static strings for simplicity.
*/
// A sample NMEA stream.
const char *gpsStream =
"$GPRMC,045103.000,A,3014.1984,N,09749.2872,W,0.67,161.46,030913,,,A*7C\r\n"
"$GPGGA,045104.000,3014.1985,N,09749.2873,W,1,09,1.2,211.6,M,-22.5,M,,0000*62\r\n"
"$GPRMC,045200.000,A,3014.3820,N,09748.9514,W,36.88,65.02,030913,,,A*77\r\n"
"$GPGGA,045201.000,3014.3864,N,09748.9411,W,1,10,1.2,200.8,M,-22.5,M,,0000*6C\r\n"
"$GPRMC,045251.000,A,3014.4275,N,09749.0626,W,0.51,217.94,030913,,,A*7D\r\n"
"$GPGGA,045252.000,3014.4273,N,09749.0628,W,1,09,1.3,206.9,M,-22.5,M,,0000*6F\r\n";
// The TinyGPS++ object
TinyGPSPlus gps;
void setup()
{
Serial.begin(115200);
Serial.println(F("BasicExample.ino"));
Serial.println(F("Basic demonstration of TinyGPS++ (no device needed)"));
Serial.print(F("Testing TinyGPS++ library v. ")); Serial.println(TinyGPSPlus::libraryVersion());
Serial.println(F("by Mikal Hart"));
Serial.println();
while (*gpsStream)
if (gps.encode(*gpsStream++))
displayInfo();
Serial.println();
Serial.println(F("Done."));
}
void loop()
{
}
void displayInfo()
{
Serial.print(F("Location: "));
if (gps.location.isValid())
{
Serial.print(gps.location.lat(), 6);
Serial.print(F(","));
Serial.print(gps.location.lng(), 6);
}
else
{
Serial.print(F("INVALID"));
}
Serial.print(F(" Date/Time: "));
if (gps.date.isValid())
{
Serial.print(gps.date.month());
Serial.print(F("/"));
Serial.print(gps.date.day());
Serial.print(F("/"));
Serial.print(gps.date.year());
}
else
{
Serial.print(F("INVALID"));
}
Serial.print(F(" "));
if (gps.time.isValid())
{
if (gps.time.hour() < 10) Serial.print(F("0"));
Serial.print(gps.time.hour());
Serial.print(F(":"));
if (gps.time.minute() < 10) Serial.print(F("0"));
Serial.print(gps.time.minute());
Serial.print(F(":"));
if (gps.time.second() < 10) Serial.print(F("0"));
Serial.print(gps.time.second());
Serial.print(F("."));
if (gps.time.centisecond() < 10) Serial.print(F("0"));
Serial.print(gps.time.centisecond());
}
else
{
Serial.print(F("INVALID"));
}
Serial.println();
}
ซึ่งผลของการ รัน โปรแกรมที่ 1 ที่ถูกแสดงบน serial monitor จะเป็นดังนี้
นาย สุธรรม แสงทรง
อ้างอิง
https://www.arduitronics.com/article/40/iteadstudio-gps-shield-part-1