> Start > Schaltungen
 

OpenSeaMap Wassertiefe Datenlogger
Teil 1 - Der Dateneingang

Das OpenSeaMap Projekt möchte mit Hilfe von Sportbooten die Wassertiefen aufnehmen und in die Seekarten einfügen. Hierfür werde ich im mehreren Teile eine Schaltung entwickeln. OpenSeaMap benötigt dafür mindestens die GPS Position, die Uhrzeit, das Datum, die Wassertiefe und einen Korrekturwert. Da GPS und Echolot auf fast allen Sportbooten vorhanden sind, sollen diese Daten eingelesen werden.

Teil 1: NMEA 0183 GPS Daten sollen in den Arduino Uno eingelesen werden und dann auf der Konsole ausgegeben werden.

Das Problem: Die NMEA 0183 Daten haben keinen 5V Pegel und können den Arduino Dateneingang beschädigen , deshalb muss ein Pegelwandler zwischen geschaltet werden.

Die Lösung: Ich habe hier den MAX232N Baustein genommen. Er wandelt RS232 Pegel in USART (5V) für den Arduino Uno. Der Baustein ist günstig und hat nur eine 5V Spannungsversorgung. Dafür benötigt er aber 5 x 1uF Kondensatoren als Beschaltung. Die 5 Kondensatoren werden wie auf Seite 7 des Datenblatt angeschlossen.

MAX232

Die Arduino Verbindung ist wie folgt

Arduino Uno MAX232 Kommentar
5V VCC Pin 16 Spannungsversorgung
GND GND Pin 15 Masse
RX (0) Pin 12 Daten mit TTL Pegel übertragen

Da der MAX232 Pin 12 als Datenausgang gewählt wurde, muss der Dateneingang vom GPS kommend an den MAX232 Pin 13 gelegt werden. Die GPS Daten Masse (Daten - oder GND) werden an den MAX232 GND geschaltet. Das ist für einen Testaufbau ersteinmal ausreichend.

Arduino Uno + MAX232

Die fertige Arduino 1.0.5 Datei zum Download.

Hier nun der Arduino Programmcode mit Kommentaren:

// Projekt OpenSeaMap Daten Logger
//
// Teil 1 : Der Dateneingang
// Hardware:  
// GPS mit NMEA 0183 Datenausgang
// MAX232N: RS232 > USART Wandler
// 5 x 1uF Kondensatoren
// Arduino Uno
//
// Matthias Busse 1.12.2013 Version 0.1

int inByte, start=0;
String nmea = "OSM Logger Dateneingang, Version 0.1 Matthias Busse"; // reservieren

void setup() {
  Serial.begin(4800); // 4800 Baud Dateneingang und Konsole
  Serial.println(nmea);
}

void loop() {
  if (Serial.available()) { // Sind Daten im Eingangspuffer
    inByte = Serial.read(); // dan lesen
    if ((start==0) && (inByte == '$')) {start=1; nmea="";} // bei $ starten
    if(start==1) {nmea.concat((char)inByte);} // das Zeichen anhängen
    if((inByte==13) && (start==1)) { // CR > Datensatzende > NMEA ausgeben
      start=0; 
      Serial.println(nmea); // auf Konsole ausgeben
    } 
  }
}  

Dann werden die Daten so oder ähnlich auf der Konsole ausgegeben.

OSM Logger Dateneingang, Version 0.1 Matthias Busse
$GPGSV,2,1,06,09,11,089,00,08,10,083,00,26,45,148,00,15,69,235,00*71
$GPGSV,2,2,06,27,28,344,00,02,29,168,00*75
$GPRMC,003016.045,V,5415.6290,N,01004.9829,E,,,071113,,*13
$GPGGA,003017.004,5415.6290,N,01004.9829,E,0,00,,,M,,M,,*45
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,1,1,04,09,11,089,00,08,10,083,00,26,45,148,00,27,28,344,00*73
$GPRMC,003017.004,V,5415.6290,N,01004.9829,E,,,071113,,*17
$GPGGA,003018.004,5415.6290,N,01004.9829,E,0,00,,,M,,M,,*4A
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,1,1,04,12,05,217,00,15,69,235,00,26,45,148,00,27,28,344,00*74
$GPRMC,003018.004,V,5415.6290,N,01004.9829,E,,,071113,,*18
$GPGGA,003019.004,5415.6290,N,01004.9829,E,0,00,,,M,,M,,*4B
$GPGSA,A,1,,,,,,,,,,,,,,,*1E

Im RMC Datensatz steht die Uhrzeit (UTC), das Datum und die Position (Länge und Breite).

Der GGA Datensatz enthält ähnlich Werte, aber das Datum fehlt.
Die Datensätze GSA und GSV enthalten Satelliteninformationen und werden deshalb hier nicht benötigt.

Projekt: > Teil 2

Fragen hierzu kann ich aus Zeitgründen nicht beantworten.
Hilfreiche Links sind: Arduino Homepage , MAX232 Datenblatt.

OpenSeaMap Wassertiefe Datenlogger
Teil 1 - Der Dateneingang

letzte Änderung 12.2013