Inkompatible Version von GPS-Modulen (Baudrate?!)

Hallo liebe OBS-Community,

bei unserem letzten Workshop in Hamburg haben wir anscheinend mal wieder eine neue/ander Charge an GPS-Modulen erwischt und haben das gleiche Fehlerbild bei 8 Sensoren:

  • Optisch/äußerlich sind sie vollkommen identisch zu unseren letzten, funktionierenden Modulen (Beschriftung auf dem IC sagt NEO-6M2. Auf dem PCB steht GY-GPS6MV2 wie immer).

  • Wir haben alle Module vor dem Einbau mit u-center getestet und verifiziert dass die Antennen funktionieren/die Module erfolgreich einen Fix bekommen. Die Module scheinen also prinzipiell funktionsfähig zu sein. Ältere (funktionierende) Module identifizieren sich in der u-center Software als „u-blox 5“ (Angabe in der Fußleiste). Diese neuen, problematischen Module identifizieren sich dort als „u-blox M8/8“ („Richtige“ M8 sind es aber anscheinend auch nicht – die haben einige Leute wohl schon erfolgreich verbaut, und die Module würden anders aussehen).

  • Allerdings können die Module nicht mit dem ESP32 aus dem OBS kommunizieren. Auf dem Display bleibt immer „0 sats SN: 0“ stehen. Und über das serielle Terminal meldet der ESP32 Folgendes:

[    37][I][OpenBikeSensorFirmware.cpp:199] setup(): openbikesensor.org - OBS/v0.18.849
[    39][I][esp32-hal-i2c.c:75] i2cInit(): Initialising I2C Master: sda=21 scl=22 freq=100000
[    44][W][Wire.cpp:301] begin(): Bus already started in Master Mode.
[    90][I][VoltageMeter.cpp:40] VoltageMeter(): Initializing VoltageMeter.
[    91][I][VoltageMeter.cpp:54] VoltageMeter(): Characterized using eFuse Vref
[    93][I][VoltageMeter.cpp:62] VoltageMeter(): eFuse Two Point: NOT supported
[   100][I][VoltageMeter.cpp:66] VoltageMeter(): eFuse Vref: Supported
[   109][I][VoltageMeter.cpp:75] VoltageMeter(): VoltageMeter initialized got 0.21V.
[   146][I][OpenBikeSensorFirmware.cpp:617] loadConfig(): Load cfg
[  1049][W][gps.cpp:356] sendAndWaitForAck(): Retry to send 0x3406 after 200ms.
[  1250][W][gps.cpp:356] sendAndWaitForAck(): Retry to send 0x3406 after 200ms.
[  1250][E][gps.cpp:361] sendAndWaitForAck(): Failed to send cfg. 0x3406 NAK: 0 after 401ms
[  1284][W][gps.cpp:663] encode(): Unexpected GPS char in state null: 4d M
[  1285][W][gps.cpp:663] encode(): Unexpected GPS char in state null: 05
[  1287][W][gps.cpp:663] encode(): Unexpected GPS char in state null: b1 �
[  1293][W][gps.cpp:663] encode(): Unexpected GPS char in state null: 41 A
[  1300][W][gps.cpp:663] encode(): Unexpected GPS char in state null: 2c ,
[  1306][W][gps.cpp:663] encode(): Unexpected GPS char in state null: 33 3
[  1313][W][gps.cpp:663] encode(): Unexpected GPS char in state null: 2c ,
[  1319][W][gps.cpp:663] encode(): Unexpected GPS char in state null: 32 2
[  1326][W][gps.cpp:663] encode(): Unexpected GPS char in state null: 31 1
[  1333][W][gps.cpp:663] encode(): Unexpected GPS char in state null: 2c ,
[  1339][W][gps.cpp:663] encode(): Unexpected GPS char in state null: 30 0
[  1346][W][gps.cpp:663] encode(): Unexpected GPS char in state null: 31 1
[  1352][W][gps.cpp:663] encode(): Unexpected GPS char in state null: 2c ,
[  1359][W][gps.cpp:663] encode(): Unexpected GPS char in state null: 30 0
[  1366][W][gps.cpp:663] encode(): Unexpected GPS char in state null: 38 8
[  1372][W][gps.cpp:663] encode(): Unexpected GPS char in state null: 2c ,
[  1379][W][gps.cpp:663] encode(): Unexpected GPS char in state null: 33 3
[  1385][W][gps.cpp:663] encode(): Unexpected GPS char in state null: 32 2
[  1392][W][gps.cpp:663] encode(): Unexpected GPS char in state null: 2c ,
[  1399][W][gps.cpp:663] encode(): Unexpected GPS char in state null: 31 1
[  1405][W][gps.cpp:663] encode(): Unexpected GPS char in state null: 30 0
[  1412][W][gps.cpp:663] encode(): Unexpected GPS char in state null: 2c ,
[  1418][W][gps.cpp:663] encode(): Unexpected GPS char in state null: 31 1
[  1425][W][gps.cpp:663] encode(): Unexpected GPS char in state null: 34 4
[  1432][W][gps.cpp:663] encode(): Unexpected GPS char in state null: 2c ,
[  1438][W][gps.cpp:663] encode(): Unexpected GPS char in state null: 32 2
[  1445][W][gps.cpp:663] encode(): Unexpected GPS char in state null: 37 7
[  1451][W][gps.cpp:663] encode(): Unexpected GPS char in state null: 0c
[  1683][W][gps.cpp:356] sendAndWaitForAck(): Retry to send 0x3406 after 200ms.
[  1883][W][gps.cpp:356] sendAndWaitForAck(): Retry to send 0x3406 after 200ms.
[  1883][E][gps.cpp:361] sendAndWaitForAck(): Failed to send cfg. 0x3406 NAK: 0 after 400ms
[  2087][W][gps.cpp:356] sendAndWaitForAck(): Retry to send 0x3406 after 200ms.
[  2117][W][gps.cpp:1156] parseNmeaMessage(): Unparsed NMEA GNRMC: $GNRMC,153547.00,A,5334.76976,N,01001.29712,E,0.037,,140523,,,A,V*17
[  2127][W][gps.cpp:1156] parseNmeaMessage(): Unparsed NMEA GNGGA: $GNGGA,153547.00,5334.76976,N,01001.29712,E,1,08,1.01,10.3,M,46.3,M,,*7F
[  2131][W][gps.cpp:1156] parseNmeaMessage(): Unparsed NMEA GNGSA: $GNGSA,A,3,21,01,08,32,10,14,27,,,,,,2.04,1.01,1.78,1*03
[  2142][W][gps.cpp:1156] parseNmeaMessage(): Unparsed NMEA GNGSA: $GNGSA,A,3,14,,,,,,,,,,,,2.04,1.01,1.78,4*09
[  2152][W][gps.cpp:1156] parseNmeaMessage(): Unparsed NMEA GPGSV: $GPGSV,3,1,12,01,52,283,36,02,34,102,16,03,17,227,21,08,49,178,32,0*64
[  2164][W][gps.cpp:1156] parseNmeaMessage(): Unparsed NMEA GPGSV: $GPGSV,3,2,12,10,30,057,26,14,24,299,29,17,06,317,,21,82,287,39,0*62
[  2176][W][gps.cpp:1156] parseNmeaMessage(): Unparsed NMEA GPGSV: $GPGSV,3,3,12,22,34,124,22,24,05,020,,27,20,157,22,32,42,094,27,0*6C
[  2187][W][gps.cpp:1156] parseNmeaMessage(): Unparsed NMEA BDGSV: $BDGSV,1,1,02,12,,,13,14,45,184,42,0*48
[  2196][W][gps.cpp:1156] parseNmeaMessage(): Unparsed NMEA GNTXT: $GNTXT,1,1,01,ANTENNA OK*2B
[  2287][W][gps.cpp:356] sendAndWaitForAck(): Retry to send 0x3406 after 200ms.
[  2287][E][gps.cpp:361] sendAndWaitForAck(): Failed to send cfg. 0x3406 NAK: 0 after 400ms
[  2291][I][gps.cpp:180] softResetGps(): Soft-RESET GPS!
  • Irgendwie sprechen der ESP32 und das GPS-Module nicht die gleiche Sprache. Wenn man davon ausgeht, dass der Befehlssatz sich bei dem Modul nicht geändert hat, dann scheint das irgendwie an einer anderen Codierung oder Baudrate zu liegen?!

  • Laut Web-Interface identifiziert sich das problematische Modul im GPS-Abschnitt so:

Hat jemand Ideen, wie wir hier weiter debuggen können? Wir haben nen ganzen Sack von den Modulen und würden die ungern entsorgen müssen.

Ich habe leider inhaltlich nichts beizutragen, begrüße aber eure Methodik der offenen gemeinsamen Problemlösung mit klarer Kommunikation. Eine wunderbare Zusammenfassung! So geht Open Source! :heart:

Ich drücke die Daumen dass sich ein:e Spezialist:in meldet, die hier helfen kann.

2 „Gefällt mir“

Moin,
ich habe hier seit kurzem zwei (ein Air360, ein Neo6, über Berrybase) und beschäftige mich mit denen ein bißchen. Noch reden die nicht mit PyGPS am seriellen… und pulseview am 8-Port saleae-clone zickt derzeit rum (hat mal funktioniert)… ansonsten bringe ich das gerne zum WS in zwei Wochen mit… DSO ggf. auch. Dann kann man der Sache besser auf den Grund gehen.
Olaf

Hallo,

liest sich sehr ähnlich wie „unser Fehlerbild“.

Auf github ein Issue von mir:

Im Forum ein wenig versteckt unter dem Titel „Modultests“:

Schickt mir gerne mal eines eurer Module. Und spielt auch gerne mal meine Test-Firmware auf. Technisch kann ich hier unterstützen… ggf. auch die Firmware vorbauen über eine CI.

1 „Gefällt mir“

Ich habe kürzlich Änderungen zum Saleae Logic High Level Analyzer (HLA) für das u-blox UBX beigetragen. Auch das könnte die Fehlersuche unterstützen.

(Siehe Release v1.0.2 bzw. aktueller main-Branch.)

Wow, Danke für deine Links. In der Tat sieht das nach dem gleichen Fehlerbild aus.

Wie können wir das Thema denn weiter voranbringen?

  • Ich werde gerne mal deine Test-Firmware aufspielen, und gucken was sie ausspuckt.
  • Ich schicke dir auch gerne eins der betreffenden Module zu

Können wir sonst noch was tun?

1 „Gefällt mir“

Ich habe gerade nochmal die Test-Firmware aktualisiert.

Mein GPS-Modul hier spricht primär NMEA, einzelne UBX-Nachrichten (das Binärprotokoll von u-blox) kann es aber schon. Ich denke wir könnten hier für einzelne Nachrichten prüfen, wie sich das Modul im Detail verhält und vom „echten“ u-blox NEO-6M abweicht.

Wenn mann wollte, könnte man auch die Firmware anpassen - aber hier gibt’s Qualitätsbedenken (Genauigkeit und Fix afair). Vielleicht können wir die aber auch ausräumen.

Die Frage ist tatsächlich wie weit es hilft und zur Stabilität beiträgt hier die NMEA Nachrichten auszuwerten.
Das Wechseln auf 115200 geht offensichtlich per UBX, manch anderes wird aber ignoriert. Insbesondere die Nachrichten die wir verwenden um Zeit & Ort zu erhalten kommen offensichtlich nicht. Zusätzliches Testen hilft da vermutlich wenig, die Ursache ist ja klar. Interessant ist eventuell welche NMEA Nachrichten so ankommen - die Firmware logt das raus: Unparsed NMEA ... dazu hat @maehw schon Details auf Github gepostet - sind es die selben Nachrichten?

Ich das Log oben im Post mal angeschauen und mit meiner Analyse aus issue 340 verglichen:

$GNRMC, $GNGGA, 2x $GNGSA, 3x $GPGSV, $BDGSV, $GNTXT including the text ANTENNA OK)

… findet sich dort genau so wieder.

Gibt es eine Übersicht, welche UBX-Nachrichten gerade genutzt werden?

Vielleicht lässt sich das über NMEA auch abbilden?

Ich habe überlegt in die Test-Firmware alle pollbaren UBX-Nachrichten auch zu pollen und auf eine Antwort zu warten. So müsste man für die GPS-Module heraus bekommen, welches Subset des Original-Protokolls sie bedienen. Könnte die Fehlersuche bei zukünftigen Modulen erleichtern (einsteigerfreundlicher machen).

Gibt es Meinungen dazu?


PS: Ich habe die Test-Firmware über GitHub Actions mittels Arduino-CLI baubar bekommen. Jetzt hänge ich an den nächsten Schritten: GitHub - maehw/ObsHwModuleTests at try-to-build-package - welche vier Binaries müssen alle erzeugt werden?

Nach meinem (gestern angelesenen) Verständnis:

  • Es gibt eine 3 kByte Partitionstabelle (bei mir dann ObsGpsTest.ino.partitions.bin), die wird geflasht an Adresse 0x08000.
  • An Adresse 0x10000 wird die Applikation geflasht (bei mir dann ObsGpsTest.ino.bin).
  • Der Rest wird mit einem Bootloader zu tun haben. Welchen nutzt ihr da? Was eigenes? Kann ich das auch nutzen? Wo komme ich da ran?

Bisher baue ich lokal mit Arduino 1.8.19 und nutze die Boardmittel zum Flashen.

Mit dem oberen Ansatz wäre es denkbar, die Test-Firmware auch per Weboberfläche upzudaten - und auch die Original-OBS-Firmware wieder einzuspielen oder? Also theoretisch ohne esptool (und erst recht ohne IDE und Buildtools, das versuche ich ja durch die CI zu machen).

1 „Gefällt mir“

Ich habe nochmal Zeit in die Fehlersuche investiert.

:eyes: @preya und @michaelAUX zur Info

@preya danke für euer zugeschicktes Modul. Es meldet sich ebenso als „Techtotop Multi-GNSS Receiver“ wie unsere Module und verhält sich auch so. Verhält sich auch so bedeutet:

  • es sendet eigenständig NMEA-Nachrichten
  • es antwortet nahezu nicht auf Poll-Requests von UBX-Nachrichten (Ausnahme: CFG-PRT)

Im Vergleich dazu antworten GPS-Module, die sich als „u-blox AG (…)“ melden auf nahezu alle UBX Poll-Requests, die ich verschicke. (NMEA-Nachrichten sehe ich keine, aber möglicherweise, weil die OBS-Firmware diese im Modul mal deaktiviert hat.)

Ich habe jetzt noch einmal einige Verbesserungen an ObsHwModuleTests/ObsGpsTest at main · maehw/ObsHwModuleTests · GitHub durchgeführt. Damit kann man ohne ein Hardware/Firmware-Experte sein am Verhalten der GPS-Module recht einfach feststellen, was los ist.

Man sollte herausfinden, …

  • ob die Verdrahtung & Baudrate stimmen (Wechsel zwischen den beiden typischen 9600 und 115’200 per „Knopfdruck“ beim Start der Test-Firmware)
  • NMEA-Nachrichten verschickt werden
  • UBX-Nachrichten verschickt werden (was die OBS-Firmware nutzt)
  • überhaupt UBX Poll-Requests beantwortet werden (unterschiedliches Verhalten von u-blox GPS-Modulen und denen von Techtotop)

Ich habe kürzlich nochmal eine Bestellung bei AliExpress angestoßen und jetzt wieder Module bekommen, die behaupten sie wären „u-blox“ (und deren Polling-Request-Antwortverhalten auch so konform ist).

Es ist also ein wenig Glücksspiel, was man bestellt.

Spielt gerne die Test-Firmware auf, ansonsten könnt ihr auch Kontakt aufnehmen und ich teste GPS-Module für euch.

2 „Gefällt mir“

Danke @maehw. Zumindest können wir mit deiner Test-Firmware jetzt vorab Module auf ihre Eignung prüfen.

Dennoch sieht es für mich so aus, als ob die betroffenen Fake-Module auch durch FW-Update/Modifikation nicht auf einen funktionsfähigen/gleicherwetigen Stand gebracht werden können. Die Funktionsweise der Fake-Module scheint sich ja deutlich zu unterscheiden von den funktionierenden Modulen.

Vielen Dank fürs ausführliche Aufschreiben euch! konnte so recht schnell rausfinden dass eins meiner Module Schrott war!

2 „Gefällt mir“