GPS受信モジュールで現在位置を確認できます。

GPS受信モジュールで現在位置を確認

GPS受信モジュールで現在位置を取得します。
OLEDディスプレイに現在位置を経度・緯度で表します。

GPS受信モジュール

OLEDディスプレイ

配線図

GPS受信モジュール
GND 38 
VCC 36 赤
TX     7 緑
OLEDディスプレイ
GND 38 黒
VCC 36 赤
SCL   2 黄
SDA   1 青

 

MicroPythonプログラム

from machine import Pin, UART, I2C
from ssd1306 import SSD1306_I2C

#Import utime library to implement delay
import utime, time

#Oled I2C connection
i2c=I2C(0,sda=Pin(0), scl=Pin(1), freq=400000)
oled = SSD1306_I2C(128, 64, i2c)

#GPS Module UART Connection
gps_module = UART(1, baudrate=9600, tx=Pin(4), rx=Pin(5))

#print gps module connection details
print(gps_module)

#Used to Store NMEA Sentences
buff = bytearray(255)

TIMEOUT = False

#store the status of satellite is fixed or not
FIX_STATUS = False

#Store GPS Coordinates
latitude = ""
longitude = ""
satellites = ""
gpsTime = ""


#function to get gps Coordinates
def getPositionData(gps_module):
    global FIX_STATUS, TIMEOUT, latitude, longitude, satellites, gpsTime
    
    #run while loop to get gps data
    #or terminate while loop after 5 seconds timeout
    timeout = time.time() + 8   # 8 seconds from now
    while True:
        gps_module.readline()
        buff = str(gps_module.readline())
        #parse $GPGGA term
        #b'$GPGGA,094840.000,2941.8543,N,07232.5745,E,1,09,0.9,102.1,M,0.0,M,,*6C\r\n'
        #print(buff)
        parts = buff.split(',')
        
        #if no gps displayed remove "and len(parts) == 15" from below if condition
        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)
                #print("Message ID  : " + parts[0])
                #print("UTC time    : " + parts[1])
                #print("Latitude    : " + parts[2])
                #print("N/S         : " + parts[3])
                #print("Longitude   : " + parts[4])
                #print("E/W         : " + parts[5])
                #print("Position Fix: " + parts[6])
                #print("n sat       : " + parts[7])
                
                latitude = convertToDigree(parts[2])
                # parts[3] contain 'N' or 'S'
                if (parts[3] == 'S'):
                    latitude = -latitude
                longitude = convertToDigree(parts[4])
                # parts[5] contain 'E' or 'W'
                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)
        
#function to convert raw Latitude and Longitude
#to actual Latitude and Longitude
def convertToDigree(RawDegrees):

    RawAsFloat = float(RawDegrees)
    firstdigits = int(RawAsFloat/100) #degrees
    nexttwodigits = RawAsFloat - float(firstdigits*100) #minutes
    
    Converted = float(firstdigits + nexttwodigits/60.0)
    Converted = '{0:.6f}'.format(Converted) # to 6 decimal places
    return str(Converted)
    
    
while True:
    
    getPositionData(gps_module)
    print ('ok')

    #if gps data is found then print it on lcd
    if(FIX_STATUS == True):
        print("fix......")
        oled.fill(0)
        oled.text("Lat: "+latitude, 0, 0)
        oled.text("Lng: "+longitude, 0, 10)
        oled.text("No of Sat: "+satellites, 0, 20)
        oled.text("Time: "+gpsTime, 0, 30)
        oled.show()
        print(latitude)
        print(longitude)
        print(satellites)
        print(gpsTime)
        
        FIX_STATUS = False
        
    if(TIMEOUT == True):
        print("Request Timeout: No GPS data is found.")
        #--------------------------------------------------
        #updated on 5-May-2022
        oled.fill(0)
        oled.text("No GPS data is found", 0, 0)
        oled.show()
        #--------------------------------------------------
        TIMEOUT = False
        
from ssd1306 import SSD1306_I2C
ライブラリーファイルssd1306.pyをPICOに保存しておきます。

電源接続して窓際に置き10分~20分で測位が成功してLEDが点滅するようになります。これは初回のコールドスタートなので次回以後は30秒以内で取得できるそうですが・・・。

実行

はじめは、リクエストタイムアウトで計測できません。

 

計測できると数値が表示されます。

 

Lat: 北緯でLng: 東経です。
測位された数値をGoogleマップで表示すると、しっかり測定場所でした。

自由研究

テンテン
テンテン

正確な位置がわかるということは紛失防止に役立つ「スマートタグ」として使えそうです。