Uso de un celular GSM con PIC o PC

Han intentado usar el módulo M32 de BenQ. Encontré un modem USB que lo usa y al destriparlo me encontré con que puedo desoldarle componentes para que trabaje con puerto serie. Lo que no me queda claro es si el PL2303 es un convertidor USB - serie TTL o USB -RS232. Pero bueno. Nada que con un datalogger (cuando lo pueda conseguir) no se solucione.
 
Bueno aqui les dejo un pequeño video que realicé a partir de un proyecto de alarma GSM con un celular siemens a56i. Con la peculiaridad de hacerlo con unicamente la board del cel, es decir sin batería, sin display, sin vibrador y sin parlante. Se alimenta del circuito principal de dos microcontroladores 16f628a. De los cuales uno controla el display mientras que el otro el teclado y todo el procesamiento de los comandos AT dirigidos al móvil así como encargado de encender el siemens. Además de realizar llamada al número especificado, acepta las llamada entrante como el de encender y apagar un led mediante msj txt. YouTube - Alarma GSM siemens

Hola EEnrique , solo quisiera saber como estas leyendo el mensaje que le llega al celular con el pic, podrias envierme el codigo, gracias
 
hola enrique

yo tambien quisiera saber como haces para recibir uns sms ya que lo he hecho de varias formas pero solo funcionan en el simulador.

Saludos

Es bastante fácil:

Primero habilitás el modo texto para SMS, con "AT+CMGF=1" y \r\n

Después le decís al modem que los mensajes entrantes los redirija a la consola, con "AT+CNMI=,2" y \r\n

Cuando te llega un mensaje, el modem debería escribirlo en la consola de la siguiente forma:

+CMT: “+541155554444,”10/9/22,14:12:34”
MENSAJE

Tenés que avisarle al celular que te recibiste bien el mensaje, usando "AT+CNMA" y \r\n

Espero que les sirva

Un saludo,
Gonzalo
 
Hola, mira estoy tratando justamnete de hacer algo asi para uncliente (hago sofware y manejo bien vb6), tu me podria pasar lo que desarrollaste? O bien te lo compraria.
h215hector@hotmail.com
Gracias



yo use visual basic para programar el sistema de transmision con un Sony ericsson K310 conectado por USB..........es mas economico y tiene modem GSM Interno,115200 de velocidad.
intenta con ese......claro esta para realizacion del programa de transmision,pero para recepcion...un t290,un a56,a71,c55,c56,[/QUOTE]
 
Última edición:
La duda es como filtrar el sms luego de leerlo con AT+CMGD=1 en CCS ya que solo nos interesaria el sms como tal y se recibe esto :
+CMT: “+541155554444,”10/9/22,14:12:34”
MENSAJE
Entonces toca filtrar MENSAJE, ya lo he hecho y funciona perfecto en simulacion pero ya en la practica tiene fallas. Si alguien puede postear algo de codigo explicando esto se les agradece,
 
Hola. Te amplio lo que preciso a ver si es posibles

Se debe "unicamente" enviar via PC mensajes a un unico telefono por ocasion. Pero como pueden llegar a ser dos o mas por minuto, y los telefonos de destino son los de una agenda de usuarios, y distinto para cada mensaje, se precisa del envio via PC, para armar el Texto del mensaje ( que proviene de un soft que lo deposita en una bd) y efectuar el envio.
h215hector@hotmail.com
Gracias
 
La duda es como filtrar el sms luego de leerlo con AT+CMGD=1 en CCS ya que solo nos interesaria el sms como tal y se recibe esto :
+CMT: “+541155554444,”10/9/22,14:12:34”
MENSAJE
Entonces toca filtrar MENSAJE, ya lo he hecho y funciona perfecto en simulacion pero ya en la practica tiene fallas. Si alguien puede postear algo de codigo explicando esto se les agradece,

Lo más sencillo sería desactivar el "Eco" del módulo y usar interrupciones para cada byte recibido desde el mismo, porque el mensaje puede llegar en cualquier momento.

Después, se puede saber que toda las cadenas enviadas por el modem empiezan con + y terminan con un \r\n, por lo que se puede hacer una máquina de estados que lea eso y lo parsee...

Un saludo,
Gonzalo
 
Les dejo un código fuente de un decodificador de SMS por comandos AT. Está escrito para AVR'S en GCC.

No tengo el proyecto completo solo logré rescatar el código de la red...es funcional según la página de donde lo saqué...

Código:
#include <avr/io.h>
#define F_CPU 8000000// Clock Speed
#include <util/delay.h>
#include <stdlib.h>
#include <avr/interrupt.h>

#define NL 12
#define n1 10
#define n3 6

#define BAUD 9600
#define MYUBRR F_CPU/16/BAUD-1

unsigned char PIN[]="at+cpin=1234";
unsigned char SCC[]="at+csca=+40722004000";
unsigned char MEM[]="at+cpms=mt,mt,mt";
unsigned char POLL[]="at+cmgl=0";
unsigned char DEL[]="at+cmgd=1";
unsigned char CR=0x0D;
unsigned char Pnumber[12+1];

unsigned char R[4+1];
unsigned char relay_positions = 0x00;

int length;
unsigned char msg[256];
unsigned char tmp;

unsigned char antet[n1+1]="0011000B91";
unsigned char mijloc[n3+1]="0000AA";

//USART part
void USART_Transmit(unsigned char data){
    while (!(UCSRA&(1<<UDRE)))// Wait for empty transmit buffer
        ;
    UDR = data; // Put data into buffer, sends the data 
}
void USART_Transmit_string(unsigned char *data, int l){
    int i;
    for(i=0;i<l;i++)
        USART_Transmit(data[i]);
}
void USART_Flush( void ){
    unsigned char dummy;
    while ( UCSRA & (1<<RXC) ) dummy = UDR;
}

//Init Part
void Init_USART(unsigned int ubrr){
    UBRRH = (unsigned char)(ubrr>>8); //set BaudRate
    UBRRL = (unsigned char)ubrr;
    UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE); //enable Receiver and Transmitter
    UCSRC = (1<<URSEL)|(0<<USBS)|(3<<UCSZ0); //set frame format
}
void Init_Relays(){
    DDRC=0xFF;
    PORTC=relay_positions;
}
void Init_Phone(){
    USART_Transmit_string(PIN,12);
    USART_Transmit(CR);
    int j;
    for(j=0;j<100;j++)
        _delay_ms(100);
    USART_Transmit_string(MEM,16);
    USART_Transmit(CR);
    _delay_ms(1000);
    USART_Transmit_string(SCC,20);
    USART_Transmit(CR);
    _delay_ms(1000);
}
/*Rutina de descifrare a mesajelor SMS*/

void taiereantet(){
    for(int j=0;j<(length-82);j++)
        msg[j]=msg[j+82];
    length-=82;
}
void taierecapat(){
    msg[length-8]=0x00;
    length-=8;
}

void makehex(){
    unsigned char ch;
    int j=0;
    ch=msg[j];
    while(ch!=0){
        if((ch>='A')&&(ch<='F'))
            ch=ch-'A'+10;
        else if((ch>='a')&&(ch<='f'))
            ch=ch-'a'+10;
        else if((ch>='0')&&(ch<='9'))
            ch=ch-'0';
        msg[j]=ch;
        ch=msg[++j];
    }
}
void rearrange(){
    unsigned char tmp[2]={0,0};
    for(int j=0;j<=(length-1)/4;j++){
        tmp[0]=msg[2*j];
        tmp[1]=msg[(2*j)+1];
        msg[2*j]=msg[length-1-(2*j)-1];
        msg[(2*j)+1]=msg[length-1-(2*j)];
        msg[length-1-(2*j)-1]=tmp[0];
        msg[length-1-(2*j)]=tmp[1];
    }
}
void rearrange2(){
    unsigned char tmp;
    for(int j=0;j<=(length-1)/2;j++){
        tmp=msg[j];
        msg[j]=msg[length-1-j];
        msg[length-1-j]=tmp;
    }
}
void scriepe8biti(){
    unsigned char tmp;
    unsigned char c2[128];
    for(int j=(length-1);j>0;j=j-2){
        tmp=msg[j]|(msg[j-1]<<4);
        c2[j/2]=tmp;
    }
    for(int j=0;j<128;j++) 
        msg[j]=c2[j];
}
void shiftarefrate(){
    unsigned char c3[32];
    unsigned char a,b;
    int safetyspace=1+(length/7);
    for(int k=0;k<(length+safetyspace);k++)
        c3[k]=0;
    for(int k=0;k<length;k++){
        c3[k+safetyspace]=msg[k];
    }
    for(int z=(length+safetyspace-1);z>=0;z--){
        b=0;
        for(int j=z;j>=0;j--){
            a=c3[j];
            a=a>>7;
            c3[j]=c3[j]<<1;
            c3[j]=c3[j]+b;
            b=a;
        }
        c3[z]=c3[z]>>1;
    }
    length=length+safetyspace;
    for(int j=0;j<128;j++) 
        msg[j]=c3[j];
}
void descifrare_SMS(){
    rearrange();
    makehex();
    scriepe8biti();
    length/=2;
    shiftarefrate();
    rearrange2();
}
//Rutina de compunere a mesajelor SMS
/*void relaypos(){
    if((relay_positions|0b00000001))
        R[0]=1;
    if((relay_positions|0b00000100)==0b00000100)
        R[1]=1;
    if((relay_positions|0b00010000)==0b00010000)
        R[2]=1;
    if((relay_positions|0b01000000)==0b01000000)
        R[3]=1;
    R[4]=0x00;
}*/
int main(void){
    Init_USART(MYUBRR);
    Init_Relays();
    Init_Phone();
    USART_Flush();
    sei();
    while(1){
        length=0;
        USART_Transmit_string(POLL,9);
        USART_Transmit(CR);
        _delay_ms(3000);
        if(length>=13){
            if(msg[12]==0x2B){
                int j;
                for(j=0;j<12;j++)
                    Pnumber[j]=msg[j+50];
                Pnumber[12]=0x00;
                taiereantet();
                taierecapat();
                descifrare_SMS();
                if((msg[0]=='R')||(msg[0]=='r')){
                    /*if(msg[2]=='?'){
                        relaypos();
                        compose_Relaypos_msg();
                        send_SMS();
                    }*/
                    if((msg[2]=='0')||(msg[2]=='1')){
                        relay_positions=0;
                        if(msg[2]=='0')
                            relay_positions+=2;
                        if(msg[2]=='1')
                            relay_positions+=1;
                        if(msg[3]=='0')
                            relay_positions+=8;
                        if(msg[3]=='1')
                            relay_positions+=4;
                        if(msg[4]=='0')
                            relay_positions+=32;
                        if(msg[4]=='1')
                            relay_positions+=16;
                        if(msg[5]=='0')
                            relay_positions+=128;
                        if(msg[5]=='1')
                            relay_positions+=64;
                        PORTC=relay_positions;
                    }
                }
                USART_Transmit_string(DEL,9);
                USART_Transmit(CR);
                _delay_ms(1000);
            }
        }
    }
}

ISR(_VECTOR(11)) {
    length++;
    msg[length-1]=UDR;
    msg[length]=0x00;
    return;
}
 
No me lo tomes a mal Roland, pero tu buscas "ayuda" o quieres que "te hagan la chamba"??
Creo que Moyano te ha ayudado bastante con el código que posteó como para además pedir que alguien más te lo pase en CCS...y tu "trabajo" donde queda?
 
Hola estube colgado con el proyecto pero volvi jej.
sigo haciendo las pruebas con el celular y el hiperterminal.
el celular es sony ericsson t290, hasta hora pude leer un mensaje nuevo y realizar llamadas desde el terminal, lo que no logro es enviar un mensaje, nose por que me dice error, pego una imagen de mi prueba en el hiperterminal.

alguien sabe por que puede pasar esto?

ya tengo el codigo para el pic, hoy voy a tratar de armarlo en el proto aver si con el pic si envia.

en un momento pude escribir el mensaje y al presionar control + z como que intentaba enviar pero no enviaba y daba error, pero despues ni siquiera podia escribir.
si alguien le paso lo mismo?
 

Adjuntos

  • SMS AT.JPG
    SMS AT.JPG
    47.9 KB · Visitas: 51
Última edición:
alguien tubo este problema?

programe el pic 18f4620 y me paso algo raro. conectado el pic al celular, no hacia nada, el celular no respondia. ahora conectando al mismo tiempo el tx del pic al rx del cel y al rx del max232, puedo ver el envio de los comandos al terminal y al mismo tiempo el celular llama al numero programado. cuando desconecto el max del celular no pasa nada. por que puede pasar esto?
en cuanto a los mensajes de texto no hay forma de enviar, siempre me devuelve error pero esto lo comprobe que es un problema del celular por que intento enviar mensajes manualmente y no manda, dice error en el envio, no se si habra que configurar algo en el cel?

pego el codigo del programa escrito en c de mikroc:
el cristal usado es de 20MHZ

Código:
void main() {
   TRISD.B2 = 1;
   TRISD.B3 = 1;
   PORTB.B2 = 0;
   PORTB.B3 = 0;

   UART1_Init(9600);
   Delay_ms(1000);
   while(1){
     if(PORTD.B2 == 1){
       Delay_ms(20);
       UART1_Write_Text("at");
       UART1_Write(10);
       UART1_Write(13);
       Delay_ms(1000);
       UART1_Write_Text("at+cmgs=");
       UART1_Write(34);
       UART1_Write_Text("02216063440");
       UART1_Write(34);
       UART1_Write(10);
       UART1_Write(13);
       Delay_ms(100);
       UART1_Write_Text("soy el pic");
       UART1_Write(26);
       Delay_ms(1000);
     }else{
          if(PORTD.B3 == 1){
              Delay_ms(20);
              UART1_Write(13);
              UART1_Write_Text("atd>0221156063440");
              UART1_Write(10);
              UART1_Write(13);
              Delay_ms(5000);
              UART1_Write_Text("ath");
              UART1_Write(10);
              UART1_Write(13);
              Delay_ms(1000);

            }else
             while(PORTD.B3 == 1 || PORTD.B2 == 1){
             }

         }
  }
}

ericklarva, moyano, gzaloprgm que opinan ustedes?

me olvidaba comentar que viendo con el osciloscopio en el tx del pic cuando no transmite, en vez de estar en nivel alto, se ve como entrecortada la señal, sera esto que hace que el celular no reconozca los comandos?

cuando conecto al max232, estando conectado el celular tabien, esta señal en el pic es alta y estable.
 
Última edición:
Lo único lógico posible es que tengas dañado el buffer del TX del PIC, lo cual es extraño mas no imposible.
Podrías checar en las configuraciones a ver si no estás omitiendo algo por ahí, se supone en teoría debes poner al TX como salida. Si ni por más le hayas el problema tu solución es meterle una resistencia de 470 o 560 Ohms en paralelo entre 5v y TX.
Cualquier resultado comentas, con respecto a tu programa la verdad ni idea.
Saludos
 
Lo único lógico posible es que tengas dañado el buffer del TX del PIC, lo cual es extraño mas no imposible.
Podrías checar en las configuraciones a ver si no estás omitiendo algo por ahí, se supone en teoría debes poner al TX como salida. Si ni por más le hayas el problema tu solución es meterle una resistencia de 470 o 560 Ohms en paralelo entre 5v y TX.
Cualquier resultado comentas, con respecto a tu programa la verdad ni idea.
Saludos

Hola eric y gracias por responder, al fin mande mensaje pero desde el terminal. el problema era una configuracion en el celular, en conectividad seleccione la opcion gsm para mensajes, estaba en automatico.

cuando decis que puede estar dañado el buffer tx del pic no puede ser, por que el pic conectado con la pc envia bien los comandos al terminal:

pic->pc anda bien puedo leer los comandos en el terminal.

pic-> celular no pasa nada.

pic -> celular y al mismo tiempo pic -> pc logre realizar una llamada.

por que conectado al mismo tiempo pc celular y pic anda?

pd: ahora revisando mi codigo me doy cuenta que no selecciono el modo texto para mensajes.
 
Bueno, no se si por curioso has medido voltaje entre la terminal de entrada del MAX( RX ) a tierra, tiene un PullUp interno que lo levanta hasta los 5V. Es por esto que cuando conectas el TX del PIC al MAX, en cualquier configuración, siempre vas a tener envío de datos.
Por eso preguntaba si tienes configurado el pin del puerto como salida, es importante. No estoy muy seguro pero me parece recordar que dependiendo de las posibles configuraciones de un solo PIN en el PIC es posible que te pida conectarle un PullUp externo.
Una manera fácil de comprobarlo es que conectes la resistencia externa de 5V al PIN RX del PIC.
Mientras le doy una leida al PDF a ver que encuentro.
Saludos
PD.Bueno le di una "checadita" al PDF, MMM, según debes configurar los pines a "1", dale una leida a la página 213 del PDF solo para asegurar que todo están en orden. Si es así, solo significaría que el buffer del PIC estuviera dañado.
 
Última edición:
Atrás
Arriba