Mô-đun GPS NEO-6M với Raspberry Pi Pico sử dụng MicroPython

Mô-đun GPS NEO-6M với Raspberry Pi Pico sử dụng MicroPython

Giới thiệu GPS

Hệ thống định vị toàn cầu (GPS) là một hệ thống định vị dựa trên vệ tinh bao gồm 24 vệ tinh quay quanh quỹ đạo, mỗi vệ tinh tạo ra hai mạch quanh Trái đất cứ sau 24 giờ. Các vệ tinh này truyền ba bit thông tin - số của vệ tinh, vị trí của nó trong không gian và thời gian thông tin được gửi đi. Những tín hiệu này được thu thập bởi máy thu GPS, sử dụng thông tin này để tính toán khoảng cách giữa nó và vệ tinh GPS. Với tín hiệu từ ba vệ tinh trở lên, máy thu GPS có thể tam giác vị trí của nó trên mặt đất (tức là kinh độ và vĩ độ) từ vị trí đã biết của các vệ tinh. Với bốn vệ tinh trở lên, máy thu GPS có thể xác định vị trí 3D (tức là vĩ độ, kinh độ và độ cao).

Ngoài ra, máy thu GPS có thể cung cấp dữ liệu về tốc độ và hướng di chuyển của bạn. Bất cứ ai có máy thu GPS đều có thể truy cập hệ thống. Bởi vì GPS cung cấp thời gian thực, định vị ba chiều, điều hướng và thời gian 24 giờ một ngày, 7 ngày một tuần, trên toàn thế giới, nó được sử dụng trong nhiều ứng dụng, bao gồm thu thập dữ liệu GIS, khảo sát và lập bản đồ.

Điểm cần nhớ: Máy thu GPS định vị bất kỳ ba hoặc nhiều vệ tinh nào, tính toán khoảng cách đến từng vệ tinh và sử dụng thông tin này để tạo vị trí riêng của nó. Hoạt động này dựa trên một nguyên tắc toán học đơn giản gọi là Trilateration.

Giới thiệu mô-đun GPS NEO-6M

Mô-đun GPS NEO-6M là một máy thu GPS có thể định vị tất cả các vị trí trên Trái đất vì nó có thể theo dõi khoảng 22 vệ tinh. Nó bao gồm một động cơ định vị u-blox 6 hiệu suất cao. Với kích thước 16 x 12.2 x 2.4 mm, kiến trúc nhỏ gọn cùng với mức tiêu thụ điện năng thấp khiến nó trở thành một lựa chọn tốt cho các dự án IoT. Nhìn chung, nó là một máy thu GPS hiệu quả về chi phí tốt.

Tổng quan về phần cứng

Hãy để chúng tôi tìm hiểu một chút về phần cứng của nó. Để có được chỉ số GPS, chúng ta phải sử dụng mô-đun GPS NEO-6M với ăng-ten. Ăng-ten được gắn chắc chắn vào mô-đun thông qua đầu nối U.FL. Đầu nối này được tìm thấy trên mô-đun GPS.

NEO-6M GPS Chip

Ở giữa mô-đun GPS, bạn có thể tìm thấy chip NEO-6M. Điều này chịu trách nhiệm theo dõi tới 22 vệ tinh và bất kỳ vị trí nào trên Trái đất trên một số kênh. Do tính chất theo dõi rất nhạy cảm của nó, nó làm cho mô-đun NEO-6M trở thành một thiết bị theo dõi GPS phổ biến.

Một số tính năng chính của chip NEO-6M bao gồm:

  • Độ nhạy cao để theo dõi

  • Dòng điện cung cấp thấp (~ 45mA)

  • Có khả năng theo dõi 5 vị trí mỗi giây với độ chính xác 2,5m (ngang).

  • Đi kèm với trang bị PSM còn được gọi là Chế độ tiết kiệm năng lượng. Chế độ này gây ra mức tiêu thụ điện năng rất ít bằng cách BẬT / TẮT mô-đun theo nhu cầu.

  • Sử dụng tuyệt vời như thiết bị theo dõi GPS trong đồng hồ thông minh do tiêu thụ điện năng rất thấp (~ 11mA)

Vị trí sửa chữa chỉ báo LED

Tiến về phía trước, mô-đun đi kèm với một chỉ báo LED cố định vị trí. Đèn LED này cho biết thông qua hiệu ứng nhấp nháy của nó cho dù mô-đun đang tìm kiếm vệ tinh hay đã tìm thấy chúng. Nếu đèn LED nhấp nháy sau mỗi giây, thì nó cho biết rằng vị trí cố định được tìm thấy. Tuy nhiên, nếu đèn LED không nhấp nháy thì mô-đun vẫn đang tìm kiếm các vệ tinh.

Bộ điều chỉnh tình trạng bỏ học thấp 3.3V

Mô-đun cũng được trang bị bộ điều chỉnh LDO 3.3V (MIC5205). Điều này cung cấp một điều chỉnh điện áp tuyến tính hiệu quả với đầu ra tiếng ồn cực thấp và điện áp bỏ học rất thấp. Ngoài ra, mô-đun cũng có thể chịu đựng được 5V một cách dễ dàng.

Kỹ thuật

Bảng dưới đây cho thấy một số thông số kỹ thuật của mô-đun NEO-6M.

 

Kiểu

GPS

Cung

2.7 V-3.6 V

Hoạt động hiện tại

45mA

Nhiệt độ hoạt động

-40 °C ~ 85 °C

Độ chính xác của vị trí nằm ngang

2,5phút

Giao thức truyền thông

NMEA, UBX Nhị phân, RTCM

Tính năng

RTC Crystal và Ngắt / Thức dậy bên ngoài

Giao diện

UART, SPI, USB và DDC

 

Sơ đồ chân của mô-đun NEO 6M

Sơ đồ dưới đây cho thấy sơ đồ chân của mô-đun NEO 6M. Nó bao gồm 4 chân có tên GND, TX, RX và VCC.

GND ·

Đây là chân nối đất sẽ được kết nối với mặt đất của vi điều khiển.

TX

Đây là chân truyền được sử dụng để liên lạc nối tiếp.

RX

Đây là chân thu được sử dụng để liên lạc nối tiếp.

VCC

Đây là chân VCC được sử dụng để cấp nguồn cho mô-đun GPS.

 

Mô-đun NEO-6M giao diện với Raspberry Pi Pico và OLED

Chúng tôi sẽ cần các thành phần sau để kết nối Raspberry Pi Pico của chúng tôi với Màn hình OLED và mô-đun GPS NEO-6M.

  1. Raspberry Pi Pico

  2. Mô-đun GPS NEO-6M

  3. Màn hình OLED SSD1306

  4. Dây kết nối

Raspberry Pi Pico với NEO-6M

Mô-đun GPS NEO-6M có 4 thiết bị đầu cuối mà chúng tôi sẽ kết nối với Raspberry Pi Pico. Chúng tôi sẽ kết nối các thiết bị đầu cuối VCC và GND với các chân 3.3V và GND của bảng Raspberry Pi Pico tương ứng. Chúng tôi sẽ kết nối thiết bị đầu cuối TX (máy phát) và thiết bị đầu cuối RX (máy thu) của mô-đun GPS với các chân UART của bo mạch Pi Pico. Trước tiên chúng ta hãy xem xét các Chân Raspberry Pi Pi UART.

Chân Raspberry Pi Pico UART

Raspberry Pi Pico chứa hai thiết bị ngoại vi giống hệt nhau với các FIFOs 32×8 Tx và 32×12 Rx riêng biệt.

Bảng sau liệt kê các chân GPIO cho cả hai thiết bị ngoại vi UART được tiếp xúc trên sơ đồ chân của bảng phát triển Raspberry Pi Pico.

Chân UART

Chân GPIO

UART0-TX

GP0 / GP12 / GP16

UART0-RX

GP1 / GP13 / GP17

UART1-TX

GP4/GP8

UART1-RX

GP5/GP9

Đối với hướng dẫn này, chúng tôi sẽ sử dụng chân UART1-TX và RX.

 

Raspberry Pi Pico

Mô-đun NEO-6M

3.3V

VCC

GP5 (UART1 RX)

TX

GP4 (UART1 TX)

RX

GND ·

GND ·

 

Raspberry Pi Pico với NEO-6M và OLED

Màn hình OLED có 4 thiết bị đầu cuối mà chúng tôi sẽ kết nối với các thiết bị của mình. Vì màn hình OLED yêu cầu điện áp hoạt động trong phạm vi 3.3-5V, do đó chúng tôi sẽ kết nối thiết bị đầu cuối VCC với 3.3V, điểm chung với bo mạch và mô-đun GPS. SCL của màn hình sẽ được kết nối với chân SCL của mô-đun và SDA của màn hình sẽ được kết nối với SDA của mô-đun. Mặt đất của cả hai thiết bị sẽ được tổ chức chung.

Raspberry Pi Pico Chân I2C

Raspberry Pi Pico có hai bộ điều khiển . Cả hai bộ điều khiển I2C đều có thể truy cập thông qua các chân GPIO của Raspberry Pi Pico. Bảng sau đây cho thấy kết nối của các chân GPIO với cả hai bộ điều khiển I2C. Mỗi kết nối của bộ điều khiển có thể được cấu hình thông qua nhiều chân GPIO như trong hình. Nhưng trước khi sử dụng bộ điều khiển I2C, bạn nên định cấu hình trong phần mềm chân GPIO nào bạn muốn sử dụng với bộ điều khiển I2C cụ thể.

 

 

Bộ điều khiển I2C

Chân GPIO

I2C0 - SDA

GP0 / GP4 / GP8 / GP12 / GP16 / GP20

I2C0 - SCL

GP1 / GP5 / GP9 / GP13 / GP17 / GP21

I2C1 - SDA

GP2 / GP6 / GP10 / GP14 / GP18 / GP26

I2C1 - SCL

GP3 / GP7 / GP11 / GP15 / GP19 / GP27

 

Các kết nối giữa hai thiết bị mà chúng tôi đang sử dụng có thể được nhìn thấy bên dưới.

Màn hình OLED SSD1306

Raspberry Pi Pico

VCC

3.3V

SDA

GP0 (I2C0 SDA)

SCL

GP1 (I2C0 SCL)

GND ·

GND ·

 

Sơ đồ Raspberry Pi Pico với OLED và NEO-6M

Thực hiện theo sơ đồ dưới đây kết nối chúng cho phù hợp.

Chúng tôi đã sử dụng các kết nối tương tự như được chỉ định trong các bảng trên. Tuy nhiên, bạn cũng có thể sử dụng các kết hợp khác của chân SDA / SCL và chân UART.

NMEA cơ bản

Mô-đun GPS NEO-6M gửi dữ liệu GPS ở định dạng NMEA. Nó có nhiều loại khác nhau bao gồm $GPRMC, $GPGGA, v.v. Mỗi trường dữ liệu NMEA được phân tách bằng dấu phẩy và bắt đầu bằng dấu '$'.

Dưới đây, bạn có thể xem cú pháp $GPXXX biểu thị các loại thông báo NMEA khác nhau:

$GPGGA

Dữ liệu sửa chữa hệ thống định vị toàn cầu. Nó cung cấp vị trí 3D và dữ liệu chính xác

$GPGSA

Nó cung cấp GPS DOP và các vệ tinh đang hoạt động

$GPGSV

Nó cung cấp thông tin chi tiết của vệ tinh GPS

$GPGLL

Nó cung cấp Vĩ độ và Kinh độ địa lý

$GPRMC

Nó cung cấp vị trí, vận tốc và thời gian

$GPVTG

Nó cung cấp tốc độ mặt đất / nước kép

Hãy để chúng tôi hiểu cách đọc câu NMEA cơ bản, tức là $GPGGA. Dưới đây là một ví dụ $GPGGA câu NMEA:

  • $: Điều này cho biết phần đầu của câu NMEA

  • GPGGA: Dữ liệu sửa chữa hệ thống định vị toàn cầu

  • 103005 : Đây là thời gian UTC khi dữ liệu được truy cập trong HH: MM: SS. Trong trường hợp này là 10:30:05 UTC

  • 3807.038, N : Vĩ độ 38 độ 07.038′ Bắc

  • 07128.99030, Đ : Kinh độ 71 độ 28.00030′ Đ

  • 1: Sửa chữa GPS

  • 07: Số lượng vệ tinh đang được theo dõi

  • 1.43 : Pha loãng ngang của vị trí

  • 134.5, M : Điều này cho thấy độ cao (m) so với mực nước biển

  • 42.9, M: Chiều cao của Geoid (mực nước biển trung bình)

  • Trường trống: thời gian tính bằng giây kể từ lần cập nhật DGPS cuối cùng

  • Trường trống: Số ID trạm DGPS

  • *78: Dữ liệu tổng kiểm tra

Thư viện SSD1306 OLED MicroPython

Chúng tôi sẽ phải cài đặt thư viện OLED SSD1306 cho MicroPython để tiếp tục với dự án của chúng tôi.

  • Để làm điều đó thành công, hãy mở Thonny IDE của bạn với Raspberry Pi Pico được cắm vào hệ thống của bạn. Đi tới Công cụ > Quản lý gói. Điều này sẽ mở ra Trình quản lý gói Thonny.

  • Tìm kiếm "ssd1306" trong thanh tìm kiếm bằng cách nhập tên của nó và nhấp vào nút 'Tìm kiếm trên PyPI.'

  • Từ các kết quả tìm kiếm sau, hãy nhấp vào kết quả được đánh dấu bên dưới: Micropython-SSD1306

Cài đặt thư viện này.

Sau một lúc, thư viện này sẽ được cài đặt thành công. Bây giờ chúng tôi đã sẵn sàng để lập trình Raspberry Pi Pico của mình với màn hình OLED.

MicroPython Script Lấy dữ liệu GPS từ mô-đun NEO-6M

from machine import Pin, UART, I2C

from ssd1306 import SSD1306_I2C

 

import utime, time

 

i2c=I2C(0,sda=Pin(0), scl=Pin(1), freq=400000)

oled = SSD1306_I2C(128, 64, i2c)

 

gpsModule = UART(1, baudrate=9600, tx=Pin(4), rx=Pin(5))

print(gpsModule)

 

buff = bytearray(255)

 

TIMEOUT = False

FIX_STATUS = False

 

latitude = ""

longitude = ""

satellites = ""

GPStime = ""

 

def getGPS(gpsModule):

    global FIX_STATUS, TIMEOUT, latitude, longitude, satellites, GPStime

    

    timeout = time.time() + 8 

    while True:

        gpsModule.readline()

        buff = str(gpsModule.readline())

        parts = buff.split(',')

    

        if (parts[0] == "b'$GPGGA" and len(parts) == 15):

            if(parts[1] and parts[2] and parts[3] and parts[4] and parts[5] and parts[6] and parts[7]):

                print(buff)

                

                latitude = convertToDegree(parts[2])

                if (parts[3] == 'S'):

                    latitude = -latitude

                longitude = convertToDegree(parts[4])

                if (parts[5] == 'W'):

                    longitude = -longitude

                satellites = parts[7]

                GPStime = parts[1][0:2] + ":" + parts[1][2:4] + ":" + parts[1][4:6]

                FIX_STATUS = True

                break

                

        if (time.time() > timeout):

            TIMEOUT = True

            break

        utime.sleep_ms(500)

        

def convertToDegree(RawDegrees):

 

    RawAsFloat = float(RawDegrees)

    firstdigits = int(RawAsFloat/100) 

    nexttwodigits = RawAsFloat - float(firstdigits*100) 

    

    Converted = float(firstdigits + nexttwodigits/60.0)

    Converted = '{0:.6f}'.format(Converted) 

    return str(Converted)

    

    

while True:

    

    getGPS(gpsModule)

 

    if(FIX_STATUS == True):

        print("Printing GPS data...")

        print(" ")

        print("Latitude: "+latitude)

        print("Longitude: "+longitude)

        print("Satellites: " +satellites)

        print("Time: "+GPStime)

        print("----------------------")

        

        oled.fill(0)

        oled.text("Lat: "+latitude, 0, 0)

        oled.text("Lng: "+longitude, 0, 10)

        oled.text("Satellites: "+satellites, 0, 20)

        oled.text("Time: "+GPStime, 0, 30)

        oled.show()

        

        FIX_STATUS = False

        

    if(TIMEOUT == True):

        print("No GPS data is found.")

        TIMEOUT = False

Mã hoạt động như thế nào?

Chúng tôi sẽ bắt đầu bằng cách nhập lớp UART, Pin và I2C từ mô-đun máy. Tiếp theo, chúng tôi cũng sẽ nhập utime và mô-đun thời gian để kết hợp độ trễ. Chúng tôi cũng sẽ nhập ssd1306 là thư viện màn hình OLED mà chúng tôi đã cài đặt trước đó. Điều này sẽ giúp chúng ta truy cập tất cả các chức năng được xác định bên trong nó.

from machine import Pin, UART, I2C

from ssd1306 import SSD1306_I2C

import utime, time

 

Khởi tạo OLED

Tiếp theo, chúng tôi sẽ khởi tạo các chân I2C GPIO cho SCL và SDA tương ứng. Chúng tôi đã sử dụng chân I2C0 SCL và I2C0 SDA.

Chúng ta đã tạo ra một phương thức I2C() lấy bốn tham số. Tham số đầu tiên là kênh I2C mà chúng ta đang sử dụng. Tham số thứ hai chỉ định chân I2C GPIO của bo mạch được kết nối với đường SDA. Tham số thứ ba chỉ định chân I2C GPIO của bo mạch được kết nối với dòng SCL. Tham số cuối cùng là kết nối tần số của OLED.

Chúng tôi đang đặt SCL trên chân 1 và SDA trên chân 0.

i2c=I2C(0,sda=Pin(0), scl=Pin(1), freq=400000)

Dữ liệu chân SCL và SDA này được lưu trong đối tượng 'i2c' sẽ kết nối với bus I2C và giúp giao tiếp giữa hai thiết bị

Bây giờ, chúng ta sẽ tạo một đối tượng 'oled' của SSD1306_I2C sử dụng width, height và đối tượng i2c làm tham số.

oled = SSD1306_I2C(128, 64, i2c)

Khởi tạo giao tiếp UART

Sau đó, chúng ta sẽ định nghĩa kết nối NEO-6M UART bằng cách tạo một đối tượng 'gpsModule'. Bằng cách sử dụng UART (), chúng tôi đã chỉ định kênh UART làm tham số đầu tiên, tốc độ truyền là tham số thứ hai và các chân TX và RX được sử dụng làm tham số thứ ba và thứ tư. Chúng tôi đang sử dụng UART1 trong trường hợp này với tốc độ truyền 9600 cho giao tiếp uart.

Sau đó, chúng tôi sẽ in các chi tiết kết nối mô-đun NEO-6M này trong bảng điều khiển vỏ Thonny.

gpsModule = UART(1, baudrate=9600, tx=Pin(4), rx=Pin(5))

print(gpsModule)

Biến dữ liệu

Sau đó chúng ta sẽ tạo một đối tượng mảng byte gọi là buff để lưu trữ các câu NMEA.

buff = bytearray(255)

Các biến sau đây sẽ lưu trữ các thông số GPS bao gồm Vĩ độ, Kinh độ, Số lượng vệ tinh và giờ UTC.

latitude = ""

longitude = ""

satellites = ""

GPStime = ""

Chức năng sau đây thu được tọa độ GPS. Chúng tôi đang chạy một vòng lặp thời gian để lấy dữ liệu GPS từ câu NMEA cơ bản $GPGGA. Vĩ độ, Kinh độ, Vệ tinh và thời gian sẽ được lấy từ câu NMEA cho phù hợp và được lưu trong các biến tương ứng của chúng.

def getGPS(gpsModule):

    global FIX_STATUS, TIMEOUT, latitude, longitude, satellites, GPStime

    

    timeout = time.time() + 8 

    while True:

        gpsModule.readline()

        buff = str(gpsModule.readline())

        parts = buff.split(',')

    

        if (parts[0] == "b'$GPGGA" and len(parts) == 15):

            if(parts[1] and parts[2] and parts[3] and parts[4] and parts[5] and parts[6] and parts[7]):

                print(buff)

                

                latitude = convertToDegree(parts[2])

                if (parts[3] == 'S'):

                    latitude = -latitude

                longitude = convertToDegree(parts[4])

                if (parts[5] == 'W'):

                    longitude = -longitude

                satellites = parts[7]

                GPStime = parts[1][0:2] + ":" + parts[1][2:4] + ":" + parts[1][4:6]

                FIX_STATUS = True

                break

                

        if (time.time() > timeout):

            TIMEOUT = True

            break

        utime.sleep_ms(500)

Hàm sau đây có nhiệm vụ chuyển đổi dữ liệu kinh độ và vĩ độ thô thành các giá trị thực tế.

def convertToDegree(RawDegrees):

 

    RawAsFloat = float(RawDegrees)

    firstdigits = int(RawAsFloat/100) 

    nexttwodigits = RawAsFloat - float(firstdigits*100) 

    

    Converted = float(firstdigits + nexttwodigits/60.0)

    Converted = '{0:.6f}'.format(Converted) 

    return str(Converted)

Bên trong vòng lặp vô hạn, trước tiên chúng ta sẽ gọi hàm getGPS (gpsModule). Nếu dữ liệu GPS có sẵn thì hãy in nó cả trên bảng điều khiển vỏ Thonny và màn hình OLED. Nếu dữ liệu GPS không được lấy trong thời gian đã đặt trong chương trình, thì thông báo "Không tìm thấy dữ liệu GPS" sẽ được in trên bảng điều khiển shell.

while True:

    

    getGPS(gpsModule)

 

    if(FIX_STATUS == True):

        print("Printing GPS data...")

        print(" ")

        print("Latitude: "+latitude)

        print("Longitude: "+longitude)

        print("Satellites: " +satellites)

        print("Time: "+GPStime)

        print("----------------------")

        

        oled.fill(0)

        oled.text("Lat: "+latitude, 0, 0)

        oled.text("Lng: "+longitude, 0, 10)

        oled.text("Satellites: "+satellites, 0, 20)

        oled.text("Time: "+GPStime, 0, 30)

        oled.show()

        

        FIX_STATUS = False

        

    if(TIMEOUT == True):

        print("No GPS data is found.")

        TIMEOUT = False

Demo

Sau khi bạn đã sao chép mã sau vào một tệp mới, hãy nhấp vào biểu tượng 'Lưu' để lưu mã chương trình trên PC của bạn.

Sau khi bạn đã lưu mã, hãy nhấn nút Run để tải mã lên mô-đun Raspberry Pi Pico của bạn. Trước khi tải mã lên, hãy đảm bảo rằng bảng chính xác được chọn.

Trong thiết bị đầu cuối shell của IDE, bạn sẽ có thể xem các thông số GPS sau:

Raspberry Pi Pico với thiết bị đầu cuối vỏ NEO 6M

Sau khi mã được tải lên Raspberry Pi Pico, bạn cũng sẽ có thể xem dữ liệu GPS trên OLED:

 

 

Bài viết cùng chuyên mục

NHANH

NHANH

Vì Đổi mới liên tục nên Nhanh hơn

ĐÚNG

ĐÚNG

Coi trọng và ưu tiên việc làm Đúng

ĐỦ

ĐỦ

Tìm và mua Đủ Đơn hàng hơn

KỊP THỜI

KỊP THỜI

Hiệu suất tối ưu bởi Kịp Thời hơn