สวัสดีครับ ไม่นานมานี้ร้าน IOXhop ได้เริ่มนำโมดูล GPS เข้ามาจำหน่าย ด้วยเหตุว่าผมได้ทำ ระบบติดตามรถประจำทาง เป็นโปรเจคจบ จึงต้องมีการใช้อุปกรณ์ที่เป็น GPS ในการดึงตำแหน่งออกมา ทำให้ผมได้มีโอกาศศึกษาการใช้งานโมดูล GPS NEO-6M แล้วนำมาสู่บทความการใช้งาน บทความนี้ครับ
รู้จักกับระบบนำร่อง
ระบบนำร่อง เป็นระบบระบุตำแหน่งบนพื้นโลก โดยใช้เวลาเป็นตัวกำหนด หลักการที่สำคัญคือ ดาวเทียมจะปล่อยค่าเวลาออกมาเป็นช่วง ๆ อุปกรณ์จะรับสัญญาณเข้ามา แล้วคำนวณระยะห่างระหว่างอุปกรณ์กับดาวเทียมโดยเปรียบเทียบเวลาปัจจุบัน กับเวลาที่รับมา ว่าแตกต่างกันเท่าไร จากนั้นจึงคำนวณเป็นระยะทางโดยเทียบกับค่าเวลาในการเดินทางของแสง (สัญญาณเดินทางได้เร็วเท่าแสง) เมื่อดาวเทียม 4 ดวงอยู่ในตำแหน่งเดิมเสมอ ทำให้สามารถตีวงเพื่อหาตำแหน่งจากระยะทางได้ แล้วจึงนำจุดที่ซ้อนทับกันมาระบุเป็นตำแหน่งของเครื่องรับ
ระบบนำร่องที่คนส่วนใหญ่รู้จักกัน คือ ระบบ GPS เกิดขึ้นตั้งแต่ประมาณปี ค.ศ. 1978 เริ่มแรกใช้ในการทหาร แต่ต่อมาได้เกิดเหตุการเครื่องบินพลัดหลง ทำให้เริ่มมีการประกาศใช้ GPS ทั่วไปในปี ค.ศ. 1983
ระบบ GPS เดิมทีมีการใช้งานกันบนเครื่องบิน เพื่อไม่ให้เครื่องบินเกิดเหตุการณ์ออกนอกเส้นทางอีก แต่เมื่อเทคโนโลยีเริ่มมีการพัฒนามากขึ้นเรื่อย ๆ ตัวรับสัญญาณ GPS มีขนาดเล็กลงเรื่อย ๆ จึงมีการพัฒนาเป็นอุปกรณ์นำทางในรถ มาจนถึงปัจจุบันที่แค่กดแอพพลิเคชั่นก็สามารถระบุตำแหน่งของเราบนแผนที่ได้เลย
ระบบนำร่องที่คนไทยอาจจะไม่ค่อยรู้จักนัก คือระบบ GLONASS เป็นระบบนำร่องจากรัสเซีย พัฒนาขึ้นมาเพื่อแข่งกับระบบ GPS โมดูล GPS รุ่นใหม่ ๆ จะสามารถรับสัญญาณของ GLONASS ได้ด้วย ทำให้สามารถระบุตำแหน่งได้แม่นยำมากยิ่งขึ้น (บางโมดูลจะเรียก GLONASS ว่า GNSS)
Ublox NEO-6M
สำหรับโมดูล Ublox NEO-6M จะสามารถรับสัญญาณ GPS ได้อย่างเดียว สามารถสื่อสารกับไมโครคอนโทรลเลอร์ได้หลายแบบ ทั้ง I2C SPI และ UART ในบทความนี้ผมจะใช้ GY-NEO6MV2 GPS module NEO6MV2 with antenna ซึงรองรับเฉพาะ UART เท่านั้น
รู้จักกับ NMEA
NMEA เป็นมาตรฐานการสื่อสารระหว่างอุปกรณ์ ส่วนใหญ่ใช้งานกับโมดูล GPS เมื่อต้องการที่จะข้อมูลมาจากโมดูล GPS เราจำเป็นจะต้องรู้รูปแบบการสื่อสารแบบ NMEA กันก่อน
NMEA สามารถระบุข้อมูลออกมาได้หลายแบบด้วยกัน ซึ่งเมื่อมีการเริ่มส่งข้อมูลมา จะเริ่มต้นการส่งด้วยเครื่องหมาย $ แล้วจบด้วยเครื่องหมาย * หลังจากนั้นจึงเป็นการตรวจสอบค่าความผิดพลาดด้วยตัวเลข Check sum
ข้อมูลที่ถูกส่งมาจะนำหน้าด้วย GPRMC GPGGA และอื่น ๆ อีกมากมาย แต่ในบทความนี้จะอธิบายเฉพาะข้อมูลแบบ GPRMC
รูปแบบของข้อมูล GPRMC มีดังนี้
$GPRMC,[ชั่วโมง][นาที][วินาที],[A หมายถึงจับสัญญาณได้แล้ว ส่วน V หมายถึงยังจับสัญญาณไม่ได้],[องศาลิปดา][นาที].[วินาที],[N หมายถึงเหนือ S หมายถึงใต้],[องศาฟิลิปดา][นาที].[วินาที],[E หมายถึงตะวันออก W หมายถึงตะวันตก],[ความเร็วบนพื้น],[Course Made Good],[วัน][เดือน][ปี],[Magnetic variation],[E หมายถึงตะวันออก W หมายถึงตะวันตก]*[Check sum]
ดูจากรูปแบบอาจจะ งง ๆ เรามาดูข้อมูลที่ส่งมาจริง ๆ กันบ้างดีกว่า
$GPRMC,225446,A,4916.45,N,12311.12,W,000.5,054.7,191194,020.3,E*68
จากข้อมูลด้านบน เราสามารถแยกออกมาได้ดังนี้
จะเห็นได้ว่า มีข้อมูลบางส่วนเท่านั้นที่เราจะดึงออกมาใช้
เมื่อเราทราบรูปแบบของข้อมูลแล้ว ต่อไปเรามาลองแปลงองศาลิปดา ที่อยู่ในรูปแบบ DMS ให้เป็นเลขทศนิยม (DD) เพื่อสะดวกต่อการนำไปปัดหมุดบนแผนที่กันครับ
การหาค่าละติจูดและลองติจูดในรูปทศนิยมจากรูปองศาลิปดา สามารถหาได้แบบเดียวกัน ดังนี้
= องศา + (นาที / 60)
จากตัวอย่าง เราสามารถหาค่าละติจูด และลองติจูดได้ดังนี้
Lat = 49 + (16.45 / 60) = 49.274166
Lng = 123 + (11.12 / 60) = 123.185333
แต่เนื่องจากลองติจูดคิดในองศาตะวันตก ค่าที่ได้จากการคำนวณจะเป็นลบ ก็นำเครื่องหมายลบต่อไปข้างหน้าได้เลย หรือคูณ -1 เข้าไป
Lng = (123 + (11.12 / 60)) * -1 = -123.185333
ต่อมา เรามาดูเรื่องความเร็วกันบ้าง ความเร็วที่ส่งมาจะอยู่ในหน่วยน๊อต นิยมใช้ในการเดินทะเล เราสามารถเปลี่ยนหน่วยเป็นกิโลเมตร ได้โดยคูณ 1.852
จากข้อมูลที่ส่งมา เป็น 0.5 น๊อต ซึ่งสามารถแปลงออกมาได้ดังนี้
0.5 * 1.852 = 0.926 Km/h.
เมื่อเราทราบหลักการทั้งหมดแล้ว ต่อไปเรามาลองเขียนโค้ดด้วย Arduino ออกมากันครับ
การเขียนโปรแกรม Arduino
บอร์ด Arduino Uno R3 ที่ผมใช้ในบทความนี้ มี UART เพียงช่องเดียว ดังนั้นผมจึงใช้ SoftwareSerial Library แทน ซึ่งจะทำให้สามารถใช้งาน UART ได้ทุกช่อง
การดึงข้อมูลแต่ละส่วนออกมา จำเป็นต้องมีการจัดการสตริง แต่เดิมเรื่องจากจัดการสตริงผมจะใช้ Regex แต่เนื่องจาก Arduino ไม่สามารถใช้งานได้ จริงต้องมีการจัดการสตริงแบบดิบ ๆ แทน
เริ่มจากการดึงข้อมูลที่ส่งออกมาจาก UART มาทีละบรรทัด จากนั้นจึงเริ่มตัด โดยใช้เครื่องหมาย , แบ่งไปเก็บไว้ในอาเรย์ทีละตัว
จากนั้นจึงนำข้อมูลแต่ละตัวมาแปลงให้ถูกรูปแบบ เช่น ข้อมูลความเร็วจากเดิมเป็นสตริง ก็แปลงกลับเป็น float แล้วทำการคำนวณ ได้ผลลัพธ์ตามที่ต้องการ
จากหลักการที่ได้อธิบายไปแล้ว ผมได้พิมพ์โค้ดขึ้นมาได้ดังนี้ ท่านสามารถต่อวงจร แล้วอัพโหลดเพื่อดูผลได้เลย
เปิด Serial Moniter ขึ้นมา จะได้ผลประมาณรูปด้านล่างนี้
เราสามารถนำค่าพิกัดที่ได้ ไปหมุดลงใน Google Map ได้เลย
การใช้งานในภาษา Python
หากต้องการใช้งานโมดูล GPS ร่วมกับคอมพิวเตอร์ ท่านสามารถใช้งานไลบารี่ในภาษา Python สำเร็จรูปที่ทางร้าน IOXhop จัดทำขึ้นมาได้เลย รองรับ OS ทั้ง Windows และ Linux
การใช้งาน จำเป็นต้องมีไลบารี่ pyserial ด้วย ท่านสามารถลงไลบารี่ pyserial ได้โดยพิมพ์
pip install pyserial
จากนั้นส่งคำสั่ง
git clone https://github.com/ioxhop/Ublox-NEO-M6-python.git
cd Ublox-NEO-M6-python
ผมใช้บอร์ด NanoPi NEO ต่อ NEO-6M ไว้ที่ขา UART1 สามารถรันด้วยคำสั่ง python testGPSLib.py เพื่อดูผลได้เลย
กรณีที่ใช้บอร์ดอื่น ๆ ท่านต้องดูขา GPIO ต่าง ๆ ว่าขาใดรองรับ UART บ้าง แล้วเป็น UART ตัวที่เท่าไร จึงจะมาสามารถแก้ไขในโค้ดโปรแกรมได้
ในการแก้ไขโค้ด ท่านต้องแก้ UART ตัวที่ท่านต่อไว้ ดูในบรรทัดที่ 23 ของไฟล์ testGPS.py แล้วแก้ /dev/ttyS1 ให้เป็นอย่างอื่น เช่น ต่อไว้ที่ UART3 ก็แก้เป็น /dev/ttyS3
ส่งท้าย
โมดูล GPS สามารถนำไปประยุกต์ได้มากมาย เช่น เอาไปติดกับรถ เพื่อติดตาม ติดกับเด็กเล็ก ๆ เพื่อป้องกันการพลัดหลง หรือลองเอาไปติดกับแมวก็ได้
สุดท้ายนี้ ผมก็ขอขอบคุณทุกท่านที่อ่านมาจนถึงตอนนี้ ข้อมูลใดที่ตกหล่น พิมพ์ผิด หรือผิดพลาด ท่านสามารถให้ความคิดเห็นมาทางช่องแสดงความคิดเห็นด้านล่างได้เลยครับ
~ สวัสดีครับ ~
เอกสารอ้างอิง