PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Locosys LS20031 mit Arduino Mega ADK



Arne1985
06.01.2012, 17:57
Ich hoffe ich hab hier den richtigen Bereich erwischt, sonst bitte verschieben.

Hallo,
ich bin neu hier und gerade erst wieder in das Programmieren eingestiegen, habe zwar schon in der Schule mal mit TP6 und Basic gearbeitet und wollte mir jetzt mal an einem Arduino versuchen, nachdem die ganzen standardübungen wunderbar geklappt haben hab ich mir den LS20031 bestellt. Wenn ich den empfänger direkt an Pin 0 und Pin 1 (RX => TX / TX => RX) hänge habe ich mit GPS Fox oder Mini GPS auch sofort eine Verbindung, da 57600 jedoch etwas schnell war habe ich mit einem FTDI Breakout Board alle Sätze bis auf den GPRMC und den GPGGA geaktiviert, Frequenz auf 1Hz und Baud 4800 gesetzt. Seit der Änderung spuckt er gelegentlich komische Daten aus wenn RX und TX angeschlossen sind, ohne RX sind die Ausgabesätze alle ok.


$GPGGA,203619.000,5341.2901,N,01008.3782,E,1,7,1.0 2,42.9,M,45.8,M,,*6F
$GPRMC,203619.000,A,5341.2901,N,01008.3782,E,1.02, 133.48,211211,,,A*61
$GPGGA,203620.000,5341.2901,N,01008.3789,E,1,7,1.0 2,42.9,M,45.8,M,,*6E
$GPRMC,203620.000,A,5341.2901,N,01008.3789,E,1.01, 127.36,211211,,,A*6F
$GPGGA,203621.000,5341.2897,N,01008.3794,E,1,7,1.0 2,43.1,M,45.8,M,,*64
$GPRMC,203621.000,A,5341.2897,N,01008.3794,E,0.67, 128.16,211211,,,A*60
$GPGGA,203622.000,5341.2893,N,01008.3798,E,1,7,1.0 2,43.0,M,45.8,M,,*6E

Bei RX und TX waren die Zeilen teilweise nicht richtig getrennt (mehrer Sätze in einer Zeile und zwischen den Sätzen irgendwelche Zeichen, als würde die Baudrate nicht passen.


Mit dem Beispielprogramm und der Bibliothek TinyGPS hat er jedoch absolut keine Ausgabe von Daten, das zeigt er mir jedoch:

Testing TinyGPS library v. 10
by Mikal Hart

Sizeof(gpsobject) = 103

(nur TX GPS => RX Arduino), langsam bin ich am verzweifeln da ich jetzt schon 2 Wochen am probieren bin und keine Idee mehr habe woran es liegen könnte.

Das LSM303DLH ( 3 Achs Kompass/ Beschleunigungssensorboard) habe ich zum Laufen bekommen indem ich statt dem Mega ADK in der Entwicklungsumgebung das Mega 2560 ausgewählt hab da gab es jedoch nur beim Kompilieren Fehler beim GPS brachte das keine Änderung.


#include <TinyGPS.h>
#include <NewSoftSerial.h>


/* This sample code demonstrates the normal use of a TinyGPS object.
It requires the use of NewSoftSerial, and assumes that you have a
4800-baud serial GPS device hooked up on pins 2(rx) and 3(tx).
*/

TinyGPS gps;
NewSoftSerial nss(2, 3);

void gpsdump(TinyGPS &gps);
bool feedgps();
void printFloat(double f, int digits = 2);

void setup()
{
Serial.begin(9600);
nss.begin(4800);

Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version());
Serial.println("by Mikal Hart");
Serial.println();
Serial.print("Sizeof(gpsobject) = "); Serial.println(sizeof(TinyGPS));
Serial.println();

}

void loop()
{
bool newdata = false;
unsigned long start = millis();

// Every 5 seconds we print an update
while (millis() - start < 5000)
{
if (feedgps())
newdata = true;
}

if (newdata)
{
Serial.println("Acquired Data");
Serial.println("-------------");
gpsdump(gps);
Serial.println("-------------");
Serial.println();
}
}

void printFloat(double number, int digits)
{
// Handle negative numbers
if (number < 0.0)
{
Serial.print('-');
number = -number;
}

// Round correctly so that print(1.999, 2) prints as "2.00"
double rounding = 0.5;
for (uint8_t i=0; i<digits; ++i)
rounding /= 10.0;

number += rounding;

// Extract the integer part of the number and print it
unsigned long int_part = (unsigned long)number;
double remainder = number - (double)int_part;
Serial.print(int_part);

// Print the decimal point, but only if there are digits beyond
if (digits > 0)
Serial.print(".");

// Extract digits from the remainder one at a time
while (digits-- > 0)
{
remainder *= 10.0;
int toPrint = int(remainder);
Serial.print(toPrint);
remainder -= toPrint;
}
}

void gpsdump(TinyGPS &gps)
{
long lat, lon;
float flat, flon;
unsigned long age, date, time, chars;
int year;
byte month, day, hour, minute, second, hundredths;
unsigned short sentences, failed;

gps.get_position(&lat, &lon, &age);
Serial.print("Lat/Long(10^-5 deg): "); Serial.print(lat); Serial.print(", "); Serial.print(lon);
Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");

feedgps(); // If we don't feed the gps during this long routine, we may drop characters and get checksum errors

gps.f_get_position(&flat, &flon, &age);
Serial.print("Lat/Long(float): "); printFloat(flat, 5); Serial.print(", "); printFloat(flon, 5);
Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");

feedgps();

gps.get_datetime(&date, &time, &age);
Serial.print("Date(ddmmyy): "); Serial.print(date); Serial.print(" Time(hhmmsscc): "); Serial.print(time);
Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");

feedgps();

gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
Serial.print("Date: "); Serial.print(static_cast<int>(month)); Serial.print("/"); Serial.print(static_cast<int>(day)); Serial.print("/"); Serial.print(year);
Serial.print(" Time: "); Serial.print(static_cast<int>(hour)); Serial.print(":"); Serial.print(static_cast<int>(minute)); Serial.print(":"); Serial.print(static_cast<int>(second)); Serial.print("."); Serial.print(static_cast<int>(hundredths));
Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");

feedgps();

Serial.print("Alt(cm): "); Serial.print(gps.altitude()); Serial.print(" Course(10^-2 deg): "); Serial.print(gps.course()); Serial.print(" Speed(10^-2 knots): "); Serial.println(gps.speed());
Serial.print("Alt(float): "); printFloat(gps.f_altitude()); Serial.print(" Course(float): "); printFloat(gps.f_course()); Serial.println();
Serial.print("Speed(knots): "); printFloat(gps.f_speed_knots()); Serial.print(" (mph): "); printFloat(gps.f_speed_mph());
Serial.print(" (mps): "); printFloat(gps.f_speed_mps()); Serial.print(" (kmph): "); printFloat(gps.f_speed_kmph()); Serial.println();

feedgps();

gps.stats(&chars, &sentences, &failed);
Serial.print("Stats: characters: "); Serial.print(chars); Serial.print(" sentences: "); Serial.print(sentences); Serial.print(" failed checksum: "); Serial.println(failed);
}

bool feedgps()
{
while (nss.available())
{
if (gps.encode(nss.read()))
return true;
}
return false;
}

Gruß Arne

Arne1985
10.01.2012, 15:14
Ich habe den Empfänger jetzt an Serial1 gehängt und alles mit "nss" durch "Serial1" ersetzt um den echten Seriellen Anschluss zu nutzen, das war vermutlich das Problem, ich kann zwar nicht verstehen warum aber da der LSM303DL auch schon nur anfing zu funktionieren und keine Fehler mehr beim Komileren verursacht hat als ich das Board von Mega ADK zu Mega 2560 in der Entwicklungsumgebung geändert habe wundert mich das nicht mehr ;)

Wenigstens sieht das was er ausspuckt jetzt so aus:




Acquired Data
-------------
Lat/Long(10^-5 deg): 5368830, 1013942 Fix age: 252ms.
Lat/Long(float): 53.68830, 10.13942 Fix age: 309ms.
Date(ddmmyy): 100112 Time(hhmmsscc): 14124400 Fix age: 390ms.
Date: 1/10/2012 Time: 14:12:44.0 Fix age: 455ms.
Alt(cm): 2580 Course(10^-2 deg): 16630 Speed(10^-2 knots): 1
Alt(float): 25.80 Course(float): 166.30
Speed(knots): 0.01 (mph): 0.01 (mps): 0.01 (kmph): 0.02
Stats: characters: 40237 sentences: 528 failed checksum: 0
-------------