GPSモジュール:AE-GYSFDMAXBの通信精度を改善したい
この質問はteratailにも同じ文面で投稿しています。
teratailの同じ質問(https://teratail.com/questions/mgs84ogum3wxze)
マルチポストの理由:できる限り多くの人の目に触れることで、より多くの回答を得る。
Qiita内でいただいた回答で解決しました。
質問
Raspberry Pi PicoでGPS受信モジュール「AE-GYSFDMAXB」を使う必要があり、ネットで調べ、マイコンとの接続、プログラムまで進み、屋外で実行してみました。ですが、シェルの欄には、大半が
Request Timeout: No GPS data is found.
と表示され、稀に緯度・経度が表示されます。これは、プログラムの問題なのか、それとも、GPS受信モジュールの故障か、もしくは、通信環境が悪いか、何が原因と思われるか教えていただきたいです。もし、プログラムの問題であれば、修正案も教えていただけると助かります。わからないことがありましたら、聞いてください。
マイコン:Raspberry Pi Pico
GPSモジュール:AE-GYSFDMAXB
プログラムの出展を見つけられませんでした。すいません
↓実行しているプログラム。長いです。
from machine import Pin, UART, I2C
#Import utime library to implement delay
import utime, time
#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)
#if gps data is found then print it on lcd
if(FIX_STATUS == True):
print("fix....................................................")
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
#--------------------------------------------------
TIMEOUT = False