Adafruit Ultimate GPS: Hat jemand Erfahrung damit?

Hallo Gemeinde

Seid einiger Zeit übe ich mit dem Adafruit Ultimate GPS herum. Klappt eigentlich ganz gut, aber ich kann einfach nicht Befehle ans GPS senden, damit er z.B. nur alle zwei Sekunden GPS-Records schickt und auch nicht, dass er mir nur z.B. $GPRMC-Records schickt.

Meine Umgebung: Mac mit Arduino 1.8.4, Arduino DUE, Adafruit Ultimate GPS (Adafruit Ultimate GPS Breakout - 66 channel w/10 Hz updates [Version 3] : ID 746 : $29.95 : Adafruit Industries, Unique & fun DIY electronics and kits)

Nachfolgend ein minimiertes Sketch, das es auf den Punkt bringt:

#define PMTK_SET_NMEA_UPDATE_500_MILLIHERTZ  "$PMTK220,2000*1C"  // Alle 2 Sekunden, 500 millihertz
#define PMTK_SET_NMEA_UPDATE_1HZ  "$PMTK220,1000*1F"             // Alle Sekunden, 1 Hz

#define PMTK_API_SET_FIX_CTL_500_MILLIHERTZ  "$PMTK300,2000,0,0,0,0*1F"  // Alle 2 Sekunden, 500 millihertz
#define PMTK_API_SET_FIX_CTL_1HZ  "$PMTK300,1000,0,0,0,0*1C"             // Alle Sekunden, 1 Hz

#define PMTK_SET_NMEA_OUTPUT_RMCONLY "$PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29" // nur RMC
#define PMTK_SET_NMEA_OUTPUT_RMCGGA "$PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28"  // nur RMC und GGA

#define PMTK_Q_RELEASE "$PMTK605*31"

void setup() {
  Serial.begin(115200);
  Serial1.begin(9600);

  Serial1.print(PMTK_SET_NMEA_UPDATE_500_MILLIHERTZ);
  Serial1.print("\r\n");
  Serial1.print(PMTK_API_SET_FIX_CTL_500_MILLIHERTZ);
  Serial1.print("\r\n");
  Serial1.print(PMTK_SET_NMEA_OUTPUT_RMCONLY);
  Serial1.print("\r\n");
  Serial1.print(PMTK_Q_RELEASE);
  Serial1.print("\r\n");
}

void loop() {
  char c;
  if (Serial1.available()) {                
    c = Serial1.read();
    Serial.print(c);
  }
}

Die Ausgabe sieht so aus:

$GPGGA,201447.000,4653.6063,N,00729.8076,E,2,07,1.38,522.7,M,48.0,M,0000,0000*6A
$GPGSA,A,3,07,09,13,28,05,20,30,,,,,,1.62,1.38,0.86*01
$GPGSV,4,1,13,30,72,064,31,05,65,254,16,13,43,290,23,28,40,136,33*7F
$GPGSV,4,2,13,07,38,056,34,20,29,309,21,15,11,290,13,09,10,102,18*7A
$GPGSV,4,3,13,02,05,222,,21,05,332,,08,05,055,,27,02,023,*76
$GPGSV,4,4,13,45,,,*7A
$GPRMC,201447.000,A,4653.6063,N,00729.8076,E,0.28,72.72,031017,,,D*53
$GPVTG,72.72,T,,M,0.28,N,0.51,K,D*06
...

Unschwer zu erkennen, dass alle GPS-Records ausgegeben werden. Und ebenso erhalte ich keinerlei Versionsausgaben (Befehl PMTK_Q_RELEASE).
Die NMEA-Befehle erkläre ich hier nicht im Detail. Wer damit Erfahrung hat, kennt sie.

Ich habe schon (fast?) alles versucht: leider ohne Ergebnis. Und - noch schlimmer - ich glaube mich zu erinnern, dass es bei meinen ersten Experimenten vor zwei Jahren funktionierte, bin mir aber nicht mehr sicher.

Für Hilfe wäre ich sehr dankbar.

Hallo,
üblich ist es, das in der FirmWare festgelegt wird was der Chip an Ausgaben liefert.
Bei Deinem ist es so, das er fast alle GPS-Sätze ausgibt.

Wenn der Chip von der VersorgungsSpannung getrennt wird, dann wird er auf “WerksEinstellung” zurück
gesetzt.

Der Chip hat bestimmte Register die Du “einfach” und auch schwierig beschreiben kannst.
Mit “$PMTKxxx,xxx,x*xx” kannst Du diese einfach setzen.
Mit “PMTKxxx,Mode” kannst Du diese schwierig beschreiben.

Wenn Du zum setzen dieser Register keinen Sketch hast, dann wird das in beiden Fällen richtig schwer.
Ich würde mal beim Hersteller des Chip schauen, ob der nicht eine Software zum konfigurieren des Chip liefert.
Gruß und Spaß
Andreas

Datenblatt

Das nächste mal lieferst DU es gleich mit!

Hi SkobyMobil

Mit den obigen Statements (z.B. PMTK_SET_NMEA_OUTPUT_RMCONLY) setze ich doch genau diese Register, die mir dann die Ausgabe-Recordtypen beschränken sollen.

Ich habe noch mit einem Arduino UNO dasselbe versucht: Dort funktioniert es bestens und ich erhalte Bestätigungsrecords in der Ausgabe des GPS Datenstroms:

$PGTOP,11,2*6E
$GPGGA,150028.200,4653.6077,N,00729.7998,E,2,06,1.14,517.4,M,48.0,M,0000,0000*6B
$GPRMC,150028.200,A,4653.6077,N,00729.7998,E,0.27,76.15,051017,,,D*54
$PMTK001,300,3*33
$PGACK,33,1*6F
$PGTOP,11,2*6E

Ich kriegs einfach nicht hin, dass dies auch auf dem Arduino DUE funktioniert. Mit Google finde ich Leute, die haben dasselbe Problem, und andere, die haben es geschafft (wenn auch nicht mit Arduino). Ich glaube, es hängt irgendwie mit dem Serial1 des Arduino DUE zusammen.

Hallo,
das sind ja andere Gegebenheiten…

Wenn es auf einem UNO läuft, aber nicht auf einem DUE, dann sind wohl einige
Lib`s nicht kompatible. Da würde ich einmal anfangen zu suchen.

Dann ist es ein 5V-Shield, der DUE aber ein 3,3V-Arduino.
Das kann funktionieren, muß aber nicht.
Dann hat der eine "merkwürdige" serielle Kommunikation, da sollte die
verwendete Lib schon genau passen.

Schon probiert?

Gruß und Spaß
Andreas

Yepp, SkobyMobil, mit der NeoGPS habe ich mich bereits herumgeschlagen. Leider ist diese Library für meinen Geschmack etwas überdesigned. Und die Dokumentation dazu lässt zu wünschen übrig. SlashDev behauptet in einem englischen Forumseintrag, dass es auf dem DUE geht, aber ich krieg's nicht gebacken. Vielleicht frage ich ihn mal nach einem lauffähigen Beispiel hierzu.

Das Adafruit Ultimate GPS funktioniert mit 3-5V DC. Das ist auch nicht das Problem. Habe das Problem sowohl mit 3.3, als auch mit 5V Speisung.

Du hast recht, es hängt wahrscheinlich mit der Serial-Library des DUE zusammen.

Für den Moment habe ich die Lösung: Ich habe auf dem Arduino UNO die NMEA-Ausgaberecords eingestellt (nur GGA und RMC), eine Batterie, die die Settings "behält" und benutze ihn dann am Arduino DUE. Solange die Batterie hält, bleiben diese Settings nun bestehen.

Danke jedenfalls für Deine Tipps!

Hallo,
dann würde ich einmal anders rangehen.
Der Due hat ja echte Schnittstellen…
Also verbindest Du Dein GPS einfach mit dem Due, Versorgunsspannung und RX/TX
Dann besorgst Du Dir das RICHTIGE Datenblatt für den GPS-Chip, Version
beachten.

Ich gehe mal davon das, das Du mit dem Due eine falsche Befehls-Sequenz mit,
oder, falschen Syntax sendest.
Da Du aber nicht prüfst, was der Chip zurück gibt- wirst Du keinen Fehler
finden können.
Also schreibe Dir einen Sketch, mit dem Du über den seriellen Monitor die
Befehle an den Chip sendest- dann liest Du die Ausgabe des Chip über
“seriell” mit dem Arduino ein.
Das Du den Chip in eine Art “ProgrammierModus” bringen mußt, ist Dir schon
klar?
Eine Lib benötigst Du zum Betrieb dieses Chip nicht.
Gruß und Spaß
Andreas