• Welcome to LusoRobótica - Robótica em Português.
 

Módulo gsm

Started by dio123, 14 de November de 2015, 11:52

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

dio123

offtopic. comprei um modulo gsm ebay percisamente o gt06 que apesar de funcionar aquilo faz barulho iritante, parecido aquele quando se tem os telemoveis perto dass colunas, quando  recebe um sms ou chamada.
Até liguei na moto e o barulho é o mesmo.  Dá logo nas vistas.


senso

Quote from: dio123 on 28 de February de 2016, 19:22
calhou, meter em hex.
O basico  é localizar a letra N e W, copiar para as variaveis latitute e longitude e meter um espaço.

void coordendas_gps(void)
{
memcpy (data2-10 , buffer , 100);  //copia do buffer para data2 e apaga +GPSINF: (No data2 fica altitute latitude longitude velocidade,speed,...)
pch = strstr(data2,"N");  //Localiza a latitude até  letra N
for(char i=0;i<11;)
{
Latitude[10-i]= *(pch-i);  //Aqui o ciclo for copia  do N para trás ficando na variavel latitude assim 3051.8007,N .
i++;
}
Latitude[9] ='N';  // substitui a virgula por N
Latitude[10]= 0x00; //NULL   // apaga o N.
}
r


Vê isto:
http://arduiniana.org/libraries/tinygpsplus/

Funcional, testado, simples.
Avr fanboy

dio123

Bom dia,
o problema é que nao estou a usar nada de arduino  mas sim o avr studio. Por isso e que tenho tido  dificuldades pelo caminho, mas ja há luz ao fundo do tunel.

Consegui e ta a funcionar prefeitamente tanto se fizer uma chamada como enviar uma sms ele retorna um sms com as coordenadas onde está.  O código testado durante 2 dias nunca falhou. Agora fui acrescentar os restantes numeros de telefone e o programa deixa de funcionar.
Se tiver USART_putstring envia o sms se colocar o if ja nao envia sms. e queria saber o porque, porque a variavel "telefone" tem o meu numero telefone e so apaga no final do ciclo.

if (ordem == 4) {
USART_putstring("AT+CGPSINF=32\r\n");  // le coordenadas
_delay_ms(200);
coordenadas();   // converte coordenadas lat e long           
_delay_ms(200);
if ( strcmp(telefone, "966*****") == 0){
USART_putstring( "AT+CMGS=\"+351966****\"\r");  //Assim nao envia nem chega a entrar dentro do if
lcd_msg("zzzzzzzzzzzzzzzz2");
_delay_ms(3000);
}
_delay_ms(100);
USART_putstring("A minha localizacao http://maps.google.com/?q=");
USART_putstring(Latitude);
_delay_ms(20);
USART_putstring(Longitude);
_delay_ms(20);
USART_send(0x1A);
lcd_clear();
lcd_gotoxy(0, 1);
lcd_msg("envio de mensagem ok");
_delay_ms(3000);
limpa();
lcd_clear();
lcd_msg("aguardar....");
memset(telefone, 0, 100);
ordem = 3;

senso

Delays com fartura no meio do código.
Podes ás mesma olhar para a biblioteca e tirar ideias.
Que variavel é esse telefone?
É um array de chars?
Avr fanboy

dio123

Sim e telefone e um char arrays.

. Os delays e para dar tempo ao modulo responder, se calhar nem percisa de tantos.

Agoras as coordenadas o que menos preocupa.

rglove

Onde está a declaração dessa variável? Se não tiver um '\0' no final, duvido que isso funcione

dio123

Esta declarada no inicio do programa.Nao tem \0 no fim, assim como no if anterior com os 4 numeros e funciona.

Logo posso postar codigo todo.

rglove

Tem que ter o '\0', senão o strcmp não tem como saber onde termina a string.
Como tinhas dito que não estava a funcionar, pensei nessa possibilidade.
O mais provável é que o '\0' lá esteja, dependendo da forma como declaraste isso

norbertomartins

Também comprei um modulo com o sim808, mas estou com dificuldades e registar na rede. Só tentei na rede MEO.

Sabem se é necessário algum cartão sim em especial?

Testes que efetuei:

Após ligar o modulo o sinal é 0

AT+csq

+CSQ: 0,0

OK



Consigo apanhar sinal dos 3 operadores.

AT+COPS=?

Call Ready

SMS Ready

+COPS: (1,"TMN","TMN","26806"),(3,"vodafone","voda P","26801"),(3,"OPTIMUS","OPTIM","26803"),,(0-4),(0-2)


Registo manualmente

AT+COPS=2,0,"TMN"

OK

O sinal passa a ser 31


AT+CSQ

+CSQ: 31,0

OK





AT+COPS?

+COPS: 2


se verificar se está registado, responde que não

AT+CREG?

+CREG: 0,0

Se tentar ligar também não dá

ATD+35196xxxxxxx;

NO CARRIER


Quote from: dio123 on 06 de December de 2015, 17:32
Em temos de rede acho que sim, pelos menos consigo ligar-me a rede meo sem antena ligada. O GPS +/- 20segundos e tenho coordenadas +/- diferença 5metros da casa.

RALAX: sim consegues usar no arduino sem problemas.

Agora isto aqui está mau,lcd e uart ok, mas agora  nao consigo imprimir buffer uart rx para o lcd, se for uma letra consegui agora frase OK nao estou a conseguir, já ando aqui a 1 dia e nao consegui. Alguma dica.


Quote
extern void lcd_cmd(char byte, unsigned char rs);
extern void lcd_msg(char *str);

main.c

volatile int i=0;
volatile uint8_t buffer[20];

int main(void)
{
   sei();
   DDRD = 0b11100000;
   USART_init();   
   lcd_begin();
   lcd_msg("test usuart avr ");

   while(1)
   {      
         lcd_gotoxy(0,1);
             while(buffer)
             lcd_cmd(buffer[i++], 1);
         lcd_msg("\r\n");
   }
}

ISR(USART_RX_vect)
{
    buffer=UDR0;       
    i++;
}

dio123

No meu caso meti o cartao telemovel desliguei o pin desliguei o 3G ficando apenas o 2G,

Depois  meti o cartao  no modulo e ficou a funcionar.

Este site ajuda com os commandos :http://m2msupport.net/m2msupport/module-tester/

dio123

Boa tarde,
Estou aqui a limar umas arestas, e queria apagar todas as mensagens que não  pertence a condição do if

if ( (strcmp(telefone, "96****") == 0) && strcmp(mensagem, "\0x0AFind me\0x0D") == 0) {
}
aqui envia a mensagem sem problemas, agora se acrescentar por baixo
else{
}
para apagar todas as restantes mensagens.
O problema é  que mesmo que envie sms certo ele vai para o else  e nao para o if.  Onde estou a falhar?
agradeço

if (ordem == 5) { // if principal
memcpy (mensagem , data2 , 20);
memcpy (telefone - 26 , data1 , 100);
if ( (strcmp(telefone, "9******7") == 0) && strcmp(mensagem, "\0x0AFind me\0x0D") == 0) {
lcd_clear();
USART_putstring("AT+CMGDA=");
USART_putstring("\"DEL ALL\"\r\n");                     // apagar todas mensagem
_delay_ms(10);
memset(mensagem, 0, 100); // apaga variavel mensagem.
limpa(); // limpa as restantes variaveis.
_delay_ms(100);
ordem = 4; // encaminha para outro if e envia o sms. Até tudo ok.
}
else {
USART_putstring("AT+CMGDA=");
USART_putstring("\"DEL ALL\"\r\n");                     // apagar todas mensagem
limpa();
lcd_clear();
lcd_msg("msg desconhecida");
ordem = 3;
}
}

dio123

resolvido primeiro comparo a mensagem e segundo vejo se a mensagem é igual com 2 if's.
O código parece estar finalizado, varias chamadas e mensagens e respondeu e o módulo respondeu sempre.
Fonte de alimentação 12v  para 3.9v testado e a funcionar.
Um pequeno curto circuito entre vbat e gnd  com um condensador e fritei o modulo. Agora fico em stand by $$.




dio123

Boa noite estou aqui a começar a desenhar a pcb e precisava de uma opinião.
A fonte que vai converter dos 12v do carro para os 3.8v para alimentar o modulo e o atmega é o que está no manual.
A minha questão é se condensadores chegam ou acrescento um condensador maior a saída. Uma vez que o modulo pode  precisar 2A segundo o manual. 
fonte: http://cl.ly/2B0n1R0J2P0l

Sérgio_Sena

Quote from: dio123 on 16 de June de 2016, 22:57
Boa noite estou aqui a começar a desenhar a pcb e precisava de uma opinião.
A fonte que vai converter dos 12v do carro para os 3.8v para alimentar o modulo e o atmega é o que está no manual.
A minha questão é se condensadores chegam ou acrescento um condensador maior a saída. Uma vez que o modulo pode  precisar 2A segundo o manual. 
fonte: http://cl.ly/2B0n1R0J2P0l



Para teres uma boa linha de alimentacao p o modem, aconselho a nao menos de 1000uF. Se tiveres espaco, poe ainda mais um de igual valor.

Alguns modems GSM sao mt esquisitos c a alimentacao e nao gostam de ver micro-sags na tensao. Outros sao mais robustos. Depende do fabricante pois cada um tem a sua implementacao.

Se a BOM estiver apertada, o q eu costumo fazer eh comecar com 470uF e ir subindo ateh a coisa comecar a trabalhar relaxada.
Se tiver BOM solta e espaco na PCB, entao ponho logo 2000uF.
Cumprimentos,
Sérgio Sena

Electronic Gear for Musicians

Instagram

dio123

#44
Estou aqui a desenhar a pcb mas acho que vou fazer asneira.
É uma placa de 1 so lado, e fiz tudo no lado button e virei o atmega para o lado button,  e agora estou com a impressão que quando for para soldar o atmega fica  ao contrario de patas para o ar certo?
O atmega fica no lado tem cobre e os restantes componentes no lado de cima.
link foto: http://cl.ly/282F2u0Q1K0f