You are on page 1of 118

EQUIPAMENTO DE

GEOLOCALIZAÇÃO E
TELEMETRIA DE DADOS EM
AUTOMÓVEL

André Filipe Silva Marques

Departamento de Engenharia Eletrotécnica


Instituto Superior de Engenharia do Porto
2017
Este relatório satisfaz, parcialmente, os requisitos que constam da Ficha de Unidade
Curricular de Projeto/Estágio, do 3º ano, da Licenciatura em Engenharia Eletrotécnica e de
Computadores

Candidato: André Filipe Silva Marques, Nº 1140205, 1140205@isep.ipp.pt


Orientação científica: Anabela Maria Azevedo Oliveira Lopes, amo@isep.ipp.pt

Empresa: Gisgeo Information Systems

Orientador: Ricardo José Vieira Baptista, ricardo.baptista@gisgeo.pt

Departamento de Engenharia Eletrotécnica


Instituto Superior de Engenharia do Porto
21 de novembro de 2017

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:

Em primeiro lugar, manifesto o meu profundo agradecimento ao meu orientador Ricardo


Baptista da Gisgeo Information Systems (Gisgeo), a oportunidade que me concedeu de
realizar o meu projeto sob a sua orientação. Por todas as ideias e sugestões e, em especial,
pela partilha de conhecimentos, ensinamentos e dedicação.

Um agradecimento especial à Engenheira Anabela Oliveira pelo empenho, dedicação e


disponibilidade que sempre demonstrou ao longo da minha carreira académica, não apenas
como orientadora, mas também como professora. Por ter acreditado nas minhas
capacidades e por ter aceitado acompanhar-me neste projeto.

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.

Obrigado por tudo!

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.

Este sistema é uma mais-valia quando instalado em viaturas/máquinas, por exemplo,


dentro de um estaleiro, e utilizando uma rede de comunicação de baixo custo de débito de
dados, reduz significativamente os custos nas comunicações móveis (GSM – do inglês,
Groupe Special Mobile).

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

Telemetry, monitoring, PCB, radio frequency communication, geographical location,


RFID, acceleration, gyroscope.

vii
Índice
AGRADECIMENTOS ............................................................................................................................III

RESUMO .................................................................................................................................................. V

ABSTRACT........................................................................................................................................... VII

ÍNDICE .................................................................................................................................................... IX

ÍNDICE DE FIGURAS ........................................................................................................................... XI

ÍNDICE DE TABELAS ........................................................................................................................ XIII

ACRÓNIMOS ...................................................................................................................................... XIV

1. INTRODUÇÃO ................................................................................................................................. 1

1.1. CONTEXTUALIZAÇÃO E MOTIVAÇÃO ............................................................................................ 1


1.2. OBJETIVOS .................................................................................................................................. 2
1.3. CALENDARIZAÇÃO ...................................................................................................................... 3
1.4. ORGANIZAÇÃO DO RELATÓRIO ..................................................................................................... 4

2. ESTADO DA ARTE.......................................................................................................................... 5

2.1. SISTEMA IMPLEMENTADO NOS BOMBEIROS VOLUNTÁRIOS DE OVAR ............................................. 6

3. FUNDAMENTO TEÓRICO........................................................................................................... 11

3.1. MICROCONTROLADORES ............................................................................................................ 11


3.2. PROTOCOLOS DE COMUNICAÇÃO ................................................................................................ 12
3.3. SISTEMA DE POSICIONAMENTO GLOBAL ..................................................................................... 24
3.4. RADIOFREQUÊNCIA ................................................................................................................... 25
3.5. ACELERÓMETRO ........................................................................................................................ 29
3.6. GIROSCÓPIO .............................................................................................................................. 32
3.7. IDENTIFICAÇÃO POR RADIOFREQUÊNCIA .................................................................................... 32
3.8. PLACAS DE CIRCUITO IMPRESSO ................................................................................................ 34

4. HARDWARE .................................................................................................................................. 35

4.1. MATERIAIS................................................................................................................................ 35
4.2. ARQUITETURA ........................................................................................................................... 45

5. SOFTWARE ................................................................................................................................... 47

5.1. BIBLIOTECA ONEWIRE .............................................................................................................. 47


5.2. CONTROLO DO MPU9250 .......................................................................................................... 49
5.3. CONTROLO DO RFID MFRC522 ................................................................................................ 53
5.4. ALTERAÇÕES NO GPS ................................................................................................................ 55
5.5. ALTERAÇÕES NO PCB ............................................................................................................... 56

ix
6. RESULTADOS................................................................................................................................ 57

6.1. BIBLIOTECA ONEWIRE............................................................................................................... 57


6.2. CONTROLO DO MPU9250 .......................................................................................................... 58

7. CONCLUSÕES ............................................................................................................................... 67

REFERÊNCIAS....................................................................................................................................... 69

ANEXO A. TERMO DE CONFIDENCIALIDADE ............................................................................... 73

ANEXO B. BIBLIOTECA ONEWIRE ................................................................................................... 75

ANEXO C. EXTRATO DE CÓDIGO DA MAIN QUE PERMITE OBTER VALORES DE


TEMPERATURA DE VÁRIOS SENSORES DS18B20.......................................................................... 79

ANEXO D. BIBLIOTECA I2C. .............................................................................................................. 81

ANEXO E. EXTRATO DE CÓDIGO MAIN REFERENTE AO ACELERÓMETRO E


GIROSCÓPIO. ........................................................................................................................................ 85

ANEXO F. PROTOCOLO SPI E CÓDIGO RFID.C REFERENTE AO DISPOSITIVO RFID. .......... 89

ANEXO G. EXTRATO DE CÓDIGO MAIN REFERENTE AO RFID MFRC522. .............................. 95

ANEXO H. EXTRATO DE CÓDIGO REFERENTE À CONVERSÃO DAS COORDENADAS DO


GPS. ......................................................................................................................................................... 97

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

CPHA – Clock Phase

CPOL – Clock Polarity

CPU – Central Processing Unit

DD – Graus decimais

DMS – Graus Minutos e Segundos

EEPROM – Electrically Erasable Programable Read Only Memory

Gisgeo – Gisgeo Information System

GND – Ground (terra/massa)

GSM – Groupe Special Mobile

GPS – Global Positioning System

LDO – Low Dropout

MISO – Master Input Slave Output

MOSI – Master Output Slave Input

MPU – Microprocessing Unit

NACK – Not Acknowledge

PCB – Printed Circuit Board

PWM – Pulse Width Modulation

xiv
RAM – Random Access Memory

RFID – Radio Frequency Identification

ROM – Read On Memory

SCL – Serial Clock Line

SCLK – Serial Clock

SDA – Serial Data Line

SPI – Serial Peripheral Interface

SS – Select Slave

UART – Universal Synchronous Asynchronous Receiver Transmitter

UBRR – USART Baud Rate Register

UCSRnA – USART Control and States Register A

USART – Universal Synchronous and Asynchronous Serial Receiver Transmitter

U2Xn – Velocidade de transmissão dupla

VCC – Tensão corrente continua

xv
1. INTRODUÇÃO

1.1. CONTEXTUALIZAÇÃO E MOTIVAÇÃO


Nos últimos anos temos assistido a uma espécie de “revolução tecnológica” de crescimento
exponencial. Hoje conhecemos o Universo, conseguimos viajar entre países, fazer troca de
informação entre países de forma instantânea e isto só é possível com o contributo do ser
humano. O avanço da tecnologia contribuiu de forma positiva em diferentes áreas, como
por exemplo, no comércio – agora é possível abrir uma empresa num país diferente e fazer
o controlo de forma instantânea à distância; e na indústria – o grau de automatização
origina um aumento de produção e diminui a mão de obra e o custo do produto. Podemos
afirmar que praticamente cada dispositivo que encontramos na indústria, no hospital ou no
supermercado, possui um circuito integrado. Através deste tipo de tecnologia, temos acesso
a um número diversificado de funções e de dados que são passíveis de serem analisados.

No mundo automóvel, o avanço tecnológico é bem percetível se considerarmos a


complexidade do veículo e o número de funções que executam. Com o aumento da
complexidade, o número de anomalias que surgem é mais elevado. De forma a precaver
esta situação, torna-se necessário o uso de circuitos integrados para permitir aos
utilizadores acederem e recolherem um conjunto de dados importantes para o controlo da
viatura.

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:

• GeoCar – solução de localização em tempo real de viaturas;


• GeoDecide – apoio no planeamento estratégico das organizações de forma a
poupar os custos e otimizar os recursos;
• GeoIndoor – permite fazer o controlo de maquinas com fonte elétrica; entre outras
soluções desenvolvidas.

Na Figura 1 está representado o logotipo da empresa Gisgeo.

Figura 1 Logotipo da empresa Gisgeo Information Systems.

Com este projeto, pretende-se desenhar um sistema autónomo capaz de fazer a


geolocalização dos veículos e, simultaneamente, a telemetria de dados. Para tal, utilizou-se
um conjunto de sensores específicos que permitissem recolher a informação mais
relevante. Posteriormente, e uma vez que é bastante mais vantajoso controlar remotamente
o veículo, utilizou-se um sistema de radiofrequência a operar a uma frequência de
868 MHz para enviar estes dados para uma central, num raio de 1 km.

1.2. OBJETIVOS

O objetivo deste projeto é a criação de um sistema capaz de fazer a monitorização e


recolha de dados de telemetria de todos os veículos dentro de um local fechado de uma
empresa. Na telemetria veicular são estudados dados referentes à temperatura, aceleração,
velocidade e inclinação. A monitorização do veículo é realizada através da recolha dos
dados de localização geográfica que é posteriormente enviada para uma central através da
comunicação por radiofrequência.

Dada a dimensão deste projeto e a infinidade de sensores/módulos que podemos incluir de


forma a torná-lo mais completo, este teve uma fase inicial no 2º semestre do 3º ano, na

2
unidade curricular de Laboratório de Sistemas na Licenciatura de Engenharia Eletrotécnica
e de Computadores.

Nessa primeira fase conseguiu-se:

• programar um sensor de temperatura;


• controlar um módulo de sistema de posicionamento global (GPS, deriva do inglês,
Global Positioning System);
• programar um display;
• realizar o PCB.

O protocolo OneWire utilizado para controlar o sensor de temperatura, foi desenvolvido


apenas para ler um sensor de temperatura. O protocolo que permite fazer a comunicação
entre o microcontrolador e o display utilizado neste projeto já tinha sido previamente
desenvolvido.

Numa segunda fase os objetivos passaram por:

• Controlo de um acelerómetro de 3 eixos;


• Controlo de um giroscópio de 3 eixos;
• Correção do resultado obtido nas coordenadas do GPS;
• Alteração no controlo do display;
• Adaptação à biblioteca OneWire;
• Controlo de um módulo de identificação por radiofrequência (RFID, do inglês:
Radio Frequency Identification);
• Controlo de um módulo de radiofrequência.

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

1.4. ORGANIZAÇÃO DO RELATÓRIO


Este relatório encontra-se dividido em 7 capítulos. O capítulo 1 é referente à introdução
onde são apresentados os principais objetivos e motivações para a realização do projeto.
No capítulo 2 é apresentado o estado da arte do projeto. No terceiro capítulo são explicados
os conceitos básicos essenciais para a compreensão do projeto. No capítulo 4 são
apresentados os materiais para a realização do projeto com uma descrição pormenorizada
dos sensores e módulos. O capítulo 5 é referente ao software, onde são explicadas as
formas utilizadas para programar os dispositivos. No capítulo 6 apresentam-se os
resultados obtidos nas várias validações que foram realizadas. Por fim, no capítulo 7, são
referidas as principais conclusões e futuros desenvolvimentos que o projeto poderá
enveredar.

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].

2.1. SISTEMA IMPLEMENTADO NOS BOMBEIROS VOLUNTÁRIOS DE OVAR


A corporação da Associação dos Bombeiros Voluntários de Ovar possui um sistema de
monitorização e telemetria dos seus veículos. O sistema foi desenvolvido pela empresa
Cartrack e foi implementado em 2013 nos veículos de transporte de doentes.

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.

Figura 3 Leitor de RFID instalado automóvel dos Bombeiros.

Na plataforma online desenvolvida pela empresa Cartrack, o operacional responsável pela


gestão das frotas tem acesso à localização instantânea de todos os veículos e de todos os
condutores que os estão a conduzir. Na Figura 4 é apresentado o layout da plataforma
online. No canto superior esquerdo da figura estão detalhadas as matrículas de todos os
veículos e à frente de cada uma delas existe um símbolo que, consoante a cor apresentada,
permite dar um feedback da condução que determinado condutor efetuou. Na barra inferior
estão detalhados os dados dos veículos assim como os nomes dos condutores. Por motivos
de confidencialidade, foram escondidos os dados referentes aos condutores e às matrículas
dos veículos nas próximas imagens, conforme assinado no termo de confidencialidade
desenvolvido e que se encontra no Anexo A.

7
Figura 4 Recortes do layout da plataforma online dos Bombeiros Voluntários de Ovar.

Através de relatórios gerados pela plataforma, o gestor tem a capacidade de saber o


percurso efetuado pelos condutores dos veículos, assim como quantas horas esteve parado
com o carro a trabalhar entre outros dados. Outros fatores que são também possíveis de
serem estudados são as regras que os condutores transgridem ao ultrapassar os limites de
velocidade estipulados ou a velocidade com que efetuam uma curva. Com este sistema, se
houver um choque violento no veículo é gerado um alerta e o gestor será avisado
imediatamente.

Na Figura 5, está representado um recorte do layout da plataforma online que demonstra


um caso prático de uma infração praticada pelo condutor ao exceder os limites de
velocidade estipulados naquele local da autoestrada. Automaticamente é gerado um alerta
com a sinalização de vermelho no relatório do percurso efetuado por aquele condutor. No
lado direito da figura é demonstrado com detalhe as informações da infração e os valores
de temperatura do veículo, o nível de combustível, em que posição estava colocado o pedal
do acelerador, as coordenadas, entre outros. Na parte inferior da figura, é revelado o
relatório do percurso e, simultaneamente, as infrações realizadas.

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.

Os microcontroladores podem variar pela quantidade de memória RAM e EEPROM


disponível, pelo número de bits do barramento (8, 16 ou 32 bits), número e funcionalidades
das portas de entrada e saída que possui.

A memória RAM e EEPROM são ambas memórias de dados. No entanto, a primeira


armazena os dados que são recolhidos enquanto o microcontrolador se encontra em
funcionamento e a segunda tem a capacidade de armazenar dados (por exemplo, as
configurações), enquanto este está desligado.

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 microcontrolador é facilmente programável através do protocolo de comunicação serial


e utilizando um ambiente de software compatível com o tipo de dispositivo utilizado.

3.2. PROTOCOLOS DE COMUNICAÇÃO


Os protocolos de comunicação surgem para facilitar a comunicação entre os diversos
dispositivos existentes nos dias de hoje. Estes foram sendo desenvolvidos de forma a
responder às necessidades e aos objetivos de cada pessoa. Podemos ter diferentes modos de
comunicações: síncronas, assíncronas, simplex, half-duplex, full-duplex, utilizando
tecnologia sem fio, entre outros [5].

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.

3.2.1. PROTOCOLO SÉRIE

O protocolo série permite fazer a comunicação entre, por exemplo, os microcontroladores e


os computadores. Pode ser aplicado em inúmeras aplicações na transmissão de dados. A
topologia de comunicação mais vulgarmente utilizada é a USART. Esta é um tipo de
comunicação full-duplex (utiliza linhas diferentes na troca de dados), bidirecional e com
uma grande diversidade de configurações de trabalho, como por exemplo, nas
comunicações RS232.

Este protocolo utiliza dois modos de transmissão: síncrono e assíncrono. Na comunicação


síncrona, os bits são transmitidos consoante um sinal de clock gerado pelo mestre do
barramento. A comunicação assíncrona é realizada sem qualquer tipo de sinal clock e não
se sabe quando a trama de dados aparecerá no barramento. A taxa de transmissão (em
inglês, baud rate) é o número de bits transmitidos por segundo, que ambos os dispositivos
(mestre e escravo) têm de conhecer para fazer a troca de informação. No caso da
configuração da USART (mais vulgarmente utilizada), esta taxa é configurada usando o
registo UBBR (USART Baud Rate Register). A troca de dados pode ser usada para
qualquer taxa de transmissão de saída, por exemplo, 9600 bps, 19200 bps, 38400 bps,
57600 bps e 115200 bps. Na Tabela 2 estão descritas as fórmulas para calcular a taxa de
transmissão e o número correspondente para colocar no registo UBRR.

13
Tabela 2 Fórmulas para o cálculo da taxa de transmissão [6].

A configuração USART utiliza três modos de operação [7]:

• Normal e assíncrono – Os dados são transmitidos e/ou recebidos sem a presença


de um sinal clock. Trata-se de um modo comunicação assíncrono que transmite os
dados a uma taxa de transmissão definida no registo UBRR.

• Velocidade dupla e assíncrono – é um tipo de comunicação assíncrona, no


entanto, tem o dobro da taxa de transmissão de dados que foi inicialmente
configurada. Para configurar a velocidade é preciso aceder ao registo UCSRnA e
colocar o bit U2Xn a 1 para duplicar o baud rate.

• Mestre síncrono – Este é a única configuração de comunicação síncrona presente


no protocolo. A transmissão de dados é realizada sob a presença de um sinal de
clock para fazer a sincronização.

As mensagens recebidas ou transmitidas são caracterizadas por um conjunto de bits: 5 a 9


bits de dados configuráveis, bits de sincronização (bit de início e fim de transmissão) e,
opcionalmente, por um bit de paridade que é utilizado para verificar a veracidade da
comunicação. Uma mensagem com 9 bits de configuração começa por um bit de início,
seguido pelo bit de dados menos significativo (LSB). Seguem-se os restantes até ao bit
mais significativo - 9º bit (MSB). O bit de paridade, se for escolhido, surge nesta fase antes
do bit de fim de transmissão. Após o bit de fim de transmissão, a comunicação pode
continuar ou o barramento fica em estado de espera por uma nova transmissão. Na Figura 7
está caracterizado o formato da trama de bits [6].

14
Figura 7 Formato da trama de bits utilizado neste protocolo [6].

3.2.2. PROTOCOLO ONEWIRE

O protocolo OneWire foi desenvolvido pela antiga Dallas Semiconductors, posteriormente


adquirida pela Maxim Integrated. Trata-se de uma comunicação serial, bidirecional,
assíncrona e half-duplex que permite a comunicação entre um mestre (computador,
microcontrolador) e vários escravos (dispositivos que utilizam protocolo OneWire) [8].

Existem dois modos de alimentação distintos [8]:

• 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.

Para facilitar a comunicação de vários dispositivos presentes no mesmo barramento


OneWire, existe em cada sensor um código de identificação único que permite fazer a

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.

Figura 8 Estrutura do código de 64 bits dos dispositivos OneWire [9].

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.

Figura 9 Método de escrita no barramento OneWire [6].

A transmissão de dados no barramento OneWire inicia sempre com um pulso reset,


iniciado pelo dispositivo mestre. Trata-se de um pulso de inicialização com a escrita 0 na
linha, durante um intervalo de tempo superior a 480 µs. A seguir, o mestre liberta a linha,
retomando o barramento ao estado anterior (nível lógico 1), através de uma resistência
pull-up externa de 4,7 kΩ. Após este “sinal”, os dispositivos escravos aguardam de 15 µs a
60 µs no estado 1 e depois respondem ao mestre emitindo um pulso de presença com o
estado lógico 0 e por um período de tempo de 60 µs a 240 µs. A Figura 10 representa um
pulso reset no barramento OneWire.

16
Figura 10 Pulso de reset iniciado pelo dispositivo mestre no barramento OneWire [6].

Depois de receber a presença de todos os dispositivos existentes no barramento, o mestre


utiliza comandos de ROM para determinar quantos e que tipos de dispositivos estão
presentes. Para tal, utilizam-se diversos comandos [8]:

• Procura de ROM (Search ROM) [0xF0] – permite ao dispositivo mestre


identificar os códigos de identificação de 64 bits de todos os dispositivos OneWire
que estão no barramento. Através do número de identificação que recolhe consegue
determinar quantos e que tipo de dispositivo estão conectados. Quando existe
apenas um sensor no barramento, este comando não precisa de ser executado, sendo
apenas necessário fazer a leitura da ROM do sensor;

• 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;

• Igualdade da ROM (Match ROM) [0x55] – Este comando, permite ao mestre


comunicar de forma individualizada apenas com um sensor através da seleção do
código de 64 bits correspondente;

• 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.

Após a execução dos comandos de ROM utilizados no protocolo OneWire, utilizam-se, em


seguida, os comandos de RAM específicos de cada sensor para fazer a troca de dados.

17
3.2.3. PROTOCOLO SPI

O protocolo Serial Peripheral Interface (SPI) desenvolvido pela Motorola, é um protocolo


de comunicação serial síncrona que permite fazer a troca de dados entre dois ou mais
dispositivos numa curta distância [10]. O SPI utiliza um esquema de comunicação do tipo
master/slave e opera em modo full duplex.

O barramento SPI define quatro sinais lógicos [11]:

• 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;

• Serial Clock (SCLK) – É o clock gerado no dispositivo mestre para a


sincronização com o escravo, realizando uma comunicação síncrona. Este sinal
informa o dispositivo escravo de quando deve fazer a leitura ou a escrita no
barramento;

• Select Slave (SS) – O mestre pode escolher com qual dos escravos quer comunicar
através da ativação do pino SS correspondente.

A Figura 11 demonstra um exemplo da arquitetura de ligação entre o dispositivo mestre e


os diferentes escravos, utilizando o protocolo SPI. Os periféricos escravos que estão
conectados ao mestre são selecionados para iniciar a transmissão quando um dos pinos
SS1, SS2 ou SS3 se encontram no nível baixo e os restantes no nível lógico 1.

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.

Tabela 3 Modos de transmissão SPI.

Modo CPOL CPHA


(fase) (polaridade)

0 0 0

1 0 1

2 1 0

3 1 1

Os diagramas presentes nas Figuras 12, 13, 14 e 15 permitem exemplificar os 4 modos de


transmissão existentes no modelo de comunicação SPI utilizando o clock. No modo 0,
Figura 12, quando se dá o clock, a fase e a polaridade estão a 0 e os dados são lidos na
borda de subida - na mudança de estado de zero para um – e são atualizados no barramento
na borda da descida.

Figura 12 Modo 0 de transmissão SPI [13].

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.

Figura 13 Modo 1 de transmissão SPI [13].

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.

Figura 14 Modo 2 de transmissão SPI [13].

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.

Figura 15 Modo 3 de transmissão SPI [13].

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.

Na configuração do protocolo SPI uma das características que também é necessário


configurar é a definição da posição do bit mais significativo através do registo DORD.

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.

Figura 16 Barramento 𝐈𝟐 𝐂 [14].

A mensagem enviada pelo dispositivo mestre para os escravos é caracterizada por um


endereço de 9 bits: 7 bits correspondem ao endereço do dispositivo escravo a quem se
pretende conectar, 1 bit de controlo para leitura/escrita no barramento e 1 bit de
confirmação (ACK - Acknowledge ou NACK – Not Acknowledge). Assim, quando o
dispositivo mestre inicia a transmissão de dados, todos os dispositivos escravos presentes
no barramento recebem a informação, mas somente o escravo que possui o endereço igual
é que participa na transmissão. A condição de acknowledge que é enviada juntamente com
a trama no 9º bit, permite informar se o dado foi corretamente recebido ou não. Quando o
recetor não recebe o último bit ou não consegue receber mais bits, ele informa o mestre
através de um NACK [6]. A Tabela 4 representa a forma como está organizada a trama de
informação na transmissão de dados utilizando o protocolo de comunicação I 2 C.

22
Tabela 4 Formato da trama enviada no barramento 𝐈𝟐 𝐂 para os dispositivos escravos.

Início Direção ACK/NACK ACK/NACK STOP

Bits de endereço Bits de dados

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)

Figura 17 a) condição de início; b) condição de final de transmissão utilizado na comunicação


𝟐
𝐈 𝐂 [16].

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.

Figura 18 Transmissão de um bit no barramento 𝐈𝟐 𝐂 [17].

Em resumo, todos os pacotes de dados transmitidos no barramento possuem 9 bits, 1 byte e


mais 1 bit de resposta. Durante a transmissão de dados, o mestre gera o clock e a condição

23
de início e fim de transmissão, enquanto que o escravo é responsável por responder se
recebeu a informação.

3.3. SISTEMA DE POSICIONAMENTO GLOBAL


O sistema de posicionamento global, que deriva do inglês Global Positioning System
(GPS), consiste num sistema que permite conhecer com exatidão a localização de vários
recetores de sinal através da informação proveniente de satélites. Foi desenvolvido pelo
departamento de defesa dos Estados Unidos da América em 1973 com objetivos
exclusivamente militares [18].

Atualmente encontram-se em funcionamento dois sistemas de posicionamento por satélite:


O GPS americano e o GLONASS russo [19]. Dois novos sistemas estão ainda a ser
implementados: Compass da China e o Galileo que está a ser implementado pela União
Europeia.

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.

Para identificar a posição (latitude e longitude) do recetor é obrigatoriamente necessário a


utilização de três satélites e para determinar as três coordenadas (latitude, longitude e
altitude) é ainda necessário um quarto satélite para a obtenção de dados com mais precisão.
Os satélites assim como os recetores GPS possuem relógios internos: os recetores utilizam
relógios de quartzo, menos precisos, e os satélites utilizam relógios atómicos de elevada
precisão, o que garante uma ótima precisão nos cálculos de posição efetuados.

O método para a deteção da posição do recetor é denominado por “triangulação”. Os


satélites enviam constantemente sinais de rádio para o recetor, sendo enviado juntamente
com a onda portadora, o horário em que o sinal saiu do satélite. Quando o sinal chega ao
recetor, este regista o horário de receção. Sabendo a diferença de tempo ∆𝑡, entre o envio e
a receção do sinal e a velocidade de propagação da onda 𝑣, (300 mil quilómetros por
segundo no vácuo), calcula-se a distância a que se encontram os satélites dos sensores,
através da fórmula abaixo. Aplicando de seguida o método da triangulação, descobre-se o
recetor.

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.

Figura 19 Sistema de triangulação utilizado pelos satélites na deteção do recetor [20].

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.

A comunicação por radiofrequência é feita através de dois sistemas: um transmissor – que


emite o sinal - e um recetor – que recebe o sinal. Ambos possuem duas antenas e têm de
trabalhar na mesma gama de frequência. A comunicação pode ser:

• Unidirecional – Este tipo de comunicação caracteriza-se por se processar apenas


num sentido e possuir um dispositivo transmissor e um recetor;

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.

O transmissor de radiofrequência é um sistema composto por um gerador de oscilação, um


transdutor e um modulador. O gerador de oscilações converte a corrente elétrica em
oscilações de uma determinada frequência; o transdutor converte a informação em
impulsos elétricos equivalentes a cada valor e o modulador controla as variações de
intensidade de oscilação ou na frequência da onda portadora. O conjunto dos três
periféricos incluídos no transmissor permite transformar o sinal de informação numa onda
eletromagnética pronta a ser enviada – processo de modulação - através do sistema de
rádio.

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]:

• Modulação em amplitude: neste tipo de modulação a frequência e a fase do sinal


de informação mantém-se. A onda portadora modulada vai fazer aumentar a
amplitude do sinal modulante. A junção dos dois resulta de um sinal modulado em
amplitude;

• Modulação em frequência: a modulação em frequência mantém as variáveis de


fase a amplitude constantes, fazendo apenas variar a frequência da portadora de
acordo com a informação a transmitir. O sinal modulador resulta de uma
modulação em frequência;

• Modulação em fase: o sinal resultante deste tipo de modulação não varia em


amplitude nem em frequência. A fase da portadora é a única variável a ser
modificada de acordo com o sinal que contém a informação que se pretende
transmitir.

26
Na Figura 20 estão representados três exemplos de sinais modulados em amplitude,
frequência e fase.

Figura 20 Exemplos de sinais modulados em amplitude, frequência e fase.

Outro tipo de modulação muito usado nas telecomunicações é a modulação digital. A


única diferença na transmissão de informação relativamente à modulação analógica, é que
o sinal de informação encontra-se em formato digital. A modulação digital é feita
principalmente através de três modos distintos [21]:

• Modulação por chaveamento de amplitude: a modulação em amplitude ou


também designada por “desvio em amplitude”, consiste em alterar a amplitude da
portadora de acordo com a informação a transmitir mantendo a frequência
constante. Quando o sinal modulador está a zero, o sinal modulado apresenta-se
sem qualquer tipo de amplitude. Este tipo de modulação está representado na
Figura 21;

Figura 21 Modulação em amplitude por chaveamento [21].

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;

Figura 22 Modulação por chaveamento de frequência [21].

• Modulação por chaveamento de fase: a fase da onda portadora é alterada em


função do sinal digital a ser transmitido. As restantes variáveis são mantidas
inalteráveis. Neste tipo de modulação, quando o bit do sinal modulador transita de
zero para um ou vice-versa, o sinal à saída apresenta uma fase de 0º; quando o bit
do sinal modulador vai a um, o sinal modulado apresenta uma fase de 180º. Na
Figura 23 está representada um exemplo de modulação por chaveamento de fase.

Figura 23 Modulação por chaveamento de fase [21].

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]:

• Primeira lei de Newton ou lei da Inércia– “Todo o corpo permanece em repouso


ou em movimento retilíneo uniforme até que alguma força externa atue sobre ele.”
A fórmula que permite deduzir esta lei é:

𝐹 = 𝑀×𝑎

• A primeira lei baseia-se em dois tipos de movimentos:

➢ Movimento retilíneo uniforme – O corpo se estiver a uma velocidade constante


a sua aceleração (a) é zero, logo a força (F) é igual a zero;

➢ 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.

• Segunda lei de Newton ou princípio fundamental da dinâmica – “A força


resultante que atua sobre um corpo é diretamente proporcional ao produto da
aceleração pela sua massa”. A segunda lei mostra que, se no corpo for atuada uma
força, a sua aceleração possui a mesma direção e sentido da força resultante.

Através desta pequena introdução às teorias de Newton, conclui-se que o acelerómetro


determina a força aplicada num corpo através da sua aceleração.

Existem diversos tipos de acelerómetros com diferentes características: acelerómetro de


transferência de calor, efeito Hall, magnetoresistivo, MEMS (MicroElectroMechanical

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]:

• Piezoelétrica – Este tipo de tecnologia usada no acelerómetro utiliza a vibração


para gerar uma tensão elétrica proporcional à aceleração do movimento vibratório.
Quando uma força atua num corpo, um cristal piezoelétrico começa a deformar-se e
a provocar um deslocamento. Este deslocamento faz gerar uma diferença de
potencial entre as suas superfícies, como se pode ver na Figura 24, com a presença
de material piezoelétrico. Esta transformação de energia mecânica em energia
elétrica é realizada por um transdutor intrínseco no módulo. Este módulo é
frequentemente utilizado em ambientes industriais, como por exemplo, no chão de
fábricas ou ainda em medições de choques e vibrações em carros ou máquinas;

Figura 24 Funcionamento do acelerómetro de tecnologia piezoelétrico [23].

• Capacitiva - Esta tecnologia consiste num sensor capacitivo de aceleração que


permite medir a aceleração estática e as forças de acelerações dinâmicas. A força de
aceleração estática é gerada por uma força gravitacional. Esta aceleração determina
o ângulo de inclinação referente à força gravitacional. Os smartphones utilizam esta
tecnologia para controlar a rotação automática do ecrã. A força de aceleração
dinâmica é gerada pelas vibrações do movimento, permitindo determinar em que
direção o dispositivo se está a movimentar. A Figura 25, ilustra o processo de
funcionamento deste acelerómetro. Pelas leis de Newton anteriormente enunciadas,
quando um corpo sofre a ação da força, esta provoca uma aceleração que faz
deslocar a placa. Esta placa provoca um movimento de aproximação e distanciação
de capacitores que faz variar a sua capacitância e gerar uma tensão.

30
Figura 25 Funcionamento do acelerómetro de tecnologia capacitiva [23].

Os acelerómetros que se encontram comercializados pelo mercado, normalmente possuem


três acelerómetros integrados num só dispositivo permitindo determinar as acelerações nos
três eixos, X, Y e Z.

O acelerómetro colocado numa superfície plana, deverá obter uma aceleração


aproximadamente de 9.81 m/s2 ou 1g (outro tipo de unidade utilizada: 1g = 9.81 m/s2 ).
Este resultado é devido ao valor obtido no eixo dos Z’s referente à força da gravidade.

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

Depois de calculado o ângulo e dependendo da forma como o acelerómetro é instalado, a


rotação e a inclinação são determinadas pelas fórmulas [24] a seguir representadas.

𝑥
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].

Através da velocidade angular (𝑟𝑎𝑑/𝑠) é possível determinar o ângulo de inclinação e sua


rotação. A forma como se obtém a inclinação resulta da multiplicação da velocidade
angular pela base de tempo. Para fazer a passagem de radianos (rad) para graus (º), basta
realizar a proporcionalidade direta (equação abaixo) para obter os valores mais
vulgarmente utilizados.

𝜋(𝑟𝑎𝑑 ) → 180°

Utilizando um filtro de Kalman e a junção dos dados obtidos do acelerómetro com os


dados obtidos através do giroscópio, são possíveis de se obter dados de inclinação e
rotação muito mais precisos. O filtro Kalman é um modelo matemático que permite
corrigir dados, que contêm ruído e incertezas associados, que foram recolhidos numa
escala de tempo. O filtro não vai ser abordado neste relatório, uma vez que não foi
utilizado.

3.7. IDENTIFICAÇÃO POR RADIOFREQUÊNCIA


A identificação por radiofrequência (RFID do inglês, Radio Frequency IDentification), é
um método que faz a recolha de dados de forma automática através de sinais de rádio. O
sistema RFID é composto por um transcetor (leitor), um transponder (etiqueta de
radiofrequência ou tag) e uma antena presente em cada um dos módulos. O princípio de
funcionamento do RFID consiste no envio de um sinal eletromagnético por uma antena, no
dispositivo transmissor (leitor). Quando uma tag entra na área coberta pela antena, é
ativada – através da deteção da onda eletromagnética que funciona como fonte de
alimentação - e inicia-se a transmissão de dados entre o leitor e a tag. Os dados depois de
recebidos pelo transcetor são descodificados e processados, por exemplo, num computador
ou microcontrolador [26]. A Figura 26 ilustra os módulos utilizados na comunicação por
RFID.

32
Figura 26 Módulos utilizados na comunicação por RFID [27].

Existem dois tipos de etiquetas RFID [28]:

• Passiva – utiliza a radiofrequência do leitor (onda eletromagnética) como fonte de


alimentação e para enviar os dados para o leitor. Uma vez que não possui uma fonte
de alimentação interna, tem um tempo de vida ilimitado. Esta tag tem apenas a
capacidade de leitura e só pode ser utilizada para curtas distâncias (tem de estar
muito próximo do transcetor);

• 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].

A Figura 27 ilustra um exemplo de um circuito impresso que possui tecnologia SMD.

Figura 27 Exemplo de um circuito impresso com tecnologia SMD.

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.

Existem vários processos de produção de placas de circuito impresso que variam de


indústria para indústria. Este processo de produção de PCB foi o utilizado pelo
Departamento de Engenharia Eletrotécnica no Instituto Superior de Engenharia do Porto.

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

O microcontrolador escolhido para fazer o controlo do sistema foi o ATmega324PA


representado na Figura 28.

Figura 28 Microcontrolador ATmega324PA PDIP.

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.

O microcontrolador é o componente principal que permite controlar diversos periféricos


que estão conectados a ele, através dos pinos de que dispõe, como representado na Figura
29. Para fazer a comunicação entre os periféricos e o microcontrolador, são necessários
protocolos de comunicação, dependendo do tipo de comunicação que realizam.

Figura 29 Pinout do atmega342PA [30].

4.1.2. SENSOR DE TEMPERATURA

No projeto de telemetria é essencial identificar e analisar a temperatura do veículo, a


temperatura do motor, a temperatura da carruagem (quando transporta materiais que têm
de cumprir temperaturas específicas), entre outros.

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].

A comunicação entre os sensores DS18B20 e o microcontrolador, realizam-se através da


utilização do protocolo de comunicação OneWire. Neste barramento, cada sensor possui
um código único de 64 bits (ROM) permitindo a comunicação com cada sensor. A
comunicação é realizada através de apenas uma linha de dados do barramento (Figura
30: a) Digital; b) DATA; c) DQ).

Existem dois formatos de sensores de temperatura: sensor com formato de um transístor


com a referência TO-92 (ver Figura 30 c), e outro que utiliza o mesmo material, mas que
está encapsulado (ver Figura 30 b). O esquema de ligações do sensor está representado na
Figura 30, sendo +VDD a alimentação do sistema, GND a massa e DQ o pino, que permite
fazer a ligação entre o microcontrolador e o sensor.

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 acelerómetro acoplado a este sistema e quando implementado num automóvel, permite


determinar as acelerações e travagens bruscas que o condutor efetuou. No caso em que o
carro se encontra parado e o veículo sofre a ação de uma força externa, é possível deduzir
que o veículo sofreu um choque por terceiros.

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.

O sensor utilizado foi o MPU9250. É um dispositivo de 9 eixos pois contém: um


acelerómetro de 3 eixos, um giroscópio de 3 eixos e um magnetómetro de 3 eixos. Para
além disto, contém um sensor de temperatura e ainda um sensor de pressão. Este
dispositivo utiliza um acelerómetro com tecnologia capacitiva como explicado na secção
3.5.

Este dispositivo permite utilizar dois protocolos de comunicação: I 2 C e SPI. O protocolo


utilizado foi o I 2 C, uma vez que utiliza apenas duas linhas (Figura 31 – pino SCL e SDA),
para estabelecer a comunicação com o microcontrolador. Para alimentação, o sensor utiliza
o pino VCC com 5 V e o GND para fazer a referência à massa. A Figura 27 mostra o
sensor MPU9250 que foi utilizado para controlar o acelerómetro e o giroscópio.

Figura 31 Sensor MPU 9250 [33].

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.

Figura 32 Transceiver RFM69HW utilizado na comunicação por radiofrequência [33].

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.

O protocolo utilizado na comunicação entre o microcontrolador e o transceiver é o SPI que


utiliza apenas 3 linhas do barramento (MOSI, MISO, SCK). Para além destas linhas, o
módulo utiliza: 1 linha de interrupção (DIO0), 1 linha de seleção (NSS), 1 GND que faz
referência à massa e ainda o VCC que é a alimentação do módulo. O pinout deste
transceiver está representado na Figura 33 a.

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].

4.1.4.1. ALIMENTAÇÃO RADIOFREQUÊNCIA

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.

4.1.4.2. CONVERSOR DE NÍVEIS LÓGICOS

O sistema de telemetria utiliza uma alimentação de 5 V, exceto o módulo de


radiofrequência (3,3 V) e o sensor RFID (3,3 V). Dado que o dispositivo mestre e o
escravo estão a ser alimentados com tensões diferentes, torna-se necessário o uso de um
conversor de níveis lógicos para fazer uma adaptação dos níveis de tensão.

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.

Figura 35 Conversor de níveis lógicos bidirecional.

41
4.1.5. IDENTIFICAÇÃO POR RADIO FREQUÊNCIA (RFID).

O dispositivo de identificação por radiofrequência, quando implementado em automóveis,


permite identificar os condutores dos veículos. Cada utilizador possui uma tag que pode ter
um formato de cartão ou porta-chaves, como mostrado na Figura 36. Estes identificadores
são do tipo passivo, uma vez que utiliza a radiofrequência do leitor como fonte de
alimentação e para enviar os dados para o leitor. Antes de iniciar a marcha do veículo, o
utilizador passa a tag junto ao leitor e, automaticamente será reconhecido. Este sistema de
identificação é essencial para controlar o tipo de condução e as infrações que cada
condutor executa, assim como, onde se encontra em cada instante com o veículo.

Figura 36 Tags em formato de cartão e porta-chaves.

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.

Figura 37 Pinout do sensor RFID MFRC522 13.56 MHz.

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.

4.1.6. SISTEMA DE POSICIONAMENTO GLOBAL (GPS)

O sistema de posicionamento global é um sistema de posicionamento por satélite que


fornece a localização geográfica em qualquer lugar da Terra, desde que o recetor esteja
posicionado num campo de visão de quatro satélites (três de posicionamento e um de
precisão).

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.

Figura 38 Pinout do sistema de posicionamento Galileo [35].

Na comunicação com o microcontrolador, este dispositivo utiliza o protocolo de


comunicação do tipo série, utilizando apenas duas linhas (RX e TX).

Na obtenção de dados, o recetor de GPS recebe um conjunto de “padrões” /respostas,


utilizando o protocolo NMEA 2.0. Neste protocolo, é possível obter várias respostas:

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).

4.1.7. DISPLAY 128X64

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 método de comunicação com o microcontrolador pode ser executado de duas formas:


paralela – utilizando simultaneamente 8 bits na transmissão de dados (8 linhas de I/O) e
três linhas de controlo; ou série – os dados são emitidos bit a bit (2 pinos I/O) e executa-se
a transmissão de dados de forma sequencial. Na comunicação do tipo paralela, por usar 8
pinos I/O e por a transmissão de dados ocorrer de forma simultânea, a velocidade de
transmissão é maior. No entanto. uma vez que neste caso a rentabilização do número de
I/O é bastante importante e a velocidade de transmissão de dados é insignificante,
utilizou-se o protocolo de comunicação do tipo série.

Figura 39 Display gráfico ST7920 128x64 [37]

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

Neste capítulo são abordados todos os conteúdos referentes à programação dos


dispositivos, assim como as alterações que foram executadas no código de controlo de
alguns módulos. Os controlos dos dispositivos são executados utilizando a linguagem de
programação C e recorrendo ao software AtmelStudio.

5.1. BIBLIOTECA ONEWIRE


A biblioteca OneWire utilizada neste sistema permite estabelecer a comunicação entre o
sensor de temperatura e o microcontrolador. Uma vez que esta permite ler apenas um
sensor, foram realizadas alterações no sentido de identificar maior número de dispositivos
OneWire presentes no barramento. As alterações desenvolvidas nesta biblioteca foram
adaptadas a partir da biblioteca presente neste website [38].

Para identificar o número e o tipo de dispositivos escravos presentes, o microcontrolador


faz uma pesquisa no barramento solicitando o código ROM de 64 bits de todos os
dispositivos, utilizando a função Onewire_search( ) (Anexo B) desenvolvida. Finalizado
este processo de pesquisa, o mestre sabe agora quantos e que tipo de dispositivos estão a
ele conectados. Esta função retorna um código de 64 bit.

Em caso de insucesso na identificação dos sensores disponíveis no barramento ou quando


não existe nenhum dispositivo a ele conectado, foi desenvolvida a função

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.

Figura 41 Fluxograma referente à leitura de vários sensores de temperatura 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 i2c_rep_start( ) permite fazer a repetição da condição de início imposta pelo


dispositivo mestre no barramento. Por parâmetro, esta função recebe o endereço do
dispositivo escravo e a direção dos dados.

A função i2c_start_wait( ) é utilizada para fazer o início da comunicação com o


dispositivo escravo presente no barramento, no entanto, no caso do dispositivo estar
ocupado, é enviada uma condição de paragem de comunicação. Quando o dispositivo
estiver livre, é novamente iniciada a condição de início. Esta função recebe por parâmetro
o endereço do dispositivo com o qual pretende comunicar e a direção dos dados.

Quando o dispositivo escravo termina a transferência de dados ou quando está ocupado


com outro dispositivo mestre, é utilizada a condição de paragem. Esta condição é gerada
pelo dispositivo mestre através da função i2c_stop( ) que liberta o barramento depois de
executar a condição de paragem.

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.

Na main do programa, foi inicializado o barramento para identificar o dispositivo


MPU9250 que está conectado no barramento, enviando para isso o seu endereço e a
direção de dados, através da passagem por parâmetro da função. Se o dispositivo estiver
presente, vai responder com um ACK no barramento e o mestre continua com a
comunicação; caso não esteja presente ou esteja ocupado, o mestre recebe um NACK e
liberta a linha, terminando com a comunicação. Na Figura 42 pode-se observar o
fluxograma que permite descrever a configuração de início de comunicação realizada pelo
dispositivo mestre. O extrato de código referente à condição de início encontra-se no
Anexo E.

Não

Figura 42 Fluxograma que descreve a configuração executada pelo mestre no barramento.

50
5.2.1. ACELERÓMETRO

O acelerómetro utilizado foi programado com a menor escala possível 2 g, de forma a


utilizar um intervalo de operação curto, de -2 g a +2 g, e obter valores com bastante
sensibilidade.

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

O giroscópio do dispositivo MPU9250, em analogia com o acelerómetro, foi programado


com a menor escala de sensibilização de 250 º/s de forma a obter valores com maior
sensibilidade. Os valores que são recolhidos pelo giroscópio vêm em º/s, permitindo
deduzir o número de graus que um veículo faz em cada segundo e, assim avaliar o perigo
das curvas.

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.

5.3. CONTROLO DO RFID MFRC522


Este dispositivo utiliza o protocolo de comunicação SPI que se encontra no Anexo F. Este
protocolo usa apenas duas funções no estabelecimento de comunicação entre o
microcontrolador e o RFID: a função spi_init( ) que faz a configuração inicial do
barramento definindo os pinos MOSI, MISO, SCK e SS como entrada ou saída, assim
como, a fase e a polaridade do sinal clock; e a função spi_transmit( ) que permite ao
dispositivo mestre fazer a escrita no barramento. Esta função recebe por parâmetro a
informação que se pretende transmitir para o RFID. O controlo do RFID foi adaptado das
bibliotecas desenvolvidas para arduíno e que estão presentes no website [40].

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).

Num ciclo infinito fechado, a função mfrc522_request( ) é utilizada para identificar


quando um sensor se aproxima do leitor. Por parâmetro é enviado um comando de pedido
de identificação da tag e retorna um byte com o valor 0 no caso de não existir
identificadores próximos ou 1 no caso de sucesso. Se for identificado um transponder (tag)
próximo, é utilizada a função mfrc522_get_card_serial( ) que permite fazer a leitura do
número único de identificação que cada transponder possui.

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.

5.4. ALTERAÇÕES NO GPS


O GPS Galileo juntamente com a resposta $GPRMC obtida pelo protocolo NMEA 2.0.,
surge com as coordenadas em formato de graus decimais (DD) – por exemplo, 40,854708,
-8,638759. Uma vez que este formato não é muito utilizado no quotidiano para fazer as
localizações geográficas, foi realizada a conversão das coordenadas para o formato graus,
minutos e segundos (DMS) – por exemplo, 40°51’17’’N 8°38’19.5’’W.

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.

5.5. ALTERAÇÕES NO PCB


Ao nível de hardware, foram adicionados ao sistema um dispositivo RFID e uns leds (com
resistência em série), e realizadas algumas alterações nas ligações de dispositivos.

O microcontrolador Atmega324PA, como dito anteriormente, possui um conjunto de pinos


para fazer a ligação entre o microcontrolador e os dispositivos. Nestes pinos existem
apenas três que possuem a capacidade de gerar uma interrupção externa. O dispositivo
RFM69HW utiliza uma interrupção externa para fazer a transmissão de dados do emissor
para o recetor, no entanto, não estava ligado ao pino que possui esta capacidade.

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.

As alterações realizadas podem ser visualizadas no capítulo 6 Resultados.

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.

6.1. BIBLIOTECA ONEWIRE


Neste subcapítulo serão apresentados os resultados referentes ao protocolo OneWire. Neste
caso, serão adicionados dois sensores de temperatura ao barramento e serão feitas as
leituras dos seus valores. A Figura 46 foi retirada a partir do computador e serve para
comprovar que a temperatura está a ser obtida a partir de dois sensores de temperatura com
ROM’s diferentes.

Figura 46 Temperatura obtida a partir de dois sensores de temperatura diferentes.

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.

Figura 47 Leitura dos dois sensores de temperatura DS18B20 visualizados no display.

6.2. CONTROLO DO MPU9250


Este subcapítulo é subdividido em dois: numa primeira fase são apresentados os resultados
referentes ao módulo acelerómetro do sensor MPU9250 e, numa segunda fase, os
resultados do giroscópio.

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.

Na Figura 48, 49 e 50 estão representadas as simulações de um carro numa estrada plana, a


subir e a descer, respetivamente.

58
Figura 48 Simulação de um carro numa estrada plana.

Figura 49 Simulação de um carro numa estrada a subir.

Figura 50 Simulação de um carro numa estrada a descer.

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.

Figura 51 Simulação de uma curva à esquerda realizada com velocidade excessiva.

Uma simulação de uma curva à direita realizada com uma velocidade excessiva está
representada na Figura 52.

Figura 52 Simulação de uma curva à direita executada com velocidade excessiva.

6.2.3. CONTROLO DO RFID MFRC522

Neste subcapítulo são representados os resultados referentes ao controlo do sensor de


identificação por radiofrequência. Este dispositivo foi programado para identificar dois
tipos de identificadores: um cartão e um porta-chaves. Para o primeiro identificador, o
leitor não vai autorizar o condutor a conduzir o veículo, emitindo uma mensagem de

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.

Na Figura 53 é apresentado o resultado da passagem de uma tag e de uma leitura executada


com acesso autorizado. Automaticamente é gerado no display uma mensagem a mostrar o
nome da pessoa a quem corresponde a respetiva tag.

Figura 53 Leitura com acesso autorizado na passagem da tag em formato de porta-chaves.

Na Figura 54 é representado o resultado da passagem de uma tag e de uma leitura com


acesso negado. Mais uma vez é gerada uma mensagem no display.

Figura 54 Leitura com acesso negado na passagem da tag em formato de cartão.

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.

Figura 55 Coordenadas que surgem no display no 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.

Figura 56 Coordenadas no formato DMS e DD.

62
6.2.5. ALTERAÇÕES NO PCB

As alterações foram apenas executadas ao nível do esquemático e do layout, não sendo


assim nada acrescentado ou alterado ao PCB já previamente realizado.

Na Figura 57 está representado o esquemático das ligações entre os componentes e os


vários dispositivos ao microcontrolador, após estes sofrerem as alterações.

Figura 57 Esquemático das ligações microcontrolador após sofrer alterações.

O dispositivo RFID MFRC522 foi adicionado ao esquemático através de um socket. Uma


vez que o dispositivo utiliza uma alimentação de 3,3 V, é necessário utilizar na
comunicação um conversor de níveis lógicos, utilizado também para o módulo de
radiofrequência. Para o pino SS que permite selecionar o dispositivo escravo com qual o
mestre pretende comunicar, foi utilizando um divisor de tensão, utilizando a seguinte
fórmula:

𝑅2
𝑉𝑜𝑢𝑡 = × 𝑉𝑖𝑛
𝑅2 + 𝑅1

Sendo R1 = 10 kΩ; R2= 18 kΩ e Vin = 5 V, substituindo as variáveis pelos seus valores,


fica:

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.

Figura 58 Esquemático do sensor RFID MFRC522.

O layout final do PCB é representado na Figura 59.

64
Figura 59 Layout do PCB.

65
66
7. CONCLUSÕES

O sistema de geolocalização e telemetria para automóveis surgiu no mundo da tecnologia


para tentar combater o número de anomalias que têm surgido nos automóveis e para tentar
rentabilizar ao máximo as frotas efetuadas. Para tal, foi desenvolvido este sistema que
permite registar os dados de telemetria e fazer um estudo das temperaturas do veículo, do
tipo de condução que efetuam nele, entre outros. O sistema de geolocalização desenvolvido
obtém dados muito precisos de localização geográfica com o mais recente sistema de
posicionamento Galileo. Este sistema em concordância com os dados de telemetria do
automóvel, permitem desenvolver relatórios mais detalhados de forma a poder diminuir o
número de anomalias. Todos estes dados quando enviados por radiofrequência para uma
central permitem diminuir as comunicações do tipo GSM que implicam uma taxa
associada ao uso deste serviço.

O sistema desenvolvido apresentou algumas dificuldades no seu desenvolvimento. A


comunicação por radiofrequência do módulo RFM69HW foi uma das principais
dificuldades encontradas e que não foram ultrapassadas devido principalmente à falta de
tempo. O módulo de RFID iButton foi outra dificuldade debatida que foi encontrada. O
problema de controlo que existia neste dispositivo derivava do protocolo OneWire, pois o
tempo de escrita no barramento de zero ou um não estavam corretos. Recorrendo ao uso de
um analisador de níveis lógicos foi realizado um estudo deste protocolo, mas sem sucesso.
A forma de ultrapassar este obstáculo foi efetuar a troca deste sensor por outro que utiliza o
protocolo de comunicação SPI. Estas foram as dificuldades principais detetadas ao longo
deste projeto.

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].

[2] “Vantagens e desafios do dispositivo OBD na Telemetria para Gestão de Frotas —


Carrorama,” 2016. [Online]. Available: http://carrorama.net/vantagens-e-desafios-
do-obd-na-telemetria-para-gestao-de-frotas/. [Accessed: 12-Oct-2017].

[3] L. Figueiredo, “Sistemas Digitais 2,” 2015. .

[4] N. Braga, “O básico sobre os Microcontroladores – parte 1 (MIC139),” 2014.


[Online]. Available: http://newtoncbraga.com.br/index.php/eletronica/52-artigos-
diversos/13263-o-basico-sobre-os-microcontroladores-parte-1-mic139. [Accessed:
07-Oct-2017].

[5] R. Ferrari, “Comunicações: Protocolos.”

[6] C. Lima and V. Marco, AVR e Arduino Técnicas de Projeto. 2012.

[7] Y. Tambi, The USART of the AVR USART Layout. 2013.

[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.

[10] L. Cabral, “Nerd Elétrico: Introdução a Comunicação SPI.” [Online]. Available:


http://nerdeletrico.blogspot.pt/2015/10/introducao-comunicacao-spi.html.
[Accessed: 07-Oct-2017].

[11] F. De Engenharia, E.-P. Alan, and P. Pinheiro, “Universidade Federal de Uberlândia


Prática 8: Comunicação SPI 8.1 – Introdução e objetivos.”

69
[12] R. Silva and H. R. Anjos, “Protocolo Serial Peripheral Interface Descrição do
processo e aplicações para Arduino.”

[13] “SPI Transfer Modes | USB-I2C/SPI/GPIO Interface Adapters.” [Online].


Available: http://dlnware.com/theory/SPI-Transfer-Modes. [Accessed: 08-Oct-
2017].

[14] V. Reis, “I2C - Protocolo de Comunicação - ArduinoBR.” [Online]. Available:


http://www.arduinobr.com/arduino/i2c-protocolo-de-comunicacao/. [Accessed: 08-
Oct-2017].

[15] A. Corporation, ATmega324PA DATASHEET COMPLETE. 2015.

[16] B. M. Projects, “An I2C Tutorial.,” 2013. [Online]. Available: http://www.best-


microcontroller-projects.com/i2c-tutorial.html. [Accessed: 08-Oct-2017].

[17] R. Ferrari, “Comunicações: Protocolos.”

[18] D. (Universidade F. de P. Guimarães and P. (Universidade do M. Cabral,


“Significado de IBM - O que é, Conceito e Definição,” 2011. [Online]. Available:
https://www.significados.com.br/gps/. [Accessed: 08-Oct-2017].

[19] G. Philipe, “Como funciona o GPS?” [Online]. Available:


https://www.oficinadanet.com.br/post/12406-como-funciona-o-gps. [Accessed: 08-
Oct-2017].

[20] J. Pereira, “Funcionamento e aplicações do GPS - PERCEBER O MUNDO.”


[Online]. Available: http://perceberomundo.blogs.sapo.pt/808.html. [Accessed: 08-
Oct-2017].

[21] C. Melo, “Fundamentos de radio freqüência.” [Online]. Available:


https://pt.slideshare.net/carlosvmelo/fundamentos-de-radio-freqncia. [Accessed: 08-
Oct-2017].

[22] Landim Wikerson, “Como funcionam acelerômetros e giroscópios? - TecMundo.”


[Online]. Available: https://www.tecmundo.com.br/celular/4406-como-funcionam-
acelerometros-e-giroscopios-.htm. [Accessed: 08-Oct-2017].

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].

[25] D. Suhanko, “Acelerômetro, giroscópio, bússola, altímetro, barômetro - IMU,”


2015. [Online]. Available: http://www.dobitaobyte.com.br/acelerometro-giroscopio-
bussola-altimetro-barometro-imu/. [Accessed: 08-Oct-2017].

[26] IDCON - Consultoria e Soluções em RFID, “O que é RFID?” [Online]. Available:


http://www.ncontrol.com.pt/o-que-e-rfid.html. [Accessed: 08-Oct-2017].

[27] “Herrtech - O que é RFID.” [Online]. Available: https://www.herrtech.com.br/blank.


[Accessed: 08-Oct-2017].

[28] D. Ciriaco, “Como funciona a RFID?,” 2009. [Online]. Available:


https://www.tecmundo.com.br/tendencias/2601-como-funciona-a-rfid-.htm.
[Accessed: 08-Oct-2017].

[29] F. DAQUINO, “Como as placas de circuito impresso são produzidas - TecMundo,”


TECMUNDO.COM.BR, 2012. [Online]. Available:
https://www.tecmundo.com.br/como-e-feito/18501-como-as-placas-de-circuito-
impresso-sao-produzidas.htm. [Accessed: 08-Oct-2017].

[30] H. Performance, L. Power, A. Avr, and M. Family, “ATmega324PA,” 2016.

[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].

[39] “#202 9Axis I2C Brick · GitBook.” [Online]. Available:


http://docs.fabo.io/fabo/arduino/brick_i2c/202_brick_i2c_9axis.html. [Accessed: 16-
Nov-2017].

[40] Norlinux, “Arduino MFRC522 RFID.” [Online]. Available:


http://maquina.96.lt/2017/06/24/arduino-mfrc522-rfid/. [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
}
}

// if no device found then reset counters so next


'search' will be like a first
if (!flags1wire.search_result || !ROM_NO[0]){
LastDiscrepancy = 0;
flags1wire.LastDevice = 0;
LastFamilyDiscrepancy = 0;
flags1wire.search_result = 0;
}else {
sprintf(PC_buffer,"ROM =");
//Mostrar no PC
send_PC();
for (int i = 0; i < 8; i++) {
newAddr[i] = ROM_NO[i];
sprintf(PC_buffer," %X",newAddr[i]);
//Mostrar no PC
send_PC();
}
sprintf(PC_buffer,"\r\n");//Mostrar no PC
send_PC();
}
return flags1wire.search_result;
}

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

while(!(TWCR & (1<<TWINT)));


// espera para que TWINT==0 =>TWINT Flag==1. indica que o
endereço foi transmitido com sucesso e o ACK/NACK foi
recebido.

twst = TW_STATUS & 0xF8;


// Check value of TWI Status Register. Mask prescaler
bits. If status different from MT_SLA_ACK return 1 =
failed to access device
if ((twst != TW_MT_SLA_ACK) && (twst !=
TW_MR_SLA_ACK))
return 1;
return 0;
}

/***********************************************
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

while(!(TWCR & (1<<TWINT)));


//wait until transmission completed

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

twst = TW_STATUS & 0xF8;


// check value of TWI Status Register. Mask prescaler
bits.
if((twst==TW_MT_SLA_NACK)||(twst==TW_MR_DATA_NAC)
){
// device busy, send stop condition to terminate write
operation //
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
while(TWCR & (1<<TWSTO));
//wait until stop condition is executed and bus released
continue;
}
break;
}
}

/*******************************************************
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];

*ax = axc * _ares*9.807; //resultado vem em 1G.


Multiplicar por 9.81, faz com que passe para m/s^2
*ay = ayc * _ares*9.807; //resultado vem em 1G.
Multiplicar por 9.81, faz com que passe para m/s^2
*az = azc * _ares*9.807; //resultado vem em 1G.
Multiplicar por 9.81, faz com que passe para m/s^2
}

/*******************************************************
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();

gxc = ((int16_t)dadosgyro[0] << 8) | dadosgyro[1];


gyc = ((int16_t)dadosgyro[2] << 8) | dadosgyro[3];
gzc = ((int16_t)dadosgyro[4] << 8) | dadosgyro[5];

*gx = (float)gxc * _gres;//retorna valor em em º/s


*gy = (float)gyc * _gres;//retorna valor em em º/s
*gz = (float)gzc * _gres;//retorna valor em em º/s
}

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
}

/* ***************** GIROSCÓPIO ********************** */


readGyroxyz(&gx, &gy, &gz);
dtostrf(gx, 4, 2, tudo3); // converter em string
dtostrf(gy, 4, 2, tudo4); // converter em string
dtostrf(gz, 4, 2, tudo5); // converter em string

sprintf(PC_buffer, "gx = %s\r\n", tudo3);


send_PC();
sprintf(PC_buffer, "gy = %s\r\n", tudo4);
send_PC();
sprintf(PC_buffer, "gz = %s\r\n", tudo5);
send_PC();
/* *************** ACELERÓMETRO ********************** */
readAccelxyz(&ax, &ay, &az);
dtostrf(ax, 4, 2, tudo); // converter em string
dtostrf(ay, 4, 2, tudo1); // converter em string
dtostrf(az, 3, 2, tudo2); // converter em string

sprintf(PC_buffer, "ax =%s\r\n", tudo);


send_PC();
sprintf(PC_buffer, "ay =%s\r\n", tudo1);
send_PC();
sprintf(PC_buffer, "az = %s\r\n", tudo2);
send_PC();

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

if (moduloeixos >= 10){


sprintf(PC_buffer, "ACIDENTE\r\n");
send_PC();
lcd_set_cursor(2,0);
lcd_send_str("ACIDENTE");
}

if (myflags.blink_ok == 1) {// Já passaram 500ms?


myflags.blink_ok=0;
sprintf(PC_buffer, "ola %s", moduloeixos);
send_PC();
}
/* *************** rotação ************************** */
raiz1=sqrt(az*az + ax*ax);
rotacao=atan2(ay,raiz1)*valorteste;
dtostrf(rotacao, 4,2,tudo7);
// sprintf(PC_buffer, "rotacao = %s\r\n", tudo7);
// send_PC();

// if (rotacao <= -5){


// sprintf(PC_buffer,"rotacao=%s-esquerda\r\n",
tudo7);
// send_PC();
// }

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

/* ************** Amostragem no LCD ****************** *


if (myflags.blink_ok == 1){ // Já passaram 500ms?
myflags.blink_ok=0;
if (myflags.lcd_on==1){
if (valinclinacao < -3){
lcd_set_cursor(0,0);
lcd_send_str("Descer");
}
if((inclinacao >= -3) & (inclinacao <= 3)){
lcd_set_cursor(0,0);
lcd_send_str("Plano ");
}
if (inclinacao > 3){
lcd_set_cursor(0,0);
lcd_send_str("Subir ");
}
if (gz <= -34){
lcd_set_cursor(2,0);
lcd_send_str("curva a direita");
lcd_set_cursor(3,0);
lcd_send_str("feita com perigo");
_delay_ms(5000);
lcd_set_cursor(2,0);
lcd_send_str(" ");
lcd_set_cursor(3,0);
lcd_send_str(" ");
}
if (gz > +34){
lcd_set_cursor(2,0);
lcd_send_str("Curva a esquerda");
lcd_set_cursor(3,0);
lcd_send_str("feita com perigo");
_delay_ms(5000);
lcd_set_cursor(2,0);
lcd_send_str(" ");
lcd_set_cursor(3,0);
lcd_send_str(" ");
}
}
}

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

for(i=0; i<send_data_len; i++){


mfrc522_write(FIFODataReg, send_data[i]);
}

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

while((i!=0) && !(n & 0x01) && !(n&waitIRq));

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

if ((status != CARD_FOUND) || (backBits != 0x10)){


status = ERROR;
}
return status;
}

/********************************************************
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;

if (myflags.lcd_on==1){ // LCD está ON?


lcd_set_cursor(0,0);
lcd_send_str(hora); //Mostrar no LCD
lcd_send_str(" "); //Mostrar no LCD

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

You might also like