PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Arduino soll GPS Daten auswerten



Spacecam
20.01.2014, 18:07
Hallo RN,
ich bin noch recht unvertraut mit dem Ardunio. Er soll eine schnelle Lösung sein um GPS Daten von einer Serienschnittstelle auszuwerten und auf einem Display anzuzeigen.

So soll es angezeigt werden:




#include <LiquidCrystal.h>
#include <DFR_Key.h>


DFR_Key keypad;

int localKey = 0;
String keyString = "";

void setup()
{
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("GPS");
delay(2500);


keypad.setRate(10);

}

void loop()
{

localKey = keypad.getKey();

if (localKey != SAMPLE_WAIT)
{
if(localKey != 1){

lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Lat: 52.22215");
lcd.setCursor(0, 1);
lcd.print("Lon: 11.22215");
}else{
lcd.clear();
lcd.print("Höhe: 11.22215");

}

}
delay(1000);
}





Habe im Internet schon einiges gefunden aber bin nicht wirklich schlau geworden. Wo schließe ich am besten die Schnittstelle am Ardunio an? Sie sendet mit 38400baud, wie kann ich es schnell und einfach ausweren? Also Höhe, Lat und Lon?


Hat jemand von euch sowas schon gemacht?

LG

Sisor
20.01.2014, 23:39
Um das Display anzusteuern fehlt dir nach dem #include <LiquidCrystal.h> noch folgendes:


// Connections:
// rs (LCD pin 4) to Arduino pin 12
// rw (LCD pin 5) to Arduino pin 11
// enable (LCD pin 6) to Arduino pin 10
// LCD pin 15 to Arduino pin 13
// LCD pins d4, d5, d6, d7 to Arduino pins 5, 4, 3, 2
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

int backLight = 13; // pin 13 will control the backlight

Sofern du es diesem Tutorial (http://www.hacktronics.com/Tutorials/arduino-character-lcd-tutorial.html) nach anschließt.

Mit dem GPS will ich mich nächsten Monat beschäftigen, ich bin also auch gespannt auf Antworten / Hilfen zu diesem Thema.

Spacecam
21.01.2014, 16:43
Ich habe das SainSmart LCD Keypad Shield, das läuft wie oben im Script dargestellt ist.
Mit geht's wirklich nur um die Auswertung des GPS strings der per UART ankommt. Wie schließe ich ihn an, wie lese und werte ich ihn aus.

Quelle:
http://playground.arduino.cc/Tutorials/GPS



#include <string.h>
#include <ctype.h>


int ledPin = 13; // LED test pin
int rxPin = 0; // RX PIN
int txPin = 1; // TX TX
int byteGPS=-1;
char linea[300] = "";
char comandoGPR[7] = "$GPRMC";
int cont=0;
int bien=0;
int conta=0;
int indices[13];


void setup() {
pinMode(ledPin, OUTPUT); // Initialize LED pin
pinMode(rxPin, INPUT);
pinMode(txPin, OUTPUT);
Serial.begin(38400);
for (int i=0;i<300;i++){ // Initialize a buffer for received data
linea[i]=' ';
}
}


void loop() {
digitalWrite(ledPin, HIGH);
byteGPS=Serial.read(); // Read a byte of the serial port
if (byteGPS == -1) { // See if the port is empty yet
delay(100);
} else {
// note: there is a potential buffer overflow here!
linea[conta]=byteGPS; // If there is serial port data, it is put in the buffer
conta++;
//Serial.write(byteGPS);
if (byteGPS==13){ // If the received byte is = to 13, end of transmission
// note: the actual end of transmission is <CR><LF> (i.e. 0x13 0x10)
digitalWrite(ledPin, LOW);
cont=0;
bien=0;
// The following for loop starts at 1, because this code is clowny and the first byte is the <LF> (0x10) from the previous transmission.
for (int i=1;i<7;i++){ // Verifies if the received command starts with $GPR
if (linea[i]==comandoGPR[i-1]){
bien++;
}
}
if(bien==6){ // If yes, continue and process the data
for (int i=0;i<300;i++){
if (linea[i]==','){ // check for the position of the "," separator
// note: again, there is a potential buffer overflow here!
indices[cont]=i;
cont++;
}
if (linea[i]=='*'){ // ... and the "*"
indices[12]=i;
cont++;
}
}
Serial.println(""); // ... and write to the serial port
Serial.println("");
Serial.println("---------------");
for (int i=0;i<12;i++){
switch(i){
case 0 :Serial.print("Time in UTC (HhMmSs): ");break;
case 1 :Serial.print("Status (A=OK,V=KO): ");break;
case 2 :Serial.print("Latitude: ");break;
case 3 :Serial.print("Direction (N/S): ");break;
case 4 :Serial.print("Longitude: ");break;
case 5 :Serial.print("Direction (E/W): ");break;
case 6 :Serial.print("Velocity in knots: ");break;
case 7 :Serial.print("Heading in degrees: ");break;
case 8 :Serial.print("Date UTC (DdMmAa): ");break;
case 9 :Serial.print("Magnetic degrees: ");break;
case 10 :Serial.print("(E/W): ");break;
case 11 :Serial.print("Mode: ");break;
case 12 :Serial.print("Checksum: ");break;
}

for (int j=indices[i];j<(indices[i+1]-1);j++){


Serial.print(linea[j+1]);

}
Serial.println("");
}
Serial.println("---------------");
}
conta=0; // Reset the buffer
for (int i=0;i<300;i++){ //
linea[i]=' ';
}
}
}
}




Dieser Script läuft. Ich bin nur nicht in der Lage die Daten auf meinem Display anzuzeigen^^
LG

Sisor
22.01.2014, 09:14
3 Fragen:
1. Welchen Arduino betreibst du?
2. Um welches GPS-Gerät handelt es sich?
3. Was meinst du mit das Skript läuft? Kriegst du Daten auf dem Serial Monitor (Tools-Serial Monitor)?

dussel07
23.01.2014, 21:16
Schon mal HIER (http://www.kh-gps.de/ardu_gps.htm) geschaut?

Spacecam
23.01.2014, 21:38
is quasi genau das was ich suche, nur kann man Hex Files wieder zurück wandeln?

Matthias Ehinger
06.02.2014, 09:40
Hi,
hast Du schon eine Lösung gefunden?
Habe auch die beiden Programme gefunden aber komme nicht so ganz weiter :(