Professional Documents
Culture Documents
GEOLOCALIZAÇÃO E
TELEMETRIA DE DADOS EM
AUTOMÓVEL
i
ii
Agradecimentos
As nossas realizações pessoais nunca são apenas nossas, mas também daqueles que de
certa forma contribuíram com pequenos e grandes gestos para as concretizar e, como tal,
não poderia deixar de lhes agradecer:
Ao Presidente Luis Medeiros da corporação dos Bombeiros Voluntários de Ovar por todo
o conhecimento que me transmitiu e pela paciência que teve comigo.
Um reconhecimento ao meu amigo António Pereira com quem tive o privilégio de partilhar
muitas horas de trabalho. Fico grato por todos os ensinamentos que me transmitiu durante
este ano.
Por último e não menos importante, aos meus pais, irmã, cunhado e namorada, por todos
os conselhos, pela paciência e tempo disponibilizado. Pelo carinho e força que me deram
nos piores momentos. Sem vocês, nunca teria chegado até aqui e não seria o que sou hoje.
iii
Resumo
Com o avanço da tecnologia nos últimos anos temos cada vez mais acesso a um conjunto
de dispositivos com diversas funcionalidades que contribuem de forma positiva nas
diferentes áreas, como na saúde, na indústria, etc. Nos veículos motorizados, por exemplo,
este avanço tecnológico é bem percetível se considerarmos a complexidade e as
funcionalidades que apresentam. No entanto, com o aumento da complexidade aumentam,
também, o número de anomalias que surgem.
Por forma a combater e prevenir este problema, e com o objetivo de fazer a monitorização
do veículo em tempo real, foi desenvolvido este projeto que consiste na construção de um
sistema que permite a recolha de dados da posição geográfica e telemetria do automóvel.
A placa de circuito impresso (PCB – do inglês, Printed Circuit Board), que foi
desenvolvida, contém sensores que permitem fazer a telemetria e o rastreio do veículo.
Com este sistema é possível obter os dados de temperatura no interior do veículo,
acelerações, velocidade, declives/inclinações, localização geográfica e ainda torna possível
a identificação do condutor da viatura. Após a instalação do sistema no veículo, os valores
recolhidos são enviados através de comunicação de dados por radiofrequência para uma
central (num raio de 1 km) que, posteriormente os irá armazenar numa base de dados.
Através da análise destes valores é possível deduzir a forma como o condutor conduziu, se
teve uma boa condução (através da análise de acelerações e travagens bruscas e dos limites
de velocidade) e determinar a sua posição geográfica em tempo real.
Palavras-Chave
Telemetria, monitorização, PCB, Comunicação radiofrequência, localização geográfica, RFID,
aceleração, giroscópio.
v
Abstract
With the progression of technology in recent years, we have more and more access to a set
of devices with various functionalities that contribute positively in different fields, such as
health, industry, etc. In motor vehicles, for example, this technological improvement is
very noticeable considering the complexity and the functionalities they present. However,
as the complexity increases, so do the number of anomalies that arise.
In order to deal with and prevent this issue and in order to make the monitoring of the
vehicle in real time was developed this project, which comprises the construction of a
system that allows the collection of data of the geographical location and telemetry of the
car.
The printed circuit board that was developed contains sensors that make it possible to
telemetry and track the vehicle. With this system it is possible to obtain temperature data
from inside the vehicle, acceleration, speed, slopes, geographical location and it also makes
it possible to identify the vehicle driver. After installing this system on a vehicle, the
values collected are sent, through radiofrequency data communication, to a central (within
a 1km radius) which will, then, store them in a database. Through analysis of these values
is possible to further deduce how the driver drove (by acceleration analysis, abrupt braking
and speed limits) and determine its geographical position in real time.
This system is an advantage when installed on vehicles/machines that are, for example,
inside a yard, and using a low cost data communication network significantly reduces costs
in mobile communications (GSM – Groupe Special Mobile).
Keywords
vii
Índice
AGRADECIMENTOS ............................................................................................................................III
RESUMO .................................................................................................................................................. V
ABSTRACT........................................................................................................................................... VII
ÍNDICE .................................................................................................................................................... IX
1. INTRODUÇÃO ................................................................................................................................. 1
2. ESTADO DA ARTE.......................................................................................................................... 5
3. FUNDAMENTO TEÓRICO........................................................................................................... 11
4. HARDWARE .................................................................................................................................. 35
4.1. MATERIAIS................................................................................................................................ 35
4.2. ARQUITETURA ........................................................................................................................... 45
5. SOFTWARE ................................................................................................................................... 47
ix
6. RESULTADOS................................................................................................................................ 57
7. CONCLUSÕES ............................................................................................................................... 67
REFERÊNCIAS....................................................................................................................................... 69
x
Índice de Figuras
Figura 1 Logotipo da empresa Gisgeo Information Systems. .....................................................2
Figura 2 Ficha OBDII utilizada nos veículos e que permite obter os dados [1]. ..........................6
Figura 3 Leitor de RFID instalado automóvel dos Bombeiros. ...................................................7
Figura 4 Recortes do layout da plataforma online dos Bombeiros Voluntários de Ovar. .............8
Figura 5 Recortes do layout da plataforma online dos Bombeiros Voluntários de Ovar com
infração. ................................................................................................................................9
Figura 6 Recortes do layout da plataforma online dos Bombeiros Voluntários de Ovar com
infração. ............................................................................................................................... 10
Figura 7 Formato da trama de bits utilizado neste protocolo [6]. ............................................. 15
Figura 8 Estrutura do código de 64 bits dos dispositivos OneWire [9]. .................................... 16
Figura 9 Método de escrita no barramento OneWire [6]. ......................................................... 16
Figura 10 Pulso de reset iniciado pelo dispositivo mestre no barramento OneWire [6]. ............. 17
Figura 11 Esquema de ligação entre o mestre e escravo que utilizam o protocolo SPI [12]. ....... 18
Figura 12 Modo 0 de transmissão SPI [13]. ............................................................................... 19
Figura 13 Modo 1 de transmissão SPI [13]. ............................................................................... 20
Figura 14 Modo 2 de transmissão SPI [13]. ............................................................................... 20
Figura 15 Modo 3 de transmissão SPI [13]. ............................................................................... 21
Figura 16 Barramento I2C [14]. ................................................................................................ 22
Figura 17 a) condição de início; b) condição de final de transmissão utilizado na comunicação
I2C [16]................................................................................................................................ 23
Figura 18 Transmissão de um bit no barramento I2C [17]. ........................................................ 23
Figura 19 Sistema de triangulação utilizado pelos satélites na deteção do recetor [20]. .............. 25
Figura 20 Exemplos de sinais modulados em amplitude, frequência e fase. ............................... 27
Figura 21 Modulação em amplitude por chaveamento [21]........................................................ 27
Figura 22 Modulação por chaveamento de frequência [21]. ....................................................... 28
Figura 23 Modulação por chaveamento de fase [21]. ................................................................. 28
Figura 24 Funcionamento do acelerómetro de tecnologia piezoelétrico [23]. ............................. 30
Figura 25 Funcionamento do acelerómetro de tecnologia capacitiva [23]. ................................. 31
Figura 26 Módulos utilizados na comunicação por RFID [27]. .................................................. 33
Figura 27 Exemplo de um circuito impresso com tecnologia SMD. ........................................... 34
Figura 28 Microcontrolador ATmega324PA PDIP. ................................................................... 35
Figura 29 Pinout do atmega342PA [30]. ................................................................................... 36
Figura 30 Esquema de ligações e as configurações dos pinos do sensor DS18B20 [31] [32]. ..... 37
Figura 31 Sensor MPU 9250 [33]. ............................................................................................ 38
xi
Figura 32 Transceiver RFM69HW utilizado na comunicação por radiofrequência [33]. ............ 39
Figura 33 (a) Pinout do módulo RFM69HW, (b) Descrição dos pinos [34]................................ 40
Figura 34 Regulador de tensão LDO de 3,3 V. .......................................................................... 41
Figura 35 Conversor de níveis lógicos bidirecional. .................................................................. 41
Figura 36 Tags em formato de cartão e porta-chaves. ................................................................ 42
Figura 37 Pinout do sensor RFID MFRC522 13.56 MHz. ......................................................... 42
Figura 38 Pinout do sistema de posicionamento Galileo [35]. ................................................... 43
Figura 39 Display gráfico ST7920 128x64 [37] ........................................................................ 44
Figura 40 Descrição dos pinos do display ST7920 [6]. .............................................................. 45
Figura 41 Fluxograma referente à leitura de vários sensores de temperatura DS18B20. ............. 48
Figura 42 Fluxograma que descreve a configuração executada pelo mestre no barramento. ....... 50
Figura 43 Fluxograma da função que permite fazer a leitura dos dados de aceleração. ............... 51
Figura 44 Fluxograma da função que permite fazer a leitura dos valores do giroscópio. ............ 53
Figura 45 Fluxograma que permite fazer o controlo de dois transponders. ................................. 55
Figura 46 Temperatura obtida a partir de dois sensores de temperatura diferentes...................... 57
Figura 47 Leitura dos dois sensores de temperatura DS18B20 visualizados no display. ............. 58
Figura 48 Simulação de um carro numa estrada plana. .............................................................. 59
Figura 49 Simulação de um carro numa estrada a subir. ............................................................ 59
Figura 50 Simulação de um carro numa estrada a descer. .......................................................... 59
Figura 51 Simulação de uma curva à esquerda realizada com velocidade excessiva. .................. 60
Figura 52 Simulação de uma curva à direita executada com velocidade excessiva. .................... 60
Figura 53 Leitura com acesso autorizado na passagem da tag em formato de porta-chaves. ....... 61
Figura 54 Leitura com acesso negado na passagem da tag em formato de cartão. ...................... 61
Figura 55 Coordenadas que surgem no display no formato DMS............................................... 62
Figura 56 Coordenadas no formato DMS e DD. ........................................................................ 62
Figura 57 Esquemático das ligações microcontrolador após sofrer alterações. ........................... 63
Figura 58 Esquemático do sensor RFID MFRC522. .................................................................. 64
Figura 59 Layout do PCB. ........................................................................................................ 65
xii
Índice de Tabelas
Tabela 1 Planeamento do projeto em semanas ...........................................................................4
Tabela 2 Fórmulas para o cálculo da taxa de transmissão [6]. .................................................. 14
Tabela 3 Modos de transmissão SPI. ....................................................................................... 19
Tabela 4 Formato da trama enviada no barramento I2C para os dispositivos escravos. ............. 23
xiii
Acrónimos
ACK – Acknowledge
DD – Graus decimais
xiv
RAM – Random Access Memory
SS – Select Slave
xv
1. INTRODUÇÃO
1
É, então, com esse propósito, que surge este projeto desenvolvido em parceria com a
empresa Gisgeo Information Systems (Gisgeo). A Gisgeo é uma empresa que desenvolve
soluções de apoio à decisão com base geográfica, utilizando vários tipos de soluções, tais
como:
1.2. OBJETIVOS
2
unidade curricular de Laboratório de Sistemas na Licenciatura de Engenharia Eletrotécnica
e de Computadores.
1.3. CALENDARIZAÇÃO
Uma vez que este projeto é bastante complexo, foi necessário fazer um template para
organizar os tempos em que cada dispositivo deve de ser controlado para dar tempo para
fazer tudo com sucesso. A Tabela 1 apresenta a calendarização do projeto.
3
Tabela 1 Planeamento do projeto em semanas
4
2. ESTADO DA ARTE
O sistema de monitorização e telemetria de dados é cada vez mais requerido nas indústrias
com o objetivo de fazer o controlo e monitorização dos seus veículos.
Este sistema implementado nos veículos utiliza dois sistemas de posicionamento: GPS
americano e o GLONASS russo. Estes dois sistemas a trabalhar em simultâneo permitem
fornecer coordenadas mais precisas e com maior velocidade de obtenção, uma vez que
existem 6 satélites a disponibilizar informação da posição geográfica. Este sistema utiliza a
tecnologia 3G/GSM, que permite fazer o upload dos dados para um servidor, sendo para
isso necessário um cartão SIM incluído no sistema e o pagamento de uma taxa para poder
usufruir deste serviço.
Os dados são recolhidos dos veículos por um dispositivo que está conectado à porta On
Board Diagnostic (OBDII) e, utilizando o protocolo de comunicação Controler Area
Network, recolhe-se um conjunto de informações relevantes como, temperatura do motor e
do líquido de arrefecimento, velocidade, aceleração, rotações por minuto, entre outros. A
Figura 2 representa um exemplo de uma ficha OBDII que permite fazer a leitura dos dados
do veículo.
5
Figura 2 Ficha OBDII utilizada nos veículos e que permite obter os dados [1].
Este sistema quando implementado em veículos possui inúmeras vantagens como, por
exemplo, na otimização das frotas – os gestores têm acesso à localização instantânea do
veículo, podendo contactar de forma direta o condutor e distribuindo as tarefas entre os
veículos presentes no terreno; acompanhamento da frota (relatórios) – os gestores
conseguem ter acesso numa plataforma online a dados como os quilómetros percorridos
por cada veículo, velocidades, travagens ou paragens de emergência. [2].
O objetivo deste sistema consiste na otimização das frotas realizadas pelos seus
operacionais. Anteriormente à implementação deste sistema, quando surgia um telefonema
para transportar um doente que se encontrava num determinado hospital, era necessário
contactar todos os operacionais que estavam fora do quartel para saber a sua localização e
posteriormente fornecer novos dados de percurso a realizar. Com o novo sistema de
telemetria e de geolocalização, sempre que existe uma chamada para buscar um doente a
um determinado sítio, o operacional que se encontra no quartel responsável e que faz a
gestão das frotas, entra em contacto com o condutor mais próximo do local e fornece novos
dados da frota a executar. Com estas correções realizadas na frota, existe uma diminuição
significativa de custos nas comunicações executadas, no tempo utilizado para estabelecer
contacto com os operacionais e ainda nos gastos de combustível.
6
O sistema de identificação do condutor instalado no veículo é um RFID iButton que está
apresentado na Figura 3. O condutor quando inicia a sua marcha tem de passar o
identificador pelo leitor, caso contrário é gerado um aviso.
7
Figura 4 Recortes do layout da plataforma online dos Bombeiros Voluntários de Ovar.
8
Figura 5 Recortes do layout da plataforma online dos Bombeiros Voluntários de Ovar com
infração.
Na Figura 6, está representado outro tipo de infração. Neste caso foi efetuada uma curva
com velocidade acima dos limites, obtendo-se valores de aceleração um pouco alterados.
Como se pode ver na parte inferior da figura, as sucessivas infrações efetuadas pelo
condutor, levou a considerar que a condução efetuada com aquele veículo foi um pouco
fora do normal e por isso, foi sinalizada com vermelho.
9
Figura 6 Recortes do layout da plataforma online dos Bombeiros Voluntários de Ovar com
infração.
10
3. FUNDAMENTO TEÓRICO
3.1. MICROCONTROLADORES
Os microcontroladores têm um papel importante na sociedade pois estão cada vez mais
presentes nas nossas vidas e em tudo o que nos rodeia, desde os simples eletrodomésticos e
brinquedos a projetos como a “casa inteligente”.
Existem dois elementos importantes em robótica cujo conceito, por vezes, se confunde:
microcontroladores e microprocessadores. Um microprocessador é um circuito integrado,
que é caracterizado pela sua velocidade de processamento, isto é, a rapidez com que as
instruções são executadas. Realiza funções de cálculo, tomada de decisão e incorpora
funções da unidade central de processamento (CPU – do inglês, Central Processing Unit).
Com o desenvolvimento da tecnologia, os microprocessadores foram os primeiros a
aparecer. Aos poucos, foram-lhes sendo adicionados periféricos externos como memória,
portas de entrada e saída e temporizadores, contribuindo assim para a construção do
microcontrolador. Este último é um circuito integrado, constituído por uma CPU e mais
um conjunto de periféricos específicos para determinadas aplicações, por exemplo,
memória flash ROM (do inglês, Read On Memory), memória RAM (do inglês, Random
Access Memory), EEPROM (do inglês, Electrically Erasable Programmable Read Only
Memory), UART (do inglês, Universal Synchronous Asynchronous Receiver Transmitter),
temporizadores, PWM (do inglês, Pulse Width Modulation), conversor analógico-digital
11
(ADC, deriva do inglês, Analog Digital Converter), entre outros [3]. Após o aparecimento
do microcontrolador, outros fabricantes começaram a desenvolver os seus
microcontroladores com características específicas para cada projeto. Se o objetivo é, por
exemplo, colocar o dispositivo num drone, o espaço e o consumo do controlador assumem
um papel mais relevante. Microchip, Atmel e Intel são exemplos de famílias de
microcontroladores mais vulgarmente procuradas.
Memórias como a EPROM e ROM são exemplos de memória de programa. Este tipo de
memória é utilizado para armazenar as instruções ou o programa que faz o controlo dos
periféricos que estão a ele conectados [4].
O tipo de comunicação master - slave (mestre – escravo) é uma comunicação baseada entre
dispositivos onde existe um mestre que gera o sinal de sincronismo e comanda o
barramento, com condições de iniciação e paragem, e o outro que recebe o sinal de
sincronização para fazer a comunicação com o dispositivo mestre. Relativamente aos
modos de comunicação, no modo simplex, os dados circulam apenas num sentido
(transmissor para o recetor); no modo half duplex, a informação transmitida pode circular
12
em ambas as direções, mas não simultaneamente; no modo de comunicação full duplex, os
dados podem ser transmitidos através do barramento nos dois sentidos e ao mesmo tempo,
isto é, um dispositivo pode transmitir e receber dados no mesmo instante. Relativamente à
estratégia de comunicação síncrona, o recetor entra em sincronismo quando o dispositivo
mestre gera o sinal de sincronização (clock). Na comunicação assíncrona, esta é realizada
através de um bit de partida enviado pelo transmissor que indica ao escravo o início de
uma comunicação [5].
Nos próximos subcapítulos são abordados alguns protocolos que são utilizados na
comunicação entre alguns dispositivos e a família de microcontroladores Atmel.
13
Tabela 2 Fórmulas para o cálculo da taxa de transmissão [6].
14
Figura 7 Formato da trama de bits utilizado neste protocolo [6].
• Parasita: Este protocolo utiliza duas linhas: GND e dados (com uma resistência de
4,7 kΩ), ou seja, o dispositivo escravo é alimentado pela linha de dados. Quando o
mestre está em comunicação com um sensor OneWire, este não pode iniciar outro
tipo de comunicação com outros dispositivos, porque a linha de dados, que
funciona também como alimentação, está ocupada.
• Externa: os circuitos integrados utilizam três linhas: +VCC (com uma resistência
de pull-up de 4,7 kΩ), GND, e dados. Contrariamente ao modo anterior, como o
barramento está livre para a transferência de dados, o dispositivo mestre pode
pesquisar continuamente se o dispositivo já acabou a conversão de dados, não
precisando de esperar pelo terminar da conversão e podendo-a iniciar
simultaneamente com outro sensor.
15
comunicação com o mestre de forma individualizada. Este código armazenado em ROM é
constituído por 64 bits sequenciais sendo que os primeiros 8 bits menos significativos
(LSB) representam a família, os 48 bits seguintes contém o número de série único e os
últimos 8 bits mais significativos (MSB) referem o código de verificação de redundância
cíclica (CRC). A Figura 8 representa o código de 64 bits armazenado em ROM.
Uma vez que só é usada uma linha de dados na comunicação, este protocolo utiliza
intervalos de tempo adequados e gerados pelo mestre na transmissão de dados. Para
escrever o nível lógico 0, o mestre desce do estado lógico um para zero e mantém-no por
um período superior a 60 µs. Para escrever o nível lógico 1 no dispositivo OneWire, o
mestre executa o mesmo procedimento, no entanto, por um período de tempo menor, 15 µs
ou menos [6]. A Figura 9 representa o diagrama de escrita de um ou zero no barramento
OneWire.
16
Figura 10 Pulso de reset iniciado pelo dispositivo mestre no barramento OneWire [6].
• Leitura da ROM (Read ROM) [0x33] – este comando é utilizado para reconhecer
o código de identificação do sensor presente no barramento. Só é utilizado quando
é o único dispositivo presente no barramento;
• Saltar ROM (Skip ROM) [0xCC] – Este código é utilizado quando existe apenas
um sensor no barramento. Permite ao mestre comunicar com um sensor de forma
direta sem ser necessário executar os comandos ROM.
17
3.2.3. PROTOCOLO SPI
• Master Output Slave Input (MOSI) – Este barramento é ligado ao pino de saída do
dispositivo mestre e ao pino de entrada do escravo para leitura de dados;
• Master Input Slave Output (MISO) – Está ligado ao pino de entrada do dispositivo
mestre - para fazer a leitura de dados proveniente do escravo – e ao pino de saída
do dispositivo escravo que envia os dados;
• Select Slave (SS) – O mestre pode escolher com qual dos escravos quer comunicar
através da ativação do pino SS correspondente.
Figura 11 Esquema de ligação entre o mestre e escravo que utilizam o protocolo SPI [12].
18
O protocolo utiliza quatro métodos de transmissão e sincronização de dados entre o
transmissor e recetor usando o sinal de clock [11]. O sinal de clock pode ter diferentes
polaridades (CPOL, do inglês, Clock Polarity) e fases (CPHA, Clock Phase),
configuradas de forma a gerar 4 modos de transmissão diferentes que podemos observar na
Tabela 3. A fase do clock determina em que momento se realiza a leitura de dados e a
polaridade define se o sinal é invertido ou não.
0 0 0
1 0 1
2 1 0
3 1 1
19
Para o modo 1, Figura 13, CPHA igual a 1 e CPOL igual a 0, os dados são lidos na descida
do clock e a saída é atualizada na subida. A primeira subida do sinal gerado é usada para a
preparação dos dados.
O modo 3 e 4 utilizam o sinal de clock invertido (CPOL = 1) que conduz a uma diferença
de fase na comunicação estabelecida. No modo 3, Figura 14, quando a fase tem o valor 0 e
a polaridade tem o valor 1, os dados são lidos na borda da descida do clock e são
atualizados na subida.
20
No último modo de configuração, Figura 15, a polaridade do sinal gerado é invertida,
CPOL é igual a 1 e a fase é igual a 1. Neste caso, o primeiro sinal de clock é utilizado para
preparar os dados, uma vez que estes apenas são lidos na borda da subida e atualizados na
descida.
Conclusão, o sinal gerado pode ser invertido através do parâmetro CPOL e ter uma fase
diferente através do parâmetro CPHA. Se CPHA é igual a 1, os dados são amostrados na
segunda borda do clock (independentemente da borda do clock estar a subir ou a descer),
invertido ou não.
3.2.4. PROTOCOLO 𝐈 𝟐 𝐂
O protocolo I 2 C - também designado por Two Wire Interface - foi projetado pela Philips
Semicondutores (hoje é a NXP) e consiste num tipo de comunicação síncrono, bidirecional
e de elevada velocidade transmissão de dados. Os dispositivos I 2 C utilizam a designação
de mestre-escravo; o dispositivo mestre é aquele que gera o sinal de clock e inicia a
transmissão, e o escravo utiliza o sinal gerado para sincronização com o mestre durante a
comunicação.
21
Este protocolo utiliza apenas duas linhas para a transmissão dos dados: dados seriais
(SDA) e clock serial (SCL). A linha de dados transporta os endereços, controla o
barramento e faz a troca de dados entre o mestre e o escravo (bidirecional) e a linha do
clock faz a sincronização do transmissor e do recetor durante a comunicação.
Este protocolo permite que vários dispositivos mestres estejam conectados ao mesmo
barramento, no entanto, apenas se costuma utilizar um como mestre e os restantes são
escravos. Cada dispositivo que utiliza este protocolo, tem um código de endereçamento
único que permite identificar os diversos sensores na linha. Um dispositivo presente no
barramento pode comportar-se como escravo, mestre ou ainda a junção dos dois, de forma
alternada. Neste protocolo é possível o endereçamento de 10 bits, todavia, esta
configuração não é muito usada. O endereçamento mais utilizado é o de 7 bits (27 = 128),
permitindo alocar 112 dispositivos, uma vez que 16 endereços são reservados (128-16
=112 dispositivos) [6]. A Figura 16 representa a forma como os dispositivos escravos se
ligam ao mestre.
22
Tabela 4 Formato da trama enviada no barramento 𝐈𝟐 𝐂 para os dispositivos escravos.
Antes de iniciar a transmissão de dados entre o mestre e os escravos, as linhas SDA e SCK
do barramento encontram-se inativas, isto é, no nível lógico alto. A transferência de dados
inicia-se com a mudança do estado lógico das linhas do barramento. Quando começa a
comunicação com o escravo, a linha SDA desce para o nível 0 com a linha SCL no nível
superior. Quando a linha SCL descer, é iniciada a transmissão de dados (ver Figura 17 a).
A transferência de dados termina com a linha de SCL retomando ao nível lógico alto e,
posteriormente a linha SDA (ver figura 17 b) [15].
a)
b)
A transmissão de um bit neste protocolo ocorre quando este é colocado na linha SDA
enquanto a linha SCL está no estado lógico 0. O bit só é amostrado quando esta linha
(SCL) volta ao estado normal, como se pode ver na Figura 18.
23
de início e fim de transmissão, enquanto que o escravo é responsável por responder se
recebeu a informação.
O GPS é constituído por uma constelação de 24 satélites que ficam igualmente distribuídos
em seis planos ao redor da órbita do planeta Terra. Cada satélite orbita o planeta duas
vezes por dia (período de 12 horas), emitindo constantemente sinais de rádio a
determinadas frequências para os recetores terrestres.
24
𝑑
𝑣= (𝑚/𝑠)
∆𝑡
Determinação da distância do recetor aos satélites.
A Figura 19 permite exemplificar o método de triangulação utilizado pelos GPS [20]. Após
descobrir as distancias (𝑑𝐴 , 𝑑𝑏 𝑒 𝑑𝐶 ) de cada satélite (A, B e C) ao recetor (P), usa-se a
triangulação para descobrir o recetor P. É utilizado um quarto satélite de referência para
determinar com exatidão a posição pretendida.
3.4. RADIOFREQUÊNCIA
A comunicação por radiofrequência foi desenvolvida e utilizada para fins militares, no
entanto, rapidamente se espalhou para a secção civil. É atualmente indispensável uma vez
que a partir dela, hoje é possível fazer a comunicação entre dois pontos da superfície
terrestre utilizando apenas dois sistemas com antenas.
25
• Bidirecional – Esta comunicação efetua-se em dois sentidos e é feita através de
dois dispositivos – transceivers. Estes tipos de dispositivos possuem um integrado
que lhes permite funcionar como recetores e transmissores.
A onda eletromagnética pronta a ser enviada é constituída pelo sinal que contém a
informação (sinal modulador) e pela onda portadora. A onda portadora pode atuar sobre
diferentes formas dependendo das suas características fase, amplitude e frequência. Devido
a estes parâmetros, podem existir três formas de modulação analógica (onda portadora e o
sinal analógico que contém a informação) [21]:
26
Na Figura 20 estão representados três exemplos de sinais modulados em amplitude,
frequência e fase.
27
• Modulação por chaveamento de frequência: este tipo de modulação utiliza uma
onda portadora modulada em frequência que faz a modulação de um sinal digital. A
variável de amplitude neste tipo de modulação mantém-se constante. Quando o
sinal modulador se encontra no nível 0, o sinal modulado à saída diminui a sua
frequência; no estado oposto, quando se encontra no estado alto, o sinal à saída
adquire a frequência da onda portadora. A Figura 22 apresenta um exemplo deste
tipo de modulação;
28
Na outra extremidade do canal de comunicação onde se localizam os dispositivos
recetores, o sinal modulado passa por um processo de desmodulação. Este processo
consiste na separação da onda portadora do sinal de mensagem, passando assim de um
sinal eletromagnético para um sinal descodificado em binário (no caso de modulação por
chaveamento), que contém a informação.
3.5. ACELERÓMETRO
O acelerómetro é um dispositivo inercial e eletromecânico, que mede a aceleração de um
corpo relativamente a um referencial, aceleração gravítica e as forças exercidas sobre ele.
Este dispositivo tem por base duas teorias físicas de Isaac Newton [22]:
𝐹 = 𝑀×𝑎
➢ Parado – Se o corpo está parado e não existe nenhuma força a atuar, a sua
aceleração é nula e ele mantém-se no mesmo estado.
29
Systems), entre outros. Este último é a tecnologia mais utilizada nos pequenos dispositivos
como smartphones e drones. Dentro deste padrão, existem dois tipos de funcionamento dos
acelerómetros, através de tecnologia [23]:
30
Figura 25 Funcionamento do acelerómetro de tecnologia capacitiva [23].
Através dos dados recebidos pelo acelerómetro nos 3 eixos, é possível determinar se houve
um choque, uma alteração brusca e ainda detetar a orientação do dispositivo, isto é, a sua
inclinação (pitch) e rotação (roll).
Para medir a inclinação do dispositivo, é necessário calcular o ângulo 𝜃 que faz entre o
eixo da força gravítica e o eixo X. Para tal, utiliza-se a função matemática arcotangente
[24] para descobrir o seu valor.
𝑥
𝜃 = 𝑎𝑟𝑐𝑡𝑎𝑛 ( )
√𝑥 2 + 𝑦 2
𝑥
Inclinação = arctan ( )
√𝑧 2 + 𝑦 2
𝑥
𝑅𝑜𝑡𝑎çã𝑜 = arctan ( )
√𝑧 2 + 𝑥 2
31
3.6. GIROSCÓPIO
Os valores obtidos pelo acelerómetro para a determinação da inclinação e da rotação não
são muito precisos. Para combater esta falha, os módulos que são comercializados no
mercado, possuem um integrado designado por giroscópio que permite medir a velocidade
angular, ou seja, determina a taxa com que a sua orientação varia ao longo do tempo [25].
𝜋(𝑟𝑎𝑑 ) → 180°
32
Figura 26 Módulos utilizados na comunicação por RFID [27].
• Ativa – são tags mais robustas, uma vez que possuem no interior uma bateria
própria para ter a capacidade de transmitir sinais a maiores distâncias para o leitor.
No entanto, devido à bateria, este tipo de RFID tem um tempo de vida limitado
(mais ou menos 10 anos).
Uma vez que o sistema RFID utiliza ondas rádio para a transmissão de dados, os intervalos
de frequências disponibilizadas neste tipo de comunicação tiveram de ser limitados para
não ocorrer interferência com os serviços móveis da polícia, da aeronáutica, entre outros.
Dentro da gama disponibilizada para o uso destas comunicações, existem várias
configurações dependendo das suas aplicações. Sistemas de baixa frequência (30 kHz a
500 kHz) são utilizados para comunicações de curta distância e são normalmente utilizados
para controles de acesso ou identificação; sistemas de alta frequência (850 MHz a
950 MHz e 2.4 GHz a 2.5 GHz), são aproveitados para leituras em médias e longas
distâncias, e são habitualmente utilizados para leitura de tags em veículos. Estas são as
frequências classificadas como as escalas de frequência Industrial Cientific Medical [26].
33
3.8. PLACAS DE CIRCUITO IMPRESSO
As placas de circuito impresso (PCB – do inglês, Printed Circuit Board), estão presentes
em toda a tecnologia e em quase todos os dispositivos, como smartphones, brinquedos,
sistemas de segurança e computadores. O PCB consiste numa placa constituída por um
material bastante isolante e que possui pequenas camadas metálicas (cobre, prata, ouro ou
níquel). Estas camadas condutoras permitem fazer as designadas pistas que são
responsáveis pela condução de corrente elétrica nos componentes que estão soldados [29].
O design do PCB é feito com recurso a softwares específicos que permitem fazer o
desenho e o esquema elétrico da placa. Através dele é possível definir a grossura das linhas
que fazem a ligação entre os componentes e fazem a alimentação do circuito, especificar o
tamanho das vias e a forma como são dispostos os componentes na placa. Depois do layout
completo, o próximo passo é a produção do PCB. Numa primeira fase, o circuito é gravado
na placa através de uma máquina de radiação ultravioleta. Posteriormente a placa passa por
um processo de corrosão numa solução ácida. Esta corrosão elimina as zonas de tinta
danificada pela radiação ultra violeta. Concluída esta fase, a placa é mergulhada em água
para neutralizar o ácido onde foi banhada. A furação é um processo bastante complexo, o
que requer bastante atenção. Para finalizar a produção do PCB, é, então necessário realizar
essa furação e a soldagem dos componentes na placa.
34
4. HARDWARE
Neste capítulo são caracterizados os materiais utilizados na realização deste projeto. Uma
vez que este já teve uma fase anterior, apenas são detalhados os materiais que foram
utilizados após esse período e/ou os que sofreram alterações. Serão também indicadas as
alterações realizadas no PCB. Adicionalmente, é apresentada a arquitetura do sistema com
a definição dos protocolos utilizados.
4.1. MATERIAIS
4.1.1. MICROCONTROLADOR
35
Este microcontrolador é caracterizado por uma memória EEPROM de 1 Kbyte, 2 Kbyte de
RAM e 32 Kbytes de memória ROM. Possui 32 portas I/O e nelas estão incorporados
vários periféricos: 2 portas séries (USART’s), 1 porta serial (SPI), 1 porta TWI (I 2 C), entre
outros [30]. A vantagem de possuir 32 portas e 2 portas séries foi o que levou à escolha
deste microcontrolador especificamente.
36
Para tal, foi utilizado o sensor de temperatura DS18B20. É um sensor digital capaz de
medir temperaturas na gama de −55 ºC a +125 ºC com uma resolução de 9 bits a 12 bits,
configuráveis. No intervalo de temperatura de −10 ºC a +85 ºC obtém-se valores com uma
precisão de ±0.5 ºC [31].
O modo de alimentação implementado foi do tipo externo, uma vez que desta forma pode
iniciar-se uma comunicação com um sensor e, simultaneamente, terminar a transferência
de dados com outro.
a) b) c)
Figura 30 Esquema de ligações e as configurações dos pinos do sensor DS18B20 [31] [32].
37
4.1.3. ACELERÓMETRO E GIROSCÓPIO
O giroscópio permite detetar a rapidez com que um veículo efetuou uma curva e ao mesmo
tempo a sua inclinação. Quando este obtém valores altíssimos num instante de tempo,
pode-se deduzir que o condutor executou uma curva com bastante velocidade e
consequentemente com uma excessiva inclinação, não executando assim uma condução
defensiva.
38
4.1.4. RADIOFREQUÊNCIA
A comunicação por radiofrequência é uma mais valia pois, através de um sistema de duas
antenas, é possível fazer uma comunicação à distância e sem fios.
O módulo escolhido para fazer a troca de dados entre dois pontos foi o RFM69HW,
apresentado na Figura 32.
Este módulo opera sempre com outro dispositivo igual, pois é um transceiver que permite
fazer o envio e a receção de dados simultaneamente (comunicação bidirecional). Para se
fazer a transmissão de dados entre o emissor e o recetor, ambos precisam de estar a operar
à mesma frequência e de estar configurados na mesma “rede”. Este módulo opera a uma
frequência de 433 MHz, 868 MHz e 915 MHz. Na Europa, a faixa de variação de
frequência que é possível utilizar sem ser necessário uma licença, situa-se entre os 863
MHz e os 870 MHz. Tendo isto em vista, 868 MHz foi a frequência escolhida para utilizar
na comunicação entre os dois transceivers.
Este dispositivo para além de possuir uma comunicação bidirecional, tem a vantagem de
apresentar um baixo consumo de energia e, simultaneamente, uma potência de saída RF
39
que não ultrapassa os limites estipulados – 20 mW - para este tipo de consumo (este
módulo utiliza uma potência de 13 mW).
a)
b)
Figura 33 (a) Pinout do módulo RFM69HW, (b) Descrição dos pinos [34].
Uma vez que o módulo é alimentado com uma tensão de 3,3 V e todo o circuito restante a
5 V, foi necessário utilizar um regulador de tensão. Sendo que estamos a trabalhar com
uma tensão muito baixa, usar um regulador de tensão linear (usados tradicionalmente) não
é vantajoso uma vez que este tem uma queda de tensão próxima de 2 V e um desperdício
de energia, por efeito calorífico, significativo [34]. Para contornar esta desvantagem,
utilizou-se um regulador de tensão do tipo LDO (low dropout), que apresenta uma baixa
queda de tensão (aproximadamente de 0,4 V) e as perdas por efeito de Joule são
insignificantes. A Figura 34 representa um regulador de tensão do tipo LDO.
40
Figura 34 Regulador de tensão LDO de 3,3 V.
Este dispositivo é bidirecional, uma vez que consegue fazer a conversão de níveis em dois
sentidos: do mais alto para o mais baixo, utilizando um divisor resistivo; do mais baixo
para o mais alto com recurso a transístores. Na Figura 35 é apresentado o conversor de
níveis lógicos utilizado para fazer a interligação dos dados entre o microcontrolador e o
módulo de radiofrequência.
41
4.1.5. IDENTIFICAÇÃO POR RADIO FREQUÊNCIA (RFID).
O dispositivo utilizado foi o RFID MFRC522 por ser de fácil instalação e por estar
disponível em grandes quantidades no mercado. Este dispositivo permite ler
identificadores (tag’s) na gama de frequência de 13.56 MHz e funciona utilizando o
protocolo de comunicação SPI ou I 2 C. O pinout de ligação deste sensor está representado
na Figura 37.
42
O sistema de comunicação utilizado é o protocolo SPI, sendo para isso necessário 5 linhas:
MOSI, MISO, SCK, SS e RESET. Juntamente com este dispositivo foram utilizados 2
leds: 1 de cor vermelha utilizado em caso de insucesso de leitura e 1 verde em caso de
sucesso.
O sensor RFID utiliza uma alimentação de 3,3 V, como dito anteriormente. Uma vez que o
transceiver RFM69HW utiliza a mesma voltagem, utilizou-se a tensão de saída convertida
pelo regulador de tensão LDO para alimentar também este dispositivo.
O sistema de GPS escolhido foi o módulo VK18U7 representado na Figura 38, que já
incorpora o novo sistema Galileo que é considerado dos equipamentos de localização com
maior precisão.
43
$GPGGA, $GPGSA, $GPGLL, $GPRMA, $GPRMC, entre outros [36]. Para cada
resposta, o utilizador recebe um conjunto de informações que são diferentes das restantes
respostas. Por exemplo, a resposta $GPRMC disponibiliza dados como a velocidade, hora
e coordenadas, enquanto que a resposta $GPGLL apresenta informações relativas à
latitude, longitude e horas.
Perante as diferentes respostas, foi utilizada a $GPRMC, pois obtém a informação básica
pretendida: horas, velocidade (em nós) e localização geográfica (sistema de coordenadas).
De forma a visualizar os dados que estão a ser obtidos em tempo real, implementou-se um
display com capacidade gráfica - ST7920 de 128x64 pontos como se pode ver na Figura
39.
O display tem 20 pinos de ligação e a pinagem surge da direita para a esquerda: o primeiro
pino está à direita e o último à esquerda. A descrição de cada pino é apresentada na Figura
40.
44
Figura 40 Descrição dos pinos do display ST7920 [6].
4.2. ARQUITETURA
Neste subcapítulo é realizado um quadro-resumo onde são descritos os protocolos
utilizados na comunicação entre o microcontrolador e os diversos periféricos.
MPU9250
I2C I2C
(Giroscópio e Acelerómetro)
ST7920
RS232
(Display)
ATmega324PA
OneWire
Série DS18B20
(Sensor de Temperatura)
RFID MFRC522
SPI
(Sensor de Identificação por
Radiofrequência)
Série VK18U7
(GPS)
SPI RFM69HW
(Radiofrequência)
45
46
5. SOFTWARE
47
Onewire_reset_search( ) (Anexo B) que permite fazer reset das variáveis e do vetor de
endereçamento de ROM.
Quando o dispositivo mestre quer comunicar com um tipo de sensor, faz a sua seleção
através da função Onewire_select( ) (Anexo B), enviando por parâmetro o seu endereço.
No programa principal, na main, foi desenvolvido o código que permite ler a temperatura
de vários sensores DS18B20, que pertencem à família 0x28. Numa fase inicial é efetuada a
procura no barramento de todos os sensores disponíveis. Numa segunda fase, apenas os
sensores com o bit menos significativo igual a 0x28 inicia a comunicação com o
microcontrolador. A Figura 41 mostra um fluxograma referente ao extrato de código
presente no Anexo C, que permite fazer a leitura de vários sensores DS18B20.
48
5.2. CONTROLO DO MPU9250
Este dispositivo utiliza o protocolo de comunicação I 2 C que foi já desenvolvido
anteriormente. Assim sendo, apenas é realizada uma explicação sobre o objetivo de cada
função utilizada neste protocolo e que está presente no Anexo D.
Este protocolo inicia a comunicação com a função i2c_start( ), emitindo uma condição de
início e enviando por parâmetro o endereço do dispositivo e a direção dos dados que
consiste na leitura ou escrita para o dispositivo escravo. No caso do microcontrolador
escrever para o dispositivo escravo, a direção será “0”, no caso de leitura de dados a
direção será “1”.
A função que permite fazer a escrita de dados pelo dispositivo mestre no barramento e com
a direção do dispositivo escravo é dada pela função i2c_write( ). Esta função recebe por
parâmetro o byte de dados a ser transmitido e retorna “0” ou “1” em caso de sucesso ou
insucesso, respetivamente.
As funções que permitem fazer a leitura dos dados enviados pelo dispositivo escravo para
o mestre são dadas por i2c_readAck( ) e i2c_readNak( ). A primeira função permite fazer
a leitura de 1 byte do barramento I 2 C e continua a solicitar o envio de mais dados; a
segunda função lê 1 byte e inicia de seguida uma condição de paragem no barramento.
49
Através do protocolo I 2 C explicado anteriormente, foram obtidos os valores do
acelerómetro e giroscópio de três eixos cada, disponíveis neste módulo (X, Y e Z). Estes
valores são adquiridos numa variável de 16 bits.
Não
50
5.2.1. ACELERÓMETRO
A função que permite determinar os valores de aceleração nos três eixos é dada por
readAccelxyz( ), que se encontra no Anexo D e que foi adaptada da biblioteca para
arduíno presente no website [39]. Por parâmetros, a função recebe e altera os valores de
aceleração “ax”, “ay” e “az” nas unidades de m/s2 . O fluxograma presente na Figura 43
descreve o processo de controlo do acelerómetro que permite adquirir os seus dados.
Figura 43 Fluxograma da função que permite fazer a leitura dos dados de aceleração.
51
Utilizando as fórmulas apresentadas na secção 3.5. foram calculados os ângulos de rotação
e inclinação do veículo. O código desenvolvido encontra-se no Anexo E. O código
apresentado abaixo faz os cálculos para descobrir os ângulos de inclinação e de rotação do
veículo, através dos dados obtidos pelo acelerómetro. Os ângulos obtidos vêm em rad/s e
para fazer a passagem para graus tem-se que multiplicar por 180/pi que é o valor que está
colocado na variável “valorteste”.
/* ********* inclinação *************** */
float raiz;
float raiz1;
raiz=sqrt(ay*ay + az*az);
inclinacao=atan2(ax,raiz)*valorteste;
dtostrf(inclinacao, 4,2,valinclinacao);
/* ***********rotação ****************** */
raiz1=sqrt(az*az + ax*ax);
rotacao=atan2(ay,raiz1)*valorteste;
dtostrf(rotacao, 4,2,tudo7);
Após a realização de vários testes num automóvel, foram estipulados valores para
identificar quando uma viatura está localizada num terreno plano, a subir ou a descer,
assim como, quando está inclinado para a esquerda ou para a direita. Este código
encontra-se desenvolvido no Anexo E.
5.2.2. GIROSCÓPIO
Depois da fase inicial de ligação entre o mestre e o escravo, os valores de giroscópio são
obtidos através da função readGyroxyz( ), que foi adaptada a partir da biblioteca
desenvolvida para arduíno, presente no website [39]. A função recebe e envia por
parâmetros os valores do giroscópio em º/s de cada um dos eixos calculados. O extrato de
código desenvolvido encontra-se no Anexo D. O fluxograma representado na Figura 44
ilustra a forma como os valores são obtidos do giroscópio em º/s e que são posteriormente
multiplicados pelo fator de sensibilidade do MPU9250.
52
Figura 44 Fluxograma da função que permite fazer a leitura dos valores do giroscópio.
53
O controlo do RFID é iniciado na main com a chamada das funções spi_init( ) e
mfrc522_init( ), sendo esta última utilizada para fazer a configuração do transcetor (leitor)
RFID. Após finalizada esta fase de configuração é utilizada a função mfrc522_read ( ) que
faz a leitura de dados do sensor RFID, enviando por parâmetro o comando que permite
obter a versão/tipo de sensor conectado ao barramento (neste caso é 0x92).
Uma vez que este dispositivo é utilizado para a identificação de diferentes utilizadores,
foram utilizados dois identificadores: porta-chaves (que está associado a uma identificação
realizada com sucesso), e um cartão (que está relacionado a uma falha de identificação). O
código referente à identificação por radiofrequência encontra-se representado no Anexo G.
O fluxograma representado na Figura 45 ilustra o processo de identificação por
radiofrequência utilizado para fazer a identificação de duas tags, utilizando as funções
anteriormente referidas.
54
Figura 45 Fluxograma que permite fazer o controlo de dois transponders.
Estas duas formas de representar a localização geográfica resultam das diferentes formas
de fracionar o grau (°). O formato DMS utiliza a latitude compreendida entre 0° no
equador até aos 90° nos pólos; por sua vez a longitude está compreendida entre 0° no
meridiano de GreenWich até aos 180° no lado oposto do globo.
55
O valor de latitude superior, de 0° a 90°, é referente ao Norte (N); a latitude inferior
compreendida entre 0° a -90° pertence ao Sul (S). Em analogia à latitude, a longitude
também se divide em dois intervalos: o valor da longitude superior, de 0° a 180°, é
referente a Este (E); a longitude inferior compreendida entre 0° a -180° é referente a Oeste
(O ou W).
Para fazer a conversão das coordenadas foi editada a função actualizar_GPS( ). Para tal
foi necessário refazer a divisão da resposta $GPRMC numa nova string e posteriormente
efetuar os cálculos. Uma vez que os valores de graus e minutos já estavam corretos, apenas
foi necessário fazer a conversão dos segundos da trama. Na main, apenas foram realizadas
algumas alterações para apresentar as coordenadas no display no formato pretendido. O
código da função actualizar_GPS( ) e o extrato de código referente à main, encontra-se no
Anexo H.
Uma vez que as três portas que têm a capacidade de gerar interrupção estavam ocupadas,
foi necessário fazer uma adaptação. O display estava ligado a uma porta desta natureza e
não necessitava dela para o seu funcionamento. Com isto, as ligações deste dispositivo
foram trocadas para os outros pinos livres do microcontrolador e o pino de interrupção do
RFM69 foi conectado ao anterior pino do display.
O RFID MFRC522 foi o dispositivo que foi adicionado ao layout do PCB, juntamente com
dois leds que permitem fazer a verificação de sucesso ou não da leitura da tag.
56
6. RESULTADOS
Neste capítulo são apresentados os resultados dos dispositivos que foram programados e
das alterações que foram realizadas ao nível de hardware e do GPS.
57
Na breadboard da Figura 47, é possível visualizar no display os valores de dois sensores
de temperatura da família DS18B20 que estão ambos ligados ao mesmo barramento.
6.2.1. ACELERÓMETRO
O acelerómetro foi inicialmente testado num carro na rua e através do envio de dados para
o computador, foram registados vários valores práticos obtidos. Através deles foi realizado
o controlo do dispositivo, assumindo assim que a partir de ±3º, o carro já se encontra a
descer ou a subir numa estrada dependendo do sinal que apresenta. Se estiver no intervalo
destes valores, ele encontra-se numa situação plana.
58
Figura 48 Simulação de um carro numa estrada plana.
6.2.2. GIROSCÓPIO
Os valores de giroscópio também foram adquiridos através de testes realizados num carro e
com o auxílio do computador que os estava a receber. Assim, os valores considerados
limite para o condutor executar uma curva com segurança foi de 64 º/s. Quando o condutor
executa uma curva e excede estes valores, é gerada uma mensagem de perigo.
59
Na Figura 51 está representada uma simulação de uma curva realizada com perigo à
esquerda. Após esta infração executada pelo condutor, é gerada uma mensagem de aviso.
Uma simulação de uma curva à direita realizada com uma velocidade excessiva está
representada na Figura 52.
60
“Acesso Negado” e um led que pisca para alertar o sucedido; no caso do segundo
identificador, se este for passado pelo leitor, ele é reconhecido e gera automaticamente
uma mensagem de “Acesso Autorizado” seguido do nome do condutor e, simultaneamente,
surge um led verde que acende durante um intervalo de tempo.
61
6.2.4. ALTERAÇÕES NO GPS
Neste subcapítulo é mostrado o resultado das alterações realizadas no modo como surgem
as coordenas de GPS no display. As coordenadas são geradas no display no formato DMS,
que facilmente é entendido por todos, pois é o mais utilizado.
Na Figura 55 está apresentada uma mensagem que é gerada no display que apresenta as
horas, a velocidade e as coordenadas em formato DMS.
De forma a comprovar os valores que estão aqui inseridos, a Figura 56 mostra o formato
das coordenadas em graus decimais que tinha aqui antes representado e a respetiva
conversão no formato DMS.
62
6.2.5. ALTERAÇÕES NO PCB
𝑅2
𝑉𝑜𝑢𝑡 = × 𝑉𝑖𝑛
𝑅2 + 𝑅1
18
𝑉𝑜𝑢𝑡 = × 5 = 3,21 𝑉
18 + 10
63
A Figura 58 a seguir apresentada, representa o esquemático do RFID MFRC522 e as suas
ligações aos outros dispositivos. Através da figura podemos visualizar o divisor de tensão
utilizado no pino de SS do RFID e do módulo de radiofrequência.
64
Figura 59 Layout do PCB.
65
66
7. CONCLUSÕES
67
Como objetivado no início, neste sistema foram realizadas as alterações ao nível do PCB e
das coordenadas do GPS. Com sucesso, foi realizado também o controlo do giroscópio, do
acelerómetro e do RFID. Estes três módulos a trabalhar em conjunto, permitem detetar
quando um veículo executa uma viragem brusca ou quando sofre um choque violento,
assim como, a identificação do condutor que executa as respetivas manobras. O dispositivo
RFM69HW foi o único dispositivo que não foi realizado o seu controlo com sucesso, como
já referido anteriormente.
Para trabalho futuro, pode ser realizado o controlo do módulo RFM69HW que permite
fazer o envio de dados por radiofrequência para uma central. Posteriormente e para
completar esta sugestão, pode ser feito uma página web onde podem ser visualizados todos
os dados recolhidos por radiofrequência.
68
Referências
[1] “Amazon.com: BAFX Products 34t5 Bluetooth OBDII Scan Tool for Android
Devices: Automotive.” [Online]. Available: https://www.amazon.com/BAFX-
Products-34t5-Bluetooth-
Android/dp/B005NLQAHS/ref=as_li_ss_tl?ie=UTF8&linkCode=sl1&tag=mercmed
i00-20&linkId=4850eba23bc9f4dd629806b7f28b69e3. [Accessed: 12-Oct-2017].
[8] A. Neto, “Antonio josé steidle neto avaliação do sistema 1-wire,” Universidade
Federal de Viçosa, 2003.
[9] Maxim Integrated, “Datasheet DS18B20,” Maxim Integrated, vol. 92, p. 20, 2015.
69
[12] R. Silva and H. R. Anjos, “Protocolo Serial Peripheral Interface Descrição do
processo e aplicações para Arduino.”
70
[23] V. M. Almeida, “Sensores Inerciais - Laboratório iMobilis.” [Online]. Available:
http://www.decom.ufop.br/imobilis/sensores-inerciais/. [Accessed: 08-Oct-2017].
[24] F. O. Paula, “Sensores IMU – uma abordagem completa - Parte 1,” February 22,
2015. [Online]. Available: http://www.decom.ufop.br/imobilis/sensores-imu-uma-
abordagem-completa-parte-1/. [Accessed: 08-Oct-2017].
[31] Maxim Integrated, “Datasheet DS18B20,” Maxim Integr., vol. 92, p. 20, 2015.
[32] “Waterproof Digital Thermal Probe or Sensor DS18B20 Length 1M New | eBay.”
[Online]. Available: http://www.ebay.com/itm/1M-Waterproof-Digital-Thermal-
Probe-Temperature-Sensor-DS18B20-Arduino-Sensor-/190738017226. [Accessed:
14-Oct-2017].
[33] “Buy 9-Axis Gyro + Accelerator + Magnetometer Sensor Module MPU-9250 online
in India | Fab.to.Lab.” [Online]. Available: https://www.fabtolab.com/9-axis-gyro-
accelerometer-magnetometer-mpu9250. [Accessed: 14-Oct-2017].
71
[34] “RFM69HW ISM TRANSCEIVER MODULE V1.3 GENERAL DESCRIPTION.”
[35] “10 PCS VK18U7 Ublox G mouse Chip GPS módulo sem fio pequeno de alto
desempenho preço de fábrica atacado / OEM / Dropshipping em Acessórios GPS de
Automóveis & Motos no AliExpress.com | Alibaba Group.” [Online].
Available: https://pt.aliexpress.com/item/10PCS-VK18U7-Ublox-G-mouse-Chip-
GPS-Wireless-Module-with-Small-Size-of-High-Performance-
FACTORY/32495363681.html?trace=msiteDetail2pcDetail. [Accessed: 15-Oct-
2017].
[36] A. Mehaffey, Joe; Yeazel Jack; Penrod, Sam; Deiss, “NMEA data,” GPS
infromation. [Online]. Available: http://www.gpsinformation.org/dale/nmea.htm.
[Accessed: 15-Oct-2017].
[37] “LCD Display Serial Graphic Display 128x64 ST7920,White on Blue.” [Online].
Available: http://www.buydisplay.com/default/lcd-display-serial-graphic-display-
128x64-st7920-white-on-blue. [Accessed: 16-Oct-2017].
[38] K. Dimitrov, “DS18B20 (digital temperature sensor) and Arduino - Arduino Project
Hub,” 2016. [Online]. Available:
https://create.arduino.cc/projecthub/TheGadgetBoy/ds18b20-digital-temperature-
sensor-and-arduino-9cc806. [Accessed: 16-Nov-2017].
72
Anexo A. Termo de Confidencialidade
73
74
Anexo B. Biblioteca OneWire
/********************************************************
**Name: Onewire_reset_search
**Function: Faz a segunda busca ao barramento
**Input: nada
**Output: nada
********************************************************/
void Onewire_reset_search() {
LastDiscrepancy = 0;
flags1wire.LastDevice = 0;
LastFamilyDiscrepancy = 0;
for(int i = 7; ; i--) {
ROM_NO[i] = 0;//Limpar o vetor de endereço
if ( i == 0) break;
}
}
/********************************************************
**Name: Onewire_select
**Function: Seleciona o dispositivo OneWire com que
pretende comunicar
**Input: endereço
**Output: nada
********************************************************/
void Onewire_select(const uint8_t rom[8]){
// Envia por parametron o endereço ROM
uint8_t i;
Onewire_Writebyte(MATCHROM);// Comando ROM de
escolher ROM
for (i = 0; i < 8; i++) Onewire_Writebyte(rom[i]);
// Escolha da ROM
}
/********************************************************
**Name:Onewire_search
**Function:Efetua uma busca no BUS 1-Wire pordispositivos
**Input: endereço
*Output: 0 = sem dispositivos, 1 = há dispositivo e
endereço no buffer
********************************************************/
uint8_t Onewire_search(uint8_t *newAddr) {
uint8_t id_bit_number;
uint8_t last_zero, rom_byte_number;
unsigned char rom_byte_mask, search_direction;
// iniciar a procura
id_bit_number = 1;
last_zero = 0;
rom_byte_number = 0;
75
rom_byte_mask = 1;
flags1wire.search_result = 0;
// if the last call was not the last one
if (!flags1wire.LastDevice) {// 1-Wire reset
if (Onewire_Reset()){//reset the search
sprintf(PC_buffer,"xxx\r\n")//Mostrar PC
send_PC();
LastDiscrepancy = 0;
flags1wire.LastDevice = 0;
LastFamilyDiscrepancy = 0;
return 0;
}
Onewire_Writebyte(BUSCNOR);//Busca normal
// loop to do the search
do{ // read a bit and its complement
flags1wire.id_bit=Onewire_Readbit();
flags1wire.cmp_id_bit=Onewire_Readbit();
// check for no devices on 1-wire
if ((flags1wire.id_bit == 1) &&
(flags1wire.cmp_id_bit == 1)){
sprintf(PC_buffer, "ola\r\n");
send_PC();
break;
}else{
// all devices coupled have 0 or 1
if (flags1wire.id_bit !=
flags1wire.cmp_id_bit)
search_direction =flags1wire.id_bit;
// bit write value for search
else{// if this discrepancy if before the
Last Discrepancy
// on a previous next then pick the same as last time
if (id_bit_number < LastDiscrepancy)
search_direction = ((ROM_NO[rom_byte_number] &
rom_byte_mask) > 0);
else
// if equal to last pick 1, if not then pick 0
search_direction = (id_bit_number ==
LastDiscrepancy);
// if 0 was picked then record its position in LastZero
if (search_direction == 0){
last_zero = id_bit_number;
// check for Last discrepancy in family
if (last_zero < 9)
LastFamilyDiscrepancy =
last_zero;
}
}
// set or clear the bit in the ROM byte rom_byte_number
// with mask rom_byte_mask
if (search_direction == 1)
ROM_NO[rom_byte_number] |= rom_byte_mask;
else
ROM_NO[rom_byte_number] &= ~rom_byte_mask;
// serial number search direction write bit
Onewire_Writebit(search_direction);
76
// increment the byte counter id_bit_number
// and shift the mask rom_byte_mask
id_bit_number++;
rom_byte_mask <<= 1;
// if the mask is 0 then go to new SerialNum byte
rom_byte_number and reset mask
if (rom_byte_mask == 0){
rom_byte_number++;
rom_byte_mask = 1;
}
}
}
while(rom_byte_number < 8);
// loop until through all ROM bytes 0-7
// if the search was successful then
if (!(id_bit_number < 65)){
// search successful so set LastDiscrepancy,
flags1wire.LastDevice, flags1wire.search_result
LastDiscrepancy = last_zero;
// check for last device
if (LastDiscrepancy == 0)
flags1wire.LastDevice = 1;//1=TRUE
flags1wire.search_result=1;//1=TRUE
}
}
77
78
Anexo C. Extrato de código da main que permite obter
valores de temperatura de vários sensores DS18B20.
if (!Onewire_search(addr)){
sprintf(PC_buffer, "No more addresses.\r\n\n");
//Mostrar no PC
send_PC();
Onewire_reset_search();
addr[0] = 0x00; //para evitar leitura com erro
}
if(addr[0]==0x28){
uint8_t temperatura_h;
uint8_t temperatura_l;
float valor = 0;
Onewire_Reset(); // reset
Onewire_select(addr);
Onewire_Writebyte(CONVER); //começar uma converção
de temperatura
while(!Onewire_Readbit()); // esperar pelo fim da
conversão
Onewire_Reset(); // reset
Onewire_select(addr);
Onewire_Writebyte(LERRAM);//comando para lêr
scratchpad
temperatura_l = Onewire_Readbyte();//Ler só os 2
primeiros bytes
temperatura_h = Onewire_Readbyte();
valor = ( ( temperatura_h << 8 ) + temperatura_l );
dtostrf(valor * 0.0625, 4, 1, numero);
//Fazer uma leitura da temperatura e converter em string
sprintf(PC_buffer,"Temperatura=%s\r\n",numero);
//Mostrar no PC
send_PC();
if (myflags.lcd_on==1){// LCD está ON?
lcd_set_cursor(0,0);
lcd_send_str("Temp1 = ");
lcd_send_str(numero); //Mostrar no LCD
lcd_send_str("'C");
lcd_set_cursor(1,0);
lcd_send_str("Temp2 = ");
lcd_send_str(numero); //Mostrar no LCD
lcd_send_str("'C");
}
}
79
80
Anexo D. Biblioteca I2C.
/*****************************************************
Condição de inicio de comunicação iniciada pelo
dispositivo mestre
returna 0 = no caso do dispositivo estar disponível, 1 =
Caso haja falha na deteção do dispositivo escravo
*******************************************************/
unsigned char i2c_start(unsigned char address){
uint8_t twst;
TWCR= (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); // Start
condition
while(!(TWCR & (1<<TWINT)));
//(acabar START) - ESPERA ATÉ TWINT==0. Quando TWINT ==0,
INICIA O PROXIMO PASSO- TRANMISSÃO DE DADOS
twst= TW_STATUS & 0XF8; // TWI STATUS REGISTER
if((twst != TW_START) && (twst != TW_REP_START))
return 1; // return 1= failed to access device
TWDR=address;
TWCR=(1<<TWINT)|(1<<TWEN);
/***********************************************
Reinicia a condição de inicio de comunicação. Se o
dispositivo escravo estiver ocupado, é utilizado uma
resposta para avisar quando o dispositivo estiver livre
Input: Endereço do dispositivo escravo + direção de
dados
******************************************************/
void i2c_start_wait(unsigned char address){
uint8_t twst;
while (1){
TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
//send START condition
81
twst = TW_STATUS & 0xF8;
//check value of TWI Status Register.Mask prescaler bits.
if((twst != TW_START) && (twst!=TW_REP_START))
continue;
TWDR = address; // send device address
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT)));//wail until
transmission completed
/*******************************************************
Condição repetição de inicio de comunicação
Input: endereço do dispositivo ecravo + direção de dados
Return: 0 = se o dispositivo esta disponivel
1 = se o dispositivo nao esta disponivel
*******************************************************/
unsigned char i2c_rep_start(unsigned char address){
return i2c_start(address);
}
/*******************************************************
Condição de paragem determinada pelo dispositivo mestre
do barramento
*******************************************************/
void i2c_stop(void){
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO);//send stop
condition
while(TWCR & (1<<TWSTO));// wait until stop
condition is executed and bus released
}
/*******************************************************
Envio de um byte no barramento atraves da escrita do
dispositivo mestre
Input: byte que se pretende transmitir
Return: 0 = caso a escrita realizada com sucesso
1 = caso a escrita tenha falhado
*******************************************************/
unsigned char i2c_write(unsigned char data){
uint8_t twst;
82
TWDR = data;// send data to the previously addressed
device
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT)));//wait until
transmission completed
twst = TW_STATUS & 0xF8;//check value of TWI Status
Register. Mask prescaler bits
if(twst != TW_MT_DATA_ACK)
return 1;
return 0;
}
/******************************************************
Leitura de 1byte do barramento
Return: retorna o byte lido do barramento I2C
*******************************************************/
unsigned char i2c_readAck(void){
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA);//TWEAN-ENABLE
ACKNOWLEDGE
while(!(TWCR & (1<<TWINT)));// wait until
transmission completed
return TWDR;
}
/******************************************************
Leitura de um byte do barramento I2C seguido de condução
de stop
Return: byte do barramento I2C
*******************************************************/
unsigned char i2c_readNak(void){
TWCR=(1<<TWINT)|(1<<TWEN);//TWEAN-ENABLE ACKNOWLEDGE
while(!(TWCR & (1<<TWINT))); // wait until
transmission completed
return TWDR;
}
/********************************************************
Faz a leitura de aceleração dos 3 eixos do acelerómetro,
onde cada eixo obtem um numero de 16 bits.
Return: Valores de aceleração dos 3 eixos numa variável
de 8 bits e em m/s^2
********************************************************/
void readAccelxyz(float *ax, float *ay, float *az){
int16_t dadosaccel[6];
i2c_start_wait(MPU9250_ADDR + I2C_WRITE);
i2c_write(MPU9250_ACCEL_XOUT_H);
i2c_rep_start(MPU9250_ADDR + I2C_READ);
dadosaccel[0] = i2c_readAck();
dadosaccel[1] = i2c_readAck();
dadosaccel[2] = i2c_readAck();
dadosaccel[3] = i2c_readAck();
dadosaccel[4] = i2c_readAck();
dadosaccel[5] = i2c_readNak();
i2c_stop();
83
axc = ((int16_t)dadosaccel[0] << 8) | dadosaccel[1];
ayc = ((int16_t)dadosaccel[2] << 8) | dadosaccel[3];
azc = ((int16_t)dadosaccel[4] << 8) | dadosaccel[5];
/*******************************************************
Faz a leitura dos valores de giroscópio dos 3 eixos do
MPU9250, onde cada
Eixo obtem um numero de 16 bits.
Return: Valores de GIROSCOPIO dos 3 eixos numa variável
de 8 bits e em º/s
*******************************************************/
void readGyroxyz(float *gx, float *gy, float *gz){
int16_t dadosgyro[6];
i2c_start_wait(MPU9250_ADDR + I2C_WRITE);
i2c_write(MPU9250_GYRO_XOUT_H);
i2c_rep_start(MPU9250_ADDR + I2C_READ);
dadosgyro[0]=i2c_readAck();
dadosgyro[1]=i2c_readAck();
dadosgyro[2]=i2c_readAck();
dadosgyro[3]=i2c_readAck();
dadosgyro[4]=i2c_readAck();
dadosgyro[5]=i2c_readNak();
i2c_stop();
84
Anexo E. Extrato de código main referente ao
Acelerómetro e Giroscópio.
/********************************************************
Inicio da configuração executada pelo dispositivo mestre
para identificação do
Dispositivo escravo
Caso a função i2c_rep_start retornar 0 = sucesso, 1 =
insucesso
********************************************************/
ret0 = i2c_rep_start(MPU9250_ADDR+I2C_WRITE);// set
device address and write mode
if(ret0){ // failed to issue start condition,
possibly no device found
i2c_stop();
sprintf(PC_buffer,"Falhou o endereco %d\r\n\n",
MPU9250_ADDR);
send_PC();
}
else{
i2c_write(0x6B); // write address = 5
i2c_write(0); // write value 0x75 to EEPROM
i2c_stop();// set stop conditon = release bus
}
85
/* **************** inclinação *********************** */
float raiz;
float raiz1;
raiz=sqrt(ay*ay + az*az);
inclinacao=atan2(ax,raiz)*valorteste;
dtostrf(inclinacao, 4,2,valinclinacao);
sprintf(PC_buffer,"Valor da Inclinacao=%s\r\n",
tudo6);
send_PC();
if(inclinacao > 3){
sprintf(PC_buffer,"inclinacao=%s
subir\r\n",valinclinacao);
send_PC();
}
if((inclinacao >= -3) & (inclinacao <= 3)){
sprintf(PC_buffer, "inclinacao=%s - plano
\r\n", valinclinacao);
send_PC();
}
if(inclinacao < -3){
sprintf(PC_buffer, "inclinacao=%s - descer
\r\n", valinclinacao);
send_PC();
}
/* ************* EXCESSO DE VIBRAÇÃO **************** */
float modulo;
modulo = sqrt(ax*ax + ay*ay + az*az);
dtostrf(modulo, 4,2,moduloeixos);
86
// if (rotacao > 5){
// sprintf(PC_buffer, "rotacao = %s -
direita\r\n", tudo7);
// send_PC();
// }
// if((rotacao > -5) & (rotacao < 5)){
// sprintf(PC_buffer, "rotacao = %s - frente\r\n",
tudo7);
// send_PC();
// }
87
88
Anexo F. Protocolo SPI e código rfid.c referente ao
dispositivo RFID.
/********************************************************
Configuração da biblioteca SPI
Definição de entradas e saídas e polaridades e etc
********************************************************/
void spi_init(){
SPI_DDR |= (1<<SPI_MOSI) | (1<<SPI_SCK) |
(1<<SPI_SS); //set mosi sck ss output, and others input
SPCR0 |= (1<<SPE0) | (1<<MSTR0) | (1<<SPR00);
}
/********************************************************
Função da protocolo SPI que permite o mestre fazer a
escrita no barramento
INPUT : Informaçao pronta a ser enviada
********************************************************/
uint8_t spi_transmit(uint8_t data){
SPDR0 = data;
while (! (SPSR0 & (1<<SPIF0) ) );
return SPDR0;
}
/********************************************************
Função da protocolo SPI que permite o mestre fazer a
escrita no barramento
INPUT : Informaçao pronta a ser enviada
********************************************************/
void mfrc522_write(uint8_t reg, uint8_t data){
ENABLE_CHIP();
spi_transmit((reg<<1) & 0x7E);
spi_transmit(data);
DISABLE_CHIP();
}
/********************************************************
Função de reset do dispositivo rfid
********************************************************/
void mfrc522_reset(){
mfrc522_write(CommandReg, SoftReset_CMD);
}
/********************************************************
Função de leitura de dados do dispositivo RFID
********************************************************/
uint8_t mfrc522_read(uint8_t reg){
uint8_t data;
ENABLE_CHIP();
spi_transmit(((reg<<1) & 0x7E) | 0x80);
89
data = spi_transmit(0x00);
DISABLE_CHIP();
return data;
}
/********************************************************
Função de configuração do dispositivo RFID
********************************************************/
void mfrc522_init(){
uint8_t byte;
mfrc522_reset();
mfrc522_write(TModeReg, 0x8D);
mfrc522_write(TPrescalerReg, 0x3E);
mfrc522_write(TReloadReg_1, 30);
mfrc522_write(TReloadReg_2, 0);
mfrc522_write(TxASKReg, 0x40);
mfrc522_write(ModeReg, 0x3D);
byte = mfrc522_read(TxControlReg);
if(! (byte & 0x03) ){
mfrc522_write(TxControlReg, byte | 0x03);
}
}
/********************************************************
Função de leitura de dados do dispositivo RFID
********************************************************/
uint8_t mfrc522_to_card(uint8_t cmd, uint8_t *send_data,
uint8_t send_data_len, uint8_t *back_data, uint32_t
*back_data_len){
uint8_t status = ERROR;
uint8_t irqEn = 0x00;
uint8_t waitIRq = 0x00;
uint8_t lastBits;
uint8_t n;
uint8_t tmp;
uint32_t i;
switch (cmd){
case MFAuthent_CMD:
{ irqEn = 0x12;
waitIRq = 0x10;
break;
}
case Transceive_CMD:
{ irqEn = 0x77;
waitIRq = 0x30;
break;
}
default:
break;
}
n=mfrc522_read(ComIrqReg);
mfrc522_write(ComIrqReg, n&(~0x80) );
n=mfrc522_read(FIFOLevelReg);
90
mfrc522_write(FIFOLevelReg, n|0x80);
mfrc522_write(CommandReg, Idle_CMD);
mfrc522_write(CommandReg, cmd);
if (cmd == Transceive_CMD){
n=mfrc522_read(BitFramingReg);
mfrc522_write(BitFramingReg, n|0x80);
}
i=2000;
do{
n=mfrc522_read(ComIrqReg);
i--;
}
tmp=mfrc522_read(BitFramingReg);
mfrc522_write(BitFramingReg, tmp&(~0x80));
if(i!= 0){
if (! (mfrc522_read(ErrorReg) & 0x1B)){
status = CARD_FOUND;
if(n & irqEn & 0x01){
status = CARD_NOT_FOUND;
}
if (cmd == Transceive_CMD){
n = mfrc522_read(FIFOLevelReg);
lastBits = mfrc522_read(ControlReg)
& 0x07;
if(lastBits){
*back_data_len = (n-1)*8 +
lastBits;
}
else{
*back_data_len = n*8;
}
if (n==0){
n=1;
}
if (n>MAX_LEN){
n=MAX_LEN;
}
for (i=0; i<n; i++){
back_data[i] =
mfrc522_read(FIFODataReg);
}
}
}
else{
status = ERROR;
91
}
}
return status;
}
/********************************************************
Função que espera pela presença da tag no sensor RFID
********************************************************/
uint8_t mfrc522_request(uint8_t req_mode, uint8_t
*tag_type){
uint8_t status;
uint32_t backBits;
mfrc522_write(BitFramingReg, 0x07);
tag_type[0] = req_mode;
status = mfrc522_to_card(Transceive_CMD, tag_type,
1, tag_type, &backBits);
/********************************************************
Função que faz a leitura da tag que passou pelo sensor
RFID
********************************************************/
uint8_t mfrc522_get_card_serial(uint8_t * serial_out){
uint8_t status;
uint8_t i;
uint8_t serNumCheck = 0;
uint32_t unLen;
mfrc522_write(BitFramingReg, 0x00);
serial_out[0] = PICC_ANTICOLL;
serial_out[1] = 0x20;
status = mfrc522_to_card(Transceive_CMD,
serial_out,2, serial_out, &unLen);
if (status == CARD_FOUND){
for(i=0; i<4; i++){
serNumCheck ^= serial_out[i];
}
if (serNumCheck != serial_out[i]){
status = ERROR;
}
}
return status;
}
/********************************************************
Função que faz o led verde piscar em caso de sucesso de
leitura
92
********************************************************/
void ledverde(){
DDRC = (1<<PORTC6);
PORTC = (1<<PORTC6);
_delay_ms(3000);
PORTC = (0<<PORTC6);
}
/********************************************************
Função que faz o led vermelho piscar em caso de insucesso
de leitura
********************************************************/
void ledvermelho(){
DDRC = (1<<PORTC7);
PORTC = (1<<PORTC7);
_delay_ms(500);
PORTC = (0<<PORTC7);
_delay_ms(500);
PORTC = (1<<PORTC7);
_delay_ms(500);
PORTC = (0<<PORTC7);
_delay_ms(500);
PORTC = (1<<PORTC7);
_delay_ms(500);
PORTC = (0<<PORTC7);
}
93
94
Anexo G. Extrato de código main referente ao RFID
MFRC522.
spi_init();
mfrc522_init();
/* bytemain = mfrc522_read(VersionReg);
// sprintf(PC_buffer, "UID tag = %X \r\n", bytemain);
// send_PC();
bytemain = mfrc522_read(ComIEnReg);
mfrc522_write(ComIEnReg, bytemain | 0x20);
bytemain = mfrc522_read(DivIEnReg);
mfrc522_write(DivIEnReg, bytemain | 0x80);
*/
bytemain = mfrc522_request(PICC_REQALL, str);
//sprintf(PC_buffer, "%d\r\n", bytemain);
//send_PC();
if (bytemain == 1){
bytemain = mfrc522_get_card_serial(str);
sprintf(PC_buffer, "TAG = ");
send_PC();
for (uint8_t t = 0; t<5; t++){
sprintf(PC_buffer, "%X ", str[t]);
send_PC();
}
sprintf(PC_buffer, "\r\n");
send_PC();
}
switch (str[0]){
case 0xE6:
lcd_clear_all();
ledverde();
lcd_set_cursor(0,0);
lcd_send_str(" Acesso ");
lcd_set_cursor(1,1);
lcd_send_str(" Autorizado ");
lcd_set_cursor(3,0);
lcd_send_str(" Andre Marques");
_delay_ms(2500);
// sprintf(PC_buffer, "Acesso Autorizado - Andre
Marques\r\n");
// send_PC();
break;
case 0xBB:
lcd_clear_all();
ledvermelho();
lcd_set_cursor(1,0);
lcd_send_str(" Acesso Negado");
95
_delay_ms(2500);
// sprintf(PC_buffer, "Acesso Negado\r\n");
// send_PC();
break;
default:
break;
}
96
Anexo H. Extrato de código referente à conversão das
coordenadas do GPS.
/********************************************************
Função que faz a divisão da resposta $GPRMC numa nova
string, dividindo os
Valores em latitude, longitude, orientação, hora, data,
velocidade
********************************************************/
void actualizar_GPS(){
uint8_t n;
//HORAS
hora[0] = GPS_RX_buffer[6];
hora[1] = GPS_RX_buffer[7];
hora[2] = 'h';
hora[3] = GPS_RX_buffer[8];
hora[4] = GPS_RX_buffer[9];
hora[5] = 'm';
hora[6] = GPS_RX_buffer[10];
hora[7] = GPS_RX_buffer[11];
hora[8] = 's';
hora[9] = '\0';
// A Data
data[0] = GPS_RX_buffer[52];
data[1] = GPS_RX_buffer[53];
data[2] = '/';
data[3] = GPS_RX_buffer[54];
data[4] = GPS_RX_buffer[55];
data[5] = '/';
data[6] = '2';
data[7] = '0';
data[8] = GPS_RX_buffer[56];
data[9] = GPS_RX_buffer[57];
data[10] = '\0';
// A latitude e a Longitude
for(n=0;n<10;n++) {
latitude[n] = GPS_RX_buffer[n+18];
longitude[n] = GPS_RX_buffer[n+31];
}
latitude[n] = longitude[n] = ns[1] = ew[1] = '\0';
latitude_G[0] = GPS_RX_buffer[18];
latitude_G[1] = GPS_RX_buffer[19];
latitude_G[2] = '*';
latitude_G[3] = ' ';
latitude_G[4] = '\0';
latitude_M[0] = GPS_RX_buffer[20];
latitude_M[1] = GPS_RX_buffer[21];
//latitude_M[2] = ' ';
97
latitude_M[2] = '\0';
latitude_S[0] = '0';
latitude_S[1] = '.';
latitude_S[2] = GPS_RX_buffer[23];
latitude_S[3] = GPS_RX_buffer[24];
latitude_S[4] = GPS_RX_buffer[25];
latitude_S[5] = GPS_RX_buffer[26];
latitude_S[6] = GPS_RX_buffer[27];
latitude_S[7] = '\0';
longitude_G[0] = GPS_RX_buffer[32];
longitude_G[1] = GPS_RX_buffer[33];
longitude_G[2] = '*';
longitude_G[3] = ' ';
longitude_G[4] = '\0';
longitude_M[0] = GPS_RX_buffer[34];
longitude_M[1] = GPS_RX_buffer[35];
longitude_M[2] = ' ';
longitude_M[3] = '\0';
longitude_S[0] = '0';
longitude_S[1] = '.';
longitude_S[2] = GPS_RX_buffer[37];
longitude_S[3] = GPS_RX_buffer[38];
longitude_S[4] = GPS_RX_buffer[39];
longitude_S[5] = GPS_RX_buffer[40];
longitude_S[6] = '\0';
// A Orientação
ns[0] = GPS_RX_buffer[29];
ew[0] = GPS_RX_buffer[43];
for(n=0;n<5;n++) {
velocidade[n] = GPS_RX_buffer[n+45];
}
// A Velocidade en Nós
velocidade[5] = '\0';
}
/********************************************************
Na main, aparece o seguinte código.
********************************************************/
if (myflags.D_val == 1) { // Os dados são
válidos
/* **************** Data & Hora ********************** */
sprintf(PC_buffer, "Hora %s",hora);//Mostrar no PC
send_PC();
sprintf(PC_buffer,"-Data %s",data);//Mostrar no PC
send_PC();
sprintf(PC_buffer, "\r\n"); //Mostrar no PC
send_PC();
/* ************ Latitude & Longitude ***************** */
sprintf(PC_buffer, "Latitude %s",latitude);//Mostrar
no PC
send_PC();
98
sprintf(PC_buffer, " %s",ns); //Mostrar no PC
send_PC();
sprintf(PC_buffer, " - Longitude %s",longitude);
//Mostrar no PC
send_PC();
sprintf(PC_buffer, " %s",ew); //Mostrar no PC
send_PC();
sprintf(PC_buffer, "\r\n"); //Mostrar no PC
send_PC();
/* ************ Velocidade no solo ******************* */
char velocidadeteste;
velocidadeteste=atoi(velocidade);
velocidadeteste=velocidadeteste*1.85;
sprintf(PC_buffer, "Velocidadeteste
%d\r\n",velocidadeteste);
send_PC();
float coordenadasteste;
coordenadasteste = atof(latitude_S);
coordenadasteste = coordenadasteste*60;
float coordenadaslongitudeteste;
coordenadaslongitudeteste = atof(longitude_S);
coordenadaslongitudeteste =
coordenadaslongitudeteste*60;
lcd_set_cursor(1,0);
char velocidadeGPS[4];
dtostrf(velocidadeteste,4,0,velocidadeGPS);//conv
erter em string
lcd_send_str(velocidadeGPS); //Mostrar no LCD
lcd_send_str(" Km/H "); //Mostrar no LCD
lcd_set_cursor(2,0);
lcd_send_str(latitude_G); //Mostrar no LCD
lcd_send_str(latitude_M); //Mostrar no LCD
char coordenadasGPS[4];
dtostrf(coordenadasteste, 2, 0, coordenadasGPS);
lcd_send_str("' "); //Mostrar no LCD
lcd_send_str(coordenadasGPS); //Mostrar no LCD
lcd_send_str("'' "); //Mostrar no LCD
lcd_send_str(ns); //Mostrar no LCD
lcd_set_cursor(3,0);
lcd_send_str(longitude_G); //Mostrar no LCD
lcd_send_str(longitude_M); //Mostrar no LCD
lcd_send_str("' "); //Mostrar no LCD
char coordenadaslongitudeGPS[4];
99
dtostrf(coordenadaslongitudeteste,2,0,coordenadas
longitudeGPS);
lcd_send_str(coordenadaslongitudeGPS); //Mostrar no
LCD
lcd_send_str("'' "); //Mostrar no LCD
lcd_send_str(ew); //Mostrar no LCD
lcd_send_str(" "); //Mostrar no LCD
}
}else{
sprintf(PC_buffer, "Invalid GPS Data\r\n");
//Mostrar no PC
send_PC();
if (myflags.lcd_on==1){ // LCD está ON?
lcd_set_cursor(0,0);
lcd_send_str("Invalid GPS DATA");//Mostrar no
LCD
lcd_set_cursor(1,0);
lcd_send_str(" ");//Mostrar no
LCD
lcd_set_cursor(2,0);
lcd_send_str(" ");//Mostrar no
LCD
lcd_set_cursor(3,0);
lcd_send_str(" ");//Mostrar no
LCD
}
}
100