การใช้งาน GPS กับ Arduino
ข้อมูลเบื้องต้นเกี่ยวกับ GPS
เครื่องรับสัญญาณจีพีเอสที่มีจำหน่ายกันตามท้องตลาดในปัจจุบัน มีหลากหลายรูปแบบและหลากหลายผู้ผลิต ตั้งแต่แบบสำเร็จรูปที่สามารถนำไปใช้งานได้ทันทีสำหรับบุคคลทั่วไป เช่น ระบบจีพีเอสบนมือถือ ในที่นี้จะขอกล่าวในรายละเอียดเฉพาะแบบที่เป็นชิปโมดูลขนาดเล็กสำหรับนักพัฒนา โดยในลำดับแรกจำเป็นจะต้องรู้เกี่ยวกับนิยามศัพท์ต่าง ๆ ของโมดูลจีพีเอส ดังนี้
- Accuracy – หมายถึง ค่าความถูกต้อง หรือความแม่นยำในการคำนวณระบุตำแหน่งบนพื้นโลกของเครื่องรับ สำหรับเครื่องรับที่ราคาไม่แพงมาก โดยทั่วไปแล้วจะมีค่าความถูกต้องอยู่ที่ประมาณ +/- 3 ถึง 5 เมตร [7] แต่ถ้าหากต้องการความถูกต้องสูง ราคาของเครื่องรับจะสูงขึ้น เช่น ระบบ DGPS [5] หรือ RTK GPS [13] และเพื่อให้ได้ความถูกต้องที่ดีที่สุด เครื่องรับสัญญาณควรจะต้องอยู่ในมุมมองที่ชัดเจนของท้องฟ้า
- Antenna – สายอากาศของเครื่องรับ เนื่องจากดาวเทียมอยู่ห่างออกไปไม่ต่ำกว่า 12,000 ไมล์ เพื่อประสิทธิภาพที่ดีที่สุดในการรับสัญญาณ สายอากาศของเครื่องรับสัญญาณจึงต้องมีประสิทธิภาพสูง ซึ่งมีให้เลือกหลากหลายชนิดด้วยกัน ตามวัตถุประสงค์และความต้องการของการใช้งาน ดังตัวอย่างต่อไปนี้
- โมดูลจีพีเอสแบบสายอากาศแพทช์ (Patch Antenna) – โมดูลชนิดนี้จะเป็นที่นิยมใช้งานกันมาก เนื่องจากมีขนาดกระทัดรัด ไม่ต้องต่อสายอากาศเพิ่มเติม ราคาถูก ใช้งานได้สะดวก [1] แสดงตามรูปที่ 2
รูปที่ 2 โมดูลจีพีเอสชนิดสายอากาศแพทช์
- โมดูลจีพีเอสแบบสายอากาศเฮลิคอล (Helical Antenna) – โมดูลชนิดนี้จะมีขนาดโตกว่าแบบแพทช์ เนื่องจากต้องมีสายอากาศเพิ่มเติม แต่ช่วยทำให้การรับสัญญาณดีขึ้นในทุกทิศทางตามรูปที่ 3
รูปที่ 3 โมดูลจีพีเอสชนิดสายอากาศเฮลิคอล
- โมดูลจีพีเอสแบบสายอากาศภายนอก (Ext Antenna) – โมดุลชนิดนี้จะมีขั้วต่อสายอากาศแบบ SMA ที่สามารถต่อกับสายอากาศภายนอกได้ตามรูปที่ 4 นิยมใช้ในกรณีที่จำเป็นต้องติดตั้งเครื่องรับสัญญาณในมุมอับไม่สามารถรับสัญญาณได้ เช่น การติดตั้งภายในอาคาร หรือในรถยนต์ ฯลฯ
รูปที่ 4 โมดูลจีพีเอสชนิดสายอากาศภายนอก
- Baud Rate – อัตราบอด รูปแบบของการสื่อสารข้อมูลในการรับสัญญาณจากจีพีเอสจะเป็นแบบอนุกรม (UART) ในอัตราบิตเฉพาะ เช่น 9600 bps , 57600 bps, etc. ซึ่งตรวจสอบได้จากดาต้าชีท
- Channel – จำนวนช่องสัญญาณของเครื่องรับ เป็นคุณสมบัติที่ผลต่อเวลาของการกำหนดตำแหน่งในครั้งแรกที่เริ่มเปิดเครื่อง จำนวนช่องที่มากกว่าจะช่วยให้ใช้เวลาที่สั้นกว่า แต่หลังจากที่กำหนดตำแหน่งได้แล้ว ช่องสัญญาณบางช่องอาจจะต้องปิดเพื่อประหยัดพลังงาน
- TTFF (Time To First Fix) – หมายถึง เวลาที่ถูกใช้ตั้งแต่เริ่มเปิดเครื่องจนกระทั่งสามารถคำนวณหาตำแหน่งที่ถูกต้องได้ ซึ่งจะต้องใช้ข้อมูลจากดาวเทียมอย่างน้อย 4 ดวง เวลา TTFF นี้ยังขึ้นอยู่กับสภาพอากาศด้วย
- Lock & Fix – หมายถึง การค้นหาและติดตามตำแหน่งของดาวเทียม โดยถ้าหากรับสัญาณจากดาวเทียมได้ตั้งแต่ 4 ดวงขึ้นไป จึงจะประมวลผลหาพิกัดตำแหน่งและเวลาที่ถูกต้องได้
- Start-up Times (Hot, Warm, and Cold) – หมายถึง เวลาตั้งแต่เริ่มจ่ายไฟเข้าโมดูลจนกระทั่งสามารถ Fix & Lock ได้ โมดูลบางชนิดได้เพิ่มซุปเปอร์คาปาซิเตอร์ หรือ แบตเตอรี่ขนาดเล็กเพื่อเลี้ยงหน่วยความจำสำหรับเก็บข้อมูลตำแหน่งดาวเทียมหลังจากปิดเครื่อง ทำให้ลดเวลา TTFF และประหยัดพลังงาน
- Update Rate – หมายถึง ความถี่ในการรายงานพิกัดตำแหน่งของโมดูล (หน่วยเป็น Hz) ซึ่งโดยทั่วไปจะอยู่ที่ 1 ครั้งต่อวินาที หรือ 1 Hz ส่วน พวกยูเอวีหรือยานอัตโนมัติที่มีความเร็วสูง ต้องการอัตราอัพเดตที่มากขึ้น อาจจะเลือกใช้โมดูล 5 Hz หรือ 10 Hz
การเชื่อมต่อสาย GPS (NEO-6M Ublox/u-blox Ublox NEO-6MV2 GPS Module GY-GPS6MV2 พร้อมสายอากาศ) กับ arduino
GND - GND
RX - Digital pin (D3)
TX - Digital pin (D4)
Vcc - 3.3 V

สามารถโหลด Library สำหรับ GPS ได้จากที่นี่
หากไม่ทราบวิธีลง Library ให้ดูได้จากลิงค์นี้ https://www.arduino2robot.com/article/19/การลง-library-ในโปรแกรม-arduino-ide
จากนั้นให้ทำการเลือก code จาก file > examples > Tiny GPS master > simple_test

จะได้ code ดังนี้ครับ
#include
#include
/* This sample code demonstrates the normal use of a TinyGPS object.
It requires the use of SoftwareSerial, and assumes that you have a
4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx).
*/
TinyGPS gps;
SoftwareSerial ss(4, 3);
void setup()
{
Serial.begin(115200);
ss.begin(9800); // แก้เป็น 9800
Serial.print("Simple TinyGPS library v. "); Serial.println(TinyGPS::library_version());
Serial.println("by Mikal Hart");
Serial.println();
}
void loop()
{
bool newData = false;
unsigned long chars;
unsigned short sentences, failed;
// For one second we parse GPS data and report some key values
for (unsigned long start = millis(); millis() - start < 1000;)
{
while (ss.available())
{
char c = ss.read();
// Serial.write(c); // uncomment this line if you want to see the GPS data flowing
if (gps.encode(c)) // Did a new valid sentence come in?
newData = true;
}
}
if (newData)
{
float flat, flon;
unsigned long age;
gps.f_get_position(&flat, &flon, &age);
Serial.print("LAT=");
Serial.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6);
Serial.print(" LON=");
Serial.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6);
Serial.print(" SAT=");
Serial.print(gps.satellites() == TinyGPS::GPS_INVALID_SATELLITES ? 0 : gps.satellites());
Serial.print(" PREC=");
Serial.print(gps.hdop() == TinyGPS::GPS_INVALID_HDOP ? 0 : gps.hdop());
}
gps.stats(&chars, &sentences, &failed);
Serial.print(" CHARS=");
Serial.print(chars);
Serial.print(" SENTENCES=");
Serial.print(sentences);
Serial.print(" CSUM ERR=");
Serial.println(failed);
if (chars == 0)
Serial.println("** No characters received from GPS: check wiring **");
}
ทำการอัพโหลด code จากนั้นเปิด serial monitor จะได้ดังนี้ครับ

ถ้าได้อย่างนี้แสดงว่าใช้ได้ให้เรา copy เฉพาะตัวเลข ของ LAT และ LON ไปวางใน google map จะได้ตำแหน่งพิกัดที่เราอยู่ ดังแสดงในรูปด้านล่าง

!! หากไม่ขึ้น LAT และ LON ให้ทำการแก้ code ส่วนที่เป็นสีแดงให้เป็น 9800
ขอบคุณที่มา
http://aimagin.com/blog/gps-กับไมโครคอนโทรลเลอร์/?lang=th