11/7/2012
Biblioman | Inyelber
WWW.AQUIHAYAPUNTES.COM CONTROL DE MENSAJES SMS
A TRAVÉS DE UN PIC
Control de Mensajes SMS a través de un PIC
Biblioman & Inyelber www.AquiHayApuntes.com Página 2
Introducción
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.
Control de Mensajes SMS a través de un PIC
Biblioman & Inyelber www.AquiHayApuntes.com Página 3
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):
Control de Mensajes SMS a través de un PIC
Biblioman & Inyelber www.AquiHayApuntes.com Página 4
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:
Comando Descripción Respuesta del Modem
AT Para comprobar que la comunicación es correcta
OK ó ERROR
AT+CMGF=1 Configura el terminal para manejar el SMS en modo texto
OK ó ERROR
AT+CSCA? Solicita al módem el número de teléfono del Centro de Mensajes
+CSCA: "+34609090999",145 seguido de un OK.
AT+CSCA="+34609090999",145
Para cambiar el número de teléfono del centro de mensajes si no es correcto
OK ó ERROR
AT+CMGS=”666779808”
Envía un mensaje al número que hay entre las comillas dobles. Una vez recibido el comando el modem responde con el carácter ‘>’ para que
El módem responderá con la posición donde se ha almacenado el mensaje enviado: +CMGS: 0 seguido de un OK.
Control de Mensajes SMS a través de un PIC
Biblioman & Inyelber www.AquiHayApuntes.com Página 5
introduzcamos el cuerpo del mensaje, para finalizar pulsamos Ctrl-Z (ascii 26)
AT+CMGR=?
Comando para la lectura del SMS guardado en la posición nº (?) de la memoria de la tarjeta SIM del teléfono.
+CMGR: "REC UNREAD","+34666779808",,"29/06/12,19:03:20+08" Texto del mensaje OK
AT+CMGD=?
Comando para el borrado del SMS guardado en la posición nº (?) de la memoria de la tarjeta SIM del teléfono.
OK ó ERROR
AT+IPR=9600 Configura la velocidad del modem a 9600 baudios
OK ó ERROR
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.
Control de Mensajes SMS a través de un PIC
Biblioman & Inyelber www.AquiHayApuntes.com Página 6
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
Control de Mensajes SMS a través de un PIC
Biblioman & Inyelber www.AquiHayApuntes.com Página 7
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[] = "+34********"; //Número de teléfono a marcar
char MENSAJE[] = "Prueba Alarma\r 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 parámetros del modem
void configurar_Modem(){
printf("at+cmgf=1\r"); //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;
Control de Mensajes SMS a través de un PIC
Biblioman & Inyelber www.AquiHayApuntes.com Página 8
//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 ascendente
delay_ms(1000);//retardo 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 envió mensajes
for(i=0;i<NUMERO_MENSAJES;i++){
Envio_SMS();
}
flag=0;
}
}
}
Aquí tenéis un vídeo de la aplicación funcionando
http://www.youtube.com/watch?v=1PRD3AKVuYY
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 del hilo abierto en el foro.
Control de Mensajes SMS a través de un PIC
Biblioman & Inyelber www.AquiHayApuntes.com Página 9
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:
Control de Mensajes SMS a través de un PIC
Biblioman & Inyelber www.AquiHayApuntes.com Página 10
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:
Nota: En el foro se encuentra un esquema del módulo.
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.
Control de Mensajes SMS a través de un PIC
Biblioman & Inyelber www.AquiHayApuntes.com Página 11
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:
https://dl.dropbox.com/u/88216600/gsm_pc.wmv
Una vez realizadas las pruebas se conecta el módulo al PIC según el esquema mostrado
arriba.
Control de Mensajes SMS a través de un PIC
Biblioman & Inyelber www.AquiHayApuntes.com Página 12
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=1\r");
delay_ms(500);
printf("AT+CMGS=04242016983\r");
delay_ms(500);
printf("esto es una prueba");
delay_ms(500);
putchar(0x1a);
}
}
Control de Mensajes SMS a través de un PIC
Biblioman & Inyelber www.AquiHayApuntes.com Página 13
Y un vídeo de la demo funcionando:
http://www.youtube.com/watch?v=z-7gFJ5uWE0
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=9600\r\n"); ----------> configura la velocidad de transmisión.
printf("AT+CMGF=1\r\n");------------> Selecciona el formato de mensajes SMS.
printf("AT+CSMS=1\r"); -------------> Selecciona el servicio de mensajes
printf("AT+CNMI=2,2\r"); -----------> 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.
Control de Mensajes SMS a través de un PIC
Biblioman & Inyelber www.AquiHayApuntes.com Página 14
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=9600\r\n");
}
IF (dato[16] == 'O' && dato[17] == 'K' && dato[12] == '0')
{
borrar_array();
printf("AT+CMGF=1\r\n");
}
IF (dato[14] == 'O' &&dato[15] == 'K' &&dato[10] == '1')
{
borrar_array();
printf("AT+CSMS=1\r");
}
Control de Mensajes SMS a través de un PIC
Biblioman & Inyelber www.AquiHayApuntes.com Página 15
IF (dato[30] == 'O' &&dato[31] == 'K' &&dato[25] == '1')
{
borrar_array();
printf("AT+CNMI=2,2\r");
}
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 funcionando:
http://www.youtube.com/watch?v=O0Mxf1WKpi0
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. Cualquier duda, sugerencia o comentario lo podéis hacer
en el foro.
Un saludo y hasta la próxima..
Control de Mensajes SMS a través de un PIC
Biblioman & Inyelber www.AquiHayApuntes.com Página 16
Este artículo esta bajo una licencia Creative Commons: Reconocimiento-No Comercial-
Compartir bajo la misma licencia.
Top Related