{"id":4577,"date":"2010-12-18T00:59:46","date_gmt":"2010-12-17T23:59:46","guid":{"rendered":"http:\/\/www.pesadillo.com\/pesadillo\/?p=4577"},"modified":"2010-12-01T15:00:12","modified_gmt":"2010-12-01T14:00:12","slug":"gps-con-arduino","status":"publish","type":"post","link":"https:\/\/www.pesadillo.com\/pesadillo\/?p=4577","title":{"rendered":"GPS con Arduino"},"content":{"rendered":"<h2>Conecta un m\u00f3dulo GPS<\/h2>\n<p>Para la realizaci\u00f3n de \u00e9ste ejemplo he utilizado un <a rel=\"nofollow\" href=\"http:\/\/www.parallax.com\/detail.asp?product_id=28146\" target=\"_blank\">m\u00f3dulo GPS de Parallax<\/a> que utiliza un interfaz serie. La conexi\u00f3n a establecer para comunicarse con Arduino, seg\u00fan la <a rel=\"nofollow\" href=\"http:\/\/www.parallax.com\/dl\/docs\/prod\/acc\/GPSManualV1.1.pdf\" target=\"_blank\">data sheet del GPS<\/a> , debe ser una conexi\u00f3n serie as\u00edncrona a 4800 bps (TTL-level interface, 8 data bits, no parity, 1 stop bit, non-inverted).<\/p>\n<p style=\"text-align: center;\">\u00a0<a href=\"http:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2010\/11\/446233292_7603591594_o1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4578\" title=\"GPS\" src=\"http:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2010\/11\/446233292_7603591594_o1.jpg\" alt=\"\" width=\"967\" height=\"600\" srcset=\"https:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2010\/11\/446233292_7603591594_o1.jpg 967w, https:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2010\/11\/446233292_7603591594_o1-300x186.jpg 300w\" sizes=\"auto, (max-width: 967px) 100vw, 967px\" \/><\/a><\/p>\n<p><em>Figura 1. <a rel=\"nofollow\" href=\"http:\/\/www.parallax.com\/detail.asp?product_id=28146\" target=\"_blank\">M\u00f3dulo GPS de Parallax<\/a><\/em><\/p>\n<p>El m\u00f3dulo GPS tiene dos modos de funcionamiento en funci\u00f3n del valor que introduzcamos por el pin RAW:<\/p>\n<ul>\n<li><strong>RAW = HIGH<\/strong> &#8211;&gt; <em>SMART MODE<\/em>. Permite escribir comandos al GPS y escuchar la respuesta de este. Es el modo por defecto si el pin RAW se deja desconectado.<\/li>\n<li><strong>RAW = LOW<\/strong> &#8211;&gt; <em>RAW MODE<\/em>. Modo escucha. El GPS escribe informaci\u00f3n el puerto serie que debemos interpretar.<\/li>\n<\/ul>\n<p>\u00a0<\/p>\n<p>En este ejemplo consta de dos partes:<\/p>\n<h3>1.- Ejemplo 1: Escucha e interpreta la informaci\u00ef\u00bf\u00bdn proporcionada por el GPS.<\/h3>\n<p style=\"text-align: center;\">\u00a0<a href=\"http:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2010\/11\/446200115_b79652ad27_o1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4579\" title=\"conexion\" src=\"http:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2010\/11\/446200115_b79652ad27_o1.jpg\" alt=\"\" width=\"633\" height=\"292\" srcset=\"https:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2010\/11\/446200115_b79652ad27_o1.jpg 791w, https:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2010\/11\/446200115_b79652ad27_o1-300x138.jpg 300w\" sizes=\"auto, (max-width: 633px) 100vw, 633px\" \/><\/a><\/p>\n<p><em>Figura 2. Esquema de conexionado del ejemplo 1.<\/em><\/p>\n<p><strong>C\u00f3<\/strong><strong>digo fuente<\/strong><\/p>\n<pre> \/*<\/pre>\n<p>\u00a0<\/p>\n<pre> Ejemplo de conexion de un modulo GPS de Parallax a Arduino<\/pre>\n<p>\u00a0<\/p>\n<pre> Ejemplo 1: Escucha e interpreta la informacion proporcionada por el GPS.<\/pre>\n<p>\u00a0<\/p>\n<pre> Igor Gonzaez Martin. 05-04-2007\r\n igor.gonzalez.martin@gmail.com<\/pre>\n<p>\u00a0<\/p>\n<pre> Lo que hace es interpretar el comando $GPRMC al recibirlo del GPS\r\n y sacar el resultado por pantalla.<\/pre>\n<p>\u00a0<\/p>\n<pre> Ejemplo:<\/pre>\n<p>\u00a0<\/p>\n<pre> $GPRMC<\/pre>\n<p>\u00a0<\/p>\n<pre> Recommended minimum specific GPS\/Transit data<\/pre>\n<p>\u00a0<\/p>\n<pre> eg1. $GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,130998,011.3,E*62\r\n eg2. $GPRMC,225446,A,4916.45,N,12311.12,W,000.5,054.7,191194,020.3,E*68<\/pre>\n<p>\u00a0<\/p>\n<pre>           225446       Time of fix 22:54:46 UTC\r\n           A            Navigation receiver warning A = Valid position, V = Warning\r\n           4916.45,N    Latitude 49 deg. 16.45 min. North\r\n           12311.12,W   Longitude 123 deg. 11.12 min. West\r\n           000.5        Speed over ground, Knots\r\n           054.7        Course Made Good, degrees true\r\n           191194       UTC Date of fix, 19 November 1994\r\n           020.3,E      Magnetic variation, 20.3 deg. East\r\n           *68          mandatory checksum<\/pre>\n<p>\u00a0<\/p>\n<pre> eg3. $GPRMC,220516,A,5133.82,N,00042.24,W,173.8,231.8,130694,004.2,W*70\r\n              1    2    3    4    5     6    7    8      9     10  11 12<\/pre>\n<p>\u00a0<\/p>\n<pre>      1   220516     Time Stamp\r\n      2   A          validity - A-ok, V-invalid\r\n      3   5133.82    current Latitude\r\n      4   N          North\/South\r\n      5   00042.24   current Longitude\r\n      6   W          East\/West\r\n      7   173.8      Speed in knots\r\n      8   231.8      True course\r\n      9   130694     Date Stamp\r\n      10  004.2      Variation\r\n      11  W          East\/West\r\n      12  *70        checksum<\/pre>\n<p>\u00a0<\/p>\n<pre> eg4. for NMEA 0183 version 3.00 active the Mode indicator field is added\r\n     $GPRMC,hhmmss.ss,A,llll.ll,a,yyyyy.yy,a,x.x,x.x,ddmmyy,x.x,a,m*hh\r\n Field #\r\n 1    = UTC time of fix\r\n 2    = Data status (A=Valid position, V=navigation receiver warning)\r\n 3    = Latitude of fix\r\n 4    = N or S of longitude\r\n 5    = Longitude of fix\r\n 6    = E or W of longitude\r\n 7    = Speed over ground in knots\r\n 8    = Track made good in degrees True\r\n 9    = UTC date of fix\r\n 10   = Magnetic variation degrees (Easterly var. subtracts from true course)\r\n 11   = E or W of magnetic variation\r\n 12   = Mode indicator, (A=Autonomous, D=Differential, E=Estimated, N=Data not valid)\r\n 13   = Checksum<\/pre>\n<p>\u00a0<\/p>\n<pre> *\/<\/pre>\n<p>\u00a0<\/p>\n<pre> #include &lt;string.h&gt;\r\n #include &lt;ctype.h&gt;<\/pre>\n<p>\u00a0<\/p>\n<pre> int ledPin = 13;                  \/\/ PIN para test\r\n int rxPin = 0;                    \/\/ PIN de TX\r\n int txPin = 1;                    \/\/ PIN de TX\r\n int byteGPS=-1;\r\n char linea[300] = \"\";\r\n char comandoGPR[7] = \"$GPRMC\";\r\n int cont=0;\r\n int bien=0;\r\n int conta=0;\r\n int indices[13];<\/pre>\n<p>\u00a0<\/p>\n<pre> void setup() {\r\n   pinMode(ledPin, OUTPUT);       \/\/ Inicializando PIN-es\r\n   pinMode(rxPin, INPUT);\r\n   pinMode(txPin, OUTPUT);\r\n   Serial.begin(4800);\r\n   for (int i=0;i&lt;300;i++){       \/\/ Incializaci\u00ef\u00bf\u00bdn del buffer de recepci\u00ef\u00bf\u00bdn\r\n     linea[i]=' ';\r\n   }\r\n }<\/pre>\n<p>\u00a0<\/p>\n<pre> void loop() {\r\n   digitalWrite(ledPin, HIGH);\r\n   byteGPS=Serial.read();         \/\/ Lee un byte del puerto serie\r\n   if (byteGPS == -1) {           \/\/ Comprueba si hay algo en el buffer del puerto serie\r\n     delay(100);\r\n   } else {\r\n     linea[conta]=byteGPS;        \/\/ Si hay algo lo escribe en el buffer de recepci\u00ef\u00bf\u00bdn.\r\n     conta++;\r\n     Serial.print(byteGPS);\r\n     if (byteGPS==13){            \/\/ Si el byte recibido es 13 = Fin de comando\r\n       digitalWrite(ledPin, LOW);\r\n       cont=0;\r\n       bien=0;\r\n       for (int i=1;i&lt;7;i++){     \/\/ Comprueba si el comando recibido es un &amp;GPRMC\r\n         if (linea[i]==comandoGPR[i-1]){\r\n           bien++;\r\n         }\r\n       }\r\n       if(bien==6){               \/\/ Si lo es ... procesa la info del comando ...\r\n         for (int i=0;i&lt;300;i++){\r\n           if (linea[i]==','){    \/\/ ... busca la posici\u00ef\u00bf\u00bdn de las \",\"\r\n             indices[cont]=i;\r\n             cont++;\r\n           }\r\n           if (linea[i]=='*'){    \/\/ ... y del \"*\"\r\n             indices[12]=i;\r\n             cont++;\r\n           }\r\n         }\r\n         Serial.println(\"\");      \/\/ ... y escribe la info en el puerto serie.\r\n         Serial.println(\"\");\r\n         Serial.println(\"---------------\");\r\n         for (int i=0;i&lt;12;i++){\r\n           switch(i){\r\n             case 0 :Serial.print(\"Hora en UTC (HhMmSs): \");break;\r\n             case 1 :Serial.print(\"Estado (A=OK,V=KO): \");break;\r\n             case 2 :Serial.print(\"Latitud: \");break;\r\n             case 3 :Serial.print(\"Direccion (N\/S): \");break;\r\n             case 4 :Serial.print(\"Longitud: \");break;\r\n             case 5 :Serial.print(\"Direccion (E\/W): \");break;\r\n             case 6 :Serial.print(\"Velocidad sobre superficie (nudos): \");break;\r\n             case 7 :Serial.print(\"Direccion del movimiento (grados): \");break;\r\n             case 8 :Serial.print(\"Fecha en UTC (DdMmAa): \");break;\r\n             case 9 :Serial.print(\"Grados de variacion magnetica: \");break;\r\n             case 10 :Serial.print(\"Variacion magnetica (E\/W): \");break;\r\n             case 11 :Serial.print(\"Modo: \");break;\r\n             case 12 :Serial.print(\"Checksum: \");break;\r\n           }\r\n           for (int j=indices[i];j&lt;(indices[i+1]-1);j++){\r\n             Serial.print(linea[j+1]);\r\n           }\r\n           Serial.println(\"\");\r\n         }\r\n         Serial.println(\"---------------\");\r\n       }\r\n       conta=0;                    \/\/ Reinicia el contador de posici\u00ef\u00bf\u00bdn en el buffer\r\n       for (int i=0;i&lt;300;i++){    \/\/    de recepci\u00ef\u00bf\u00bdn y el propio buffer\r\n         linea[i]=' ';\r\n       }\r\n     }\r\n   }\r\n }<\/pre>\n<p>\u00a0<\/p>\n<p>Si probamos este c\u00f3digo, y todo va bien, en el monitor serie deber\u00edamos visualizar informaci\u00f3n parecida a esta:<\/p>\n<p><strong>A: POSICI\u00d3N NO V\u00c3\u0081LIDA: La luz del GPS parpadea.<\/strong><\/p>\n<pre> ...\r\n ...<\/pre>\n<p>\u00a0<\/p>\n<pre> $GPGGA,154653,4428.2011,N,00440.5161,W,0,00,,-00044.7,M,051.6,M,,*6C\r\n $GPGSA,A,1,,,,,,,,,,,,,,,*1E\r\n $GPGSV,3,1,10,02,50,290,003,10,25,24,045,35,27,56,145,00,,,,,,,,*78\r\n $GPRMC,154653,V,4428.2011,N,00440.5161,W,000.5,342.8,050407,,,N*7F<\/pre>\n<p>\u00a0<\/p>\n<pre> ---------------\r\n Hora en UTC (HhMmSs): 154653\r\n Estado (A=OK,V=KO): V\r\n Latitud: 4428.2011\r\n Direccion (N\/S): N\r\n Longitud: 00440.5161\r\n Direccion (E\/W): W\r\n Velocidad sobre superficie (nudos): 000.5\r\n Direccion del movimiento (grados): 342.8\r\n Fecha en UTC (DdMmAa): 050407\r\n Grados de variacion magnetica:\r\n Variacion magnetica (E\/W):\r\n Modo: N\r\n ---------------<\/pre>\n<p>\u00a0<\/p>\n<pre> ...\r\n ...<\/pre>\n<p>\u00a0<\/p>\n<p><strong>B: POSICI\u00d3N V\u00c3\u0081LIDA: El GPS tiene la luz fija.<\/strong><\/p>\n<pre> ...\r\n ...<\/pre>\n<p>\u00a0<\/p>\n<pre> $GPGGA,154654,4428.2011,N,00440.5161,W,0,00,,-00044.7,M,051.6,M,,*6B\r\n $GPGSA,A,1,,,,,,,,,,,,,,,*1E\r\n $GPGSV,3,1,10,02,50,290,00\r\n $GPGGA,154655,4328.1874,N,00340.5185,W,1,03,08.5,-00044.7,M,051.6,M,,*79\r\n $GPGSA,A,2,13,23,25,,,,,,,,,,08.5,08.5,00.9*0E\r\n $GPGSV,3,1,10,02,50,290,26,04,60,210,26,08,33,173,29,10,21,296,00*7E\r\n $GPGSV,3,2,10,13,58,044,34,16,03,035,00,20,02,109,00,23,26,057,34*7B\r\n $GPGSV,3,3,10,25,24,045,35,27,56,145,27,,,,,,,,*7D\r\n $GPRMC,154655,A,4428.1874,N,00440.5185,W,000.7,000.0,050407,,,A*6C<\/pre>\n<p>\u00a0<\/p>\n<pre> ---------------\r\n Hora en UTC (HhMmSs): 154655\r\n Estado (A=OK,V=KO): A\r\n Latitud: 4428.1874\r\n Direccion (N\/S): N\r\n Longitud: 00440.5185\r\n Direccion (E\/W): W\r\n Velocidad sobre superficie (nudos): 000.7\r\n Direccion del movimiento (grados): 000.0\r\n Fecha en UTC (DdMmAa): 050407\r\n Grados de variacion magnetica:\r\n Variacion magnetica (E\/W):\r\n Modo: A\r\n ---------------<\/pre>\n<p>\u00a0<\/p>\n<pre> ...\r\n ...\r\n\r\nFuente: <a href=\"http:\/\/www.arduino.cc\/es_old\/Tutoriales\/GPS\" target=\"_blank\">http:\/\/www.arduino.cc\/es_old\/Tutoriales\/GPS<\/a><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Conecta un m\u00f3dulo GPS Para la realizaci\u00f3n de \u00e9ste ejemplo he utilizado un m\u00f3dulo GPS de Parallax que utiliza un interfaz serie. La conexi\u00f3n a establecer para comunicarse con Arduino, seg\u00fan la data sheet del GPS , debe ser una conexi\u00f3n serie as\u00edncrona a 4800 bps (TTL-level interface, 8 data bits, no parity, 1 stop bit, non-inverted). \u00a0 Figura 1. [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[69],"class_list":["post-4577","post","type-post","status-publish","format-standard","hentry","category-electronica","tag-electronica"],"_links":{"self":[{"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=\/wp\/v2\/posts\/4577","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4577"}],"version-history":[{"count":3,"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=\/wp\/v2\/posts\/4577\/revisions"}],"predecessor-version":[{"id":9859,"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=\/wp\/v2\/posts\/4577\/revisions\/9859"}],"wp:attachment":[{"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4577"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4577"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4577"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}