การเขียนโปรแกรมต่อ GPS ด้วยคอมโพเน็นต์ OpenGPSX (ภาค 3)

ทำความเข้าใจเรื่อง Baud rate

  • Blog ที่ผมเขียนเรื่องนี้คงจะมีหลายภาค ตอนนี้ภาค 3 จะมาเริ่มโปรแกรมมิ่งกัน เพื่อนำคอมโพเน็นต์ OpenGPSX มาใช้งาน ก่อนจะไปต่อผมขอพูดเกร็ดเล็กเกร็ดน้อย เกี่ยวกับเรื่อง Baud rate กับ NMEA บางประโยคเช่น $GPGSV การต่อเครื่อง GPS เข้ากับเครื่องคอมพิวเตอร์ผ่านทาง serial port คงจะคุ้นๆเรื่อง Baud rate เดิมทีก่อนหน้านี้ใช้ Baud rate 4800 b/s ก็น่าจะพอ ตัวเลข 4800 หน่วยเป็น bit ถ้าแปลงเป็น byte (เท่ากับ 1 ตัวอักษร) ก็หารด้วย 8 จะได้ 600 ตัวอักษรต่อวินาที
  • สมมติว่าเครื่อง GPS ของเราส่งประโยคของ NMEA มาให้ดังนี้คือ $GPRMC, $GPGSA, $GPGGA, $GPGLL, $GPVTG เท่ากับ 5 ประโยค (ยกเว้นประโยค $GPGSV) จะมีขนาดค่อนข้างคงที่เฉลี่ยแล้วประมาณ 80 ตัวอักษรต่อประโยคซึ่งจะประมาณ 5 x 80 = 400 ตัวอักษร ที่นี้จะเหลือประมาณ 200 ตัวอักษรที่จะเหลือให้ประโยค $GPGSV ซึ่งประโยค GSV จะส่งมาเป็นชุดอาจจะเป็น 2 บรรทัด ถ้าในขณะนั้นเครื่อง GPS รับสัญญาณได้ไม่เกิน 8 ดวง (4 ดวงต่อบรรทัด) แต่ถ้ารับได้มากกว่า 8 ดวงไม่เกิน 12 ดวง จะได้ประโยคนี้ 3 บรรทัด หาขนาดได้คร่าวๆเท่ากับ 3 x 80 = 240 ตัวอักษร
  • ดังนั้นประโยค $GPRMC, $GPGSA, $GPGGA, $GPGLL, $GPVTG ที่รับจากเครื่อง GPS ประมาณ 400 ตัวอักษรรวมกับประโยค $GPGSV 3 บรรทัดเท่ากับ = 400 + 240 = 640 ซึ่งจะเกิน 600 ตัวอักษรต่อวินาที (Baud rate 4800 b/s) ทำให้ข้อมูลจะเกิดการสูญหาย ผมสังเกตว่าประโยค $GPGSV เครื่อง GPS จะส่งมาให้ทุกๆวินาทีไม่เหมือนกับประโยคบางประโยคเช่น $GPBOD, $GPWPL หรือ $GPRTE นานๆจะส่งมาสักครั้ง
  • ดังนั้น Baud rate 4800 b/s ไม่พอเสียแล้วครับ

ปรับ Baud rate เป็น 9800 b/s

  • 9800 b/s หารด้วย 8 จะได้ 1225 ตัวอักษรต่อวินาที
  • เครื่อง GPS มือถือแบบที่เราใช้กันปัจจุบันจะระบุว่ารับได้ 12 channels ก็คือรับดาวเทียม GPS บนท้องฟ้าได้เต็มที่ 12 ดวง แต่ในอนาคตจะมีเครื่องที่สามารถรับได้มากกว่า 12 ดวงให้เห็นกันทั่วไป ผมค้นดูใน internet เห็นยี่ห้อ UBlox ที่รับได้ถึง 16 channels ซึ่งจะมีประโยค GSV เป็นชุดทั้งหมด 4 ประโยคดังนี้

$GPGSV,4,1,14,25,15,175,30,14,80,041,,19,38,259,14,01,52,223,18*76
$GPGSV,4,2,14,18,16,079,,11,19,312,,14,80,041,,21,04,135,25*7D
$GPGSV,4,3,14,15,27,134,18,03,25,222,,22,51,057,16,09,07,036,*79
$GPGSV,4,4,14,07,01,181,,15,25,135,*76

  • ถ้าในอนาคตเป็นเครื่องรับ 24 channels สมมติว่ารับสัญญาณของ GPS บนท้องฟ้าได้เต็มที่ 24 ดวง จะต้องใช้ประโยค $GPGSV ทั้งหมดเท่ากับ 24 = 4 ดวง x 6 บรรทัด  ประมาณขนาดได้ 6 x 80 = 480 ตัวอักษร รวมกับประโยคอื่นๆที่ผมกล่าวไปแล้ว 400 ตัวอักษรเท่ากับ 480 + 400 = 880 ตัวอักษร ดังนั้น baud rate 9800 b/s (1225 ตัวอักษร) ก็น่าจะพอ แต่ถ้าในขณะนั้นประโยคอื่นๆถูกส่งมาด้วยเช่น $GPZDA, $GPBOD, $GPWPL, $GPRTE, $GPGGK อะไรประมาณนี้ขนาด baud rate 9800 b/s ก็ฉิวเฉียดจะเต็ม ดังนั้นในอนาคต baud rate ของ GPS ควรจะอยู่ที่ 19200 b/s

ดาวน์โหลด

  • เฉพาะคอมโพเน็นต์ OpenGPSX ดาวน์โหลดได้ตามลิงค์นี้ OpenGPSX0.3.21.zip
  • โปรแกรมที่จะใช้ทดสอบที่จะเขียนในตอนนี้ ดาวน์โหลดได้ตามลิงค์นี้ OpenGPSProject.zip

ติดตั้งคอมโพเน็นต์ OpenGPSX

  • เมื่อดาวน์โหลด component มาแล้วจำทำการติดตั้งบน Lazarus ถ้าเป็นเครื่องที่ไม่เคยติดตั้ง component “OpenGPSX” มาก่อนหน้าตาจะเป็นดังรูปด้านล่าง
Lazarus ที่ยังไม่ได้ติดตั้ง OpenGPSX
  • unzip โฟลเดอร์คอมโพเน็นต์ที่ดาวน์โหลดมาแล้ว copy ไปไว้ที่โฟลเดอร์ของ Lazarus ตัวอย่างเช่นเครื่องผมอยู่ที่ “c:\lazarus\components\opengpsx”
โฟลเดอร์ของคอมโพเน็นต์ OpenGPSX

Compile & Rebuild

  • คลิกที่เมนู Package > Open package file (.lpk)… เปิดไฟล์ opengpsx.lpk ที่อยู่ในโฟลเดอร์ c:\lazarus\components\opengpsx
เปิดไฟล์ package ของคอมโพเน็นต์ OpenGPSX
  • เปิดไฟล์ opengpsx.lpk
เปิดไฟล์ opengpsx.lpk
  • ทำการ compile และ ติดตั้งคอมโพเน็นต์
ติดตั้งคอมโพเน็นต์
  • เมื่่อติดตั้ง component เสร็จก็พร้อมจะนำมาใช้งาน
Class ต่างๆของ component

ทดสอบคอมโพเน็นต์แบบง่าย

  • จะลอง component อย่างเร็วก่อน ด้วยการคลิกที่ OpenGPSX palette แต่ละ class แล้วมาแปะที่ฟอร์มดังรูปด้านล่าง
ทดสอบอย่างเร็ว
  • จะเห็นหน้าตาของ object แต่ละตัว ซึ่ง TGPSSkyplot, TGPSTarget และ TGPSSignalplot เป็น Visual component ส่วนอีกสองตัวได้แก่ TNMEADecode และ TGPSPortConnected เป็น Non visual component มาลองดูโค้ดที่ Lazarus สร้างขึ้นมาให้จะเห็น unit ที่ถูกเรียกใช้เช่น gpsskyplot, gpstarget, gpssignalplot, nmeadecode และ gpsportconnected
      [sourcecode language=”delphi”]

 

      unit Unit1;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, gpsskyplot,
gpstarget, gpssignalplot, nmeadecode, gpsportconnected;

type

{ TForm1 }

TForm1 = class(TForm)
GPSPortConnected1: TGPSPortConnected;
GPSSignalPlot1: TGPSSignalPlot;
GPSSkyPlot1: TGPSSkyPlot;
GPSTarget1: TGPSTarget;
NMEADecode1: TNMEADecode;
private
{ private declarations }
public
{ public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.lfm}

end.

[/sourcecode]

  • ก็ขอจบตอนนี้ก่อนครับ ตอนหน้ามาดูโปรแกรมที่ผมเขียนขึ้นมาเพื่อทดสอบและเรียกใช้ OpenGPSX component กันเป็นเรื่องเป็นราวครับ

Leave a Reply

Your email address will not be published.