Arduino GSM/GPRS Shield, más facil, imposible!

Si como yo, has estado jugando un poco con tu Arduino, tarde o temprano llega un momento donde es necesario conectarlo al mundo exterior. Lo mas usual es conectarlo mediante Ethernet o WiFi si te dá el presupuesto, para poder enviar información hacia el mundo exterior.

Pero estas no son las únicas opciones de comunicación. En esta ocasión, vamos a revisar el Shield GPRS/GSM EF-Com fabricado por la Elekfreaks, y distribuido por www.dx.com.

Este shield, permite que nuestro arduino opere como un teléfono GSM, obviamente debiendo programar todas las funciones del mismo. Dentro del hardware de este shield, podemos encontrar los siguientes dispositivos:

  • Modem GSM/GPRS basado en el chip SIM900
  • Conectores de entrada y salida de audio (para realizar o recibir llamadas)
  • Reloj RTC, con batería de respaldo
  • Varios pines de GPIO libres controlables mediante comandos AT
  • Opción para conexión RS232 via hardware o software en el Arduino

Al recibir el paquete, pude notar inicialmente, que el empaque era bastante grande para un shield de Arduino, por lo que definitivamente debía tener varios items en su interior. Dentro del paquete, al abrirlo pude encontrar:

  • Shield GSM / GPRS
  • Antena externa
  • Adaptador de 9V / 1A
  • Display Nokia 5100 con backlight Azul

El display es un extra inesperado. En el sitio web no indica que se incluye este display, pero el Shield tiene un header instalado propiamente para éste. Es un extra que da valor agregado al producto.

El adaptador de 9V es necesario, porque alimentando directamente al Arduino y al Shield desde el puerto USB, éste no alcanza a proveer la corriente necesaria para su operación. Según el fabricante, el módulo en picos de consumo de corriente, puede superar 1A facilmente.

Algo a tomar muy en cuenta, es la posición del display LCD en el shield. Lastimosamente no existen marcas del Pin 1 del header, y en el Wiki del fabricante, menciona que el LCD con backlight azul (existen 2 versiones, una con backlight azul y otra con backlight blanco) debe ir como se muestra en las fotos, con el display sobre el chip SIM900. Esta posición es incorrecta, ya que el display con backlight azul debe ir montado en la posición exterior del Shield. Esto lo veremos en las imágenes posteriores.

Programación

Como lo mencionabamos, el Shield GPRS funciona como un modem GSM serial, es decir, para su uso, únicamente requerimos los pines Rx, Tx y Gnd del puerto serie de nuestro arduino, o de un puerto serial por Software, en los pines que nosotros definamos

Tomando en cuenta esto, vamos a programar un pequeño Sketch, que ejecutará las siguientes tareas:

  • Mostrará un mensaje de bienvenida en el LCD Nokia 5100
  • Esperará un caracter en el puerto serial del Arduino
  • Mediante un Puerto Serial de Software inicializará la comunicación con el Shield GSM
  • Enviará un mensaje de texto (SMS) a un número colocado en el software
  • El código que vamos a usar en nuestro arduino es el siguiente:
#include <"lcd5110_graph.h">
#include <"softwareserial.h">

LCD5110 myGLCD(9,10,11,12,13);

extern uint8_t SmallFont[];

#define rxPin 2
#define txPin 3

SoftwareSerial mySerial(rxPin, txPin);

char *init1="AT+IPR=19200";  // configuracion del modulo para 19200bps
char *init2="AT+CMGF=1";  // configuracion para modo ascii 
unsigned char CR=13; // caracter de retorno de linea
void setup()
{
  myGLCD.InitLCD();
  myGLCD.setFont(SmallFont);

  mySerial.begin(19200);                 // Velocidad de conexion por defecto del Shield  
  Serial.begin(19200);                  // Velocidad del puerto serie
  Serial.println("Conexion Serial Ok.");

  myGLCD.clrScr();
  myGLCD.print("Prueba del", CENTER, 0);
  myGLCD.print("GPRS Shield   ", LEFT, 12);
  myGLCD.print("patolin.com   ", LEFT, 30);
  myGLCD.update();
}

void loop()
{
  // inicializamos el shield

      mySerial.write(init1);
      mySerial.write(CR);
      delay(1000);
      mySerial.write(init2);
      mySerial.write(CR);
      delay(1000);

  myGLCD.clrScr();
  myGLCD.print("SMS", CENTER, 0);
  myGLCD.print("Esperando", LEFT, 12);
  myGLCD.print("caracter al ", LEFT, 24);
  myGLCD.print("RS232", LEFT, 36);
  myGLCD.update();

  // esperamos un caracter cualquiera en el puerto serie

  if (Serial.available()) {
      if (mySerial.available()) Serial.write(mySerial.read());
      // limpiamos el buffer de lectura
      Serial.read();

      // enviamos el sms
      myGLCD.clrScr();
      myGLCD.print("SMS", CENTER, 0);
      myGLCD.print("Enviando....", LEFT, 12);
      myGLCD.update();

      mySerial.write("AT+CMGS=\"099XXXXXXX\""); // reemplace por el numero de celular de destino  
      mySerial.write(CR);
      delay(1000);
      mySerial.write("Prueba de SMS desde Arduino!");  
      mySerial.write(CR);
      delay(1000);
      mySerial.write(26);  // Ctrl+Z para finalizar el mensaje y enviar
      myGLCD.print("enviado!", LEFT, 30);
      myGLCD.update();

  }

}

Bastante sencillo cierto? El código se explica solo. Basta con configurar la comunicación con el Shield a la misma velocidad (19200bps en este caso) y enviar los respectivos comandos. Al ser un modem GRPS, responde a una amplia variedad de comandos AT, que podemos revisarlos en este manual propio del fabricante.

Les dejo un video de la prueba de este código sobre mi Arduino.

Para concluir, las aplicaciones para este Shield son varias! Desde una alarma de seguridad de hogar con notificaciones por SMS, hasta un dispositivo remoto que pueda contestar llamadas y devolver información.

Para concluir, podemos resumir las características de este Shield, en las siguientes:

  • Shield GSM/GPRS Quad-Band 850/900/1800/1900 MHz, con el chip SIM900 GSM
  • Compatible con Arduino Uno / Mega
  • Voltaje de Operación 5Vcc
  • Socket plástico para el Chip GSM ubicado en la parte inferior del Shield
  • Antena externa, en L para mayor facilidad de ubicación
  • Adaptador de alimentación incluido
  • Jacks de Entrada y Salida de Audio, para la generación de llamadas telefónicas via celular
  • Reloj en tiempo real incluido
  • Display LCD Nokia 5100 incluido

Para los entusiastas de la electrónica y del Arduino, puedo comentarles que el precio de este Shield es un poco elevado. El costo es de USD. 57,70 incluido el envío desde China. Si descontamos el valor del LCD y del adaptador, podríamos llegar a los USD. 50,00 que sigue siendo algo elevado, tomando en cuenta el costo del Arduino. Pero si vamos a usar este Shield en una aplicación profesional, Si resulta muchísimo más barato que otras soluciones de comunicación GSM que existen en el mercado.

Les dejo algunos enlaces correspondientes a este producto. Espero les sean de interés

Arduino GSM / GPRS Shield Wireless Extension Board Module w / antena / adaptador
GSM Shield WIKI
SIM900 AT Command Reference
Post Original en www.patolin.com

gprs_lcd.ino (2.85 KB)

hola, soy nuevo en el foro, yo tengo el mismo shield gprs (sin el lcd) pero estoy tratando de conectarlo con un Leonardo y no encuentro forma.

Prové varios codigos y nada. (el tuyo y otros similares utilizando softwareserial)

Tambien probe lo que sugiere este sitio para conectar el shield con leonardo o mega que es doblar la patita del pin 2 del shield y puentear el pin 2 con el 8. (esto creo es para usar la libreria GSM: http://arduino.cc/de/Guide/GSMShieldLeonardoMega)

saludos.

Lastimosamente no tengo un Leonardo acá, pero la librería SoftwareSerial que uso, requiere indicar que pines vas a usar para RX/TX con la tarjeta GSM. No debería darte problemas.

Lo que sí, mientras la tarjeta no esté alimentada con el cargador de pared, con el chip colocado, y el led de indicador de conexión GSM parpadeando, no te dará conexión serial.... yo también me rompí la cabeza unos cuantos dias hasta dar con eso.

Gracias por la info! Tengo el mismo módulo GSM (elecfreaks), pero no logro realizar llamadas con el comadno "ATD XXXXX;" ni "ATD + +XXXX;" ni "ATD=\"XXXXX\"", si puedes por favor dime cómo te funciona a ti! Muchas gracias!

patolin: Lastimosamente no tengo un Leonardo acá, pero la librería SoftwareSerial que uso, requiere indicar que pines vas a usar para RX/TX con la tarjeta GSM. No debería darte problemas.

Lo que sí, mientras la tarjeta no esté alimentada con el cargador de pared, con el chip colocado, y el led de indicador de conexión GSM parpadeando, no te dará conexión serial.... yo también me rompí la cabeza unos cuantos dias hasta dar con eso.

Si, lo del tema de la alimentacion de pared ya lo tenia en cuenta.

Al parecer las librerias por defecto no se llevan bien con Leonardo, reitero, el soporte de este sitio recomienda doblar el pin 2 y puentearlo al 8. Pero con esto tampoco e tenido resultados. En otros sitios hablan de que es importante utilizar "Serial1" como clase, pero no lo e podido implementar con exito.

Seguire buscando otra alternativa.

gracias. saludos

hola buenos dias...

tengo una placa arduino UNO y un modulo M95 para recibir sms, envío texto por el puerto serial del arduino, la tarjeta M95 los lee, pero cuando envio un comando AT se presenta problemas, porque responde muchas veces lo mismo, es decir, lee el comando AT y responde AT OK y luego responde nuevamente ATOK ERROR, y sigue respondiendo como si entrara en un ciclo para resonder a los comando AT. de antemano muchas gracias.

Leiste que respondiste un mensaje de fecha Nov 22, 2013, 03:21 am. Nadie te va a responder de los ya involucrados.
Crea un nuevo post con tu problema incluso si quiers el mismo título.

Recuerda incluir códigos, detalle del shield utilizado, links. Todo con tags. Lee las normas del foro por favor.
Gracias.

Hola buenas solo una duda por que al compliar el codigo me sale este error

Arduino: 1.6.1 (Windows 7), Board: "Arduino Uno"

_1_sim900.ino:3:30: fatal error: C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/"softwareserial.h": Invalid argument

compilation terminated.

Error compiling.

This report would have more information with "Show verbose output during compilation" enabled in File > Preferences.

Saludos AbelKarim lee el post de Surbyte

Saludos Max seata, ya me di cuenta jeje perdon soy nuevo en esto

Hola sabes yo intento utilizar es mòdulo con arduino mega y no consigo hacer que jale.. :(

Me gustaría saber si sigue valiendo la pena apostar por la GSM/GPRS shield sabiendo que (al menos en USA pero supongo que será tendencia mundial) la red 2G la van a ir apagando a partir del año que viene....Yo si fuera el Arduino Team intentaría diseñar una 3G/4G shield. Me gustaría que alguien me corrigiera si estoy equivocado. Gracias.

Osqui: Me gustaría saber si sigue valiendo la pena apostar por la GSM/GPRS shield sabiendo que (al menos en USA pero supongo que será tendencia mundial) la red 2G la van a ir apagando a partir del año que viene....Yo si fuera el Arduino Team intentaría diseñar una 3G/4G shield. Me gustaría que alguien me corrigiera si estoy equivocado. Gracias.

No desaparece la cobertura GSM, lo que hacen algunas compañías es dejar de dar sim compatibles con la Red 2g, pero hay otras que siguen dándolas, pero si para un proyecto profesional debería tenerse en cuenta la dificultad para conseguirlas

Hola amigos!!! como puedo controlar el tiempo de llamada saliente de la shield gsm con arduino UNO !! me explico: general mente en el monitor serial tengo todas las respuestas si al número marcado esta ocupado "BUSY" si no responde o esta apagado, y según eso puedo hacer una acción de respuesta,, pero aquí esta el pero: cuando la llamada se ha efectuado con éxito no tengo respuesta rápida de que hay conexiónen el monitor serial para yo poder decir al shield "muy bien la llamada se ha realizado y ahora espera 5 segundos y luego cuelga"

en general como puedo limitar el tiempo de llamada?? cualquier consejo muchas gracias!!

podrías implementar una especie de timeout usando millis(). Cuando inicias el llamado cargas una variables unsigned long con el valor de millis() (en mseg) y en tu loop mientras esperas que cualgue, consultas ese tiempo y si superas digamos 5000 mseg cortas.

Hola amigos!!! como puedo controlar el tiempo de llamada saliente de la shield gsm con arduino UNO !! me explico: general mente en el monitor serial tengo todas las respuestas si al número marcado esta ocupado "BUSY" si no responde o esta apagado, y según eso puedo hacer una acción de respuesta,, pero aquí esta el pero: cuando la llamada se ha efectuado con éxito no tengo respuesta rápida de que hay conexión en el monitor serial para yo poder decir al shield "muy bien la llamada se ha realizado y ahora espera 5 segundos y luego cuelga"

en general como puedo limitar el tiempo de llamada?? cualquier consejo muchas gracias!!

Repites la consulta?

No olvides que este es un tema que no debiste usar para canalizar tu consulta. Deberías haber creado una nueva consulta como hilo nuevo. Tenlo presente para la proxima.

gracias por la respuesta! a ver si entendí cuando yo inicie el llamado es decir empieza en el momento que marcado desde ahí se empieza a contar el tiempo o cuando ya la conexión se realice??

Depende de que quieras limitar. Quieres controlar el tiempo de llamada pues que eso sea. Quieres controlar cuanto tiempo llama sin que antes corte, también!! O ambos.

surbyte, gracias por tu contestacion! y bueno mi shield es un SIM900 con estos comandos AT (http://www.espruino.com/datasheets/SIM900_AT.pdf) pero es extraño porque cuando se marca un numero y este esta ocupado enseguida tengo una respuesta de "BUSY" y yo puedo responder con cualquier otro comentado como ATDL por ejemplo!! pero cuando se establece una llamada no tengo ninguna respuesta es como que el proceso se parara hasta que la otra persona cuelgue ahi obtengo un "OK" que hizo conexio seguido de un "NO CARRIER" que es cuando colgó la otra parte!!