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.

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

PROBANDO LOS COMANDOS AT

 

Para poder comunicarnos vía comandos AT tendremos que cargar un programa para la comunicación serie como hemos hecho tantas veces anteriormente. Crearemos una instancia llamada SIM808 y seleccionaremos los pines del Arduino que queramos usar para comunicarnos (Rx y Tx). Nosotros hemos elegido el 7 y el 8, pero podéis usar cualquiera que sea compatible con la librería. También podéis cambiar la velocidad de comunicación, pero debe ser la misma para el puerto serie y para la instancia que hemos creado. Nosotros hemos elegido 19200 porque es la que usa el SIM900, de forma que podamos usar los programas que ya tenemos de esas sesiones.

#include <SoftwareSerial.h>
SoftwareSerial SIM900(7, 8); //Seleccionamos los pines 7 como Rx y 8 como Tx

void setup()
{
 SIM900.begin(19200);
 Serial.begin(19200);
 delay(1000);
}

void loop()
{
 //Envíamos y recibimos datos
 if (Serial.available() > 0)
 SIM808.write(Serial.read());
 if (SIM808.available() > 0)
 Serial.write(SIM808.read());
}

Una vez hayamos cargado el programa abrimos el monitor serie y seleccionamos la velocidad correcta. El primer comando AT nos servirá simplemente para saber si el módulo responde y que por lo tanto la comunicación funciona. Y este comando es simplemente AT, lo escribimos y pulsamos INTRO. Debería respondernos con un OK; si no deberíamos repasar que esté todo en orden: conexiones, encendido y velocidad correcta.

monitor serie AT

Comprobado esto, ya podemos meter el PIN de la tarjeta SIM, que se hace mediante el comando AT+CPIN=”XXXX”; donde tendréis que sustituir XXXX por el pin que corresponda, en mi caso 1867, o sea, AT+CPIN=”1867″. Obtendremos un mensaje de respuesta indicando si el PIN es correcto, y en caso de que lo sea, el LED que parpadeaba una vez por segundo pasará a hacerlo cada 3 segundos (más o menos), indicando que ha encontrado la red móvil.

comando at pin sim

Y ahora ya estamos en disposición de enviar y recibir llamadas y conectarnos a Internet. Para comprobar que efectivamente podéis llamaros al numero de teléfono de la SIM que hayáis puesto en el módulo, o usar el comando ATDXXXXXXXXX; (sustituyendo las X por el número de teléfono y respetando el “;”) para llamar a quien queráis. Y si le conectáis unos cascos y un micrófono al módulo podréis hablar como si fuera un teléfono normal.

monitor serie llamar recibir

O si llamáis al número de teléfono de la SIM que hayáis colocado, oiréis tono y en el monitor serie veréis como aparece “RING”.

 

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(20000);  // Espera 20 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

Aquí os dejamos un vídeo para que veáis cómo nos ha ido a nosotros:

 

En la siguiente sesión aprenderemos a recibir llamadas y SMS. Y, si os habéis quedáis con ganas de más, os recomendamos que echéis un ojo a esta sesión. En ella encontraréis un programa más trabajado en el que, entre otras cosas, vamos a usar una función para enviar los comandos AT y asegurarnos de que la respuesta del módulo sea la que esperamos.

 

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

 

(301) Comments

  • Buenas tardes, una pregunta ¿A qué se refiere con el “PIN de la SIM” dónde puedo consultarlo? Gracias

    • Es el PIN de tu tarjeta de teléfono. Debería venirte con ella o si no tienes que consultarlo con tu operadora.

    • José Carlos Vargas

    Un Saludo.
    En un Arduino Uno, donde tengo Instalado un Módulo Bluetooth HC06 en pines 0 y 1, funcionando y enviando comandos a una aplicación.
    Puedo conectar simultáneamente un módulo GSM, creando un puerto serie por Hardware en pines 10 y 11 por ejemplo, para enviar alarmas.?
    Funcionarían los dos puertos?.

    • Sí, deberían funcionar. Y si necesitas más tienes el Arduino Mega que cuenta con 4 puertos serie.

    • Rodolfo

    Excelente Video Ivan, ¿Algun modulo que me puedas recomendar para conectarme a 3G o 4G? podria contactarte? De antemano agradezco mucho tu atencion y tu tiempo. EXCELENTE VIDEO Y APORTE. Saludos.

    • Muchas gracias Rodolfo, este es 2G y la verdad es que no he probado más. A ver si alguien puede echar algo de luz. Un saludo.

    • Luis

    He intentado incorporar una tarjeta SIM TIGO 4G pero no realiza ninguna llamada el modulo SIM900
    Estimado Ivan: ¿Tiene que ver el chip en el mal funcionamiento del SIM900?

    • Hola Luis, primero mira a ver si llamando tu a esa tarjeta te da tono, para asegurarnos de que le pin esté bien y coja la red.

    • Joluflocu

    Buenas, el monitor serie no para de escribir por pantalla el símbolo ¿¿¿¿¿¿¿¿, tampoco puedo enviar comandos AT, no los saca en pantalla, ya que todo el rato escribe: ¿¿¿¿¿¿¿¿, a qué puede ser debido? gracias

    • Eso es que la velocidad de comunicación no es la correcta. Fíjate que tengas la velocidad del monitor serie a 19200, y si no es que tu módulo no funciona a esa velocidad y que tendrás que probar a ver cuál es la correcta.

    • Xavier

    Hola, una pregunta, tu le colocaste la batería 3V CR1220 al reverso de la placa ??????? que queda cerca del portasim !!!!!. NO me funciona, no sé si es por no colocar esa batería, ya que estoy alimentando como lo indicas en el vídeo. Pero no me responde al comando AT

    • Hola Xavier, la pila no es necesaria para que arranque la placa. Prueba a alimentar la el GPRS y el Arduino por separado, y el GPRS hazlo con un alimentador de 9v de Arduino a ver si as te funciona bien.

  • Ahora que me doy cuenta lo que tengo conectado es una batería de 7.4v. Igual no le llega para que funcione. Acabo de probar poniendo la alimentación auxiliar tanto en arduino como en el módulo y no funciona.

    • He probado ahora con el cargador de la batería lipo (9v) y nada.

      • Hola Domingo, prueba con una fuente de alimentación de 9V de las típicas de Arduino. Con esa debería funcionar sin problema.

  • Hola Diego. Estoy usando el GPRS para un proyecto de una alarma con sms. El problema es que no sé qué puede estar fallando pero no funciona. Se encienden 3 luces rojas en el módulo, una de ellas parpadea una vez por segundo. Cuando conecto la placa y subo el programa solo se enciende una y cuando le doy al botón manual se encienden las demás. No responde al comando AT ni al AT+CPIN. Estoy usando un Arduino Mega con los pines 10 y 11 conectados al 7 y 8 del GPRS y con el pin 52 conectado al 9 del GPRS. Tampoco sé si la soldadura que he hecho en el pad R13 está bien… cuando la hice se me despegó como una de las 2 chapitas metálicas que tiene el pad (la de la derecha) y lo soldé encima hasta que quedó un pegote de estaño como el que tienes en la foto. Estoy usando alimentación auxiliar. No sé qué hacer porque estoy siguiendo el tutorial y como digo hasta donde sé debería estar todo en orden. No sé si falla al encender la tarjeta o al meterle el pin o al conectar a la red o a todo… Espero que me puedas ayudar, te estaría muy agradecido.

    • Perdón Iván* xD Lo siento mucho.

      • 🙂 A ver, vamos a ir por partes para descartar errores. Primero, enciende el gprs y el arduino, y pulsa el pulsador durante un par de segundos. Deberías tener 2 luces fijas y una tercera que empieza a parpadear. Entonces fíjate que tengas el programa cargado y el monitor serie a 19200 y envía AT. Debería devolverte OK. De momento no trates de meter el PIN, vams a centrarnos en esto.

        Si ves que no te responde, mira el cableado por si acaso, recuerda que tienes que unir las tierras del Arduino y el GPRS con un cable aunque los alimentes por separado. Y fíjate que los jumpers del GPRS estén puestos en el 7 y 8 (tienes la foto en la sesión.

        Prueba y me cuentas. Un saludo.

        • He puesto los jumpers como en la foto. Tengo alimentación auxiliar conectada al Arduino y el Vcc y el ground como en la foto (perdona no aclarar antes que no la tenía en el GPRS). Se me encienden las 2 luces fijas y una parpadea. Cargo el programa con el monitor serie a 19200, envío AT y no responde con OK.
          Tenía copiado el programa solo que donde pone SIM808 puse SIM900. Si pongo SIM808 me salta error ‘SIM808’ was not declared in this scope. No sé si puede tener alguna relación con mi problema.

          • Avatar for Ivan Uriarte

            Y donde pone 7, 8 puse 10, 11 porque estoy con el Mega. También he probado a poner los cables del 10 y 11 de sitio por si los tenía conectados al revés y a poner 11, 10 pero no funciona igualmente.

  • Hola. Lo primero, enhorabuena por vuestra página. Es muy útil.
    Tengo un problema con el shield SIM900: Si lo apago pulsando el botón PWR no hay manera de volverlo a encender. Lo tengo alimentado con 9V@1A. Debo hacer algo más? Podría estar defectuoso? No me importaría comprar otro, pero si el resultado va a ser el mismo preferiría buscar otro shield. Gracias.

    • Hola Enrique, yo creo que si lo apagas de hay no permite volver a encenderlo. Hay que apagar del interruptor.

      • Gracias por la respuesta Ivan.
        Mi problema es que de vez en cuanto necesito resetearlo porque deja de comunicar. He tratado encenderlo y apagarlo por software (con su correspondiente soldadura de puente) y pasa lo mismo que con el pulsador: apaga pero no enciende.

        pinMode(9, OUTPUT);
        digitalWrite(9, HIGH);
        delay(2000);
        digitalWrite(9, LOW);
        delay(5000);

        Hay alguna otra forma de hacer un reset o volver a encenderlo?

        Gracias

        • Hola Enrique, pues tienes razón no encuentro manera de hacerlo… Sólo se me ocurre que alimentes por separado el arduino y el GPRS y que pases la alimentación del GPRS por un relé. Así podrías apagarlo por completo y volver a encender la tarjeta por software. Supongo que debería funcionar. Un saludo.

    • Emmanuel

    Hola, tengo un problema y no se donde mas buscar. Tengo el sim800l y no logro conectarlo. Probe con la libreria fona, pero es como si el modulo no le responde nada al arduino

    • No he utilizado ese chip, pero si no te responde seguramente el problema está en las conexiones o la velocidad de comunicación. Un saludo.

    • Ivan

    hola tengo un problema cuando pongo para llamar o enviar mensajes, no los hace ya probe la conexion y el saldo y tiene todo la programacion tambien esta bien la alimentacion tambien, tambien los jumpers

    • El pin lo reconoce y te da el visto bueno? Se mantienen encendidos los led que indican que la sim está encendida?

    • OSCAR ROBERTO FONSECA BARRERA

    hola ivan; quiero saber si al realizar uno puede dejar un mensaje predeterminado para que lo escuche a la persona que se llama gracias

      • OSCAR ROBERTO FONSECA BARRERA

      era si al realizar una llamada puedo dejar un mensaje predeterminado?

    • Hola Oscar, que yo sepa no es posible, al menos directamente con este módulo.

    • Diego mora

    hola gente de prometec, podrían indicarme como seria el cableado de este modulo sim900 a una raspberry pi 3?
    no he logrado hacerla funcionar 🙁 …….una ultima cosa, este modulo sim900 le encienden los leds de color verde tambn? solo me enciende de color rojo todos los leds. gracias

    • Hola Diego, pues la verdad es que ni idea… a ver si alguien te puede echar una mano.

Give a Reply

WordPress Anti-Spam by WP-SpamShield