Páginas

miércoles, 19 de abril de 2017

Modulo GPS

  

 

 Modulo GPS

Hoy traigo un módulo GPS muy sencillo de utilizar el Ublox NEO-6M pero que es compatible con otros muchos que se venden sueltos para Arduino.

Este módulo funciona tanto con Arduino como suelto, ya que simplemente hay que alimentarlo con 3,3V y escuchar la patilla TX. Por lo tanto su utilización es de lo más sencillo.





Lleva una antena externa amplificadora así como las diferentes patillas para alimentarlo y comunicarse con él.

Lo conectamos a nuestro Arduino de la siguiente forma, las conexiones TX/RX son configurables, yo elijo las entradas digitales del Arduino 8 y 10:



Modulo GPS
Arduino UNO/MEGA
3,3V
3,3V
GND
GND
TX
8
RX
10








A la hora de utilizarlo simplemente hay que escuchar lo que el modulo nos mande. Un ejemplo, sería este:



  1. // Modulo GPS
  2. // Conectamos el modulo de la siguiente forma:
  3. // GND -> GND
  4. // 3,3V -> 3,3V
  5. // TX -> 8
  6. // RX -> 10
  7. // http://arubia45.blogspot.com.es/

  8. #include <SPI.h>
  9. #include <SD.h>
  10. #include <SoftwareSerial.h>

  11. File myFile;

  12. void grabar_txt(String Fichero, String Linea) {
  13.   myFile = SD.open(Fichero, FILE_WRITE);
  14.   if (myFile) {
  15.     myFile.println(Linea);
  16.     myFile.close();
  17.   } else {
  18.     Serial.println("Error abriendo el fichero.");
  19.   }
  20. }

  21. SoftwareSerial mySerial(8, 10); // RX, TX
  22. // Patilla CS del lector SD (RobotDyn)
  23. const int chipSelect = 9;

  24. String Linea;

  25. void setup()
  26. {
  27.   Serial.begin(9600);

  28.   if (!SD.begin(chipSelect)) {
  29.     Serial.println("Fallo de inicializacion SD!!");
  30.     return;
  31.   }
  32.   Serial.println("Inicializacion SD realizada");

  33.   mySerial.begin(9600);
  34.   Serial.println("Iniciando ...");
  35.   delay(200);
  36. }

  37. void loop()
  38. {
  39.   while (mySerial.available() > 0)  {
  40.     char c;
  41.     c = mySerial.read();
  42.     if (c == '$') {
  43.       int pos  = Linea.indexOf("GPGGA");
  44.       if (pos >= 0) {
  45.         Serial.print(Linea);
  46.         grabar_txt("GPGGA.TXT", Linea);
  47.         delay(500);
  48.       }
  49.       Linea = "";
  50.       Linea.concat(c);
  51.     }
  52.     else {
  53.       Linea.concat(c);
  54.     }
  55.   }
  56. }


Si cargamos este ejemplo en nuestro Arduino y abrimos el Monitor Serie de nuestro Arduino IDE debería de verse:




Este ejemplo filtra los datos que recibimos del módulo quedándonos solo con los GPGGA ya que este módulo es capaz de darnos datos de localización en disitntos estándares. Además los graba en la tarjeta SD en el fichero GPGGA.TXT

Si cargamos una web de geolocalización podemos ver nuestro recorrido



Una web que está muy bien para todo esto y nos permite pasarlo al Google Earth es esta:

http://www.gpsvisualizer.com

El módulo lo puedes comprar por unos 8€ o quizás algo menos ya dependiendo del acabado y donde lo compres.

Espero que os sea de utilidad ya que sobre esto se pueden hacer muchas cosas.

jueves, 11 de agosto de 2016

Modem Shield GPRS Neoway M590


  

 

 

 

 

 

 

 

 

 

Modem Shield GPRS Neoway M590

Hoy voy a comentar unos de los componentes más interesantes que ha caído en mis manos desde hace tiempo, muy interesante porque es un módulo GPRS muy económico.

Consiste en un shield gprs basado en el chip de Neoway M590 que se está vendiendo muchísimo sobretodo en Rusia. Y este es el mayor problema que me he encontrado, la gran mayoría de documentación, foros y ejemplos que hay en Internet están en ruso.




Pero aquí os voy a hablar un poco sobre él para los que han comprado este módulo y no saben como hacerlo funcionar. El shield se venden en distintos acabados, sin ensamblar a un precio no superior a los 2,5€ lo que le hace ser una compra interesante aún sin saber si funcionará. Os dejo algunas fotos de los acabados disponibles:








En mi caso yo compré el más pequeño y simple (el de la primera foto) y gracias a la ayuda de ATIS Soluciones que se prestaron a ensamblar el shield lo tenía por unos 2€ funcionando.



El problema fundamental es que el vendedor que lo envía de China la documentación que me pasó fue esta:



Para que el módulo arranque al enchufarlo es importante conectar la patilla K (boot) a tierra. Otra opción es conectar a una salida digital del Arduino y poner la salida a LOW cuando queramos encenderlo.


Y tras ponerme en contacto con el en varias ocasiones conseguí que me pasara algunos manuales en formato PDF del fabricante del chip pero nada que me sirviera para hacerlo funcionar con mi Arduino. Os dejo los enlaces a los documentos PDF:

Neoway M590 AT Command Sets_V3.0 (Conjunto de comandos AT)

Neoway M590 Diseño Hardware

Con esta documentación y basándome en algunos ejemplos rusos (más abajo podéis encontrar los enlaces a algunas de estas web) llegamos a la conclusión de como conectar el modem a nuestro Arduino:

Shield Neoway M590
Arduino UNO/MEGA
5V
5V
GND
GND
T (TX)
12
R(RX)
13
K(BOOT)
GND
GND
GND

Para que el módulo arranque al enchufarlo es importante conectar la patilla K (boot) a tierra. Otra opción es conectar a una salida digital del Arduino y poner la salida a LOW cuando queramos encenderlo. Para que esta tabla de conexión sirva tanto para un Arduino UNO como para un MEGA 2560 he puesto la conexión TX/RX en las I/O 12/13 del Arduino según cada modelo de Arduino se pueden utilizar distintas I/O.

Es importante saber que para que el módulo funcione correctamente el Arduino dede de estar alimentado por la entrada de alimentación a parte de por el USB si no el módulo estará reseteándose cada pocos segundos (nos saldrá en pantalla MODEM STARTUP).

Los comandos AT de este chip son bastante reducidos pero que nos sirven perfectamente para distintas funciones. La que a mí mas me interesaba era la posibilidad de hacer FTP sobre un servidor Linux. Pero vamos a ver un ejemplo, vamos a cargar un sketch para poder introducir comandos manualmente a través del Monitor Serie de nuestro Arduino IDE:


  1. // Shield Neoway M590
  2. // Conectamos el modulo de la siguiente forma:
  3. // GND -> GND
  4. // 5V -> 5V
  5. // TX -> 12
  6. // RX -> 13
  7. // K  -> GND
  8. // GND -> GND

  9. // http://arubia45.blogspot.com.es/

  10. #include "SoftwareSerial.h"
  11. // Definimos los canales I/O entre el Arduino y el Modem
  12. SoftwareSerial MiSerial(12, 13); //RX, TX

  13. //Arranque del modem mediante patilla 6 del Arduino
  14. //#define pinBOOT 6
  15. void setup() {
  16.   Serial.begin(19200);
  17.   Serial.println("Test M590 GSP/GPRS by ALRO");
  18.   MiSerial.begin(19200);
  19.   //  pinMode(pinBOOT, OUTPUT);
  20.   //  digitalWrite(pinBOOT, LOW);
  21.   //  MiSerial.println(19200);
  22.   MiSerial.println("AT");
  23. }
  24. void loop() {
  25.   if (MiSerial.available())
  26.     Serial.write(MiSerial.read());
  27.   if (Serial.available())
  28.     MiSerial.write(Serial.read());
  29. }


Si cargamos este ejemplo en nuestro Arduino y abrimos el Monitor Serie de nuestro Arduino IDE debería de verse:




Para que podamos comunicarnos con el Modem a través del Monitor Serie la velocidad en Baudios tenemos que ponerla en 19200 y la fiscalización de las entradas en Ambos NL & CR, si todo lo hemos hecho correctamente el modem responderá OK al comeando AT que el envía el Arduino al arrancar y si los chequeos internos del modem han sido correcto a continuación nos dirá +PBREDY por lo que ya podremos enviarle comandos. En la guía de comandos AT que os he puesto anteriormente están todos pero vamos a probar los más interesantes:

AT+CGDCONT=1,"IP","APN de nuestro operador GMS"

Este comando nos conectará a Internet sustituyendo "APN de nuestro operador GMS" por el APN de nuestra compañía telefónica. A lo que el modem contestaría OK.

Una vez conectado el chip Neoway M590 necesita el comando:

AT+XISP=0   (Respuesta OK)

Y ya a continuación obtenemos una IP y la consultamos:

AT+XIIC=1    (Respuesta OK)

AT+XIIC? 

Nos devuelve la IP de nuestro Modem, si devuelve 0.0.0.0 no estamos conectados. Para conectar a un servidor FTP a continuación ponemos:

AT+FTPLOGIN=IP,puerto,usuario,clave (Respuesta OK)
AT+FTPGET=,1,2                                      (Contenido del FTP)
AT+FTPLOGOUT                                      (Respuesta OK)

Si queremos saber la IP de una URL lo hacemos con el comando:

AT+DNS="arubia45.blogspot.com.es"

OK

+DNS:216.58.211.193

+DNS:OK

En la documentación del chip podemos encontrar como enviar SMS, conectarnos a una web, etc ...

Aquí os dejo un pequeño ejemplo de como subir un fichero a un servidor FTP desde una tarjeta SD, este ejemplo no es estable en Arduino UNO, recomiendo probarlo en un Arduino MEGA:



  1. // Shield Neoway M590
  2. // Conectamos el modulo de la siguiente forma:
  3. // GND -> GND
  4. // 5V -> 5V
  5. // TX -> 12
  6. // RX -> 13
  7. // K  -> GND
  8. // GND -> GND
  9. // http://arubia45.blogspot.com.es/

  10. #include <SPI.h>
  11. #include <SD.h>
  12. #include <SoftwareSerial.h>


  13. char* file_backup = "BACKUP.TXT";
  14. File myFile;

  15. String login_ftp;



  16. SoftwareSerial mySerial(12, 13); // RX, TX

  17. //*********************************************//
  18. //                     SETUP
  19. //*********************************************//
  20. void setup() {
  21.   Serial.begin(9600);
  22.   mySerial.begin(19200);

  23.   if (!SD.begin(10)) {
  24.     Serial.println("Fallo de Inicializacion de la SD!");
  25.     return;
  26.     while (true);
  27.   } else {
  28.     Serial.println("Inicializacion de la SD realizada");
  29.   }

  30.   Serial.println("Iniciando...");

  31.   sendATcommand("AT", "OK", "ERROR", 2000);
  32.   delay(2000);

  33.   delay(1000);
  34.   grabar_txt(file_backup, "Backup tras reinicio");

  35.   gprs_modem_ftp (file_backup);
  36. }


  37. //*********************************************//
  38. // Funcion Enviar Comandos AT al modulo GPS/GPRS
  39. //*********************************************//
  40. byte sendATcommand(String ATcommand, String answer1, String answer2, unsigned int timeout) {
  41.   byte reply = 1;
  42.   String content = "";
  43.   char character;

  44.   Serial.println(ATcommand);

  45.   while (mySerial.available() > 0) mySerial.read();

  46.   mySerial.println(ATcommand);
  47.   delay(100);
  48.   unsigned int timeprevious = millis();
  49.   while ((reply == 1) && ((millis() - timeprevious) < timeout)) {
  50.     while (mySerial.available() > 0) {
  51.       character = mySerial.read();
  52.       content.concat(character);
  53.       Serial.print(character);
  54.       delay(10);
  55.     }
  56.     if (content.indexOf(answer1) != -1) {
  57.       reply = 0;
  58.     } else if (content.indexOf(answer2) != -1) {
  59.       reply = 2;
  60.     } else {
  61.     }
  62.   }
  63.   return reply;
  64. }

  65. //*********************************************//
  66. //              Funcion FTP via GPRS
  67. //*********************************************//
  68. byte gprs_modem_ftp (String FileName) {
  69.   byte reply = 1;
  70.   int i = 0;
  71.   unsigned long tamano;
  72.   Serial.println("Empezamos con el FTP");
  73.   Serial.println(FileName);
  74.   if (!(myFile = SD.open(FileName, FILE_READ))) {
  75.     Serial.println ("Fichero: No encontrado");
  76.     reply = 1;
  77.   }
  78.   else {
  79.     Serial.println("Fichero:encontrado ");
  80.     tamano = myFile.size();
  81.   }


  82.   delay(1000);
  83.   i = 0;
  84.   Serial.println("Iniciamos comunicacion con GPRS");

  85.   reply = 0;
  86.   if (reply == 0) {
  87.     if (reply == 0) {
  88.       reply = sendATcommand("AT+CGDCONT=1,\"IP\",\"gprsmov.pepephone.com\"", "OK", "ERROR", 1000);
  89.       reply = sendATcommand("AT+XISP=0", "OK", "ERROR", 1000);
  90.       if (reply == 0) {
  91.         reply = sendATcommand("AT+XIIC=1", "OK", "ERROR", 1000);
  92.         if (reply == 0) {
  93.           if (reply == 0) {
  94.             Serial.println("Conectamos con el FTP ....");
  95.             if (reply == 0) {
  96.               reply = sendATcommand("AT+FTPLOGOUT", "OK", "ERROR", 1000);
  97.               //Obtenemos la IP del dominio ftp
  98.               mySerial.println("AT+DNS=\"url.prueba.es\"");
  99.               while (!mySerial.find("+DNS:")) ;
  100.               String IP;
  101.               boolean no_mas = false;
  102.               char character;
  103.               while (mySerial.available() > 0) {
  104.                 character = mySerial.read();
  105.                 if ((character != 10) and (character != 13) and (character != '+') and (no_mas == false)) {
  106.                   IP.concat(character);
  107.                 } else {
  108.                   no_mas = true;
  109.                 }
  110.                 delay(10);
  111.               }
  112.               Serial.println("IP:" + IP);
  113.               login_ftp = "AT+FTPLOGIN=" + IP;
  114.               login_ftp.concat(",puerto,usuario,clave");
  115.               Serial.println(login_ftp);
  116.               mySerial.println(login_ftp);
  117.               while (!mySerial.find("+FTPLOGIN:User logged in")) ;
  118.               Serial.println("Subimos fichero ....");
  119.               if (reply == 0) {
  120.                 String Aux = "AT+FTPPUT=" + String(FileName) + ",1,2," + String(tamano);
  121.                 Serial.println(Aux);
  122.                 reply = sendATcommand(Aux, "OK", "ERROR", 1000);
  123.                 delay(1000);

  124.                 while (myFile.available()) {
  125.                   char c = (char)myFile.read();
  126.                   mySerial.print(c) ;
  127.                   Serial.print(c);
  128.                 }
  129.                 myFile.close();
  130.                 while (!mySerial.find("ERROR")) {
  131.                   mySerial.print(" ");
  132.                 }

  133.                 //delay(15000);
  134.                 reply = sendATcommand("AT+FTPLOGOUT", "OK", "ERROR", 1000);
  135.                 Serial.println("Adios");

  136.               }
  137.             }
  138.           }
  139.         }
  140.       }
  141.     }
  142.   }
  143.   return reply;
  144. }



  145. void grabar_txt(String Fichero, String Linea) {

  146.   myFile = SD.open(Fichero, FILE_WRITE);

  147.   if (myFile) {
  148.     myFile.println(Linea);
  149.     myFile.close();
  150.   } else {
  151.     Serial.println("Error abriendo el fichero.");
  152.   }
  153. }

  154. int j = 0;


  155. //*********************************************//
  156. //              Loop 
  157. //*********************************************//

  158. void loop() {

  159. }

Ejemplo2



Espero que esta entrada os sirva para poder utilizar el Neoway M590 con vuestro Arduino y que os haya sido de interés.

Enlaces de interés:

GSM сигнализация для дачи на NEOWAY M590 и Arduino, итог

не работает? Neoway m590