> Start > Schaltungen
 

OpenSeaMap Wassertiefe Datenlogger
Teil 4 - Einen zweiten NMEA Eingang hinzufügen

Teil 4: Es wird ein zweiter NMEA Eingang hinzugefügt.

Ein zweiter NMEA Anschluss wird benötigt wenn GPS und Echolot verschiedene Geräte mit zwei NMEA Ausgängen sind. Ist ein Kombigerät (GPS mit Echolot) vorhanden, kann der Anschluss 2 einfach frei gelassen werden.

Das MAX232 IC hat bereits einen zweiten Eingang sodass wir an Hardware nichts hinzufügen müssen.
1. NMEA Eingang Pin 13 > USART Ausgang Pin 12 > RX Eingang des Arduino Uno
2. NMEA Eingang Pin 8 > USART Ausgang Pin 9 > Pin 8 des Arduino Uno

Nach einigen Versuchen hat sich herausgestellt dass die Arduino Library SoftwareSerial nicht gut funktioniert wenn auf der Standard RX Schnittstelle des Arduino Uno auch Daten ankommen. Deshalb wird hier die Library AltSoftSerial verwendet. Diese Library wird im Arduino Unterverzeichnis "libraries" entpackt und im Programm mit #include eingebunden. Dann ist ein Neustart des Arduino Programms notwendig damit die Library eingelesen wird.

Die Neuerungen in diesem Programm sind:
port2 wird mit der AltSoftSerial Library bereitgestellt und mit 4800 Baud gestartet
port2 erhält eigene Variablen: inByte2, start2 und nmea2
Die Variablen für den Eingang 1 (RX) werden umbenannt zu inByte1, start1 und nmea1.
Die Funktionen schreiben und schreibeSD bekommen jetzt den jeweils passenden nmea String übergeben.

Die fertige Arduino 1.0.5 Datei zum Download.

Hier der Arduino Programmcode mit Kommentaren:

// Projekt OpenSeaMap Daten Logger
//
// Teil 4 : Einen zweiten NMEA Eingang hinzufügen über den MAX232
// Hardware:  
// GPS mit NMEA 0183 Datenausgang
// MAX232N: RS232 > USART Wandler, Pin 13 > 12 & 8 > 9
// 5 x 1uF Kondensatoren
// Arduino Uno
// Wireless SD Shield http://arduino.cc/en/Main/ArduinoWirelessShield
// MicroSD Karte (ich verwende hier eine 4GB MicroSD Karte)
//
// MOSI - pin 11
// MISO - pin 12
// CLK - pin 13
// CS - pin 4
//
// Matthias Busse 13.12.2013 Version 0.4

#include <SD.h> // SD Karten Library einbinden
#include <AltSoftSerial.h>
// Library von http://www.pjrc.com/teensy/td_libs_AltSoftSerial.html
AltSoftSerial port2; // RX=8, TX=9

const int chipSelect = 4;
int inByte1, inByte2, start1=0, start2=0;
String nmea1 = "OSM Logger SD Karte schreiben, Version 0.4 Matthias Busse"; // reserv.
String nmea2 = "OSM Logger SD Karte schreiben, Version 0.4 Matthias Busse"; // reserv.

void setup() {
  Serial.begin(4800); // 4800 Baud Dateneingang und Konsole
  port2.begin(4800);
  Serial.println(nmea1);
  pinMode(10, OUTPUT);
  if (!SD.begin(chipSelect)) {
    Serial.println("SD Karte nicht vorhanden");
    return;
  }
  Serial.println("SD Karte OK.");
}

void loop() {
    if (Serial.available()) { // Sind Daten an Port 1 ?
    inByte1 = Serial.read(); // dann lesen
    if ((start1==0) && (inByte1 == '$')) {start1=1; nmea1="";} // bei $ starten
    if(start1==1) {nmea1.concat((char)inByte1);} // das Zeichen anhängen
    if((inByte1==13) && (start1==1)) { // CR > Datensatzende > NMEA ausgeben
      start1=0; 
      schreiben(nmea1);
    } 
  }
  if (port2.available()) { // Sind Daten an Port 2 ?
    inByte2 = port2.read(); // dann lesen
    if ((start2==0) && (inByte2 == '$')) {start2=1; nmea2="";} // bei $ starten
    if(start2==1) {nmea2.concat((char)inByte2);} // das Zeichen anhängen
    if((inByte2==13) && (start2==1)) { // CR > Datensatzende > NMEA ausgeben
      start2=0; 
      schreiben(nmea2);
    } 
  }
}  

void schreiben(String nmeawrite) { 
// Nur die gewünschten Datensätze rausschreiben.
// http://wiki.openstreetmap.org/wiki/DE:Water_Depth
// RMC, DPT, DBK, DBS, DBT

  if (nmeawrite.substring(3,6) == "RMC") { // $--RMC
    Serial.println(nmeawrite);
    schreibeSD(nmeawrite);
    return;
  } 
  if (nmeawrite.substring(3,6) == "DPT") { // $--DPT
    Serial.println(nmeawrite);
    schreibeSD(nmeawrite);
    return;
  } 
  if (nmeawrite.substring(3,6) == "DBK") { // $--DBK
    Serial.println(nmeawrite);
    schreibeSD(nmeawrite);
    return;
  } 
  if (nmeawrite.substring(3,6) == "DBS") { // $--DBS
    Serial.println(nmeawrite);
    schreibeSD(nmeawrite);
    return;
  } 
  if (nmeawrite.substring(3,6) == "DBT") { // $--DBT
    Serial.println(nmeawrite);
    schreibeSD(nmeawrite);
    return;
  } 
}

void schreibeSD(String nmeasd) {
// Einen Datensatz auf die SD Karte scheiben
//
// Matthias Busse 1.12.2013 Version 0.1

  File datei = SD.open("osm.txt", FILE_WRITE);
  if (datei) {
    datei.println(nmeasd);
    datei.close();
  }  
  else {
    Serial.println("Fehler: Datei konnte nicht geoeffnet werden.");
  }
}

Das Projekt: Teil 3 < > Teil 5

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

OpenSeaMap Wassertiefe Datenlogger
Teil 4 - Einen zweiten NMEA Eingang hinzufügen

letzte Änderung 12.2013