ทำความเข้าใจเรื่อง 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” มาก่อนหน้าตาจะเป็นดังรูปด้านล่าง
- unzip โฟลเดอร์คอมโพเน็นต์ที่ดาวน์โหลดมาแล้ว copy ไปไว้ที่โฟลเดอร์ของ Lazarus ตัวอย่างเช่นเครื่องผมอยู่ที่ “c:\lazarus\components\opengpsx”
Compile & Rebuild
- คลิกที่เมนู Package > Open package file (.lpk)… เปิดไฟล์ opengpsx.lpk ที่อยู่ในโฟลเดอร์ c:\lazarus\components\opengpsx
- เปิดไฟล์ opengpsx.lpk
- ทำการ compile และ ติดตั้งคอมโพเน็นต์
- เมื่่อติดตั้ง 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 กันเป็นเรื่องเป็นราวครับ