บทความนี้เราจะลองมาใช้งาน 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 จะเป็นดังนี้
จะเห็นได้ว่า NMEA sentenses ตัวอย่าง ทั้ง 6 ประโยค ถูกดีโค๊ดออกมาได้อย่างถูกต้อง มีทั้ง Latitude, Longitude, วันเดือนปี, เวลา ถ้าได้ผลอย่างนี้ก็แสดงว่าเราติดตั้งไลบรารี่ TinyGPS ได้ถูกต้องและพร้อมใช้แล้ว ดังนั้นหากเราสามารถเชื่อมต่อ GPS Shield กับ Arduino UNO และผ่านข้อมูล NMEA ไปให้ไลบรารี่ TinyGPS ได้ เราก็จะสามารถดึงข้อมูลไม่ว่าจะเป็นตำแหน่งพิกัด รวมทั้งข้อมูลที่สำคัญอื่นๆอีกหลายชนิด ออกมาใช้ได้ ซึ่งจะอธิบายต่อไปในโอกาสหน้า (GPS Shield ตอนที่ 2)
โดย Pink Panther
หน้านี้เป็นสารบัญของบทความที่ปรากฏในเว็บของ Arduitronics.com นะครับ จะขอแบ่งออกเป็นหัวข้อตามกลุ่มของสินค้าในร้านดังต่อไปนี้
หน้าที่เข้าชม | 15,400,008 ครั้ง |
ผู้ชมทั้งหมด | 5,903,086 ครั้ง |
เปิดร้าน | 21 พ.ค. 2556 |
ร้านค้าอัพเดท | 21 ก.ย. 2568 |