Páginas

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