Interface de um simulador GPS com controlador PIC18F458 no Proteus usando um emulador de porta serial

Interface de um simulador GPS com controlador PIC18F458 no Proteus usando um emulador de porta serial

Para este projeto, exceto um telefone celular com GPS para gravar sentenças GPS NMEA, nenhum hardware é necessário. Usei um telefone Android e vários aplicativos estão disponíveis na Play Store que permitem gravar frases NMEA no formato “.txt” ou “.log”. Como nem todos os usuários têm acesso a um telefone Android, anexei dois conjuntos de frases de GPS para permitir que você conclua este projeto. Como nenhum sinal de GPS pôde ser obtido em ambientes fechados, o primeiro conjunto de sentenças de GPS foi registrado caminhando aproximadamente 100 metros ao ar livre. O segundo conjunto de sentenças GPS foi gravado em ambientes fechados para uma condição sem sinal GPS. O único outro hardware necessário é um PC Host. Para este projeto, usei um laptop HP Pavilion série G6 com processador Intel de 2,1 GHz e 3 GB de RAM executando o sistema operacional Windows 7 Home Basic de 64 bits. O seguinte software é necessário para concluir este projeto com sucesso:

1) GPS Sim

2) Labcenter Proteus v7.6 ou superior (para este projeto foi usado v7.8 com SP2)

3) Divisor de porta serial Eltima v5.0

GSM

Figura 1 : Janela do Simulador GPS

A Figura 1 mostra a janela do Simulador GPS. Para começar a navegar até a pasta que contém os arquivos de log de sentenças NMEA, clique no botão Procurar. Selecione o intervalo como 8 segundos. 4 segundos também podem ser selecionados; entretanto, qualquer intervalo inferior a este causará erros no Proteus e as informações de latitude e longitude não serão visualizadas para todas as sentenças. Além disso, selecione RMC como tipo de sentença, pois somente essas sentenças são passadas para a simulação do Proteus e são usadas para obter informações de latitude e longitude. Em seguida, selecione a porta COM1 no menu de seleção de porta. Qualquer porta disponível pode ser selecionada, desde que não seja a porta COM2. A porta COM2 é usada no Proteus para transmitir dados para o pino USART RX do controlador. Além disso, a porta selecionada neste menu deve ser a mesma usada para criar um link virtual (usando Eltima Serial Splitter) entre a porta e a porta COM2 no Proteus. O software GPS Simulator pode ser baixado no seguinte link:

Fig. 2:Janela Divisor Serial

A Figura 2 mostra a janela do Serial Splitter 5.0 da Eltima Software. Para criar o link virtual entre a porta selecionada no GPS Simulator e a porta COM2 utilizada no Proteus, selecione a aba 'Complex Bundles'. Para o lado de entrada, selecione a opção 'Porta Virtual' e depois a porta COM utilizada pelo Simulador GPS para passar as sentenças ao Proteus (COM1 neste caso). Em seguida, clique no botão 'Adicionar porta'. Repita o mesmo procedimento para o lado de saída, mas selecione a porta COM2. Depois que as portas de entrada e saída forem adicionadas, clique no botão ‘Adicionar pacote’. Um pacote criado com sucesso aparecerá no lado esquerdo da janela do software, conforme mostrado na figura. Uma versão de teste de 14 dias do Serial Splitter pode ser baixada no seguinte link:

A guia Diagrama de circuito mostra o circuito Proteus para a simulação. Um cristal de 15,9744 MHz está conectado aos pinos 13 e 14 do microcontrolador PIC18F458. A chave SW1 é a chave de reinicialização. O pino RXD do componente P2 COMPIM está conectado ao pino RX (pino 26) do controlador. Um IC MAX232 não é necessário, pois está integrado ao componente COMPIM. A porta D do controlador está conectada às linhas de dados paralelas D0:D7 do display LCD. Os pinos VSS e VDD do LCD são aterrados e fornecem uma tensão de 5V respectivamente. Os pinos RS, R/W e E do LCD estão conectados aos pinos 38, 39 e 40 respectivamente na Porta B.
Para desenvolver a lógica de controle para análise de sentenças GPS, o módulo UART foi configurado e as informações de latitude e longitude foram analisadas usando manipulação de strings. Para configurar o módulo UART, o pino RX foi configurado para entrada e a recepção serial foi habilitada atribuindo um valor 0x90 ao registrador de recepção RCSTA. O registro do gerador de taxa de transmissão SPBRG recebeu um valor de 0x19 para taxa de transmissão de 9600bps. O modo assíncrono foi escolhido limpando o bit SYNC no status de transmissão e no registro de controle do TXSTA. O sinalizador de recebimento foi apagado e os dados foram copiados do registrador de recebimento RCREG para uma variável temporária quando o sinalizador foi definido na recepção dos dados. O bit de habilitação de recepção contínua CREN no registro de recepção RCSTA foi então limpo para permitir a recepção contínua de dados.

As sentenças $GPRMC foram passadas do simulador GPS para o pino RX do controlador por meio do componente COMPIM. Dois conjuntos dessas frases foram pré-gravados usando um telefone celular com GPS para duas condições – uma localização GPS variável e nenhum sinal GPS. Para uma localização GPS variável, o primeiro conjunto de frases foi gravado a uma distância de 100m. Na ausência de sinal GPS, o segundo conjunto de sentenças GPS foi gravado em ambientes fechados. As sentenças $GPRMC e $GPGGA (condição de sinal GPS encontrado) tinham o mesmo comprimento (76 caracteres). Se nenhum sinal de GPS fosse encontrado, as frases com comprimento inferior a 76 caracteres não continham informações de latitude e longitude; em vez disso, uma série de vírgulas era encontrada nas frases gravadas. Essas características das sentenças gravadas foram utilizadas para identificar a sentença $GPRMC e então extrair informações de latitude e longitude. A identificação da sentença $GPRMC e da ausência de sinal GPS foi obtida usando comparação de strings. Uma vez encontrados o sinal GPS e o $GPRMC, a latitude e a longitude foram extraídas determinando-se a posição inicial e o número de caracteres nos valores de latitude e longitude. A Figura 5 mostra a lógica de controle para analisar a sentença $GPRMC.

GPS

Figura 3: Lógica de controle para análise de sentença GPS

Para executar a simulação os seguintes passos devem ser executados na ordem indicada:

1) Inicie o Serial Splitter e crie o pacote complexo entre a porta de entrada do Simulador GPS e a porta COM2 do circuito Proteus

2) Abra 'gps.DSN' no Proteus

3) Inicie o Simulador GPS e selecione o arquivo de log

4) Inicie a simulação no Proteus e depois inicie a transmissão do arquivo de log no GPS Simulator

O display LCD mostrará que o sinal GPS foi encontrado e exibirá informações de latitude e longitude. Apenas parte desta informação é mostrada na Figura 6, pois o display LCD é apagado e as informações seguintes sobre latitude e longitude são mostradas. Para o segundo arquivo de registro, o display LCD mostrará que o sinal GPS não foi encontrado.

GPS

Fig. 6: Informações de latitude mostrando parcialmente

Código fonte do projeto

###


#incluir
#incluir
#pragma configuração OSC=HS #pragma configuração OSCS = DESLIGADO #pragma configuração WDT = DESLIGADO #pragma configuração DEBUG = DESLIGADO #pragma configuração LVP = DESLIGADO #define rsPORTBbits.RB7 #define rw PORTBbits.RB6 #define em PORTBbits.RB5 #define lcd PORTD void mydelay(caractere não assinado); void data_wrt(caractere não assinado); vazio init_lcd(void); void cmd_wrt(caractere não assinado); vazio lat_long(void); anular nada(void); caractere não assinado cmd ={0x38,0x01,0x0C,0x06}; //comando LCD char não assinado strcompare(char *s1, char *s2, tamanho do char não assinado); //Função de comparação de strings caractere não assinado gps(77)={'�'}; status de caractere não assinado; caractere assinado; /**/ char não assinado lati(11) = "Latitude: "; char não assinado longi(12) = "Longitude: "; char não assinado deg(9) = "graus"; caractere não assinado mins(10) = "minutos", "; vazio principal(vazio) { // verifica variáveis ​​de frase caractere estático não assinado gprmc(7), gprmctemp(7)="$GPRMC"; estático int gp1,gp2; estático int st=0,len=6; estático int i,j,k; //verifica as variáveis ​​de correção do satélite caractere estático não assinado sc(2), sctemp(2)="V"; estático int sc1,sc2; estático int sc_st=8,sc_len=1; static unsigned char nogps(14) = "Sem sinal de GPS"; static unsigned char yesgps(17) = "Sinal de GPS encontrado"; interno x,y; estado = 0; ret = 0; TRISB = 0x00; //torna a portaB como saída TRISD = 0x00; //torna portD como saída PORTCbits.RX = 1; //Define o pino RX como entrada TXSTAbits.SYNC = 0; //modo assíncrono TXSTAbits.BRGH = 1; //taxa de transmissão alta RCSTA = 0x90; //habilita porta serial e receptor SPBRG = 0x19; //Taxa de transmissão de 9600, 16MHz xtal init_lcd ; meu atraso(1); cmd_wrt(0x80); //força o cursor no início da 1ª linha enquanto(1) { para(x=0;x<76;x++) { enquanto(PIR1bits.RCIF==0); //espera para receber gps(x) = RCREG; } //Verifica se a sentença $GPRMC foi recebida para (gp1=st,gp2=0; gp2 gprmc(gp2)=gps(gp1); gprmc(gp2)='�'; para (sc1=sc_st,sc2=0;sc2 sc(sc2)=gps(sc1); sc(sc2)='�'; if (strcompare(gprmc,gprmctemp,6)==1 && (strcompare(sc,sctemp,1)==0)) //Verifica se o sinal GPS foi encontrado { //cmd_wrt(0x80); para(j=0;j<16;j++) data_wrt(simgps(j)); meuatraso(500); cmd_wrt(0xC0); meu atraso(1); cmd_wrt(0x80); meu atraso(1); lat_long ; } if ((strcompare(gprmc,gprmctemp,6)==1) && (strcompare(sc,sctemp,1)==1)) { //cmd_wrt(0x80); para(eu=0;eu<13;eu++) dados_wrt(nogps(i)); meuatraso(500); cmd_wrt(0x01); meu atraso(1); cmd_wrt(0x80); meu atraso(1); } RCSTAbits.CREN=0; //Limpa o bit de habilitação de recebimento contínuo RCSTAbits.CREN=1; //Define o bit de habilitação de recepção contínua para recepção contínua } } vazio lat_long(vazio) { caractere estático não assinado latitude(13), longitude(14); static int lat_a,lat_b,long_c,long_d; static int lat_st1=19,long_st2=33,lat_len1=13,long_len2=14; /****Latitude****/ //Declarações para separar dígitos e caracteres estático int lat1_a,lat2_b,lat1_c,lat2_d; estático int la_st1=0,la_st2=11,la_len1=12,la_len2=1; caractere estático não assinado latF1(12), latF2(1); //Declarações para separar graus e minutos de dígitos static int laa,lab,lac,lad; static int último1=0,último2=1,lalen1=2,lalen2=9; char não assinado estático latFinal1(2), latFinal2(9); //Variáveis ​​para exibição estático int i1,j1,k1,l1,m1,n1; /****Longitude****/ //Declarações para separar dígitos e caracteres estático int longo1_a,long2_b,long1_c,long2_d; estático int long_st1=0,lo_st2=12,long_len1=12,lo_len2=1; char não assinado estático longF1(12), longF2(1); //Declarações para separar graus e minutos de dígitos estático int loa,lob,loc,lod; static int perdido1=0, perdido2=2,lolen1=2,lolen2=9; char não assinado estático longFinal1(3), longFinal2(9); estático int i2,j2,k2,l2,m2,n2; /*latitude*/ // Extraindo informações de latitude para (lat_a=lat_st1,lat_b=0; lat_b latitude(lat_b)=gps(lat_a); latitude(lat_b)='�'; //Separando dígitos e caracteres para (lat1_a=la_st1,lat2_b=0; lat2_b latF1(lat2_b)=latitude(lat1_a); latF1(lat2_b)='�'; para (lat1_c=la_st2,lat2_d=0; lat2_d latF2(lat2_d)=latitude(lat1_c); latF2(lat2_d)='�'; //Visualização em graus e minutos for (laa=último1,lab=0; laboratório latFinal1(lab)=latF1(laa); latFinal1(lab)='�'; para (lac=último2,lad=0; rapaz latFinal2(lad)=latF1(lac); latFinal2(lad)='�'; /*coloque o código para exibir a latitude aqui*/ cmd_wrt(0x01); meu atraso(1); cmd_wrt(0x80); para(i1=0;i1<10;i1++) dados_wrt(lati(i1)); meu atraso(50); cmd_wrt(0xC0); meu atraso(1); para(j1=0;j1<2;j1++) dados_wrt(latFinal1(j1)); para(k1=0;k1<8;k1++) dados_wrt(deg(k1)); meuatraso(500); cmd_wrt(0x01); meu atraso(1); cmd_wrt(0x80); para(l1=0;l1<9;l1++) dados_wrt(latFinal2(l1)); cmd_wrt(0xC0); para(m1=0;m1<9;m1++) dados_wrt(mins(m1)); meu atraso(1); para(n1=0;n1<1;n1++) dados_wrt(latF2(n1)); meuatraso(500); /*longitude*/ cmd_wrt(0x01); meu atraso(1); cmd_wrt(0x80); para(i2=0;i2<10;i2++) dados_wrt(longi(i2)); meu atraso(50); cmd_wrt(0xC0); meu atraso(1); // Extraindo informações de longitude para (long_c=long_st2,long_d=0; longo_d longitude(long_d)=gps(long_c); longitude(long_d)='�'; //Separando dígitos e caracteres para (longo1_a = longo_st1, longo2_b = 0; longo2_b longF1(long2_b)=longitude(long1_a); longoF1(long2_b)='�'; para (long1_c=lo_st2,long2_d=0; longo2_d longF2(long2_d)=longitude(long1_c); longoF2(long2_d)='�'; //Visualização em graus e minutos for (loa=perdido1,lob=0; lob longFinal1(lob)=longF1(loa); longFinal1(lob)='�'; for (loc=perdido2,lod=0; lod longoFinal2(lod)=longF1(loc); longFinal1(lod)='�'; /*coloque aqui o código para exibir a longitude*/ para(j2=0;j2<3;j2++) dados_wrt(longFinal1(j2)); para(k2=0;k2<8;k2++) dados_wrt(deg(k2)); meuatraso(500); cmd_wrt(0x01); meu atraso(1); cmd_wrt(0x80); para(l2=0;l2<9;l2++) data_wrt(longFinal2(l2)); cmd_wrt(0xC0); para(m2=0;m2<9;m2++) data_wrt(mins(m2)); meu atraso(1); para(n2=0;n2<1;n2++) data_wrt(longF2(n2)); meuatraso(500); cmd_wrt(0x01); meu atraso(1); cmd_wrt(0x80); meu atraso(1); RCSTAbits.CREN=0; //Limpa o bit de habilitação de recebimento contínuo RCSTAbits.CREN=1; //Define o bit de habilitação de recepção contínua para recepção contínua principal ; } strcompare de char não assinado (char *s1, char *s2, tamanho de char não assinado) { caractere não assinado i; para (eu=0;eu { se(*s1 != *s2) { retornar 0; } outro { //Fazer nada } s1++; s2++; } retornar 1; } /*****Código LCD*****/ vazio init_lcd { int j; para(j=0;j<4;j++) cmd_wrt(cmd(j)); } /*************************************/ void cmd_wrt (char cmddata não assinado) { rs=0;// seleciona rs como comando reg rw=0;//para escrever no lcd lcd=cmddados; en=1; meu atraso(1); en=0; meu atraso(1); } void data_wrt (dados de caracteres não assinados) { rs=1;// seleciona rs como registro de dados rw=0; lcd=dados; en=1; meu atraso(1); en=0; meu atraso(1); } void mydelay (valor de caractere não assinado) { for(;val>=1;val--) { Atraso1KTCYx(1); } }

###

Diagramas de circuito

gps_proteus

Conteúdo Relacionado

Determinar uma localização precisa é necessário em várias indústrias...
A Infineon Technologies AG apresenta os novos MOSFETs CoolSiC...
Uma rede de sensores é incorporada em todos os...
O controlador do motor é um dos componentes mais...
ESP32-CAM é um módulo de câmera compacto que combina...
A evolução dos padrões USB foi fundamental para moldar...
A SCHURTER anuncia um aprimoramento para sua conhecida série...
A Sealevel Systems anuncia o lançamento da Interface Serial...
A STMicroelectronics introduziu Diodos retificadores Schottky de trincheira de...
O novo VIPerGaN50 da STMicroelectronics simplifica a construção de...
A Samsung Electronics, fornecedora de tecnologia de memória avançada,...
O mercado embarcado tem uma necessidade de soluções de...
Quando você explora a área de Controle V/F dos...
Você provavelmente já se deparou com o termo 'arrastar'...
Você provavelmente tem um Isolador de suporte Se você...
Voltar para o blog

Deixe um comentário

Os comentários precisam ser aprovados antes da publicação.