วันพฤหัสบดีที่ 16 กุมภาพันธ์ พ.ศ. 2560

Iteadstudio GPS Shield


บทความนี้เราจะลองมาใช้งาน GPS Shield กับ บอร์ด Arduino UNO กัน แต่ก่อนจะเข้าเรื่องผมขออธิบายหลักการเบื้องต้นของ GPS ซะหน่อยนะครับ GPS (Global Positioning System) เป็นระบบบอกพิกัดบนโลกที่อาศัยตำแหน่งของดาวเทียม GPS เป็นพิกัดอ้างอิง โดยเครื่องรับ GPSสามารถคำนวณตำแหน่งบนพื้นโลกได้จากการวัดระยะทางระหว่างเครื่องรับและดาวเทียม GPS ซึ่งต้องมีอย่างน้อย ดวง (ดูภาพที่ 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 และความหมายของข้อมูลแต่ละส่วนในประโยค
ในตอนที่ ของบทความนี้จะอธิบายไลบรารี่ที่ชื่อว่า TinyGPS (ดาวน์โหลดที่ถูกพัฒนาขึ้นเพื่อใช้ในการจัดการข้อมูลในประโยค NMEA และจะทำการทดสอบไลบรารี่นี้ โดยที่ยังไม่จำเป็นต้องต่อบอร์ด Arduino เข้ากับ GPS Shield ส่วนในตอนที่ ของบทความจะอธิบายการใช้งาน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

ไม่มีความคิดเห็น:

แสดงความคิดเห็น