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.
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.
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 |