บทความนี้จะนำเสนอวิธีการใช้งาน USB GPS ผ่านทางภาษา Python บนระบบปฏิบัติการ Linux (รวมถึง Raspberry Pi ด้วย) เพื่อให้สามารถอ่านค่าพิกัดปัจจุบันและบันทึกไว้ในไฟล์เพื่อนำไปประมวลผลต่อไป
สิ่งที่ต้องใช้
- USB GPS – เพื่อใช้อ่านค่าพิกัดจากดาวเทียม ตัวอย่างที่ใช้ในบทความนี้คือของ DeLorme Earthmate LT-20
- โปรแกรม gpsd พร้อมทั้งโปรแกรมทดสอบ และ api ใช้งานผ่าน Python สามารถติดตั้งได้โดยใช้คำสั่ง
sudo apt-get install gpsd gpsd-clients python-gps
ตรวจสอบ USB GPS
ขั้นแรกควรตรวจสอบก่อนว่า USB GPS ใช้งานได้หรือไม่ ซึ่งปกติแล้วอุปกรณ์นี้จะจำลองตัวเองเป็นพอร์ม serial ดังนั้นเมื่อเสียบอุปกรณ์เข้าไปก็มักจะปรากฏขึ้นชื่อว่า /dev/ttyUSB0 ให้ลองเข้าไปดูว่ามีไฟล์นี้หรือไม่ ในบางกรณีไฟล์อาจเป็นชื่ออื่น ซึ่งก็ต้องนำชื่อนั้นไปปรับใช้ในโปรแกรมด้วย
สำหรับท่านที่ใช้งาน Raspberry Pi สามารถตรวจสอบรายการรุ่น USB GPS ที่ทดสอบแล้วว่าใช้ได้ที่
http://elinux.org/RPi_VerifiedPeripherals#USB_GPS_devices
แต่หากอุปกรณ์ของท่านไม่ได้อยู่ในรายการก็ไม่ได้แปลว่าจะใช้ไม่ได้เสมอไป ตัวอุปกรณ์ที่ใช้ในบทความนี้ก็ไม่มีในรายการ แต่พอทดสอบก็พบว่าใช้งานได้ดี
ลองอ่านค่าพิกัดผ่าน gpsd
ให้เรียกใช้โปรแกรม gpsd ซึ่งจะทำงานในพื้นหลังเพื่อค่อยติดต่อกับดาวเทียมและจัดการอุปกรณ์ให้ล๊อกตำแหน่งพิกัดปัจจุบัน
sudo gpsd /dev/ttyUSB0 -F /var/run/gpsd.sock
หลังจากนั้นก็ลองเรียกใช้โปรแกรม cgps เพื่อดูว่า GPS สามารถระบุพิกัดได้หรือไม่
cgps -s
อย่าลืมว่าต้องวางอุปกรณ์ในที่โล่งสามารถเห็นท้องฟ้าได้ ไม่อยู่ใต้หลังคาหรือต้นไม้ อุปกรณ์ควรเห็นท้องฟ้าอย่างน้อย 70% ตัว USB GPS อาจไม่ฉลาดหรือหาตำแหน่งได้ไวเท่า GPS ในโทรศัพท์มือถือเพราะในระบบโทรศัพท์มือถือจะทำการระบุตำแหน่งโดยใช้ตำแหน่งเสาสัญญาณโทรศัพท์เข้ามาช่วยด้วย
เมื่อเรียกใช้งานและ GPS สามารถระบุพิกัดปัจจุบันได้จะเห็นหน้าจอลักษณะดังนี้
หมายเหตุ หากเรียกใช้โปรแกรม cgps แล้วแสดงหน้าจอข้างต้นเพียงไม่กี่วินาทีแล้วจบการทำงาน ท่านอาจต้องเรียกใช้ gpsd อีกครั้งหนึ่งโดยใช้คำสั่งต่อไปนี้
killall gpsd sudo gpsd /dev/ttyUSB0 -F /var/run/gpsd.sock
เขียน Python อ่านพิกัดเก็บลงไฟล์
เมื่อแน่ใจแล้วว่าระบบสามารถระบุพิกัดปัจจุบันได้ ก็ให้เขียนโปรแกรม Python ดังตัวอย่างต่อไปนี้เพื่อทำการจัดเก็บตำแหน่งลงไฟล์
import gps # Listen on port 2947 (gpsd) of localhost session = gps.gps("localhost", "2947") session.stream(gps.WATCH_ENABLE | gps.WATCH_NEWSTYLE) while True: try: report = session.next() # Wait for a 'TPV' report and display the current time # To see all report data, uncomment the line below # print report if report['class'] == 'TPV': if hasattr(report, 'lat'): print report.lat if hasattr(report, 'lon'): print report.lon file = open('gps_data.txt','a') file.write(str(report.lat)+','+str(report.lon)+"\n") file.close() except KeyError: pass except KeyboardInterrupt: quit() except StopIteration: session = None print "GPSD has terminated"
เมื่อทดสอบโปรแกรมก็ควรจะเห็นพิกัดถูกพิมพ์ขึ้นมาบนหน้าจอ และบันทึกลงไฟล์ gps_data.txt
การทดลอง – ปั่นจักรยาน
ผู้เขียนได้ติดตั้งอุปกรณ์ USB GPS เข้ากับ Raspberry Pi และติดตั้งไว้บนจักรยานและทดสอบปั่นไปกลับโดยทำการบันทึกค่าพิกัดไว้ตลอดทาง
เมื่อกลับจากการปั่นทดสอบก็ได้นำไฟล์พิกัดไปลอง plot ตำแหน่งใน google map โดยใช้วิธีการที่ได้เขียนไว้ในบทความ “การ plot ตำแหน่งพิกัดลงบน Google Map โดยใช้ Python อย่างง่าย” และได้ผลออกมาดังภาพ
หมายเหต ข้อมูลที่นำมา plot เป็นเพียงบางส่วนของเส้นทางที่ปั่นจริง
เนื่องจากวันที่ทดสอบสภาพอากาศค่อนข้างดี ฟ้าโปร่งจึงทำให้ GPS หาตำแหน่งได้อย่างรวดเร็ว และเท่าที่สังเกตุดูผลจะเห็นว่าตำแหน่งที่ได้ค่อนข้างแม่นยำ ถึงขนาดที่สามารถแยกฝั่งถนนที่ปั่นจักรยานขาไปและขากลับได้
สรุป
บทความนี้ได้แสดงให้เห็นวิธีการอย่างง่ายในการอ่านตำแหน่งพิกัดจากอุปกรณ์ USB GPS และทำการแสดงผล และบันทึกค่าลงไฟล์เพื่อนำไปใช้งานต่อไป
อ้างอิง
การติดตั้ง gpsd และตัวอย่างโปรแกรม Python ในบทความนี้ดัดแปลงมาจากตัวอย่างในบทความ Adafruit Ultimate GPS on the Raspberry Pi บน website Adafruit.com