Noiasca hat mich auf die Existenz der Library TinyGPS/TinyGPSplus hingewiesen. Nach Lesen der Doku und Laden der Beispiele finde ich leider eine prinzipielles Problem: die Beispiele verlangen alle, das GPS an Rx und Tx anzuschließen. Leider verfügt mein GPS nur über einen Tx-Ausgang, da es keine Informationen empfängt, sondern nur sendet. Ich habe also in meinen eigenen Versuchen das Tx-Signal (über einen MAX3232, um den TTL-Pegel zu bekommen) an Pin 0 (Rx) des Arduino angeschlossen, und die Masseleitung des GPS mit GND verbunden.
Die Beispiele aus der TinyGPSplus-Bibliothek verlangen alle: static const int RXPin = 4, TXPin = 3;
Ist zwingend ein Rx-Pin nötig? Kann ich den "simulieren"?
Danke und Gruß
Wie hast du den den angeschlossen ?
Normalerweise braucht es den bei einer UART-Verbindung zwischen den Modulen nicht.
Da könntest du deine Module schnell zerstören, wenn auf die Pins eine höhere Spannung drauf kommt.
Poste mal einen Link deines GPS.
Ja, der ist nötig, du musst dem GPS doch mitteilen, was er machen soll.
Allerdings ist Pin D0 der falsche Pin, da dieser vom USB-Serialwandler belegt ist. Da kannst du schnell Probleme bekommen.
Du brauchst SoftwareSerial für dein GPS.
Wenn Du RX mit einer PIN-Nummer initialisierst, die es auf Deinem Controller nicht gibt, geht das auch.
Da Du den nicht ansprichst, macht es nix aus, da z.B. auch eine 255 hinzuschreiben.
Tipp: Einfach probieren und sehen, was passiert
Na ja, wenn RS232-Pegel an dem Anschluss liegt... Besser nicht direkt auf einen Arduino-Eingang legen. Siehe auch NMEA.DE : OpenSeaMap Wassertiefe Datenlogger - Teil 1 Dateneingang. Der Pegel des Ausgangs meines Geräts scheint zwar bei 5 V zu liegen, da das aber nicht normkonform ist, möchte ich da auf Nummer sicher gehen. Vielleicht wird ja mal ein anderer GPS-Empfänger angeschlossen, und dann steht man dumm da.
Nein, das GPS-Gerät sendet, wenn Betriebsspannung anliegt, ganz stur alle Sekunde je einen RMC-, GGA, GSA-, GSV-, GLL- und VTG-Satz, ohne dass es dazu aufgefordert werden muss. Es hat zwar noch einen ungenutzten Anschluss, der aber laut Datenblatt zur Konfiguration des Geräts dient. Vielleicht ist das sein Rx? Sehe ich mir nochmal an.
Na, "einfach mal probieren und sehen, was passiert". "Einfach mal probieren" = eine nicht existierende Pin-Nummer nehmen, "hat nicht geklappt" = beeindruckt den Sketch nicht. Es wird immer noch angezeigt "check wiring". Zwischenzeitlich habe ich auch den bisher freien Anschluss mit angeschlossen, auch ohne Ergebnis. Weil verschiedentlich bei manchen Leuten auch Rx und Tx gedanklich vertauscht werden, habe ich auch mal die Pins vertauscht, auch ohne Erfolg.
Dann hättest du das auch beschreiben sollen.
Ob das bei deinem Problem hilft, kann ich nicht erkennen. Bedenke, RS232 hat einen negativen Pegel, der nicht UART konform ist.
Schön, da du aber keinen Link postest, also möglichst dein Modul geheim hälst, konnte ich das nicht erraten.
Und was hat dein Problem mit den "Wassertiefe Datenlogger" zu tun ?
Die Pegelanpassung habe ich nur der Vollständigkeit halber erwähnt, sie ist eher ein Nebenthema. Diese Schaltung funktioniert ja wie sie soll, hatte ich auch erwähnt.
Das geht aus den ersten Zeilen des verlinkten Artikels hervor:
"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."
Für die Wahl des Titels in dem Artikel kann ich nichts.
Immer noch die Frage: Warum braucht TinyGPS einen Tx-Pin, wenn dort nichts gesendet werden muss? Oder eher: Wie kann ich auf den Tx-Pin verzichten, wenn mein Gerät nichts sendet?
Vielen Dank für die vielen HInweise. Leider hat das Definieren des Tx-Pins als einen physisch nicht vorhandenen Pin nicht geholfen, sei es 255 oder -1.
Ich habe in dem Zusammenhang auch versucht, statt SoftwareSerial ReceiveOnlySoftwareSerial zu verwenden, ebenfalls ohne Erfolg. In allen Fällen wurde "Kein GPS vorhanden" gemeldet.
Andererseits wird das GPS sehr wohl erkannt, wenn man die Programme von Matthias Busse (http://www.nmea.de/schaltung/osm_log_eingang_v02.ino) verwendet. Hier wird Pin 0 genommen, also der originäre Rx-Pin. Das hat den (kleinen) Nachteil, dass der Pin nicht angeschlossen sein darf (oder das GPS abgeschaltet sein muss), wenn ein Sketch über USB hochgeladen werden soll.
Bilder in der Variante const int RXPin = 4, TXPin = 3;
Der funktinierende Sketch mit Pin 0
der nicht funktionierende Sketch mit Pin 4/3
Achte bei den Echtbildern darauf dass wir wirklich jedes einzelne Kabel erkennen können. Wir sehn nicht auf deinen Schreibstisch. Wir sehen nur was du uns zeigst.
Hast du den mal versucht, ob die Schnittstelle so auch funktioniert ?
Also deinen Sketch mit SoftwareSerial an 2 Pins und einen 2. beliebigen Controller mit selbigem Sketch. Diese beiden per serial (UART) verbinden und schauen, ob die Übertragung funktioniert.
Das wäre doch ein gangbarer Weg um das System zu prüfen.
@noiasca:
Nr. 1 und 2 kein Problem, siehe Anlage. Einige Kondensatoren sind nicht sichtbar, da auf der Unterseite als SMDs.
Nr. 3: Kein Foto, da identisch mit Nr. 1, außer, dass die orange Leitung an Pin 4 liegt, während GND (oder, um keine Möglichkeit auszulassen, der grüne Anschluss vom GPS) an 3 liegt, in beiden Fällen "No GPS detected" GPS-Anschluss.pdf (36.0 KB)
// aus: http://www.nmea.de/schaltung/osm_log_eingang_v01.ino
// 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
}
}
}
Nr. 5:
// "DeviceExample" von TinyGPSPlus-
#include <TinyGPSPlus.h>
#include <SoftwareSerial.h>
/*
This sample sketch demonstrates the normal use of a TinyGPSPlus (TinyGPSPlus) object.
It requires the use of SoftwareSerial, and assumes that you have a
4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx).
*/
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 4800;
// The TinyGPSPlus object
TinyGPSPlus gps;
// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);
void setup()
{
Serial.begin(115200);
ss.begin(GPSBaud);
Serial.println(F("DeviceExample.ino"));
Serial.println(F("A simple demonstration of TinyGPSPlus with an attached GPS module"));
Serial.print(F("Testing TinyGPSPlus library v. ")); Serial.println(TinyGPSPlus::libraryVersion());
Serial.println(F("by Mikal Hart"));
Serial.println();
}
void loop()
{
// This sketch displays information every time a new sentence is correctly encoded.
while (ss.available() > 0)
if (gps.encode(ss.read()))
displayInfo();
if (millis() > 5000 && gps.charsProcessed() < 10)
{
Serial.println(F("No GPS detected: check wiring."));
while(true);
}
}
void displayInfo()
{
Serial.print(F("Location: "));
if (gps.location.isValid())
{
Serial.print(gps.location.lat(), 6);
Serial.print(F(","));
Serial.print(gps.location.lng(), 6);
}
else
{
Serial.print(F("INVALID"));
}
Serial.print(F(" Date/Time: "));
if (gps.date.isValid())
{
Serial.print(gps.date.month());
Serial.print(F("/"));
Serial.print(gps.date.day());
Serial.print(F("/"));
Serial.print(gps.date.year());
}
else
{
Serial.print(F("INVALID"));
}
Serial.print(F(" "));
if (gps.time.isValid())
{
if (gps.time.hour() < 10) Serial.print(F("0"));
Serial.print(gps.time.hour());
Serial.print(F(":"));
if (gps.time.minute() < 10) Serial.print(F("0"));
Serial.print(gps.time.minute());
Serial.print(F(":"));
if (gps.time.second() < 10) Serial.print(F("0"));
Serial.print(gps.time.second());
Serial.print(F("."));
if (gps.time.centisecond() < 10) Serial.print(F("0"));
Serial.print(gps.time.centisecond());
}
else
{
Serial.print(F("INVALID"));
}
Serial.println();
}
#include <SoftwareSerial.h>
SoftwareSerial mySerial(4, 3); // RX, TX
void setup() {
Serial.begin(4800);
Serial.println("Goodnight moon!");
// set the data rate for the SoftwareSerial port
mySerial.begin(4800);
}
void loop() { // run over and over
if (mySerial.available()) {
Serial.write(mySerial.read());
}
if (Serial.available()) {
mySerial.write(Serial.read());
}
}
Serial Monitor auch auf 4800!
Eingang auf pin 4 setzen.
Siehst was hereinkommen?
Nachdem ich noch einmal die Doku zu TinyGPS gelesen habe ("TinyGPS ist es egal, woher es seine Daten bezieht"), habe ich SoftwareSerial raussschmeißen wollen und die Daten vom Pin 0 bziehen wollen. Das klappt auch, wird auch in diesem Thread beschrieben: TinyGPS and hardware serial?. Ich sage mal: Problem gelöst
Danke für die Diskussionen!