martes, 2 de octubre de 2012

GPS - Monitor de señal. Arduino

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

1 comentario:

  1. Muy interesante, gracias por compartir tu código, me ayudó bastante para montar un reloj, ahora haber si consigo añadirle milisegundos.... gracias!!

    ResponderEliminar