Geht nicht gibt's nicht

.

Mittwoch, 1. August 2012

Seatalk NMEA PC Interface



Derzeit beschäftige ich mich mit der Anbindung eines PCs an den Seatalk-Bus. Dies erfordert eine Seatalk-To-USB-Bridge. Nachfolgend beschreibe ich ein derartiges Interface, das darüberninaus auch noch NMEA0183 versteht. Das ganze wird benötigt, wenn man an Bord einen digitalen Kartenplotter auf Basis der OpenSource-Lösung OpenCPN betreiben möchte. Neben Raymarine bieten einige kleine Hersteller Lösungen an, die aber alle nur Teile der Anforderungen abdecken. Eine genauere Beschreibung des Seatalk-Protokolls findet sich hier.

Anforderungen

  • Seatalk-Daten an den PC senden
  • Seatalk-Daten vom PC auf den Seatalkbus geben
  • Zurücklesen der selbst ausgegebenen Daten
  • NMEA 0183-Daten aus bis zu vier Quellen lesen
  • NMEA-Daten filtern
  • Seatalk-Daten filtern
  • Daten so verteilen, dass jeder Bus alle Daten erhält
  • Galvanische Trennung PC zum Bordnetz und zu Seatalk bzw. NMEA
  • Diskreter Aufbau des Seatalk-Bustreibers mit handelsüblichen Transistoren
  • USB-nach-UART-Interface mit FTDI-Chip
  • Datenverarbeitung mit Low-Power ARM Cortex M0 Micro (LPC1114, NXP)
  • Versorgung des Micros über USB
  • einfachster Aufbau mit minimalem BOM

Seatalk Hardware-Interface


Der Aufbau des Hardware-Interface ist hier dargestellt. Die galvanische Trennung wird über schnelle Optokoppler erreicht, eventuell über induktiv gekoppelte Wandler. Als Bustreiber werden handelsübliche Transistoren verwendet, die überall erhältlich sind und somit im Schadenfall einfach gewechselt werden können. Die angegebene Stimulanz simuliert kurze Datenpakete auf dem Bus, Transistor Q1 stellt den Ausgang eines angeschlossenen Seatalk-Gerätes dar. Es ist sichergestellt, das die gesendeten Datenpakete sofort wieder zurückgelesen werden können. Die richtige Invertierung der PC-Daten gegenüber den Seatalk-Daten wird sichergestellt. Um das Bordnetz so wenig wie moeglich zu belasten ist berücksichtigt worden, das Querstroeme in den Optokopplern oder den Bustreibertransistoren nur fliessen, wenn aktive Daten anliegen. Die PC-seitige Versorgung des Interfaces erfolgt direkt ueber USB, die Stromaufnahme sollte 20mA nicht uebersteigen.


Beim Seatalkbus warten die einzelnen Geräte solange, bis der Bus frei ist und senden dann ihre eigenen Daten. Im obigen Timing-Diagramm sind die Seatalk-Daten eines Gerätes dargestellt, das bereits über den Pull-Down-Transistor an den Bus angeschlossen ist (blau).  Ein weiteres Gerät (rot) ist dargestellt, welches Daten auf den Bus legt. Dieses Gerät liest immer den kompletten Dateninhalt des Seatalk-Busses (grün) einschließlich der eigenen Daten. Die Busdaten sind hier gegenüber den einzelnen RX- und TX-Daten jeweils invertiert, was einem 12V-Ruhepegel auf dem Seatalk-Bus entspricht.

Datenbrücke

Die Datenbrücke übernimmt die richtige Verteilung der Daten zwischen dem Seatalk-Bus, bis zu vier NMEA0183-Quellen, einer NMEA0183-Senke sowie dem PC. Der umzusetzende Datenfluss ist unten dargestellt. Innerhalb der Bridge sowie in/aus Richtung des PCs wird mit vereinfachten bzw. gefilterten NMEA-Daten gearbeitet, so dass nur relevante Informationen auf die Busse gegeben werden. Die Daten der bis zu vier NMEA-Eingänge werden dabei zu einem Datenstrom verdichtet.


Der NMEA-Ausgang sieht folgende Daten:
  • Seatalk nach NMEA gewandelt
  • NMEA 1-4
  • NMEA vom PC
Der Seatalk-Bus sieht folgende Daten
  • NMEA 1-4, auf Seatalk gewandelt
  • NMEA vom PC, auf Seatalk gewandelt
  • Original Seatalk-Daten
Der PC sieht folgende Daten
  • NMEA 1-4
  • Original Seatalk-Daten (gewandelte nach Seatalk gewandelte NMEA Daten werden ausgeblendet)
Durch diese Verteilung wird sichergestellt, dass sämtlichen Datenempfängern jeweils die gesamte Datenmenge aller Datenquellen zur Verfügung steht.

Zur Vereinfachung der Buffer werden alle Quell-Daten mit einem der Quelle zugeordneten Quellbyte versehen und dann in eine gemeinsame Warteschlange geschrieben werden. Von dort werden sie stückweise abgeholt und entsprechen einer zuvor festgelegten Zuordnung von Quellbyte und Datenziel auf die entsprechenden Busse geschrieben.

ARM Controller


Für das Controllerboard verwende ich das Target-System eines LPCXpresso-Boards (NXP/Code Red). Das LPCXpresso-Board  kann man an einer Sollbruchstelle trennen, damit erhält man zum einen das Target-System und zum anderen den JTAG-ISP-Programmierteil (LPC-Link), der nur noch an USB angestöpselt werden muss. LPC-Link und Target werden dann über ein Flachbandkabel verbunden. Ueber dieses Interface ist spaeter eine komfortable In-System-Programmierung moeglich (ISP). Fuer die Programmierung in C steht eine umfassende Elipse-Programmierumgebung zur Verfuegung, die kaum  Wünsche offen lässt. Es stehen C-Bibliotheken für viele Anwendungen zur Verfuegung, so. z.B. die benötigten Software-UARTs.


Downloads


Wird fortgesetzt.

1 Kommentare: