bclose

MÓDULO GSM/GPRS: llamar y enviar SMS

Empezando con el módulo GPRS

Objetivos

 

 

    • Presentar la tarjeta GSM/GPRS basado en el módulo SIM900.
    • Aprender a conectarlo y a ponerlo en marcha.
    • Usarlo para realizar llamadas y enviar SMS.
 

Material requerido.

Imagen de Arduino UNOArduino UNO o equivalente
modulo gprsUn Shield GPRS SIM900
conexionesAlgunos cables de protoboard.
Power supply

 Una fuente de alimentación para Arduino.

 

GSM Y GPRS

 

Hemos visto varias formas de conectar nuestro Arduino al exterior, como Ethernet y wifi, pero puede que alguna vez queramos comunicarnos con él y no tengamos acceso a ninguna de estas redes, o no queramos depender de ellas. Puede ser muy útil, por ejemplo, para colocar en una estación meteorológica.

Para este tipo de propósitos podemos utilizar un módulo GSM/GPRS con una tarjeta SIM, de forma que podamos comunicarnos con él como si se tratase de un teléfono móvil. Y es que esta tarjeta basada en el módulo SIM900 nos permite enviar y recibir llamadas y SMS y conectarnos a Internet, transformando nuestro Arduino en un teléfono móvil.

gprs shield

EL GSM (Global System for Global Communications) es el sistema de comunicaciones que más se utiliza en teléfonos móviles y es un estándar en Europa.  La primera funcionalidad de esta tecnología es la transmisión de voz, pero también permite la transmisión de datos (SMS, Internet), eso sí,  a una velocidad muy baja de 9kb/s.

El GPRS (General Packet Radio Service) es una extensión del GSM basada en la transmisión por paquetes que ofrece un servicio más eficiente para las comunicaciones de datos, especialmente en el caso del acceso a Internet. La velocidad máxima (en teoría) del GPRS es de 171kb/s, aunque en la práctica es bastante más pequeña.

 

CONEXIONES Y PUESTA EN MARCHA

 

El módulo que vamos a usar para el tutorial no tiene pines para montarla directamente sobre el Arduino, pero hay modelos que sí lo permiten. De todas formas la conexión es muy sencilla.

Esta tarjeta está basada en el módulo SIM900, y la configuraremos y controlaremos vía UART utilizando los comandos AT.

Lo primero tendremos que colocar la tarjeta SIM que vayamos a usar. El adaptador para las tarjetas es del tamaño de las SIM normales, que en su mayoría han sido sustituidas por MicroSIM  y NanoSim, así que tendremos que hacernos con una o enganchar una de estas últimas en un adaptador (el módulo que utilizamos en la sesión y que podéis conseguir en la tienda de esta página incluye adaptadores para todos los tamaños de tarjeta). Con un poco de paciencia y de pericia también podríamos colocar una nano o una micro directamente, pero en correremos peligro de que se mueva y deje de hacer contacto.

Antes de conectar nada al Arduino, vamos a colocar los jumpers que tiene la tarjeta de forma que utilicemos para comunicarnos los pines 7 y 8.

bridges gprs

Para conectarla a nuestro Arduino tenemos dos opciones, y para las dos necesitaremos una fuente de alimentación externa, ya que con conectar el Arduino por USB será suficiente para encender el módulo, pero no para alimentar también la tarjeta. Si conectamos la alimentación externa al shield GPRS y alimentamos el Arduino con el USB o una fuente aparte, sólo tendremos que unir los pines 7 y 8 para la comunicación serie y el GND entre ambas tarjetas.

 
  • Si utilizáis un Arduino Mega, la conexión sería de los pines 7 y 8 del GPRS a los pines 10 y 11 del Mega.
  • En la programación también habría que cambiar la instrucción en la que definimos la instancia Software Serial que creamos y ponerle los pines 10 y 11 (lo recordaremos más adelante).
 

 

montaje gprs

Si conectamos la alimentación externa al Arduino a parte de las tres conexiones anteriores tendremos que unir los pines 5V del Arduino y del GPRS.

arduino gprs shield

Para encender el shield tenemos que colocar el interruptor en la posición correcta. Las dos posiciones corresponden a cada uno de los tipos de conexión que hemos explicado arriba. Una vez hagamos esto se encenderán dos LEDs

Para activar la alimentación de la tarjeta SIM también nos encontramos con dos opciones. Podemos hacerlo manualmente presionando el pulsador que hay en uno de los laterales durante uno o dos segundos y veremos que se enciende otro LED, y que uno de los que se había encendido antes empieza a parpadear una vez por segundo. Este parpadeo nos indica que está buscando la red. Cuando la encuentre y se conecte cambiará la frecuencia de parpadeo y lo hará cada 3 o 4 segundos. Eso sí, no se conectará hasta que no metamos el PIN de la SIM, que ya veremos ahora cómo hacerlo.

encendido modulo sim900

También podemos activarla por programa, pero antes tendremos que realizar una soldadura en el pad “R13” que está justo al lado de la regleta de pines roja “J16”. Y una vez hecho esto la activaremos mandando un pulso de 1 segundo al pin 9 de la tarjeta. Así que si queréis usar este tipo de activación tendréis que añadir un cable entre un pin digital (en nuestro caso el 9) y el pin 9 de la tarjeta que hemos conectado. Eso sí, recordad que si está activada la tarjeta y volvemos a meter el pulso, lo que haremos será apagarla.

activar tarjeta software

 

REALIZANDO LLAMADAS DESDE ARDUINO

 

Para comunicarnos con el módulo utilizaremos comandos AT, pero lo primero que haremos será incluir la librería SoftwareSerial.h y configurar la comunicación por los pines 7 y 8 (10 y 11 para el Arduino Mega).

#include <SoftwareSerial.h>
SoftwareSerial SIM900(7, 8); // 10 y 11 para el Arduino Mega. Configura el puerto serie para el SIM900.

El módulo utiliza una velocidad de comunicación de 19200KHz, así que en el setup configuraremos el puerto serie para el SIM900 y para Arduino a esa velocidad.

Además introduciremos el PIN de la tarjeta para desbloquearla utilizando comandos AT y le daremos un poco de tiempo para que se conecte a la red. El comando que utilizaremos es AT+CPIN=“XXXX, donde sustituiremos XXXX por el PIN de nuestra tarjeta.

 
  • Recordad que como vamos a meter el comando dentro de un println, tendremos que utilizar las \ antes de cada “ para que no se comporten como un carácter especial.
 

Así que el setup nos quedaría así:

void setup()
   {
      //digitalWrite(9, HIGH); // Descomentar para activar la alimentación de la tarjeta por Software
      //delay(1000); 
      //digitalWrite(9, LOW);
      delay (5000);  //Nos damos un tiempo para encender el GPRS y la alimentación de la tarjeta
      SIM900.begin(19200);  //Configura velocidad del puerto serie para el SIM900
      Serial.begin(19200);  //Configura velocidad del puerto serie del Arduino
      Serial.println("OK");
      delay (1000);
      SIM900.println("AT+CPIN=\"XXXX\"");  //Comando AT para introducir el PIN de la tarjeta
      delay(25000);  //Tiempo para que encuentre una RED
   }

Crearemos una función en la que meteremos las instrucciones necesarias para llamar y colgar la llamada, también mediante comandos AT. Para llamar usaremos el comando ATDXXXXXXXXX, (sustituyendo las X por el número al que queramos llamar) y para colgar ATH.

No hay que ser tacaño con el tiempo que mantenemos la llamada, porque a veces puede tardar en empezar a dar tono y sino podríamos colgar antes de recibir nada en nuestro móvil.

void llamar()
   {
      Serial.println("Realizando llamada...");
      SIM900.println("ATDXXXXXXXXX;");  //Comando AT para realizar una llamada
      delay(30000);  // Espera 30 segundos mientras realiza la llamada
      SIM900.println("ATH");  // Cuelga la llamada
      delay(1000);
      Serial.println("Llamada finalizada");
   }

Y ya sólo tenemos que llamar a la función cuando nosotros queramos. En este ejemplo simplemente hacemos que llame una vez y se quede en espera indefinidamente.

void loop()
   {
      llamar();  //Realiza la llamada
      while (1);
   }

Aquí os dejamos el programa completo: llamar.

serie llamar

 

ENVIAR SMS

 

La programación para enviar un SMS va a ser idéntica, pero crearemos otra función que se encargará de mandar los comandos AT para enviar el SMS.

Primero usaremos el comando AT+CMGF=1\r para indicarle al módulo GPRS que vamos a mandar un mensaje, y a continuación introducimos el número al que va dirigido con el comando AT+CMGS = “XXXXXXXXX”.

Una vez hecho esto simplemente le enviamos el contenido del mensaje y lo finalizamos con el caracter ^Z. La función quedaría así:

void mensaje_sms()
   {
      Serial.println("Enviando SMS...");
      SIM900.print("AT+CMGF=1\r");  //Configura el modo texto para enviar o recibir mensajes
      delay(1000);
      SIM900.println("AT+CMGS=\"XXXXXXXXX\"");  //Numero al que vamos a enviar el mensaje
      delay(1000);
      SIM900.println("SMS enviado desde un Arduino. Saludos de Prometec.");  // Texto del SMS
      delay(100);
      SIM900.println((char)26); //Comando de finalización ^Z
      delay(100);
      SIM900.println();
      delay(5000);  // Esperamos un tiempo para que envíe el SMS
      Serial.println("SMS enviado");
   }

Podéis descargar el programa completo aquí: mandar_sms.

serie mandar mensaje

 

Resumen de la sesión

 

En esta sesión hemos aprendido varias cosas importantes:

 
    • Podemos hacer que nuestro Arduino se comporte como un teléfono móvil.
    • Cómo conectar y configurar la tarjeta GPRS.
    • A enviar llamadas y SMS a cualquier teléfono.
 
 
 

LikeUsOnFacebook_Icon

 

(134) Comments

    • Kevin garcia

    hola, donde van las xxxx de la at del pin de la tarjeta? cual va? de la tarjeta sim que esta en el shield? o del que vamos a llamar?

    • Hola Kevi, es el pin de nuestra tarjeta, para poder desbloquearla.

    • Rommel

    Hola, el programa lo ejecuto y me aparece como mensaje enviado, pero no lo recibo en mi celular. Descargué el código desde el link que ustedes pusieron: http://www.prometec.net/wp-content/uploads/2016/06/mandar_sms-1.rar

    • Hola Rommel, lo primero asegúrate de que el móduo se conecta a la red correctamente. Puedes enviar llamadas y recibirlas?

  • Que tal saludos, una pregunta pienso alimentar el arduino y el modulo gsm con una adaptador de 9v a 2A. Crees que haya inconvenientes en el funcionamiento de los módulos odebería usar uno de 1A.

    • Uno de dos amperios es perfecto Alex

    • Jose Luis

    Hola, no puedo mandar mensajes pero si llamar a qué se debe?

    • Hola José Luis, he visto que estabas tenías varios comentarios, pero te respondo en este. Si te funciona la llamada por lo menos vamos bien encaminados. El programa más completo que tenemeos es el de la sesión http://www.prometec.net/gprs-enviar-recibir-llamadas-sms/

      Por otra parte, ¿puedes recibir las llamadas y los SMS correctamente? Deberías poder verlos en el puerto serie. Y por último, prueba a eliminar el +56 o lo que sea que es tu prefijo internacional donde pones el número al que va dirigido el mensaje. Prueba un poco y nos cuentas. Un saludo.

  • hola Ivan muy buena explicación, tengo una pregunta estoy haciendo una alarma con el arduino mega y modulo shield como hago para evitar estar presionando manualmente ese pulsador es decir que ya salga directamente que quede permanente sin estar pulsando como seria las conexiones entre ellos….gracias

  • Buenas tardes!
    Cuando utilizo el código que habéis proporcionado en la página, por que puede ser que cuando enciendo el monitor serial me aparecen caracteres raros en lugar de aparecer “Realizando llamada” o lo que se tenga puesto.
    Un saludo, espero respuesta!

    • Hola Andrés, lo más probable es que tengas puesta la velocidad del monitor serie diferente que la del módulo. Recuerda que tienes que ponerla a 19200 igual que en el programa en el selector de abajo a la derecha del monitor serie. Un saludo.

  • Tengo una duda puedo llamar a la SIM del módulo SIM 900???

    Y si lo puedo hacer como podría colgar la llamada con accionar un botón y que le envié un mensaje al celular “estoy ocupado”

    Me ayudarias con ese código

    • Hola Daniel, por supuesto que puedes llamarle, y ademas puedes descolgar la llamada yu si le conectas unos cascos y un micro hablar por teléfono. Para colgar no tendrías más que leer el pulsador y mandar el comando ATH que cuelga la llamada. Despúes envías el sms y listo. Un saludo.

  • Saludos Iván, verás , la programación para mandar un SMS funciona con el shield.Pero ¿Podría cambiar los carácteres por strings? y si sí ¿Cómo lo hago?

    • Hola Joseé, no estoy seguro de entenderte del todo, pero si te refieres al texto del mensaje, puedes guardarlo en un String o un array de char y enviarlo al SIM900.

  • Gracias Ivan! Cuando disponga del shield voy a hacer pruebas, si logro buenos resultados lo comparto con la comunidad.

    Un abrazo!

  • Buenas noches, como están ?

    Hay alguna forma de evitar los delays? Porque cada delay que pongo son ciclos de instrucciones que el arduino no ejecuta y por ende podría perder los eventos de pulsadores y demás “perifericos”.

    Otra cosa, puedo enviar simultaneamente varios mensajes a distintos celulares? Me refiero no llamar a la funcion de enviar sms multiples veces por cada mensaje a enviar. Yo necesito enviar el mismo mensaje de texto a diferentes celulares.

    Muchas gracias!

    • Hola Nicolás, echa un ojo a esta sesión que el programa está mucho mejor depurado. http://www.prometec.net/gprs-enviar-recibir-llamadas-sms/

      Por otro lado, yo la única forma que he encontrado es repetir la función y enviar varias veces el SMS, no he encontrado la forma de mandar a varios números el mismo, tampoco le he dedicado mucho tiempo (porque ando escaso), pero ya sois varios los que os interesáis en eso así que intentaré sacar un rato.

      Un saludo.

  • Hola, excelente tutorial, tengo una duda, en caso de querer enviar el valor de una variable autiomaticamente en un sms como seria la sintaxis para hacerlo, he estado probando pero me da error al compilar.
    SIM900.println(“SMS enviado desde un Arduino. Saludos de Prometec.”); // Texto del SMS

    por ejemplo para enviar el valor de la prersion atmosferica recogida de un sensor yo hago lo siguiente:
    SIM900.println(“presion=””presion_at”); // Texto del SMS

    donde presion_at es el valor recogido por el sensor.

    Gracias por vuestro tiempo

      • Maddox

      Buenas hecpas, no se si ya resolviste tu problema, no obstante, te explico.
      El comando “println” de Arduino, no es como el comando “printf” del C que usamos en Windows.

      Mientras que en la función “printf” puedes incluir valores de variables dentro del String a mostrar, ya que los concatena, [Ejemplo: printf(“valor=%d”, &presion) En esta ocasión, se muestra el valor de “presion” donde se ha colocado %d en la String]
      En la función “println” de Arduino, solo puede mostrar una sola cadena, es decir, no puede concatenar una String constante con otra String de una variable.

      No obstante hay una solución:

      Al no poder incluir todo dentro de la misma función println, siempre puedes dividir el contenido en dos funciones, para que una muestre el texto constante, y otra el valor de la variable. Quedaría de la siguiente manera:

      SIM900.print(“presion=”); //Muestra la cadena de texto
      SIM900.println(”presion_at”); //Muestra el valor de la variable

      Lo primero lo pongo en una función “print”, para que no haga un salto de linea, y me permita seguir añadiendo texto. Lo último lo pongo con un “println” para que finalice con un retorno y una nueva linea, de manera que se finalice el texto.

      Espero que te haya servido de ayuda.
      Un saludo.

  • Hola lo probe y todo bien menos el enviar mensajes, no logro que envie el mensaje al movil, en el terminal serial aparece como enviado pero sin embargo jamas llega, que podria ser?.

    • Hola Cristian, hemos hecho un pequeño cambio en el programa quitando un espacio de un comando AT. Prueba ahora a descargarlo otra vez y a ver si te funciona y si no lo miramos. Un saludo.

  • Hola. muchas gracias por toda esta información, tengo una pregunta. En mi caso yo utilize un código similar, pero le agregue un sensor de movimiento el cual esta conectado al shield, y del el shield salen unas conexiones que ban a un protoboard que tiene un led. Al detectar movimiento el LED se enciende y se supone que el shield debería de ya sea llamar o mandar un mensaje a un celular para mandar la alerta de invasion de domicilio, pero el problema es que no realiza ni manda ningún mensaje, me podrías por favor dar un consejo?
    Mi sensor ya detecta movimiento, y el led ya enciende, la sim tiene saldo y puede recibir y realizar llamadas cuando lo probe en un celular, al realizar una llamada desde mi cel a la sim cuando esta montada en el shield me reconoce que la sim esta activa o alcanzable porque cuando la desconecto me manda mensaje de que el numero no se encuentra disponible, le conecte un power alterno al shield a parte del del arduino (USB) pero nada funciona y ya estoy toda desesperada. Por favor ayudame 🙁 dame un consejo.

    • Hola Adriana, ¿si tratas de hacer una llamada sin más con el programa de la sesión consigues hacerla o tampoco? Me parece entender que sí pero no estoy seguro. En caso de que si lo consigas prueba a usar el programa de esta sesión, que es un poco más completo:

      http://www.prometec.net/gprs-enviar-recibir-llamadas-sms/

      Verás que usamos una estructura case para mandar mensajes o sms, no tendrías más que usar ese case o una estructura if en la que realice la llamada al activarse el sensor en vez de al recibir una ‘l’ o una ‘s’ por el puerto serie.

      Pruébalo y nos cuentas a ver. un saludo.

    • Jennifer

    Hola amigo disculpaa y podrias proporcionar la libreria del SIM900 ya que me marca error en el codigo porque no encuentra la libreriaa de favor te lo agradeceria mucho

    • Hola Jennifer, pues no usamos ninguna librería que esté relacionada con el SIM900. Usamos la librería softwareserial, que se supone que viene por defecto en el ide, pero compruébalo por si acaso. Esa librería nos sirve para emular un puerto serie usando dos pines digitales para podercomunicarnos con el sim900. Un saludo.

    • Ricardo

    Excelente informacion, ahora como podria hacer yo para que desde mi celular yo envie el numero para que la sim900 lo interprete y lo tome como el numero nuevo al cual llamar en lugar de programarlo en ATDXXXXXXXXX.

    gracias por su ayuda

    • Hola Ricardo, podrías crear una variable String, y sacar el número de dentro de un SMS y asignárselo al String que has creado. Luego no tienes mas que añadirle el ATD por delante y el ; al final al String y meter la variable dentro dentro de la instrucción en la que llamas por teléfono en vez del ATDXXXXXXXXX;

Give a Reply

WordPress Anti-Spam by WP-SpamShield

KIT DE INICIO A ARDUINO

¡¡Solo en Mayo!!

Antes 72€

¡¡Ahora por sólo 64,95€!!

Comprar