Control de Mensajes SMS a través de un PIC

Este tutorial trata sobre la comunicación RS-232 entre un Microcontrolador (PIC) y un teléfono o módulo GSM para el control de mensajes SMS por medio del estándar de comandos AT.

MICROCONTROLADORES

Biblioman & Inyelber

7/14/20129 min leer

Este tutorial trata sobre la comunicación RS-232 entre un Microcontrolador (PIC) y un teléfono o módulo GSM para el control de mensajes SMS por medio del estándar de comandos AT. Por un lado describiré mis experiencias a la hora de conectar el PIC a un teléfono móvil comercial (SAGEM MY 3036) y por otro lado se describirán las experiencias con el módulo GSM TC35i que el amigo Inyelber nos ha comentado en el foro (gracias por el aporte).

Primeras pruebas con el SAGEM MY3036

Lo primero que le puede venir a la cabeza a alguien que quiera conectar su viejo celular a un Microcontrolador es si su teléfono permite esa conexión y en caso de que así sea el cómo hay que hacer la conexión. El requisito imprescindible para ello es que el teléfono móvil disponga de un modem GSM con interfaz serie, lo que el número de candidatos se suele reducir a teléfonos ya antiguos como el Siemens C55, Nokia N70, etc. El que se haga la pregunta si el PIC se puede comunicar con un teléfono más moderno con interfaz USB o bluetooth, pues supongo que sí pero no es el tema de este artículo, tal vez para la próxima...

Una vez que sabemos que nuestro celular dispone de modem GSM y de una interfaz serie para comunicarnos con él vía RS-232 debemos de comprobar que podemos establecer una comunicación con él por medio de comandos AT, para ello la forma más fácil es conectar el teléfono a un PC equipado con puerto serie a través de un cable de datos, según se muestra en la figura de abajo:

No hay que poner ningún convertidor entre ellos, tanto el puerto COM del ordenador como el Modem interno del teléfono trabajan con niveles RS-232.

Para empezar a comprobar si tenemos comunicación entre el ordenador y el móvil utilizaremos cualquier programa de comunicación serie como el hyperterminal.

Establecemos una nueva conexión con el teléfono SAGEM:

A través de un puerto COM de nuestro ordenador (en mi caso el COM1):

Establecemos los parámetros de configuración del puerto (9600,8,N, 1,N):

Por la parte del Modem del teléfono Móvil los parámetros se configuraron automáticamente al establecer la conexión, por lo que no tuve que configurar nada.

Una vez que la conexión se ha establecido se mandan comandos AT a través del Hyperterminal para comprobar que el teléfono responde:

No todos los teléfonos soportan todos los comandos Hayes o AT.

La lista completa de comandos para el teléfono SAGEM lo tenéis aquí.

Una tabla con los comandos más utilizados y que suelen aceptar todos los teléfonos sería la siguiente:

Ejemplo de alarma con envío de SMS

Este es un ejemplo sencillo de envío de mensajes SMS a través de un PIC conectado a un teléfono móvil por medio de una interfaz serie RS-232. El funcionamiento es sencillo, cuando el sensor volumétrico se activa cierra su contacto, este alimenta al convertidor CA/CC que a su vez alimenta al relé RL1, este cierra su contacto y produce una interrupción en el PIC a través de la patilla RB0 que hace que se envíen los comandos AT necesarios para que el teléfono móvil envíe un número determinado de mensajes de alarma al número que hayamos introducido en el programa.

Esquema eléctrico

El circuito utiliza un convertidor de niveles MAX232 para adaptar los niveles TTL requeridos por el PIC a los niveles del estándar RS232 utilizado por el teléfono.

Importante: anteriormente he comentado que para conectar el teléfono móvil al PC no se necesita ningún conversor de niveles ya que ambos utilizan los niveles de tensión del estándar RS232, además la conexión entre el teléfono móvil y el puerto serie del PC se hace a través de un cable de datos directo (sin cruzar) ya que el Teléfono Móvil hacía de equipo de comunicación de datos (DCE) y el PC de equipo terminal de datos (DTE). Ahora estamos conectando el PIC al teléfono Móvil a través del convertidor de niveles, ambos (el PIC y el Teléfono) son DCE, por lo que si dejamos las mismas conexiones en el circuito el cable para conectarnos al teléfono tiene que ser un cable cruzado (Null módem) que es simplemente un cable que tiene cruzadas las líneas Tx y Rx. Comercialmente estos cables se suelen diferenciar visualmente de los normales en que las piezas de plástico que sirven de ayuda para atornillar y sujetar el conector son de color violeta y en los cables normales (sin cruzar) son de color gris de todas formas por si acaso es buena idea comprobar las conexiones de los pines con el polímetro antes de conectar.

¡Ojo! Si nos equivocamos y ponemos un cable directo entre el convertidor de niveles y el teléfono no solo no funcionará sino que nuestro querido MAX232 se empezará a calentar como si de una estufa se tratará, lo que vendría después ya os lo podéis imaginar.

Circuito montado

Código fuente del PIC

/////////////////////////////////////////////////////////////////////////
// //
//Alarma con sensor volumétrico y envío de mensajes SMS //
// //
// www.aquihayapuntes.com //
// //
/////////////////////////////////////////////////////////////////////////

#include <16F877.h>
#device ICD=TRUE//si no utilizas el debugger debe de ir comentada
#FUSES NOWDT, HS, NOPUT, NOLVP
#use delay(clock=20000000)

//Configuración puerto serie
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

//Variables de configuración SMS
#define NUMERO_MENSAJES 2 //Número de mensajes a enviar
char NUMERO[] = "+34681345641"; //Numero de teléfono a marcar
char MENSAJE[] = "Prueba Alarmar AquiHayapuntes.com";//Mensaje a enviar

int flag=0;//variable auxiliar

#int_EXT
void EXT_isr(void){//función de tratamiento a la interrupción externa

flag=1;

}

//Función para configurar paramétros del modem
void configurar_Modem(){

printf("at+cmgf=1r"); //configura el tipo de formato de mensaje de texto SMS (formato TEXTO)
delay_ms(200);

}

//Función para enviar mensajes SMS
void Envio_SMS(){

char ctrlz = 26; //combinacion de teclas "ctrl+z"

printf("at+cmgs="%s"r",NUMERO);
delay_ms(200);
printf("%s",MENSAJE);
delay_ms(200);
printf("%c",ctrlz); //se envia el mensaje
delay_ms(200);

}
void main()
{
int i;

//Configuración registros PIC
enable_interrupts(GLOBAL);//habilito interrupción global
enable_interrupts(INT_EXT);//habilito interrupción externa
ext_int_edge(L_TO_H);// flanco de activación ascencente

delay_ms(1000);//retarto para estabilizar

configurar_Modem();//llamada a la función de configuración del modem

while(true) { //Bucle infinito hasta interrupción

if (flag==1){ // si se produce alarma envio mensajes

for(i=0;i<NUMERO_MENSAJES;i++){
Envio_SMS();
}
flag=0;
}

}
}

Aquí tenéis un vídeo de la aplicación funcionando:

Envío y recepción de mensajes SMS con el módulo GSM TC35i

Paso a ahora a redactar las experiencias con el módulo GSM TC35i que el amigo inyelber a tenido a bien compartir con todos nosotros, para cualquier pregunta o duda podéis hacerla a través de los comentarios de los vídeos o en las redes sociales.

Descripción del módulo GSM TC35i

El módulo GSM TC35i es una mejora del GSM TC35 este último es solo dual band es decir trabaja solo con las frecuencias de 900/1800 MHz. Como nos comenta Inyelber un dato importante antes de adquirir el módulo es comprobar si en nuestro país existen operadoras que trabajen en esas frecuencias, para evitar este problema podemos adquirir el modulo GSM SIM900, cuesta un poco más pero es Quadband y sirve para todas las operadoras.

El GSM TC35i incorpora una interfaz serie RS232 y un conector DB9, el módulo está diseñado para ser conectarlo directamente al PC por lo que en la placa lleva un MAX232 para adaptar los niveles al estándar RS232 que utiliza el PC, para conectar el módulo a un PIC debemos utilizar otro MAX232 para volver adaptar los niveles a los valores TTL requeridos por el PIC, en las siguientes fotos se ve el detalle de las conexiones.

Detalle de las conexiones del MAX232 que lleva el módulo GSM:

Detalle de las conexiones del segundo MAX232, por un lado se conecta al MAX232 que lleva incorporado el módulo GSM y por el otro al PIC:

Probando el módulo..

Antes de conectar el módulo al PIC se comprueba su correcto funcionamiento a través de una conexión al PC y el hyperterminal.

Para la conexión del módulo al PC se puede usar un cable USB - SERIAL que podemos encontrar en cualquier tienda de computadoras.

Los comandos que usaremos en las pruebas son:

  • at

  • at+creg?

  • at+cmgf=1

  • at+cmgs= número de teléfono mensaje de prueba

El comando AT es para ver si el modulo se está comunicando, debe responder OK.

El comando AT+ CREG? es para saber si está registrando en la red gsm.

El comando AT+ CMGF = 1 es para configurarlo en modo de mensaje de texto.

El comando AT+ CMGS = numero de teléfono , acá se coloca el numero del teléfono al cual le vamos a enviar el mensaje de texto, luego le damos Enter y nos saldrá una flechita donde pondremos el texto a enviar, por ejemplo "esto es una prueba" y luego de escribir el mensaje le tenemos que dar a ctrl z para enviarlo.

Un vídeo que muestra las pruebas realizadas lo tenéis aquí.

Una vez realizadas las pruebas se conecta el módulo al PIC según el esquema mostrado arriba.

Montaje en la Proto-Board:

Envío de mensajes SMS a través del PIC.

#include <16F877A.h>
#use delay(clock=4000000)
#fuses DEBUG
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES NOPUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOCPD
#use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7)

void main (){
if(input(PIN_A0)){
printf("AT+CMGF=1r");
delay_ms(500);
printf("AT+CMGS=04242016983r");
delay_ms(500);
printf("esto es una prueba");
delay_ms(500);
putchar(0x1a);
}
}

Y un vídeo de la Demo funcionando:

Recepción de mensajes SMS a través del PIC

Para la recepción de mensajes Inyelber nos ha preparado una demo en la que en la proto-board se enciende un led conectado al pin D2 del PIC 16f877A cuando el módulo recibe un mensaje con la palabra “Epa”.

Los comandos AT que permiten configurar el modulo para que reciba mensajes son los siguientes:

  • printf("AT+IPR=9600rn"); ----------> configura la velocidad de transmisión.

  • printf("AT+CMGF=1rn");------------> Selecciona el formato de mensajes SMS.

  • printf("AT+CSMS=1r"); -------------> Selecciona el servicio de mensajes

  • printf("AT+CNMI=2,2r"); -----------> esto quiere decir que se recibirá el mensaje y no será guardado en la SIM, existen diferentes configuraciones, en el manual aparecen especificadas las diferentes opciones, para este caso haremos = 2,2.

Código fuente del PIC:

#include <16F877A.h>
#use delay(clock=4000000)
#fuses DEBUG
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES NOPUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOCPD
#use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7)

char dato[75];
int a=0;
int b=0;
char c=0;

void borrar_array()
{
FOR (a = 0; a < 75; a++)
{
dato[a] = 0;
delay_ms (50) ;
}

a=0;
b=0;
c=0;
}

void main()
{
borrar_array();

WHILE (true)
{
IF (kbhit () )
{
c = getc ();
dato[b] = c;
b++;
}

IF (dato[2] == 'S' &&dato[9] == 'T')
{
borrar_array();
printf("AT+IPR=9600rn");
}

IF (dato[16] == 'O' && dato[17] == 'K' && dato[12] == '0')
{
borrar_array();
printf("AT+CMGF=1rn");
}

IF (dato[14] == 'O' &&dato[15] == 'K' &&dato[10] == '1')
{
borrar_array();
printf("AT+CSMS=1r");
}

IF (dato[30] == 'O' &&dato[31] == 'K' &&dato[25] == '1')
{
borrar_array();
printf("AT+CNMI=2,2r");
}

IF (dato[16] == 'O' &&dato[17] == 'K' &&dato[12] == '2')
{
borrar_array();
output_high(pin_d2);
delay_ms(500);
output_low(pin_d2);
delay_ms(500);
output_high(pin_d2);
delay_ms(500);
output_low(pin_d2);
}

IF (dato[51] == 'E' &&dato[52] == 'p' &&dato[53] == 'a')
{
output_high(pin_d2);
borrar_array();
}
}

}

Y otro vídeo con la demo de recepción de mensajes funcionando:

Bueno y hasta aquí este tutorial sobre el control de mensajes SMS a través de un PIC espero que sea de utilidad. Gracias a todos los usuarios del foro que han participado con sus aportaciones a este tema.

La versión en .pdf del artículo lo podéis descargar desde aquí.

Un saludo y hasta la próxima..