[TH] ESP32 & NEO-6MV2 GPS Module

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

ภาพที่ 1 โมดูลจีพีเอส NEO-6MV2

NEO-6MV2 GPS Module

โมดูลจีพีเอส NEO-6MV2 ประกอบด้วยตัวภาครับจีพีเอสดังภาพที่ 2 และสายอากาศดังภาพที่ 3 ซึ่งโมดูลนี้เป็นภาครับสัญญาณจีพีเอสแบบเคลื่อนที่ได้ ซึ่งออกแบบตามการทำงานบอกพิกัดของ u-blox 6 ซึ่งคุณสมบัติของโมดูลจีพีเอสเป็นดังต่อไปนี้

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

การเชื่อมต่อ

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

ภาพที่ 4 ขาเชื่อมต่อของโมดูลจีพีเอส

การต่อระหว่าง ESP32 และโมดูลจีพีเอส เป็นตามตางรางต่อไปนี้

ESP32NEO-GMV2 GPS Module
3V3Vcc
GNDGND
21RX
22TX

ตัวอย่างโปรแกรม

ตัวอย่างโปรแกรม 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)
ภาพที่ 5 ผลลัพธ์จาก code19-1

ตัวอย่างโปรแกรม 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("------------")
ภาพที่ 6 ตัววอย่างผลลัพธ์จาก code19-2
ภาพที่ 7 ตัวอย่างเมื่อนำไปประยุกต์กับการแสดงด้วยโมดูลกราฟิกแอลซีดี

สรุป

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

สุดท้ายขอให้สนุกกับการเขียนโปรแกรมครับ

อ้างอิง

  1. GPS Module NEO6MV2

(C) 2020, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2020-11-11