Schlagwort-Archive: GPS

NMEA2000 Position einlesen und auf USB Klartext ausgeben mit dem NMEA Shield

Der NMEA2000 PGN 129025 liefert schnelle Positionsdaten mit Breite und Länge typisch 10x in der Sekunde. Diese werden mit den NMEA Shield am N2K Eingang eingelesen und als Klartext per USB am PC ausgegeben.

Hier das Programm:

// Die Positionsdaten vom PGN 129025 werden mit dem 
// NMEA Shield in den Arduino eingelesen und dann 
// formatiert auf USB ausgegeben.
// 
// PGN 129025 : Position, Rapid Update, typisch 10x pro Sek.
//
// Matthias Busse 12.04.2017 Version 1.0

#include <SPI.h>
#include <Arduino.h>
#include <NMEA2000_CAN.h>
#include <N2kMessages.h>
#include <N2kMessagesEnumToStr.h>

#define N2k_CAN_INT_PIN 21
#define MCP_CAN_RX_BUFFER_SIZE 100

typedef struct {
  unsigned long PGN;
  void (*Handler)(const tN2kMsg &N2kMsg); 
} tNMEA2000Handler;

void PositionRapid(const tN2kMsg &N2kMsg);

tNMEA2000Handler NMEA2000Handlers[]={
  {129025L,&PositionRapid},
  {0,0}
};

template<typename T> void PrintLabelValWithConversionCheckUnDef(const char* label, T val, double (*ConvFunc)(double val)=0, bool AddLf=false ) {
  Serial.print(label);
  if (!N2kIsNA(val)) {
    if (ConvFunc) { Serial.print(ConvFunc(val)); } 
    else { Serial.print(val); }
  } 
  else Serial.print("not available");
  if (AddLf) Serial.println();
}

void setup() {
  Serial.begin(115200);
  Serial.println("NMEA2000 PGN 129025 PositionRapid als Klartext ausgeben");
  NMEA2000.EnableForward(false);
  NMEA2000.SetMsgHandler(HandleNMEA2000Msg);
  NMEA2000.Open();
}

void loop() {
  NMEA2000.ParseMessages();
}

void PositionRapid(const tN2kMsg &N2kMsg) {
// PGN 129025 LAT & LON, Rapid Update.
// kommt typisch 10x pro Sekunde
double Latitude;
double Longitude;
    
  if (ParseN2kPositionRapid(N2kMsg,Latitude,Longitude) ) {
    Serial.print("Breite: ");
    Serial.print(Latitude,5);
    Serial.print(" Laenge: ");
    Serial.println(Longitude,5);
  }
  else {
    Serial.print("Fehler PGN: ");
    Serial.println(N2kMsg.PGN);
  }
}

void HandleNMEA2000Msg(const tN2kMsg &N2kMsg) {
int iHandler;
  
  for (iHandler=0; NMEA2000Handlers[iHandler].PGN!=0 && !(N2kMsg.PGN==NMEA2000Handlers[iHandler].PGN); iHandler++);
  if (NMEA2000Handlers[iHandler].PGN!=0) {
    NMEA2000Handlers[iHandler].Handler(N2kMsg); 
  }
}

Verwendet wurden:
Arduino Software 1.8.0
NMEA Shield Version 1.7
Arduino Mega 2560
NMEA2000 GPS Antenne

von Matthias Busse

Die NMEA 0183 GSV Datensätze vom GPS zerlegen

In den NMEA GSV Datensätzen werden die empfangenen Satelliten Nummern, die Richtung, die Höhe über dem Horizont und die Signalstärke ausgegeben. Hiermit lässt sich die für den Satellitenstatus so typische Draufsicht und die Signalstärkebalken anzeigen.

In jeder Zeile werden bis zu 4 Satellitendaten ausgegeben und für weitere Satelliten werden zusätzliche Zeilen angefügt. Bei einem 12-Kanal GPS Empfänger können also bis zu 3 Zeilen ausgegeben werden wenn 12 Satelliten im Empfangsbereich sind. Weiterlesen

Den NMEA 0183 Datensatz GGA zerlegen in die einzelnen Daten

Der GGA GPS-Datensatz soll in die Bestandteile zerlegt werden. Einzelne Funktionen geben die Werte zurück.

Der GGA Datensatz sieht so aus:
$GPGGA,172643.004,5415.6232,N,01004.9739,E,0,00,,,M,,M,,*43
Er enthält mindestens die Uhrzeit, die Breite und Länge, siehe nmea.de .
Mehr Inhalt ist möglich, aber häufig nicht enthalten.

Zuerst werden die Daten eingelesen. Ich verwende hier eine GPS Antenne und einen selbstgebauten NMEA0183 > UART Wandler mit dem Arduino Uno zusammen. Weiterlesen

Den Arduino Quarz Takt genauer bestimmen mit einer RTC oder mit GPS

Für einen Frequenzzähler mit dem Arduino ist es wichtig den Quarz Takt genau zu bestimmen. Beim Arduino Uno ist er mit 16 MHz angegeben. Der eingebaute Quarz hat einen typischen Fehler von \pm 30ppm (parts per million) also \pm30*10^{-6}.

Das entspricht 30 Sekunden auf 1.000.000 Sekunden beim Arduino.

Für den Frequenzzähler bedeutet das einen Fehler für 100.000 Hz von \pm 3Hz. Da dieser Fehler auch bei 99.999 Hz gilt, können wir von dieser Genauigkeit ausgehen:
> Die ersten 4 Stellen der Frequenz werden korrekt dargestellt. Weiterlesen