PONTIFÍCIA UNIVERSIDADE CATÓLICA DO PARANÁ
CURSO DE GRADUAÇÃO EM ENGENHARIA DE COMPUTAÇÃO
TIAGO AUGUSTO PERETTO
RELATÓRIO TÉCNICO FINAL
Projeto Banshee
CURITIBA
Dezembro de 2011
TIAGO AUGUSTO PERETTO
RELATÓRIO TÉCNICO FINAL
Projeto Banshee
Documento
referente
ao
projeto
“BANSHEE” que deverá ser entregue
como avaliação final da disciplina
Projeto Final do 10º (décimo) período
de Engenharia de Computação da
Pontifícia Universidade Católica do
Paraná.
O projeto foi orientado pelo professor
Afonso Ferreira Miguel e o documento
será avaliado pelo professor Luiz
Lima.
Visto do professor orientador
Visto do professor da disciplina
Projeto Final
CURITIBA
Dezembro de 2011
SUMÁRIO
LISTA DE FIGURAS.............................................................................................. iv
LISTA DE TABELAS.............................................................................................. v
1.
RESUMO....................................................................................................... 6
2.
INTRODUÇÃO.............................................................................................. 6
3.
DETALHAMENTO DO PROJETO................................................................ 9
3.1
Módulo Transmissor........................................................................ 9
3.1.1 Código embarcado......................................................................... 10
3.1.1.1
3.2
Fluxograma.................................................................. 11
Módulo Receptor............................................................................ 12
3.2.1 Código embarcado......................................................................... 13
3.1.1.1
A velocidade é conhecida............................................ 13
3.1.1.2
A distância entre transmissor e receptor pode ser
determinada................................................................................................ 13
4.
3.1.1.3
O tempo de propagação pode ser determinado.......... 14
3.1.1.4
Fluxograma.................................................................. 17
PROCEDIMENTOS DE TESTE E VALIDAÇÃO DO PROJETO................ 18
4.1
Transdutores........................................................................ 18
4.2
Módulo Transmissor............................................................ 19
4.3
Módulo Receptor.................................................................. 20
4.3
Código embarcado: Cálculo de posição............................ 21
4.3.1 Resposta Teórica........................................................ 21
4.3.2 Resposta Prática........................................................23
5.
CONCLUSÃO............................................................................................. 23
6.
REFERENCIAS BIBLIOGRÁFICAS........................................................... 25
7.
ANEXOS..................................................................................................... 26
7.1
Código do módulo transmissor.................................................... 26
7.2
Código do módulo receptor........................................................... 26
LISTA DE FIGURAS
Figura 1 – Esquema de funcionamento do GPS. Triangulação de sinais de
satélites.................................................................................................................... 6
Figura 2 – Equipamentos de visão artificial. Câmeras, controladores e
processadores......................................................................................................... 7
Figura 3 – Diagrama do projeto. Disposição dos transmissores e do receptor....... 8
Figura 4 – Arduino Duemilanove............................................................................. 9
Figura 5 – Circuito do módulo transmissor............................................................ 10
Figura 6 – Fluxograma do código do módulo transmissor..................................... 11
Figura 7 – Circuito do módulo receptor.................................................................. 12
Figura 8 – Sistema de coordenadas (x,y,z)........................................................... 14
Figura 9 – Diagrama que apresenta variação de x e y no cálculo dos
pontos.................................................................................................................... 15
Figura 10 – Diagrama de tempos com respectivas notações................................ 16
Figura 11 – Fluxograma do código do módulo receptor................................. 17
Figura 12 – Sinal de um transmissor ultrassom..................................................... 18
Figura 13 – Teste de distância: transmissores a 45, 90 e 120 cm.........................19
Figura 14 – Teste de distância: transmissores a 150, 180 e 200 cm.................... 19
Figura 15 – Teste de sincronização. Transmissores alinhados............................. 20
Figura 16 – Sinal de um transmissor e sua respectiva representação no módulo
receptor.................................................................................................................. 21
Figura 17 – Resposta ao Arduino ao cálculo teórico............................................. 22
LISTA DE TABELAS
Tabela 1 – Resposta do algoritmo aos valores teóricos........................................ 22
1.
RESUMO
A fim de atender a demanda de sistemas de orientação em espaços
reduzidos, o projeto propõe a utilização de sinais de ultrassom como parâmetro
para a determinação da posição de um objeto. Para tal resultado, utilizam-se três
transmissores e um receptor para comunicação e um sistema numérico para
cálculo da posição.
2.
INTRODUÇÃO
Nos últimos anos, inúmeros projetos de automação doméstica tem sido
desenvolvidos para emular, através de robôs, ações comumente efetuadas por
seres humanos.
Um dos desafios para tal propósito é o desenvolvimento de sistemas de
orientação. O sistema de orientação mais empregado é o GPS (Global
Positioning System), mas, em ambientes reduzidos, tal técnica não pode ser
utilizada devido a limitações de ordem de precisão e tempo de resposta dos
produtos comerciais.
Figura 1 – Esquema de funcionamento do GPS. Triangulação de sinais de
satélites
Assim, surgiram outras soluções, como o desenvolvimento de projetos de
visão artificial e softwares de reconhecimento de imagens. Ora, com a tecnologia
cada vez mais avançada de câmeras e processadores que garantem a eficácia de
algoritmos complexos, um grande avanço pode ser detectado nessa área, embora
o custo para o emprego dessas técnicas ainda seja elevado.
Figura 2 – Equipamentos de visão artificial. Câmeras, controladores e
processadores
Por isso, este projeto propõe a utilização de sinais de ultrassom com caráter
periódico a fim de o módulo receptor posicionar-se no espaço em que está
alocado.
Utilizando três transmissores dispostos em um ambiente, cujo sincronismo
de transmissão é controlado por um microcontrolador Arduino, e um receptor que,
ao captar os sinais transmite-os para outro Arduino que, conhecendo o período
entre cada transmissão e a velocidade de propagação da onda sonora consegue
desenvolver um cálculo capaz de aproximar teoricamente o valor obtido.
O projeto apresenta uma solução de custo inferior, porém precisão superior
ao GPS em espaços reduzidos.
T
T
Receptor
T
Figura 3 – Diagrama do projeto. Disposição dos transmissores e do receptor
Entre as aplicações possíveis estão o posicionamento de um produto em
uma planta industrial, um objeto que deseja-se encontrar em um ambiente ou
ainda, partindo-se do princípio que se conhece a posição de um móvel ao qual o
módulo receptor está acoplado, utilizar o sistema de posicionamento para transitar
com o objeto guiando-o através de comandos de coordenadas, por exemplo.
Ainda, é possível aplicar tal sistema em outras atividades onde sejam
necessárias as atividades de monitoramento e controle de objetos, produtos e
equipamentos.
O conteúdo deste documento está dividido em três itens. No primeiro deles,
no Detalhamento do Projeto, estão contidas as descrições dos módulos –
transmissor e receptor - e do código embarcado no microcontrolador. No item
Procedimentos de Teste e Validação do projeto serão apresentados os resultados
obtidos para cada módulo individualmente assim como o resultado final dos
módulos integrados .
Por último, será apresentada a conclusão sobre a realização deste projeto.
3.
DETALHAMENTO DO PROJETO
3.1
Módulo Transmissor
O módulo transmissor é composto por um microcontrolador Arduino
Duemilanove e por três emissores de ultrassom.
Figura 4 – Arduino Duemilanove
O microcontrolador é responsável pelo sincronismo dos transmissores. Com
o código embarcado e com três de suas saídas conectadas à alimentação dos
emissores, permite-se controlar a transmissão periódica dos sinais de ultrassom.
O Arduino ativa uma das saídas por 100 milissegundos a cada segundo.
Desse modo, cada transmissor efetua um pulso na frequencia de 40khz
sincronizado com a saída do Arduino. Após a transmissão dos três sinais, o
microcontrolador aguarda três segundos – tempo necessário para o cálculo e
visualização do resultado no módulo receptor – até que um novo ciclo seja
iniciado.
Figura 5 – Circuito do módulo transmissor
3.1.1 Código embarcado
O código embarcado no módulo transmissor serve como controlador das
transmissões dos emissores, dando a elas caráter periódico.
Utilizando a função delay() da biblioteca base do Arduino, inclui-se
facilmente os intervalos entre cada transmissão. O acionamento das portas de
saída é feito através da função digitalWrite(bit,level), tal que bit é a porta que
deseja-se ativar e level como o nível do sinal que deseja-se aplicar, HIGH (alto –
nível lógico 1) ou LOW (baixo – nível lógico 0).
O código completo embarcado no módulo transmissor encontra-se nos
Anexos.
3.1.1.1
Fluxograma
Inicio
Configura portas
Ativa
TRANSMISSOR1
Aguarda 5
microssegundos
Aguarda 1
segundo
Desativa
TRANSMISSOR1
Ativa
TRANSMISSOR2
Aguarda 5
microssegundos
Desativa
TRANSMISSOR2
Aguarda 1
segundo
Ativa
TRANSMISSOR3
Aguarda 5
microssegundos
Desativa
TRANSMISSOR2
Aguarda 5
segundos
Figura 6 – Fluxograma do código do módulo transmissor
3.2
Módulo Receptor
O módulo receptor é constituído de um transdutor, que irá coletar os sinais
provenientes dos módulos transmissores, conectado a um microcontrolador
Arduino. É inerente ao transdutor a amplificação do sinal, o que resulta em um
sinal digital de qualidade.
Utilizando uma entrada digital do Arduino, permite-se verificar se a porta
está em nível lógico 1 ou 0 (verdadeiro ou falso – em eletrônica, nível alto ‘HIGH’
ou baixo ‘LOW’).
Quando um sinal é detectado, armazena-se o instante de tempo que o
evento ocorreu. Depois de recebidos os três pulsos, inicia-se o processo de
cálculo da posição baseado na diferença de tempo entre cada recepção.
Os valores das coordenadas obtidas são apresentados em um display do
tipo 16X2 (16 colunas x 2 linhas). Para a representação dos valores no dispay
utilizou-se as funções da biblioteca LiquidCrystal, contida no próprio pacote básico
do Arduino.
Figura 7 – Circuito do módulo receptor
3.2.1 Código embarcado
O código embarcado no módulo receptor é baseado em alguns
princípios básicos:
3.1.1.1
A velocidade é conhecida
A equação 20,04√T m/s descreve a velocidade de propagação
da onda longitudinal, tal que T é a temperatura absoluta do ambiente
em Kelvin.
Conforme fornecido pelo Simepar (Sistema Meteorológico do
Paraná), a temperatura média no verão de Curitiba é de 25ºC, o que
corresponde a 294,15K. Assim, admite-se que a velocidade de
propagação do sinal é de 343.7020667 m/s.
3.1.1.2
A distância entre transmissor e receptor pode ser
determinada
Em primeiro lugar deve ser determinada uma unidade para a
métrica. Neste projeto, a unidade adotada foi o metro. A escolha foi
feita para evitar conversões da unidade de velocidade.
A unidade de distância é importante pois é ela quem define a
variação ao qual o módulo receptor está submetido, além de servir
como parâmetro de um sistema de coordenadas.
Assim, adota-se um sistema de coordenadas cujo ponto (0,0)
está localizado sobre o transmissor T1, a sua direita encontram-se os
valores positivos de x, a sua frente os valores positivos de y e sobre
ele os valores positivos de z. Com base nisso utiliza-se a equação de
distância proveniente da Geometria Analítica para calcular a
distância entre transmissor e receptor.
d = √x²+y²+z²
(1)
Tal que d é o vetor distância, e x, y e z são as coordenadas do
receptor.
(0,0,z)
d
(x,0,0)
(0,0,0)
(0,y,0)
P=(x,y,z)
Figura 8 – Sistema de coordenadas (x,y,z)
3.1.1.3
O tempo de propagação pode ser determinado
Através da equação t = l .
c
Onde:
l = Distância entre o receptor e o transmissor;
t = Variação de tempo entre a transmissão e a chegada
c = Velocidade de propagação da onda longitudinal.
Determina-se teoricamente o tempo necessário para o sinal
propagar-se do transmissor ao receptor.
Ainda, gravando em uma variável o instante de tempo (em
microssegundos – função micros()) em que ocorreu uma recepção e
obtendo as variações entre as recepções (subtração simples entre o tempo
da segunda recepção e o tempo da primeira recepção) procura-se, através
dos cálculos teóricos, a localização do receptor.
Ora,
sabe-se que cada ponto no
plano
R³ (espaço
compreendido entre os vetores x, y e z) possui valores singulares de T1 e
T2 (variação entre primeira e segunda recepção = T1 e variação entre a
segunda e a terceira recepção = T2). Assim, a partir do ponto central (0.5,
0.5, 1) calcula-se os tempos T1 e T2 dos pontos a sua volta (inclusive os
valores do próprio ponto) e, encontrando-se um ponto cuja diferença entre
os valores calculados e teóricos seja mínima adota-se este ponto como o
mais próximo da localização real.
(x,y+∆)
(x-∆,y+∆)
(x+∆,y+∆)
(x,y)
(x-∆,y)
(x+∆,y)
(x-∆,y-∆)
(x+∆,y-∆)
(x,y-∆)
Figura 9 – Diagrama que apresenta variação de x e y no cálculo dos pontos
A fórmula utilizada para verificar o melhor resultado entre os pontos é
apresentada abaixo:
tempoParametro = (tempoCalculado2 + 1) – deltaReal
(2)
tempoCalculado = | tempoParametro – tempoCalculado1 |
(3)
Tal que:
tempoParametro = tempo usado como parâmetro – une tempo
teórico e tempo real;
tempoCalculado2 = tempo de propagação do sinal a partir de um
transmissor, segunda chegada;
deltaReal = intervalo de tempo entre recepções de dois sinais obtidos
através do receptor;
tempoCalculado = valor final usado como margem de erro;
tempoCalculado1 = tempo de propagação do sinal a partir de um
receptor, primeira chegada;
Os valores acima podem ser representados a partir da imagem
abaixo:
Tempo de propagação
Intervalo entre recepções
1 segundo = período
Tempo de propagação
Figura 10 – Diagrama de tempos com respectivas notações
Os tempos de propagação são obtidos teoricamente utilizando a
expressão
(1)
e
nas
funções
(2)
e
(3)
são
mostrados
como
tempoCalculado1 e tempoCalculado2. O período é conhecido e deve ser
sincronizado no receptor caso haja alguma alteração no módulo
transmissor. O intervalo entre recepções é o valor obtido na prática e nas
funções acima é denominado de deltaReal.
Assim, utilizam-se valores teóricos e reais como parâmetro para
determinação da posição mais próxima da real.
No ponto onde a variação seja mínima, determina-se este como
melhor solução.
Por último, apresenta-se o resultado obtido em um display do
tipo 16X2, cuja implementação utilizou a biblioteca LiquidCristal do Arduino.
3.1.1.4
Fluxograma
Inicio
Configura
display
Configura portas
S
Armazena
tempo
Aguarda
recepção
Recepção Ok?
N
S
Aguarda
recepção
Recepção Ok?
Armazena
tempo
N
S
Armazena
tempo
Recepção Ok?
Aguarda
recepção
Calcula posição
N
Apresenta
resultado
Figura 11 – Fluxograma do código do módulo receptor
4.
PROCEDIMENTOS DE TESTE E VALIDAÇÃO DO PROJETO
4.1
Transdutores
Para efeitos de teste, conectou-se os transdutores (transmissor e
receptor) à alimentação de 5V CC para observar a amplitude e a frequência do
sinal. Nesse teste, os três transmissores e o receptor apresentaram resultados
satisfatórios até a distância de dois metros, mais do que o valor máximo
necessário para o projeto (1,732m diagonal de um cubo de 1 metro de aresta).
Figura 12 – Sinal de um transmissor ultrassom
Figura 13 – Teste de distância: transmissores a 45, 90 e 120 cm
Figura 14 – Teste de distância: transmissores a 150, 180 e 200 cm
4.2
Módulo Transmissor
Cabe ao módulo transmissor enviar os sinais de maneira
sincronizada e adequada, respeitando os intervalos de tempo e garantindo
que o módulo receptor possa interpretar os sinais corretamente.
A imagem abaixo mostra os três transmissores alinhados enviando
os sinais a cada um segundo. Conforme apresentado, os tempos estão
sendo respeitados.
Figura 15 – Teste de sincronização. Transmissores alinhados
4.3
Módulo Receptor
Conforme pode-se concluir das imagens acima, o receptor consegue
capturar os sinais transmitidos a uma distância superior a requisitada pelo
projeto. Além disso, responde com tal amplitude que o microncontrolador é
capaz de interpretar o sinal pela sua entrada digital, como é apresentado
pela imagem abaixo:
Figura 16 – Sinal de um transmissor e sua respectiva representação no
módulo receptor
4.3
Código embarcado: Cálculo de posição
4.3.1 Resposta Teórica
Para testar a eficiência do algoritmo no cálculo da
posição, calculou-se teoricamente os intervalos de tempo T1 e T2 de
certas coordenadas e, aplicando os valores obtidos como resposta
como base de cálculo do algoritmo, esperou-se que o código fosse
capaz de realizar a operação inversa e retornar as coordenadas
utilizadas como parâmetro.
Ainda, utilizou-se a função millis() da biblioteca Time do
Arduino para calcular o tempo necessário para o algoritmo efetuar a
operação.
Figura 17 – Resposta ao Arduino ao cálculo teórico
A tabela abaixo apresenta os resultados obtidos pelo algoritmo
no cálculo da posição com base nos intervalos de tempo.
ALGORITMO DE CÁLCULO DE POSIÇÃO
TEÓRICO
X
0,01
0,15
0,25
0,30
0,45
0,62
0,71
0,99
CALCULADO
Y
0,01
0,15
0,25
0,70
0,90
0,43
0,88
0,99
X
0,24
0,24
0,24
0,25
0,40
0,68
0,77
1,00
Y
0,24
0,24
0,24
0,75
0,60
0,32
0,77
1,00
ERRO
TEMPO DE RESPOSTA
0,06
0,03
0,00
0,02
0,19
0,00
0,03
0,01
0,04
0,169
0,172
0,17
0,161
0,081
0,123
0,171
0,292
0,167
Tabela 1 – Resposta do algoritmo aos valores teóricos
4.3.2 Resposta Prática
Com cada módulo funcionando a contento individualmente,
uniram-se eles a fim de testar efetivamente o funcionamento do
projeto.
Infelizmente, o resultado final não foi o esperado. Os intervalos
de tempo não condisseram com o valor teórico, e como o cerne do
projeto baseia-se nestes intervalos de tempo, o cálculo da posição
não pode ser realizado corretamente.
5.
CONCLUSÃO
Em primeiro lugar, é importante ressaltar os grandes avanços obtidos após
a alteração dos componentes. Alterando o microncontrolador MSP430 pelo
Arduino obteve-se grande avanço não apenas na facilidade de programação, mas
também no tempo de resposta para o cálculo, na possibilidade da utilização de
bibliotecas próprias para utilização do display e em determinados comandos que
reduziram em muito o tempo gasto na resolução de problemas.
Ainda, a utilização de módulos de ultrassom prontos em substituição ao
modelo que estava sendo desenvolvido respondeu a outro grande avanço. O
circuito anteriormente proposto apresenta falhas graves de resposta, devido á
grande atenuação que ocorria e pela saturação, quando aumentava-se a
alimentação dos amplificadores para obter uma solução ao problema anterior.
Além disso, havia muito consumo de energia e a necessidade de diversas fontes
de alimentação para fornecer a tensão eficaz para cada tipo de componente era
inconveniente.
Por conta disso, perdeu-se uma quantidade generosa de tempo buscando
soluções para esses problemas, que foram resolvidos quando optou-se pela
alteração quase total dos elementos do projeto.
O projeto na configuração atual apresenta grandes melhorias em relação ao
layout anterior, embora, no teste final, os resultados tenham-se apresentados
insatisfatórios.
Como descrito anteriormente, os intervalos de tempo recebidos não
condizem com o esperado valor teórico. Isto implica na impossibilidade do
algoritmo resolver adequadamente o cálculo.
A princípio, acreditou-se que o erro estava no fato do código ser baseado
em pulling e, por isso, o intervalo de tempo entre cada verificação na porta de
entrada implicava em perda de precisão. Assim, buscou-se introduzir a técnica de
interrupção, de forma a diminuir a margem de erro na recepção dos sinais.
No Arduino, existe uma função denominada attachInterrupt() que pode ser
configurada para ser ativada a cada rampa de subida, de descida ou de alteração
no estado de uma porta de entrada. Esta função, quando ativada, seria
responsável por armazenar o instante de tempo entre cada recepção, visto que
cada rampa de subida geraria uma interrupção.
De fato, acreditou-se que a utilização desta função resolveria o problema, já
que durante os anos a utilização de interrupções foi vastamente explorada e com
diversos cases de sucesso. Mas, por conta de características intrínsecas ao
receptor e ao Arduino, esta opção acabou sendo descartada na fase de testes ao
gerar interrupções mesmo quando não havia dados sendo coletados.
Outra proposta foi de reduzir os períodos de ativação do sinal e dos
intervalos entre cada transmissão, a fim de reduzir a margem de erro que tempos
na ordem de milissegundos poderiam gerar. Infelizmente os testes acabaram
mostrando que o receptor não interpretava pulsos muito velozes dos
transmissores e ainda, a faixa de ativação que é interpretada está na casa dos
100 milissegundos. Por conta disso, novamente optou-se por utilizar um período
de 100 milissegundos e um segundo entre cada transmissão. Este último poderia
ser reduzido, mas para efeitos de facilidade de cálculo manteve-se este tempo.
Além disso, mostrou-se que o Arduino, mesmo com a utilização de variáveis
de 4 bytes (double e float), “cortava” os valores e reduzia a precisão. Por conta
disso, modificou-se o código afim de utilizar os valores em microssegundos (que
poderiam ser armazenados em variáveis do tipo unsigned long, sem perda de
dados) para que a precisão pudesse ser elevada. Ainda assim, os resultados
foram insatisfatórios pois, agora utilizando valores de ordem maior os erros, além
de permanecerem, ainda foram propagados.
Essas entre outras intempéries minaram a conclusão total do projeto, e
embora muitos problemas tenham sido solucionados ao longo do caminho este
último, e mais importante, não pode ser resolvido.
Mesmo com tudo isso, o saldo do projeto é positivo, visto que foram
incluídos conhecimentos em programação em dois processadores, conhecimentos
de eletrônica e outros conhecimentos gerais, como o de geometria, por exemplo.
6.
REFERÊNCIAS BIBLIOGRÁFICAS
Barone M.Jr., Álgebra Linear, 3a ed. IME-USP,1988.
Fossen, Thor I., Guidance and Control of Ocean Vehicles, University of Trondheim,
Noruega. John Wiley & Sons, 1994.
Gribbon, K.T., Johnston, C.T., Bailey, D.G., A Real-time FPGA Implementation of a
Barrel Distortion Correction Algorithm with Bilinear Interpolation, Proceedings of
Image and Vision Computing New Zealand, Palmerston North, New Zealand, pp
408-413, Novembro, 2003.
Nippon Ceramic, <www.nicera.co.jp>, Acesso em 23 de dezembro de 2004.
Santos, A. O. et al., Sensor ultra-sônico para determinação de posição de modelo
em escala reduzida em tanque de provas, Congresso da Sociedade Brasileira de
Engenharia Naval (Sobena), 2004.
Tannuri, E. A., Morishita, H. M., Lago, G. A., Veras, V. L. M., Critical analysis of
control and filtering algorithms used in real dynamic positioning systems, 24nd
International Conference on Offshore Mechanics and Arctic Engineering, OMAE,
2005.
Véras, V.L.M., Simulação e Análise de Sistema de Posicionamento Dinâmico, XIX
Congresso Pan-Americano de Engenharia Naval, Transporte Marítimo e
Engenharia Portuária XIX COPINAVAL, Guayaquil, Equador, 2005.
7.
ANEXOS
7.1
Código do módulo transmissor
int TRANSMISSOR1=13;
int TRANSMISSOR2=12;
int TRANSMISSOR3=11;
void setup(){
pinMode(TRANSMISSOR1, OUTPUT);
pinMode(TRANSMISSOR2, OUTPUT);
pinMode(TRANSMISSOR3, OUTPUT);
}
void loop(){
digitalWrite(TRANSMISSOR1, HIGH);
// sets the LED on
delay(100);
digitalWrite(TRANSMISSOR1, LOW);
// sets the LED off
delay(1000);
// waits for a second
digitalWrite(TRANSMISSOR2, HIGH);
// sets the LED on
delay(100);
digitalWrite(TRANSMISSOR2, LOW);
// sets the LED off
delay(1000);
// waits for a second
digitalWrite(TRANSMISSOR3, HIGH);
delay(100);
digitalWrite(TRANSMISSOR3, LOW);
delay(5000);
7.2
// sets the LED on
// sets the LED off
// waits for five seconds
Código do módulo receptor
#include <Time.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//posicao inicial
float bx=0.5, by=0.5;
//velocidade de propagação do sinal em microssegundos
//Com a temperatura média de Curitiba no verão
double v=343.7020667;
//variação de valor aceitável de posicão
float delta=0.01;
//variação aceitável de tempo
float deltaT=0.001;
//Variaveis para calculo de variação do tempo
double x=0,y=0;
//Vetor de variação de tempo
double menor[9];
//Menor valor do vetor
double m;
//Indice do vetor cujo menor valor está alocado
int n;
double T1, T2;
float parametro=0;
void setup(){
lcd.begin(16, 2);
Serial.begin(9600);
pinMode(7, INPUT);
}
void loop(){
PEGAPOSICAO:
lcd.setCursor(0, 0);
lcd.print("
lcd.setCursor(0, 0);
lcd.print("START");
bx=0.5, by=0.5;
x=0,y=0;
double temp, first;
");
double tempos[3];
PRIMEIRA_RECEPCAO:
if(!digitalRead(7))
goto PRIMEIRA_RECEPCAO;
else{
tempos[0]=micros();
first=tempos[0];
}
SEGUNDA_RECEPCAO:
if(!digitalRead(7))
goto SEGUNDA_RECEPCAO;
else{
temp=micros();
if((first+1500000) < temp){
tempos[0]=temp;
first=tempos[0];
goto SEGUNDA_RECEPCAO;
}
else{
if((temp-first) > 100000){
tempos[1]=temp;
}
else
goto SEGUNDA_RECEPCAO;
}
}
TERCEIRA_RECEPCAO:
if(!digitalRead(7))
goto TERCEIRA_RECEPCAO;
else{
temp=micros();
if((tempos[1]+1500000) < temp){
tempos[0]=temp;
first=tempos[0];
goto SEGUNDA_RECEPCAO;
}
else{
if((temp-tempos[1]) > 100000){
tempos[2]=temp;
}
else
goto TERCEIRA_RECEPCAO;
}
}
tempos[0] = tempos[0]/1000000;
tempos[1] = tempos[1]/1000000;
tempos[2] = tempos[2]/1000000;
T1 = (tempos[1] - tempos[0]);
T2 = (tempos[2] - tempos[1]);
lcd.setCursor(0, 0);
lcd.print("
");
lcd.setCursor(0, 0);
lcd.print("T1=");
lcd.print(T1);
lcd.setCursor(0, 1);
lcd.print("
lcd.setCursor(0, 1);
lcd.print("T2=");
lcd.print(T2);
delay(3000);
if(T1 == T2)
");
goto IMPRIMEPOSICAO;
parametro=(calculaTempo1(bx,by,v,T1)
+
calculaTempo2(bx,by,v,T2));
CALCULAPOSICAO:
x=calculaTempo1(bx,by+delta,v,T1);
y=calculaTempo2(bx,by+delta,v,T2);
menor[0]=(x+y);
/*lcd.setCursor(0, 0);
lcd.print("
");
lcd.setCursor(0, 0);
lcd.print("1=");
lcd.print(menor[0]);*/
x=calculaTempo1(bx-delta,by+delta,v,T1);
y=calculaTempo2(bx-delta,by+delta,v,T2);
menor[1]=(x+y);
/*lcd.setCursor(0, 1);
lcd.print("
");
lcd.setCursor(0, 1);
lcd.print("2=");
lcd.print(menor[1]);
delay(2000);*/
x=calculaTempo1(bx-delta,by,v,T1);
y=calculaTempo2(bx-delta,by,v,T2);
menor[2]=(x+y);
/*lcd.setCursor(0, 0);
lcd.print("
");
lcd.setCursor(0, 0);
lcd.print("3=");
lcd.print(menor[2]);*/
x=calculaTempo1(bx-delta,by-delta,v,T1);
y=calculaTempo2(bx-delta,by-delta,v,T2);
menor[3]=(x+y);
/*lcd.setCursor(0, 1);
lcd.print("
");
lcd.setCursor(0, 1);
lcd.print("4=");
lcd.print(menor[3]);
delay(2000);*/
x=calculaTempo1(bx,by-delta,v,T1);
y=calculaTempo2(bx,by-delta,v,T2);
menor[4]=(x+y);
/*lcd.setCursor(0, 0);
lcd.print("
");
lcd.setCursor(0, 0);
lcd.print("5=");
lcd.print(menor[4]);*/
x=calculaTempo1(bx+delta,by-delta,v,T1);
y=calculaTempo2(bx+delta,by-delta,v,T2);
menor[5]=(x+y);
/*lcd.setCursor(0, 1);
lcd.print("
");
lcd.setCursor(0, 1);
lcd.print("6=");
lcd.print(menor[5]);
delay(2000);*/
x=calculaTempo1(bx+delta,by,v,T1);
y=calculaTempo2(bx+delta,by,v,T2);
menor[6]=(x+y);
/*lcd.setCursor(0, 0);
lcd.print("
lcd.setCursor(0, 0);
lcd.print("7=");
");
lcd.print(menor[6]);*/
x=calculaTempo1(bx+delta,by+delta,v,T1);
y=calculaTempo2(bx+delta,by+delta,v,T2);
menor[7]=(x+y);
/*lcd.setCursor(0, 1);
lcd.print("
");
lcd.setCursor(0, 1);
lcd.print("8=");
lcd.print(menor[7]);
delay(2000);*/
x=calculaTempo1(bx,by,v,T1);
y=calculaTempo2(bx,by,v,T2);
menor[8]=(x+y);
/*lcd.setCursor(0, 0);
lcd.print("
lcd.setCursor(0, 0);
lcd.print("9=");
lcd.print(menor[8]);*/
m=menor[0];
for(int i=0;i<9;i++){
if(menor[i]<m){
m=menor[i];
n=i;
}
}
if(n == 0){
by+=delta;
}
else if(n == 1){
");
bx-=delta;
by+=delta;
}
else if(n == 2){
bx-=delta;
}
else if(n == 3){
bx-=delta;
by-=delta;
}
else if(n == 4){
by-=delta;
}
else if(n == 5){
bx+=delta;
by-=delta;
}
else if(n == 6){
bx+=delta;
}
else if(n == 7){
bx+=delta;
by+=delta;
}
else if(n == 8){
goto IMPRIMEPOSICAO;
}
if(((calculaTempo1(bx,by,v,T1)
calculaTempo2(bx,by,v,T2))) < deltaT){
goto CALCULAPOSICAO;
}
else
goto IMPRIMEPOSICAO;
IMPRIMEPOSICAO:
//IMPRIMEPOSICAO
lcd.setCursor(0, 1);
lcd.print("
");
lcd.setCursor(0, 1);
lcd.print("X=");
lcd.print(bx);
lcd.print(" Y=");
lcd.print(by);
delay(2000);
goto PEGAPOSICAO;
}
double calculaTempo1(float x, float y, double v, double T1){
//TRÊS DIMENSÕES
double distanciaA = sqrt((x*x)+(y*y)+1);
double tempoA = (distanciaA/v);
//TRÊS DIMENSÕES
double distanciaB = sqrt(((1-x)*x)+(y*y)+1);
double tempoB = (distanciaB/v);
double tempo=(tempoB+1)-T1;
+
tempo = fabs(tempo-tempoA);
return tempo;
}
double calculaTempo2(float x, float y, double v, double T2){
//TRÊS DIMENSÕES
double distanciaB = sqrt(((1-x)*x)+(y*y)+1);
double tempoB = (distanciaB/v);
//TRÊS DIMENSÕES
double distanciaC = sqrt(((1-x)*x)+((1-y)*y)+1);
double tempoC = (distanciaC/v);
double tempo=(tempoC+1)-T2;
tempo = fabs(tempo-tempoB);
return tempo;
}
Download

Sistema de Localização por Ultrassom