Sunteți pe pagina 1din 19

Control de Mensajes SMS a travs de un PIC

Este tutorial trata sobre la comunicacin RS-232 entre un Microcontrolador (PIC) y un telfono o
mdulo GSM para el control de mensajes SMS por medio del estndar de comandos AT. Por un
lado describir mis experiencias a la hora de conectar el PIC a un telfono mvil comercial (SAGEM
MY 3036) y por otro lado se describirn las experiencias con el mdulo 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 telfono permite esa conexin y en caso de que as sea el cmo hay que
hacer la conexin. El requisito imprescindible para ello es que el telfono mvil disponga de un
modem GSM con interfaz serie, lo que el nmero de candidatos se suele reducir a telfonos ya
antiguos como el Siemens C55, Nokia N70, etc. El que se haga la pregunta si el PIC se puede
comunicar con un telfono ms moderno con interfaz USB o bluetooth, pues supongo que s pero
no es el tema de este artculo, tal vez para la prxima...

Una vez que sabemos que nuestro celular dispone de modem GSM y de una interfaz serie para
comunicarnos con l va RS-232 debemos de comprobar que podemos establecer una
comunicacin con l por medio de comandos AT, para ello la forma ms fcil es conectar el
telfono a un PC equipado con puerto serie a travs de un cable de datos, segn se muestra en la
figura de abajo:


No hay que poner ningn convertidor entre ellos, tanto el puerto COM del ordenador como el
Modem interno del telfono trabajan con niveles RS-232.

Para empezar a comprobar si tenemos comunicacin entre el ordenador y el mvil utilizaremos
cualquier programa de comunicacin serie como el hyperterminal.

Establecemos una nueva conexin con el telfono SAGEM:



A travs de un puerto COM de nuestro ordenador (en mi caso el COM1):


Establecemos los parmetros de configuracin del puerto (9600,8,N, 1,N):


Por la parte del Modem del telfono Mvil los parmetros se configuraron automticamente al
establecer la conexin, por lo que no tuve que configurar nada.

Una vez que la conexin se ha establecido se mandan comandos AT a travs del Hyperterminal
para comprobar que el telfono responde:


No todos los telfonos soportan todos los comandos Hayes o AT.

La lista completa de comandos para el telfono SAGEM lo tenis aqu.

Una tabla con los comandos ms utilizados y que suelen aceptar todos los telfonos sera la
siguiente:


Ejemplo de alarma con envo de SMS
Este es un ejemplo sencillo de envo de mensajes SMS a travs de un PIC conectado a un telfono
mvil por medio de una interfaz serie RS-232. El funcionamiento es sencillo, cuando el sensor
volumtrico 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 interrupcin en el PIC a travs de la patilla RB0
que hace que se enven los comandos AT necesarios para que el telfono mvil enve un nmero
determinado de mensajes de alarma al nmero que hayamos introducido en el programa.
Esquema elctrico


El circuito utiliza un convertidor de niveles MAX232 para adaptar los niveles TTL requeridos por el
PIC a los niveles del estndar RS232 utilizado por el telfono.

Importante: anteriormente he comentado que para conectar el telfono mvil al PC no se necesita
ningn conversor de niveles ya que ambos utilizan los niveles de tensin del estndar RS232,
adems la conexin entre el telfono mvil y el puerto serie del PC se hace a travs de un cable de
datos directo (sin cruzar) ya que el Telfono Mvil haca de equipo de comunicacin de datos
(DCE) y el PC de equipo terminal de datos (DTE). Ahora estamos conectando el PIC al telfono
Mvil a travs del convertidor de niveles, ambos (el PIC y el Telfono) son DCE, por lo que si
dejamos las mismas conexiones en el circuito el cable para conectarnos al telfono tiene que ser
un cable cruzado (Null mdem) que es simplemente un cable que tiene cruzadas las lneas Tx y Rx.
Comercialmente estos cables se suelen diferenciar visualmente de los normales en que las piezas
de plstico 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 polmetro antes de conectar.

Ojo! Si nos equivocamos y ponemos un cable directo entre el convertidor de niveles y el telfono
no solo no funcionar sino que nuestro querido MAX232 se empezar a calentar como si de una
estufa se tratar, lo que vendra despus ya os lo podis imaginar.



01.//////////////////////////////////////////////////////////////////////
///
02.//
//
03.//Alarma con sensor volumtrico y envo de mensajes
SMS //
04.//
//
05.//
www.aquihayapuntes.com //
06.//
//
07.//////////////////////////////////////////////////////////////////////
///
08.
09.#include <16F877.h>
10.#device ICD=TRUE//si no utilizas el debugger debe de ir comentada
11.#FUSES NOWDT, HS, NOPUT, NOLVP
12.#use delay(clock=20000000)
13.
14.//Configuracin puerto serie
15.#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
16.
17.//Variables de configuracin SMS
18.#define NUMERO_MENSAJES 2 //Nmero de mensajes a enviar
19.char NUMERO[] = "+34681345641"; //Numero de telfono a marcar
20.char MENSAJE[] = "Prueba Alarma\r AquiHayapuntes.com";//Mensaje a
enviar
21.
22.int flag=0;//variable auxiliar
23.
24.#int_EXT
25.void EXT_isr(void){//funcin de tratamiento a la interrupcin externa
26.
27.flag=1;
28.
29.}
30.
31.//Funcin para configurar paramtros del modem
32.void configurar_Modem(){
33.
34.printf("at+cmgf=1\r"); //configura el tipo de formato de mensaje de
texto SMS (formato TEXTO)
35.delay_ms(200);
36.
37.}
38.
39.//Funcin para enviar mensajes SMS
40.void Envio_SMS(){
41.
42.char ctrlz = 26; //combinacion de teclas "ctrl+z"
43.
44.printf("at+cmgs=\"%s\"\r",NUMERO);
45.delay_ms(200);
46.printf("%s",MENSAJE);
47.delay_ms(200);
48.printf("%c",ctrlz); //se envia el mensaje
49.delay_ms(200);
50.
51.}
52.void main()
53.{
54.int i;
55.
56.//Configuracin registros PIC
57.enable_interrupts(GLOBAL);//habilito interrupcin global
58.enable_interrupts(INT_EXT);//habilito interrupcin externa
59.ext_int_edge(L_TO_H);// flanco de activacin ascencente
60.
61.delay_ms(1000);//retarto para estabilizar
62.
63.configurar_Modem();//llamada a la funcin de configuracin del modem
64.
65.while(true) { //Bucle infinito hasta interrupcin
66.
67.if (flag==1){ // si se produce alarma envio mensajes
68.
69.for(i=0;i<NUMERO_MENSAJES;i++){
70.Envio_SMS();
71.}
72.flag=0;
73.}
74.
75.}
76.}





Control de Mensajes SMS a travs de un PIC
Envo y recepcin de mensajes SMS con el mdulo GSM TC35i
Paso a ahora a redactar las experiencias con el mdulo GSM TC35i que el amigo inyelber a tenido a
bien compartir con todos nosotros, para cualquier pregunta o duda podis hacerla a travs del hilo
abierto en el foro.

Descripcin del mdulo GSM TC35i


El mdulo 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 mdulo es comprobar si en nuestro pas existen operadoras que trabajen en esas
frecuencias, para evitar este problema podemos adquirir el modulo GSM SIM900, cuesta un poco
ms pero es Quadband y sirve para todas las operadoras.

El GSM TC35i incorpora una interfaz serie RS232 y un conector DB9, el mdulo est diseado para
ser conectarlo directamente al PC por lo que en la placa lleva un MAX232 para adaptar los niveles
al estndar RS232 que utiliza el PC, para conectar el mdulo 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 mdulo GSM:

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

Nota: En el foro se encuentra un esquema del mdulo.

Probando el mdulo..
Antes de conectar el mdulo al PIC se comprueba su correcto funcionamiento a travs de una
conexin al PC y el hyperterminal.
Para la conexin del mdulo 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= nmero de telfono 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 telfono , ac se coloca el numero del telfono 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 vdeo que muestra las pruebas realizadas lo tenis aqu.

Una vez realizadas las pruebas se conecta el mdulo al PIC segn el esquema mostrado arriba.

Montaje en la Proto-Board:


Envo de mensajes SMS a travs 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);
}
}













Recepcin de mensajes SMS a travs del PIC
Para la recepcin 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 mdulo 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 transmisin.
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.
Cdigo 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");
}

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();
}
}
}

S-ar putea să vă placă și