
1、Einführung
ATGM336H-5N-Serie ist ein kleines, leistungsstarkes BDS/GNSS-Global-Constellation-Navigation-Modul, basierend auf dem vierten Generation niedrige Leistungsaufnahme GNSS SOC Single-Chip AT6558 von Zhongkewei, unterstützt mehrere Satellitennavigationssysteme und Satellitenvergrößerungssysteme, verfügt über 32 Tracking-Kanäle, kann gleichzeitig GNSS-Signale von sechs Systemen empfangen und gemeinsam Navigation und Positionsbestimmung mit Zeitsteuerung durchführen, hat die Vorteile von hoher Empfindlichkeit, niedriger Leistungsaufnahme und geringem Kosten, ist für Fahrzeugnavigation, Handgerätige Positionsbestimmung und tragbare Geräte geeignet und kann direkt die Ublox MAX-Serie Module ersetzen.
2、Schemazeichnung
GPS-Positionierungsmodul-HS-S78P SchemaKlicken Sie zum Anzeigen
3、Modulparameter
Pinbezeichnung | Beschreibung |
|---|---|
G | GND(Spannungsversorgungsminus) |
V | VCC(Spannungsversorgungsplus) |
R | serielle Kommunikationsübertragung RX-Leitung |
T | serielle Kommunikationsübertragung TX-Leitung |
Spannungsversorgung: 3.3V-5V
Verbindungsmethode: PH2.0 4P Steckerkabel
Montageart: Schraubenfestigung
4, Platinegröße

5、Arduino IDE Beispielprogramm
Achtung: Wenn beim Hochladen des Programms eine Fehlermeldung bezüglich der Bibliotheksdateien angezeigt wird, laden Sie bitte zuerst die Bibliotheksdateien herunter!
Anleitung zum Herunterladen und Importieren der Bibliotheksdateien für das Arduino IDE:Klicken Sie zum Anzeigen
Beispielprogramm (UNO-Entwicklerboard):
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
TinyGPSPlus gps;
SoftwareSerial gps_ss(A5, A4);
void setup(){
gps_ss.begin(9600);
Serial.begin(9600);
}
void loop(){
while (gps_ss.available()) {
if (gps.encode(gps_ss.read())) {
if (gps.location.isValid()) {
Serial.println(gps.location.lat());
Serial.println(gps.location.lng());
}
}
}
}6、ESP32 Python Beispiel (für Mixly IDE /米思齐)
Entwicklungsboard auswählen Python ESP32 [ESP32 Generic(4MB)] auf den Code-Modus umschalten und hochladen
Achtung: Wenn beim Hochladen des Programms eine Fehlermeldung bezüglich der Bibliotheksdateien angezeigt wird, laden Sie bitte zuerst die Bibliotheksdateien herunter!
米思齐(Mixly)IDE ESP32库文件下载及导入教程:Klicken Sie zum Anzeigen
示例程序(ESP32-Python):
from machine import UART, Pin
import time
import machine
# 示例程序
class GPSNMEA:
def __init__(self):
self._buf = bytearray()
self._lat = None
self._lon = None
self._fix_ok = False
self._sats = 0
self._fix_quality = 0
self._hdop = None
self._rmc_valid = False
self._utc_time = None
self._date = None
def has_fix(self):
return bool(self._fix_ok)
def latitude(self):
return self._lat
def longitude(self):
return self._lon
def satellites(self):
return self._sats
def hdop(self):
return self._hdop
def beijing_time(self):
dt = self.beijing_datetime_tuple()
if dt:
y, mo, d, hh, mm, ss = dt
return f"{y:04d}-{mo:02d}-{d:02d} {hh:02d}:{mm:02d}:{ss:02d}"
return None
def beijing_datetime_tuple(self):
if not self._utc_time or not self._date:
return None
day, month, year_2 = self._date
year_full = 2000 + year_2 if year_2 < 80 else 1900 + year_2
h, m, s = self._utc_time
try:
epoch = time.mktime((year_full, month, day, h, m, s, 0, 0))
epoch += 8 * 3600
y, mo, d, hh, mm, ss, _, _ = time.localtime(epoch)
return (y, mo, d, hh, mm, ss)
except:
return None
def feed(self, data):
if data is None:
return
if isinstance(data, int):
data = bytes([data])
elif isinstance(data, memoryview):
data = bytes(data)
elif isinstance(data, str):
data = data.encode('ascii', 'ignore')
self._buf.extend(data)
while True:
idx = self._buf.find(b'\n')
if idx < 0:
break
line = self._buf[:idx + 1]
self._buf = self._buf[idx + 1:]
try:
s = bytes(line).decode('ascii', 'ignore').strip()
except:
continue
if s:
self._handle_sentence(s)
def _handle_sentence(self, s):
if not s.startswith('$') or len(s) < 7:
return
if not self._checksum_ok(s):
return
fields = s.split('*', 1)[0].split(',')
tag = fields[0][1:]
if tag.endswith('RMC'):
self._parse_rmc(fields)
elif tag.endswith('GGA'):
self._parse_gga(fields)
self._fix_ok = self._rmc_valid or (self._fix_quality > 0)
@staticmethod
def _checksum_ok(sentence):
if not sentence.startswith('$') or '*' not in sentence:
return False
try:
data, cshex = sentence[1:].split('*', 1)
except ValueError:
return False
calc = 0
for ch in data:
calc ^= ord(ch)
try:
given = int(cshex.strip()[:2], 16)
except ValueError:
return False
return calc == given
@staticmethod
def _dm_to_deg(dm, neg):
if not dm or '.' not in dm:
return None
i = dm.find('.')
head, tail = dm[:i], dm[i:]
if len(head) < 3:
return None
try:
minutes = float(head[-2:] + tail)
degrees = float(head[:-2]) if head[:-2] else 0.0
except ValueError:
return None
dec = degrees + minutes / 60.0
return -dec if neg else dec
def _parse_rmc(self, f):
if len(f) < 7:
self._rmc_valid = False
return
if len(f) > 1 and f[1]:
try:
hh = int(f[1][0:2]); mm = int(f[1][2:4]); ss = int(f[1][4:6])
self._utc_time = (hh, mm, ss)
except:
pass
if len(f) > 9 and f[9]:
try:
dd = int(f[9][0:2]); mo = int(f[9][2:4]); yy = int(f[9][4:6])
self._date = (dd, mo, yy)
except:
pass
status = f[2] if len(f) > 2 else 'V'
self._rmc_valid = (status == 'A')
if not self._rmc_valid:
return
lat = self._dm_to_deg(f[3] if len(f) > 3 else ', (f[4] if len(f) > 4 else ') == 'S')
lon = self._dm_to_deg(f[5] if len(f) > 5 else ', (f[6] if len(f) > 6 else ') == 'W')
if (lat is not None) and (lon is not None):
self._lat, self._lon = lat, lon
def _parse_gga(self, f):
if len(f) < 10:
return
try:
self._fix_quality = int(f[6]) if f[6] else 0
except ValueError:
self._fix_quality = 0
try:
self._sats = int(f[7]) if f[7] else 0
except ValueError:
self._sats = 0
try:
self._hdop = float(f[8]) if f[8] else None
except ValueError:
self._hdop = None
if self._fix_quality > 0:
lat = self._dm_to_deg(f[2], f[3] == 'S') if len(f) > 4 else None
lon = self._dm_to_deg(f[4], f[5] == 'W') if len(f) > 6 else None
if (lat is not None) and (lon is not None):
self._lat, self._lon = lat, lon
uart = UART(1, baudrate=9600, tx=Pin(17), rx=Pin(16), timeout=1000)
gps = GPSNMEA()
def get_latitude():
return gps.latitude()
def get_longitude():
return gps.longitude()
def get_beijing_time():
return gps.beijing_time()
def get_beijing_datetime_tuple():
return gps.beijing_datetime_tuple()
def has_fix():
return gps.has_fix()
buf = bytearray(256)
# 这个变量必须有,获取时间块使用的这个变量
dt = (0,0,0,0,0,0)
while True:
# -----------------------串口数据切片处理------------------------------------
n = uart.any() # 检查 UART 缓冲区中是否有可读取的字节数量
if n:
# 防止读取的数据超过缓冲区长度
n = min(n, len(buf))
# 从 UART 中读取 n 个字节到 buf 数组中
read_bytes = uart.readinto(buf, n)
if read_bytes:
# 将实际读取的字节切片,并转换成 bytes 类型,传给 GPS 解析器
gps.feed(bytes(buf[:read_bytes]))
#-------------------------------------------------------------------------
if has_fix():
WeiDu = get_latitude()
JingDu = get_longitude()
dt = get_beijing_datetime_tuple()
print(('纬度:' + str(WeiDu)))
print(('经度:' + str(JingDu)))
time.sleep(1)
# 需先让GPS获取时间
if dt:
print('时间:',end ="")
print((str(dt[3]) + ' : '),end ="")
print((str(dt[4]) + ' : '),end ="")
print(str(dt[5]))
else:
print('解析失败')
7、米思齐 Mixly 示例程序(图形化语言) in Deutsch
Beispielprogramm (UNO-Entwicklerboard):2、第二步将UNO开发板的库文件下载后解压在桌面。
Achtung: Wenn beim Hochladen des Programms eine Fehlermeldung bezüglich der Bibliotheksdateien angezeigt wird, laden Sie bitte zuerst die Bibliotheksdateien herunter!
米思齐(Mixly)IDE Arduino库文件下载及导入教程:Klicken Sie zum Anzeigen

Beispielprogramm (ESP32-Entwicklungsboard):2、第二步将UNO开发板的库文件下载后解压在桌面。
Achtung: Wenn beim Hochladen des Programms eine Fehlermeldung bezüglich der Bibliotheksdateien angezeigt wird, laden Sie bitte zuerst die Bibliotheksdateien herunter!
米思齐(Mixly)IDE ESP32库文件下载及导入教程:Klicken Sie zum Anzeigen

8、Testumgebung Einrichtung
Testumgebung für Arduino UNO einrichten
Vorbereiten Sie die Komponenten:
UNO-R3 Entwicklungsboard *1
UNO-R3 EXP-Erweiterungsplatte *1
USB type-c Datenkabel *1
HS-S78P GPS-Modul*1
PH2.0 4P-Doppelkopfsteckerleitung *1
Schaltplan der Leitung:

ESP32 Testumgebung einrichten
Vorbereiten Sie die Komponenten:Wird aktualisiert...
Schaltplan der Leitung:Wird aktualisiert...
9、Video-Tutorial
Arduino UNO Videoanleitung:Klicken Sie zum Anzeigen
ESP32 Python Videoanleitung:Klicken Sie zum Anzeigen
10、Testergebnis
Arduino UNO Testergebnis:
Einfügen Sie den Code, um Ihre Länge und Breite am Computer-Serialport zu sehen.(Hinweis: Innen könnte es aufgrund von Antennensignalen nicht möglich sein, den Breiten- und Längengrad anzuzeigen, am besten im freien, offenen Bereich testen)

ESP32 Testergebnis:
Wird aktualisiert...