bclose

MÓDULO GSM/GPRS: recibir llamadas y SMS

Seguimos trabajando con el módulo GPRS

Objetivos

 

 

    • Recibir llamadas y SMS.
    • Identificar quién nos llama.
    • Mostrar los SMS en el monitor serie.
 

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.

 

RECIBIR LLAMADAS

 

Ya vimos en la sesión anterior cómo conectar y poner en marcha el módulo GPRS, y si alguien probó en ese momento a llamar a la tarjeta que tenemos colocada en el SIM900, habrá visto como da tono normalmente.

Sin embargo no habrá visto nada que indique que se está recibiendo una llamada, aunque si nos fijamos veremos como uno de los LEDs de la tarjeta se apaga mientras se recibe. Así que lo que vamos a hacer es que nos avise mediante el monitor serie cuando las reciba.

En principio la única diferencia hasta llegar al loop va a ser que declararemos una variable global de tipo char para guardar los caracteres que nos lleguen del SIM900.

char incoming_char = 0; //Variable para guardar los caracteres que envía el SIM900

En el loop simplemente comprobaremos que se están enviando caracteres desde el SIM900 y los iremos mostrando por el monitor serie.

void loop()
   {
      if (SIM900.available() > 0)
         {
            incoming_char = SIM900.read(); //Guardamos el caracter que llega desde el SIM900
            Serial.print(incoming_char); //Mostramos el caracter en el monitor serie
         }
   }

Si ahora probáis a hacer una llamada al número que tengáis en la tarjeta del SIM900 veréis que en el monitor serie mostrará la palabra “RING” una vez por cada tono, y terminará con un “NO CARRIER”.

monitor serie llamada sim900

Pero muchas veces puede sernos muy útil saber quién nos está llamando para, por ejemplo, realizar una acción sólo si nos llama un número determinado (cosa que veremos en la próxima sesión). Para ello utilizaremos el comando “AT+CLIP=1\r”. Si queremos desactivarlo sólo tenemos que volver a ponerlo a 0. Y con esto ya tendríamos el programa completo para recibir llamadas.

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

char incoming_char = 0; //Variable para guardar los caracteres que envia el SIM900

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
      Serial.println("PIN OK");
      SIM900.print("AT+CLIP=1\r"); //Activamos la identificación de llamada.
      delay(1000);
}

void loop()
   {
      if (SIM900.available() > 0)
         {
             incoming_char = SIM900.read(); //Guardamos el caracter que llega desde el SIM900
             Serial.print(incoming_char); //Mostramos el caracter en el monitor serie
         }
   }
monitor serie sim900 ring clip

 

RECIBIR SMS

 

Para recibir también correctamente los SMS, sólo tenemos que incluir un par de comandos AT más en el setup. Uno ya lo conocemos de la sesión anterior, que configura el módulo para poder enviar y recibir SMS “AT+CMGF=1\r”. Y también incluiremos el comando “AT+CNMI=2,2,0,0,0\r” que lo configura para que nos envíe por el puerto serie los SMS que nos lleguen.

Así el programa completo para recibir llamadas y SMS quedaría así:

#include <SoftwareSerial.h>
SoftwareSerial SIM900(7, 8); // Configura el puerto serial para el SIM900

char incoming_char = 0; //Variable para guardar los caracteres que envía el SIM900

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
      Serial.println("PIN OK");
      SIM900.print("AT+CLIP=1\r"); // Activamos la identificación de llamadas
      delay(1000);
      SIM900.print("AT+CMGF=1\r"); //Configura el modo texto para enviar o recibir mensajes
      delay(1000);
      SIM900.print("AT+CNMI=2,2,0,0,0\r"); //Configuramos el módulo para que nos muestre los SMS recibidos por comunicacion serie
      delay(1000);
   }

void loop()
   {
      if (SIM900.available() > 0)
         {
            incoming_char = SIM900.read(); //Guardamos el caracter que llega desde el SIM900
            Serial.print(incoming_char); //Mostramos el caracter en el monitor serie
         }
   }

Y cuando recibamos un mensaje se nos mostrará por el monitor serie tanto el número desde el que se envía como el contenido del SMS, con la fecha y hora del envío. Y si nos fijamos, al contrario que en las llamadas, el número vendrá con el prefijo internacional, en mi caso el +34 que pertenece a España.

SMS monitor serie sim900

Y como siempre, podéis descargar el programa completo aquí: recibir_llamadas_y_SMS.

En la siguiente sesión utilizaremos lo que hemos aprendido para que nuestro Arduino se ponga en contacto con nosotros si fuera necesario, y a que realice ciertas órdenes utilizando llamadas y SMS, y asegurándonos de que sólo responda ante nosotros.

 

Resumen de la sesión

 

En esta sesión hemos aprendido varias cosas importantes:

 
    • Cómo recibir llamadas y SMS y mostrarlas por el puerto serie.
    • A identificar quién nos está llamando.
    • Ya sabemos recibir y enviar llamadas y SMS.
 
 
 

LikeUsOnFacebook_Icon

(20) Comments

  • Buenos dias,

    Estoy haciendo un proyecto con la placa de “Arduino Mega 2560” y una “SIM900”. He hecho el mismo programa que nos habeis mostrado y cuando envio el mensaje desde mi movil, en la pantalla me aparece, “OK”, “PIN OK” y ya esta, no me aparece lo siguiente, que es desde que numero se envia el mensaje y el mensaje mismo.
    He conectado dos cables por salida, uno al RX1 y el otro al TX1, como me ha dicho mi profesor, pero no se porque el mensaje no se envia del todo, cual podria ser el fallo?

    Saludos,

    • Nuestro programa utiliza la librería SoftwareSerial porque los Arduino Uno sólo tienen un puerto serie. De todas formas también puedes usarla con el MEGA (está indicado en la sesión).

      Pero si vas a utilizar el puerto serie número 1 del MEGA (tiene varios) no hace falta usar esa librería, simplemente utilizarias la instrucción Serial1.xxxx dodnde nosotros usamos SIM900.xxxx, y conectar correctamente el MEGA y el GPRS. Un saludo.

    • Alberto

    ¡Hola!
    ¡¡¡¡¡¡¡Funciona!!!!!!!.
    Cambiando en Arduino Mega los pines 7 por el 10 y 8 por el 11 funciona tal y como indica el tutorial.

    Muchas gracias Iván.
    Salu2.

    • Hola Alberto, me alegro que lo hayamnos solucionado! Me lo apunto y en cuanto puedo añado la explicación al tutorial. Un saludote!

    • Alberto

    Hola;
    Agradecer de antemano la labor de los tutoriales pues nos instruyen de manera clara y sencilla en el universo Arduino.
    Comentaros que yo tambien tengo el mismo problema. Utilizo un Arduino Mega (ya que no logro subir y compilar el programa en un arduino UNO, pero eso es otro caso a parte) y el mismo GPRS que el tutorial, he probado a encender un LED dentro de la condición “if (SIM900.available() > 0)” y no se enciende sin embargo si que lo hace fuera de esta condición, por lo que deduzco que el problema está en la recepciónde datos del GPRS al Arduino Mega. Probaré la solución que propone Iván y os comento algo.

    Salu2!.

    • Hola Alberto, la cuestión es que por lo visto el pin 8 del Arduino Mega no se puede usar con la librería Sofware Serial. y claro como no recibe ningún dato no entra nunca en ese bucle, por lo que no puedes encender el LED dentro de él.

      Prueba a usar los pines 10 y 11 del Arduino como comentaba a ver si te funciona. Un saludote!

  • Hola, gracias por el tutorial, tengo el mismo problema que Andrew, la diferencia es que yo lo hago con hardwareSerial del arduino mega, y uso la misma shield del tutorial, a mi tampoco me muestra el RING y los mensajes que envío desde el celular, como te aparece en el tutorial en el monitor serial, que puede ser?; hay que configurar algo mas en el shield para recibir llamadas y mensajes? y tengo una duda si deseo programar una hora predeterminada para enviar mensajes con la shield, o cada cierto tiempo, lo haría con un delay o un reloj? o existe un comando AT?. Gracias por la información y el tiempo brindado.

    • Hola Gabriel, prueba la última opción que le he dado a Andrew a ver si te funciona, yo es que ahora mismo no tengo un Mega para probarlo.

      Por otra parte, la solución fácil que se me ocurre es utilizar un RTC para obtener la hora correcta y enviar el mensaje cuando quieras. Tienes aquí una sesión sobre los RTC: http://www.prometec.net/relojes-rtc/

      Un saludote!

  • Buenos días Ivan,
    Esta es la shield que estoy utilizando: https://drive.google.com/open?id=1VBF2M5rVUryQtoml0c7Lwh_F1p2QygMZ8g
    Cuando la conecto al Mega, como te dije, funcina enciando y recibiendo, por que en el movil desde el que mando el mensaje a la shield me indica “entregado”.
    Lo que no tengo nada pero que nada claro es como hacer eso de los pines que me indicas. Es decir, ¿como hago si el 8 no es el adecuado?
    Lamento tanta molestia, pero llevo meses con este tema hasta que vi estos tutoriales y la verdad, son de mucha ayuda, pero en este punto estoy CIEGO.
    Gracias

    • Hola Andrew, no es ninguna molestia, estamos para ayudar. Creo que el error puede venir por lo siguiente. Según he leído por ahí dice que el Arduino Mega es compatible con la librería Software Serial en todos los pines, pero sin embargo al leer la documentación de la librería no todos lo son, y entre ellos no está el pin 8.

      Prueba a utilizar los pines 10 y 11, es decir, conecta los pines 7 y 8 del GPRS a los pines 10 y 11 de Arduino Mega, y cambia esta instrucción SoftwareSerial SIM900(7, 8); por esta SoftwareSerial SIM900(10, 11); y me cuentas a ver.

      Y si no ahora que me he dado cuenta, el Arduino Mega tiene varios puertos serie, podrías utilizar cualquiera que no sea el 1 (0 Rx y 1 Tx), aunque no se si estás familiarizado con esto.

      Prueba lo que te comento primero y si no funciona probamos otras cosas. Un saludote!

      • En cuanto a lo de los Pines 7 y 8 del GPRS . . . no tengo ni idea de cuales son , por que como te mostré en la imagen (https://drive.google.com/open?id=1VBF2M5rVUryQtoml0c7Lwh_F1p2QygMZ8g) no están numerados…¿Serán los mismos que coinciden con el 7 y 8 del Mega?

        “Y si no ahora que me he dado cuenta, el Arduino Mega tiene varios puertos serie, podrías utilizar cualquiera que no sea el 1 (0 Rx y 1 Tx), aunque no se si estás familiarizado con esto.” -> Pues no. No lo estoy y realmente me gustaría saber a que te refieres. En la placa tengo puestos los conectores RX y TX en SWSerial. ¿?

        • Hola Andrew, a ver los pines 7 y 8 del GPRS son los que tenemos marcados en el tutorial que se conectan al 7 y 8 del Arduino. En tu foto de los de abajo el que setá junto antesy el que esta justo después de la pequeña separación que hay. Es decir el primero por la izquierda sería el 0, el siguiente el 1… y así hasta el 7 y 8.

          En cuanto a la otra cuestión: usamos la libreria software serial para simular un puerto serie usando dos pines que no sean el 0 y el 1 del Arduino uno, que son los encargados de realizar la comunicación serie. El Mega tiene más puertos serie (los que vienen marcados con Rx y Tx) pero de momento vamos a dejar esto. Pruebea a ver si te funciona conectando com o te digo los pines 7 y 8 del GPRS a los pines 10 y 11 del Mega y cambiando la instrucción que te comentaba y me cuentas a ver.

          Un saludote!

          • FUNCIONA OK!!!
            Gracias Ivan por tu paciencia.

          • Lo que sucede ahora es que al enviar los mandatos al grps el monitor los muestra pero muy lento, es decir, al enviarle el SIM900.print(“AT+CLIP=1\r”); en el monitor se muestra AT+CLIP=1 a razón de 2 segundos para mostrar cada letra. 🙁
            Pero si, consigue mostrar mensaje.

          • Imagen de perfil de Ivan

            Hola Andrew! Bueno al menos algo hemos avanzado jejeje. Pues la verdad es que no se me ocurre que puede ser. Estás usando el programa que tenemos subido en la sesiÓn Si no es así mira que no tengas algún delay dentro del loop o de alguna de las funciones que pueda estar haciendo eso.

            Un saludote.

          • Solucionado.
            Le he quitado la linea * SIM900.print(“AT+CNMI=2,2,0,0,0\r”); * y ahora no tiene ese retardo del que te hablaba, me muestra mensajes y realiza llamadas.

            Saludones!

  • Hola. Muy buenas explicaciones. Enhorabuena.
    Utilizo arduino Mega 2560 y una Sim900.
    Todo lo anterior a este ejemplo funciona perfectamente.
    Este último ejemplo, al compilarlo, es cierto que recibe llamadas, por que se oye el tono y si descuelgo puedo hablar y comunicar (utilizo auriculares y mic conectado a la sim900).
    El caso es que no muestra en el monitor los RING ni los mensajes que se le envien, y si que los recibe por que en el teléfono donde los envio tengo activado “recibir mensaje de recepción”.
    No se que puede pasar, la verdad.

    • Hola Andrew, lo primero supongo que tendrás bien seleccionada la velocidad del monitor serie correctamente a 19200 baudios.

      En caso de que así sea, ¿en la sesión anterior te realizaba correctamente las llamadas y los SMS, no? En ese caso el problema estaría en la recepción de los mensajes desde el GPRS al Arduino, que se realiza usando el pin 8.

      Yo no he probado a usarlo con un Mega, pero no debería haber problema en teoría. De todas formas cuando me contestes eso seguimos mirando a ver. La programación la he comprobado por si acaso y funciona correctamente (usando un UNO). Un saludo.

      • Cierto, las llamadas y los SMS los envia OK. El prolema es la recepción.
        Me pierdo cuando me indicas lo del Pin 8, supongo que te refieres al Pin 8 del ¿GPRS?

        • Hola Andrew, en teoría el shield utiliza los pines 7 y 8 del shield y del Arduino para comunicarse entre sí. Uno para enviar datos y otro para recibir. Esos datos luego los vemos nosotros por el monitor serie que utiliza los pines 0 y 1. Creo que me he equivocado y en realidad es el pin 7 el que envía los datos que le llegan al shield hacia Arduino.

          Si envías los SMS y las llamadas correctamente significa que Arduino es capaz de enviarle órdenes al GPRS, pero parece que en tu caso no recibe los datos que deberían llegarle desde el GPRS.

          ¿Estás utilizando el mismo módulo GPRS que he usado yo para la sesión? Comprueba también que tengas bien puesto los bridges para usar los pines 7 y 8 y correctamente enchufados los cables, no vaya a ser que esté mal colocado alguno. un saludote!

Give a Reply

WordPress Anti-Spam by WP-SpamShield