この質問はQiitaにも同じ文面で投稿しています。
Qiitaの同じ質問
マルチポストの理由:できる限り多くの人の目に触れることで、より多くの回答を得る。
Qiitaにて解決しました
謝辞
今回の質問に回答・コメントを送ってくださった皆様、ありがとうございました。
Qiitaでいただいた回答で問題は解決しましたが、teratailでのコメント・回答からも参考になる点があり、解決に近づくことができました。ありがとうございました。詳しくはこちらをご覧ください。また、質問サイトを使い始めて間もないため、知らなかったマナーや、プログラムをする上での心構えも教えていただきました。そちらにも感謝します。
以下が解決したプログラムです。
py
1from machine import Pin, UART 2import utime 3 4def byte2string(bData): 5 try: 6 return bData.decode('utf-8') 7 except: 8 return ''.join(map(chr, bData)) 9 10def nmea2dd(val): 11 val = float(val) 12 d = val // 100 13 m = ((val / 100 - d) * 100) // 60 14 s = (((val / 100 - d) * 100 - m) * 60) / 3600 15 return d + m + s 16 17#gps = UART(0, 9600) 18gps = UART(1, baudrate=9600, tx=Pin(4), rx=Pin(5)) 19 20buf = '' 21satellites = [] 22n_use, latitude, longitude, altitude = 0, 0, 0, 0 23 24print("Start!") 25 26for _ in range(100): #⭐️ 27 if gps.any() > 0: 28 while gps.any() > 0: 29 buf += byte2string(gps.read()) 30 sentences = buf.split('\r\n') 31 for sentence in sentences: 32 if len(sentence) == 0 or sentence[0] != '$': continue 33 part = sentence.split(',') 34 if part[-1].find('*') < 0: #checksum 35 buf = sentence 36 break 37 38 #print(sentence) #すべてのNMEAデータを見る 39 if part[0] == '$GPGGA': 40 if part[6] == '0': continue #is invalid 41 n_use, latitude, longitude, altitude = part[7], part[2], part[4], part[9] 42 if len(latitude) == 0 or len(longitude) == 0: continue 43 latitude, longitude = nmea2dd(latitude), nmea2dd(longitude) 44 if part[0] == '$GPGSA': 45 satellites = [] 46 for n in range(12): 47 if len(part[3 + n]) == 0: continue 48 satellites.append(int(part[3 + n])) 49 if part[0] == '$GPRMC': 50 dmy, hms = part[9], part[1] 51 if len(dmy) == 0 or len(hms) == 0: continue 52 year, month, mday, hour, minute, second = \ 53 int(dmy[4:6]) + 2000, int(dmy[2:4]), int(dmy[0:2]), \ 54 int(hms[0:2]), int(hms[2:4]), int(hms[4:6]) 55 # UTC to JST 56 secs = utime.mktime((year, month, mday, hour, minute, second, 0, 0)) 57 secs += 9 * 3600 # +09:00 58 year, month, mday, hour, minute, second, weekday, yearday = utime.localtime(secs) 59 print(f"時刻:{year:04}/{month:02}/{mday:02} {hour:02}:{minute:02}:{second:02}") 60 if n_use == 0: continue 61 print(f'測位利用衛星:{n_use}個 {satellites}') 62 print("緯度:%.8f" % (latitude)) 63 print("経度:%.8f" % (longitude)) 64 print(f"高度:{altitude}") 65 if part[0] == '$GPZDA': 66 print() 67 68 else: #end of for 69 buf = '' 70 71 utime.sleep(0.1) 72 73print("End;") 74
質問
Raspberry Pi PicoでGPS受信モジュール「AE-GYSFDMAXB」を使う必要があり、ネットで調べ、マイコンとの接続、プログラムまで進み、屋外で実行してみました。ですが、シェルの欄には、大半が
py
1Request Timeout: No GPS data is found.
と表示され、稀に緯度・経度が表示されます。これは、プログラムの問題なのか、それとも、GPS受信モジュールの故障か、もしくは、通信環境が悪いか、何が原因と思われるか教えていただきたいです。もし、プログラムの問題であれば、修正案も教えていただけると助かります。わからないことがありましたら、聞いてください。
マイコン:Raspberry Pi Pico
GPSモジュール:AE-GYSFDMAXB
プログラムの出展を見つけられませんでした。すいません
py
1from machine import Pin, UART, I2C 2 3#Import utime library to implement delay 4import utime, time 5 6#GPS Module UART Connection 7gps_module = UART(1, baudrate=9600, tx=Pin(4), rx=Pin(5)) 8 9#print gps module connection details 10print(gps_module) 11 12#Used to Store NMEA Sentences 13buff = bytearray(255) 14 15TIMEOUT = False 16 17#store the status of satellite is fixed or not 18FIX_STATUS = False 19 20#Store GPS Coordinates 21latitude = "" 22longitude = "" 23satellites = "" 24gpsTime = "" 25 26 27#function to get gps Coordinates 28def getPositionData(gps_module): 29 global FIX_STATUS, TIMEOUT, latitude, longitude, satellites, gpsTime 30 31 #run while loop to get gps data 32 #or terminate while loop after 5 seconds timeout 33 timeout = time.time() + 8 # 8 seconds from now 34 while True: 35 gps_module.readline() 36 buff = str(gps_module.readline()) 37 #parse $GPGGA term 38 #b'$GPGGA,094840.000,2941.8543,N,07232.5745,E,1,09,0.9,102.1,M,0.0,M,,*6C\r\n' 39 #print(buff) 40 parts = buff.split(',') 41 42 #if no gps displayed remove "and len(parts) == 15" from below if condition 43 if (parts[0] == "b'$GPGGA" and len(parts) == 15): 44 if(parts[1] and parts[2] and parts[3] and parts[4] and parts[5] and parts[6] and parts[7]): 45 print(buff) 46 #print("Message ID : " + parts[0]) 47 #print("UTC time : " + parts[1]) 48 #print("Latitude : " + parts[2]) 49 #print("N/S : " + parts[3]) 50 #print("Longitude : " + parts[4]) 51 #print("E/W : " + parts[5]) 52 #print("Position Fix: " + parts[6]) 53 #print("n sat : " + parts[7]) 54 55 latitude = convertToDigree(parts[2]) 56 # parts[3] contain 'N' or 'S' 57 if (parts[3] == 'S'): 58 latitude = -latitude 59 longitude = convertToDigree(parts[4]) 60 # parts[5] contain 'E' or 'W' 61 if (parts[5] == 'W'): 62 longitude = -longitude 63 satellites = parts[7] 64 gpsTime = parts[1][0:2] + ":" + parts[1][2:4] + ":" + parts[1][4:6] 65 FIX_STATUS = True 66 break 67 68 if (time.time() > timeout): 69 TIMEOUT = True 70 break 71 utime.sleep_ms(500) 72 73#function to convert raw Latitude and Longitude 74#to actual Latitude and Longitude 75def convertToDigree(RawDegrees): 76 77 RawAsFloat = float(RawDegrees) 78 firstdigits = int(RawAsFloat/100) #degrees 79 nexttwodigits = RawAsFloat - float(firstdigits*100) #minutes 80 81 Converted = float(firstdigits + nexttwodigits/60.0) 82 Converted = '{0:.6f}'.format(Converted) # to 6 decimal places 83 return str(Converted) 84 85 86while True: 87 88 getPositionData(gps_module) 89 90 #if gps data is found then print it on lcd 91 if(FIX_STATUS == True): 92 print("fix....................................................") 93 print("緯度:",latitude) 94 print("経度:",longitude) 95 print(satellites) 96 print(gpsTime) 97 98 FIX_STATUS = False 99 100 if(TIMEOUT == True): 101 print("Request Timeout: No GPS data is found.") 102 #-------------------------------------------------- 103 #updated on 5-May-2022 104 #-------------------------------------------------- 105 TIMEOUT = False 106
回答3件
あなたの回答
tips
プレビュー