คอมโพเน็นต์ OpenGPSX
- Concept ของ component คือผู้พัฒนาโปรแกรมทั่วๆไปสามารถนำ component ของผมไปใช้งานได้ง่าย ใช้เวลาน้อย โดยไม่ต้องมีความรู้เรื่อง GPS มาก ผมเขียนคอมโพเน็นต์ตัวนี้ขึ้นมาเพราะผมใช้ GPS บ่อย ตั้งแต่เครื่องมือถือทั่วๆไปเช่น Garmin หรือบน Pocket PC ก็เคยใช้ จนกระทั่งเครื่อง GPS ระดับ Precise เช่น Trimble, Leica ที่มีสนนราคาเรือนล้านบาท ใช้งานใน mode เช่น
- Differential GPS (DGPS) ตั้งแต่ตั้ง Reference Station เอง จนถึงเช่าสัญญาณ DGPS จาก Omnistar หรือ Landstar
- RTK (Real Time Kinematic) ที่ติดตั้ง Reference Station ประกอบกับอุปกรณ์ Radio Modem เพื่่อส่งสัญญาณ Correction ไปยังเครื่อง Rover ทำให้รับสัญญาณได้ละเอียดกว่าระบบ DGPS
- Static หรือ Fast Static ใช้มากเพื่อขยายหมุดจากหมุด GPS ที่ทราบค่าพิกัดแล้วโดยการตั้งเครื่องรับ GPS ที่หมุด GPS แล้วนำเครื่อง GPS อีกเครื่องไปตั้งที่หมุดใหม่ ทำการรังวัดเก็บข้อมูล แล้วนำข้อมูลทั้งสองเครื่องไปคำนวณผ่านโปรแกรมต่างๆเช่น TGO, LGO หรือโปรแกรมอื่นๆของผู้ผลิต GPS
- ก็เลยมีแรงบันดาลใจว่าน่าจะทำ component สำหรับ Lazarus ซักตัวหนึ่งที่สามารถ decode ประโยคต่างๆของ NMEA ได้ และนำข้อมูลเหล่านี้ไปแสดงผลเช่นวาดสัญลักษณ์ GPS บนท้องฟ้า แสดงความแรงของสัญญาณ GPS ตลอดจนวาดลูกศรแสดงเป้าหมายของ Waypoint ในการ programming ก็ไม่ถือว่าเป็นเรื่องยากหนักหนาสาหัส แต่ติดขัดคือผมมีงานประจำ และงานโปรแกรมมิ่งเป็นงานอดิเรก จึงมีเวลาค่อนข้างน้อย แต่ผมก็พยายามจนสามารถออกรุ่นแรกได้คือรุ่น 0.3 ซึ่งความรู้สึกของผมน่าจะพอใช้งานได้
ความสามารถของ Component “OpenGPSX”
- สำหรับ Features ของคอมโพเน็นต์ผมจะเรียงไปตาม Class หลักๆ ดังนี้ครับ
- TGPSPortConnected เอาไว้ตั้งค่าการเชื่อมต่อกับเครื่อง GPS เช่นตั้งค่าการเชื่อมต่อกับ Serial Port เช่นตั้งค่า Com port, Baud rate, Parity, Data bit และ Stop bit เมื่อทำการเชื่อมต่อแล้ว class นี้สามารถดักจับข้อมูล NMEA ที่ผ่านทาง port ก่อนจะกระจายสตริงของ NMEA ผ่านทาง Event

- TNMEADecode เป็น class ที่อ่านค่า NMEA ที่เครื่อง GPS ส่งมาให้ผ่าน TGPSPortConnected แล้ว decode รหัสของ NMEA ตามชนิดของ sentence เช่น $GPGSA, $GPGSV, $GPRMC, $GPGGA, $GPVTG, $GPGLL, $GPWPL, $GPRTE หรือของ Garmin บางส่วน
- TGPSSkyPlot เป็น class ที่วาดรูปสัญลักษณ์ของ GPS บนท้องฟ้า เมื่อได้รับการแปล NMEA จากรูปประโยค $GPGSV

- TGPSSignalStrength แสดงความแรงของสัญญาณของ GPS เมื่อได้รับการแปล NMEA จากประโยค $GPGSV เช่นเดียวกัน


- TGPSTarget เป็นตัวบอกทิศทางจุดเป้าหมาย (Waypoint) ที่ต้องการจะไป โดยคอมโพเน็นต์จะคำนวณจากค่าพิกัดจุดเป้าหมายและค่าพิกัดปัจจุบันจาก GPS

- ส่วนการ Implement ตัว Event จาก TNMEADecode สามารถแยกไปตามชนิดของประโยคของ NMEA ดังตัวอย่างรูปดัานล่างได้ง่ายๆ

ไฟล์และส่วนประกอบของคอมโพเน็นต์
- ส่วนใหญ่จะเขียนเองเกือบทั้งหมดยกเว้น การเชื่อมต่อกับ Serial port ผมดึงไฟล์จากคอมโพเน็นต์ “SdpoSerial” ซึ่งในคอมโพเน็นต์นี้พัฒนาต่อจาก Synaser โดยการเขียน class ขึ้นมา wrap “Synaser” ให้ใช้งานได้ง่าย ผมดัดแปลงโค้ดบ้างเล็กน้อยให้เหมาะสมกับการใช้งาน GPS ซึ่งไฟล์ที่นำมาใช้มีสองไฟล์คือ sdposerial.pas กับ synaser.pas
- อื่นๆก็เขียนเองเกือบหมดรวมทั้ง class ที่ใช้คำนวณหาระยะทางและทิศทางบน Ellipsoid ถ้ายังไม่ลืมก็คือใช้อัลกอริที่มของ Vincenty ซึ่งผมได้แก้ bug ใน unit นี้ด้วย

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