Este módulo que traigo aquí es de un módulo de localización por GPS y que podemos usar con arduino.
Hay varios modelos pero son muy semejantes a su uso.
Foto vía |
Viene con una antena en forma rectangular exterior y que tendremos que unir al módulo.
Se alimenta con 3,6 V. como mucho en algunos modelos pero tiene incorporado la electrónica para usar con 5 V. y tiene un consumo pequeño con 37 mA.
La precisión, según cuenta fabricante, es de 2,5 m. Algo muy favorable sobretodo con el bajo precio que tiene.
Es importante recordar que se debe colocar en el exterior o muy cerca de ventana para captar satélites. Esto se notará porque parpadeará el LED incorporado
CONEXIÓN
Usamos la conexión UART del módulo.
Para no interferir con otras conexiones con el puerto en serie se puede usar la librería SoftSerial y así usar cualquier pin para dicha conexión. En la placa Mega lo tenemos más fácil ya que dispone de varios pines RX/TX, y yo uso los 18 y 19.
He de recordar que se deben cruzar los pines en esta conexión es decir RX(módulo) con TX(arduino) y TX(módulo) con RX(arduino).
Una advertencia, el 18 no hace falta conectarlo, ya que funciona igulamente.
Por los tanto nos quedaría.
Origen Imagen |
Los datos obtenidos están agrupados en un formato GPRMC que es el del protocolo NMEA (National Marine Electronic Association). De esta cadena de datos podemos sacar la longitud, latitud, hora en UTC, fecha, velocidad, variación magnética en grados...A mi me interesan los 5 primeros datos que he nombrado.
Para sacar los datos de esta cadena de GPRMC se puede usar la librería TinyGPS.h (disponible dentro del gestor de librerías de ARDUINO, pero hay que descargarla) o hacerlo "a mano"
Aquí os dejo el programa que uso yo SIN LIBRERÍAS y para arduino Mega, calculo también la hora en Madrid
/*Programa para usar GPS NEO6 con MEGA Modificación Manolo No usa librerías. */ char nmeaSentence[68]; String latitude; //latitud String longitude; //longitud String lndSpeed; //velocidad String gpsTime; //Hora UTC, la hora a 0 grados de longitud del primer meridiano, a 8 horas de la hora de Beijing String madridTime; //Hora de Madrid String gpsDate; //Fecha #define GpsSerial Serial1 #define DebugSerial Serial void setup() //Contenido inicial { GpsSerial.begin(9600); //Tasa de baudios de 9600. DebugSerial.begin(9600); DebugSerial.println("Test GPS Arduino/mega2560"); DebugSerial.println("@ManoloJCR/Tao"); DebugSerial.println("Wating to get gps data..."); } void loop() //Bucle principal { for (unsigned long start = millis(); millis() - start < 1000;) //Escanea la información del GPS continuamente en un segundo { while (GpsSerial.available()) //El puerto serie obtiene los datos y comienza a analizar { char c = GpsSerial.read(); //Leer un byte de datos switch(c) //Determinar el valor del byte { case '$': //Si es $, significa el comienzo de un marco de datos GpsSerial.readBytesUntil('*', nmeaSentence, 67); //Lee los siguientes datos y los guarda en la matriz de caracteres nmeaSentence, hasta 67 bytes //Serial.println(nmeaSentence); latitude = parseGprmcLat(nmeaSentence); //Obtener valor de latitud longitude = parseGprmcLon(nmeaSentence);//Obtener valor de longitud lndSpeed = parseGprmcSpeed(nmeaSentence);//Obtener valor de velocidad gpsTime = parseGprmcTime(nmeaSentence);//Obtener la hora del GPS gpsDate = parseGprmcDate(nmeaSentence);//Obtener la fecha del GPS if(latitude > "") //Imprimir cuando no esté vacío { // DebugSerial.println("latitude: " + latitude); DebugSerial.println("------------------------------------"); int glat = latitude.substring(0,2).toInt(); int mlat = latitude.substring(2,4).toInt(); int slat = latitude.substring(5,8).toInt(); slat = slat*0.0060; DebugSerial.print("Latitud: "); DebugSerial.print(glat); DebugSerial.print("º "); DebugSerial.print(mlat); DebugSerial.print("´ "); DebugSerial.print(slat); DebugSerial.print("´´ "); DebugSerial.println(latitude.substring(11,12)); } if(longitude > "") //Imprimir cuando no esté vacío { // DebugSerial.println("longitude: " + longitude); int glong = longitude.substring(0,3).toInt(); int mlong = longitude.substring(3,5).toInt(); int slong = longitude.substring(6,10).toInt(); slong = slong*0.0060; DebugSerial.print("Longitud: "); DebugSerial.print(glong); DebugSerial.print("º "); DebugSerial.print(mlong); DebugSerial.print("´ "); DebugSerial.print(slong); DebugSerial.print("´´ "); DebugSerial.println(longitude.substring(12,13)); } if(lndSpeed > "") //Imprimir cuando no esté vacío { DebugSerial.println("Speed (knots): " + lndSpeed); } if(gpsDate > "") //Imprimir cuando no esté vacío { //DebugSerial.println("gpsDate: "+gpsDate); int year = gpsDate.substring(4,6).toInt(); int month = gpsDate.substring(2,4).toInt(); int day = gpsDate.substring(0,2).toInt(); DebugSerial.print("gpsDate: "); DebugSerial.print(day); DebugSerial.print("/"); DebugSerial.print(month); DebugSerial.print("/"); DebugSerial.println(year); } if(gpsTime > "") //Imprimir cuando no esté vacío { //DebugSerial.println("gpsTime: "+gpsTime); int hour = gpsTime.substring(0,2).toInt(); int minute = gpsTime.substring(2,4).toInt(); int second = gpsTime.substring(4,6).toInt(); DebugSerial.print("gpsTime: "); DebugSerial.print(hour); DebugSerial.print("h: "); DebugSerial.print(minute); DebugSerial.print("min. "); DebugSerial.print(second); DebugSerial.println("s. "); madridTime = madridgetTime(gpsTime); //Obtener la hora de Madrid //DebugSerial.println("madridTime: "+madridTime); int mhour = madridTime.substring(0,2).toInt(); int mminute = madridTime.substring(2,4).toInt(); int msecond = madridTime.substring(4,6).toInt(); DebugSerial.print("madridTime: "); DebugSerial.print(mhour); DebugSerial.print("h: "); DebugSerial.print(mminute); DebugSerial.print("min. "); DebugSerial.print(msecond); DebugSerial.println("s. "); delay (58000); } } } } } String madridgetTime(String s) { int hour = 0; int minute = 0; int second = 0; int onehour = s.substring(0,1).toInt(); int oneminute = s.substring(2,3).toInt(); hour = s.substring(0,2).toInt(); minute = s.substring(2,4).toInt(); second = s.substring(4,6).toInt(); hour += 1; // DebugSerial.println(minute); // DebugSerial.println(oneminute); if(hour<10) { if(minute<10) s = String(onehour)+String(hour)+String(oneminute)+String(minute)+String(second); else { s = String(onehour)+String(hour)+String(minute)+String(second); } } else { if(minute<10) s = String(hour)+String(oneminute)+String(minute)+String(second); //DebugSerial.println(s); else { s = String(hour) + String(minute) + String(second); } if(hour > 24) hour -= 24; } return s; } //Descomponemos cadena NMEA //La cadena debe ser GPRMC o no la analizamos //Return Latitude String parseGprmcLat(String s) { int pLoc = 0; //paramater location pointer int lEndLoc = 0; //lat parameter end location int dEndLoc = 0; //direction parameter end location String lat; /*Buscamos GPRM al principio cadena */ if(s.substring(0,4) == "GPRM") { // Serial.println(s); for(int i = 0; i < 5; i++) { if(i < 3) { pLoc = s.indexOf(',', pLoc+1); } if(i == 3) { lEndLoc = s.indexOf(',', pLoc+1); lat = s.substring(pLoc+1, lEndLoc); } else { dEndLoc = s.indexOf(',', lEndLoc+1); lat = lat + " " + s.substring(lEndLoc+1, dEndLoc); } } return lat; } } //Descomponemos cadena NMEA //La cadena debe ser GPRMC o no la analizamos //Return Longitude String parseGprmcLon(String s) { int pLoc = 0; //paramater location pointer int lEndLoc = 0; //lat parameter end location int dEndLoc = 0; //direction parameter end location String lon; /*Buscamos GPRM al principio cadena */ if(s.substring(0,4) == "GPRM") { //Serial.println(s); for(int i = 0; i < 7; i++) { if(i < 5) { pLoc = s.indexOf(',', pLoc+1); } if(i == 5) { lEndLoc = s.indexOf(',', pLoc+1); lon = s.substring(pLoc+1, lEndLoc); } else { dEndLoc = s.indexOf(',', lEndLoc+1); lon = lon + " " + s.substring(lEndLoc+1, dEndLoc); } } return lon; } } //Descomponemos cadena NMEA //La cadena debe ser GPRMC o no la analizamos //Return velocidad String parseGprmcSpeed(String s) { int pLoc = 0; //paramater location pointer int lEndLoc = 0; //lat parameter end location int dEndLoc = 0; //direction parameter end location String lndSpeed; /*Buscamos GPRM al principio cadena */ if(s.substring(0,4) == "GPRM") { //Serial.println(s); for(int i = 0; i < 8; i++) { if(i < 7) { pLoc = s.indexOf(',', pLoc+1); } else { lEndLoc = s.indexOf(',', pLoc+1); lndSpeed = s.substring(pLoc+1, lEndLoc); } } return lndSpeed; } } //Descomponemos cadena NMEA //La cadena debe ser GPRMC o no la analizamos //Return date String parseGprmcDate(String s) { int pLoc = 0; //paramater location pointer int lEndLoc = 0; //lat parameter end location int dEndLoc = 0; //direction parameter end location String gpsDate; /*Buscamos GPRM al principio cadena */ if(s.substring(0,4) == "GPRM") { //Serial.println(s); for(int i = 0; i < 10; i++) { if(i < 9) { pLoc = s.indexOf(',', pLoc+1); } else { lEndLoc = s.indexOf(',', pLoc+1); gpsDate = s.substring(pLoc+1, lEndLoc); } } return gpsDate; } } //Descomponemos cadena NMEA //La cadena debe ser GPRMC o no la analizamos //Return tiempo String parseGprmcTime(String s) { int pLoc = 0; //paramater location pointer int lEndLoc = 0; //lat parameter end location int dEndLoc = 0; //direction parameter end location String gpsTime; /*Buscamos GPRM al principio cadena */ if(s.substring(0,4) == "GPRM") { //Serial.println(s); for(int i = 0; i < 2; i++) { if(i < 1) { pLoc = s.indexOf(',', pLoc+1); } else { lEndLoc = s.indexOf(',', pLoc+1); gpsTime = s.substring(pLoc+1, lEndLoc); } } return gpsTime; } } // Turn char[] array into String object String charToString(char *c) { String val = ""; for(int i = 0; i <= sizeof(c); i++) { val = val + c[i]; } return val; }