GPS - Monitor de señal.
Arduino
xsetaseta@gmail.com
Después de realizar un monitor de GPS con un PC, me dispongo a realizar un monitor con un arduino.
Teniendo toda la información de mi anterior programa
http://seta43.duckdns.org/gps.html la realización en el arduino me a resultado muy fácil.
Además de procesar los datos del GPS los manda por la línea serie al ordenador a 38400bps.
Se conecta un LCD al arduino y se utiliza la librería LiquidCrystal.h .He utilizado la conexión estándar de 4bits según viene en la librería.
The circuit: * LCD RS pin to digital pin 12 * LCD Enable pin to digital pin 11 * LCD D4 pin to digital pin 5 * LCD D5 pin to digital pin 4 * LCD D6 pin to digital pin 3 * LCD D7 pin to digital pin 2 * LCD R/W pin to ground * 10K resistor: * ends to +5V and ground * wiper to LCD VO pin (pin 3)Esquema con el programa fritzing.
Montaje realizado y funcionando.
Video funcionando
http://www.youtube.com/watch?v=uIa1Pc7ilTw&feature=plcp Salida de gps con señales TTL.
Programa para el arduino. |
/* xsetaseta@gmail.com seta comunicaciones */
// include the library code: #include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
char VARI[100]; int contador; boolean stringComplete = false; //char hora[10]; byte pantalla;
struct DATOSGPS{ char cadena[16]; }; struct DATOSGPS datosgps[22];
void split (char separador) { int x,xx,y,z; z=sizeof(VARI); y=0; xx=0; for(x=0;x<z;x++) { datosgps[y].cadena[xx]=VARI[x]; if(VARI[x]==0) break; if( separador==VARI[x]) { datosgps[y].cadena[xx]=0; xx=0; y++; } else { xx++; } } }
void insert(int n,char caracter) { int x; x=sizeof(VARI); for(;x>n;x--) { VARI[x]=VARI[x-1]; } VARI[x]=caracter; }
void setup() { // initialize both serial ports: lcd.begin(16, 2); Serial.begin(38400); }
void serialEvent() { while (Serial.available()) { char inChar = (char)Serial.read(); VARI[contador]=inChar; if (inChar == '\n') { stringComplete = true; VARI[contador]=0; } contador++; } }
void loop() { if (stringComplete) { WriteComand(); } }
void WriteComand() { if(!strncmp(VARI,"$GPGGA",6)) { Serial.print("OK->"); Serial.println(VARI);
split(','); if(pantalla==0) { pantalla=1; lcd.clear(); //Hora strcpy(VARI,datosgps[1].cadena); insert(2,':'); insert(5,':'); VARI[8]=0; Serial.println(VARI); lcd.setCursor(0, 0); lcd.print(VARI); if(datosgps[6].cadena[0]!='0') { lcd.setCursor(0, 1); lcd.print(""); } else { lcd.setCursor(0, 1); lcd.print(" "); }
} else { pantalla=0; lcd.clear(); strcpy(VARI,datosgps[2].cadena); insert(2,' '); Serial.print(VARI); lcd.setCursor(0, 0); lcd.print(VARI); strcpy(VARI,datosgps[3].cadena); Serial.println(VARI); lcd.setCursor(10, 0); lcd.print(VARI); strcpy(VARI,datosgps[4].cadena); insert(3,' '); Serial.print(VARI); lcd.setCursor(0, 1); lcd.print(VARI); strcpy(VARI,datosgps[5].cadena); Serial.println(VARI); lcd.setCursor(11, 1); lcd.print(VARI); } } contador=0; stringComplete = false; }
|
Un saludo.
Juan Galaz
Muy interesante, gracias por compartir tu código, me ayudó bastante para montar un reloj, ahora haber si consigo añadirle milisegundos.... gracias!!
ResponderEliminar