บทความนี้เป็นการใช้ ESP32 เชื่อมต่อกับโมดูลจีพีเอสผ่านทางพอร์ตสื่อสารอนุกรมลำดับที่ 2 ของ ESP32 เพื่ออ่านข้อมูลและแสดงผลข้อมูลที่ได้รับจากโมดูลจีพีเอส และแสดงความหมายที่อ่านได้ โดยตัวอย่างโปรแกรมที่ 1 เป็นการอ่านค่าจากโมดูลจีพีเอส และตัวอย่างที่ 2 เป็นการแสดงสารสนเทศที่อ่านได้จากโมดูลจีพีเอสเพื่อให้ผู้อ่านได้นำไปปรับปรุงแก้ไขต่อไป

NEO-6MV2 GPS Module
โมดูลจีพีเอส NEO-6MV2 ประกอบด้วยตัวภาครับจีพีเอสดังภาพที่ 2 และสายอากาศดังภาพที่ 3 ซึ่งโมดูลนี้เป็นภาครับสัญญาณจีพีเอสแบบเคลื่อนที่ได้ ซึ่งออกแบบตามการทำงานบอกพิกัดของ u-blox 6 ซึ่งคุณสมบัติของโมดูลจีพีเอสเป็นดังต่อไปนี้
- ต้องการแหล่งจ่ายไฟกระแสตรงแรงดัน 2.7-3.6V
- ต้องการกระแสในการทำงาน 67mA
- ต้องการเสาสัญญาณ (Antenna gain) 50dB
- ทำงานที่อุณหภูมิ -40 ถึง 85 องศาเซลเซียส
- เสาอากาศใช้ได้ทั้งแบบ Passive และ Active
- รองรับการเชื่อมต่อแบบ UART, USB, SPI และ DDC แต่ในบทความนี้ใช้โมดูลที่เชื่อมต่อแบบ UART ความเร็วในการสื่อสาร 9600 bps


การเชื่อมต่อ
โมดูจีพีเอสที่ทางเราได้มาเป็นรุ่นเชื่อมต่อผ่าน RS232 ซึ่งต้องสื่อสารด้วยความเร็ว 9600bps และมีขาเชื่อมต่อด้วยกัน 4 ขา คือ Vcc, GND, RX และ TX ดังภาพที่ 4

การต่อระหว่าง ESP32 และโมดูลจีพีเอส เป็นตามตางรางต่อไปนี้
ESP32 | NEO-GMV2 GPS Module |
---|---|
3V3 | Vcc |
GND | GND |
21 | RX |
22 | TX |
ตัวอย่างโปรแกรม
ตัวอย่างโปรแกรม code19-1 เป็นการเขียนโปรแกรมเพื่อเชื่อมต่อกับพอร์ต UART2 ของ ESP32 โดยใช้ขา GPIO22 เป็น RxD และ GPIO21 เป็น TxD ด้วยอัตราการสื่อสารที่ 9600bps หลังจากนั้นวนรอบเพื่ออ่านค่าที่ได้จากโมดูลจีพีเอส และแสดงผลค่าที่อ่านได้ผ่านพอร์ตสื่อสารอนุกรมที่เชื่อมต่อกับคอมพิวเตอร์ ได้ผลลัพธ์ดังภาพที่ 5
#code19-1
import machine
u2=machine.UART(2, baudrate=9600, rx=22, tx=21, timeout=10)
print(u2)
while True:
data = u2.readline()
if (data != None):
print(data)

ตัวอย่างโปรแกรม 2
ตัวอย่างโปรแกรม code19-2 เป็นการปรับปรุงจาก code19-1 โดยตรวจสอบเฉพาะข้อมูลที่ขึ้นต้นด้วย $GPRMC หลังจากนั้นทำการถอดชุดข้อมูลที่ถูกคั่นด้วยคอมมา (comma) เพื่อแสดงข้อมูลให้เข้าใจได้ง่ายขึ้น และตัวอย่างของผลลัพธ์เป็นดังภาพที่ 6 และตัวอย่างเมื่อนำไปแสดงที่โมดูลกราฟิกแอลซีดีดังภาพที่ 7
# code19-2
import machine
u2=machine.UART(2, baudrate=9600, rx=22, tx=21, timeout=10)
print(u2)
while True:
data = u2.readline()
if (data != None):
if (b'$GPRMC' in data):
s = data.decode() # convert bytearray to string
info = s.split(',')
print("Time(UTC) hhmmss.ms: {}".format(info[1]))
if (info[2] == 'V'):
print("Navigation receiver warning")
else:
print("Lat:{},{} Lon:{},{}".format(info[3],info[4],info[5],info[6]))
if (len(info[7])>0):
print("Speed over ground {} knots".format(info[7]))
print("Track made good, degrees true {}".format(info[8]))
print("Magnetic Veriation {} degree(s)".format(info[10]))
print("E/W: {}".format(info[11]))
print("Date (ddmmyy): {}".format(info[9]))
print("------------")


สรุป
จากตัวอย่างในบทความนี้ผู้อ่านสามารถเชื่อมต่อโมดูลจีพีเอสเข้ากับบอร์ด ESP32 เพื่ออ่านค่าจากโมดูลจีพีเอส และแสดงผลออกมาได้ โดยใช้ภาษาไพธอน พร้อมทั้งมีการถอดความหมายจากข้อความเพื่อแสดง Time (UTC), สถานะของการทำงาน (ถ้าเป็น V แสดงว่าไม่เกิดการเคลื่อนที่ หรือไม่สามารถเชื่อมต่อได้ แต่ถ้าเป็น A หมายความว่าสามารถอ่านค่าได้), Latitude, M/S, Longitude, E/W, Speed over ground, Track made good, Date, Magnetic Variation, E/W และ checksum ซึ่งทางทีมงานผู้เขียนหวังว่าคงเป็นประโยชน์ต่อผู้อ่านบ้างไม่ก็น้อย เพื่อนำไปปรับปรุงโปรแกรมต่อไป
สุดท้ายขอให้สนุกกับการเขียนโปรแกรมครับ
อ้างอิง
(C) 2020, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2020-11-11