Você está na página 1de 35

PONTIFCIA UNIVERSIDADE CATLICA DO PARAN

CURSO DE GRADUAO EM ENGENHARIA DE COMPUTAO

TIAGO AUGUSTO PERETTO

RELATRIO TCNICO FINAL


Projeto Banshee

CURITIBA
Dezembro de 2011

TIAGO AUGUSTO PERETTO

RELATRIO TCNICO FINAL


Projeto Banshee

Documento

referente

ao

projeto

BANSHEE que dever ser entregue


como avaliao final da disciplina
Projeto Final do 10 (dcimo) perodo
de Engenharia de Computao da
Pontifcia Universidade Catlica 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

SUMRIO

LISTA DE FIGURAS.............................................................................................. iv
LISTA DE TABELAS.............................................................................................. v
1.

RESUMO....................................................................................................... 6

2.

INTRODUO.............................................................................................. 6

3.

DETALHAMENTO DO PROJETO................................................................ 9
3.1

Mdulo Transmissor........................................................................ 9

3.1.1 Cdigo embarcado......................................................................... 10


3.1.1.1
3.2

Fluxograma.................................................................. 11

Mdulo Receptor............................................................................ 12

3.2.1 Cdigo embarcado......................................................................... 13


3.1.1.1

A velocidade conhecida............................................ 13

3.1.1.2

A distncia entre transmissor e receptor pode ser

determinada................................................................................................ 13

4.

3.1.1.3

O tempo de propagao pode ser determinado.......... 14

3.1.1.4

Fluxograma.................................................................. 17

PROCEDIMENTOS DE TESTE E VALIDAO DO PROJETO................ 18


4.1

Transdutores........................................................................ 18

4.2

Mdulo Transmissor............................................................ 19

4.3

Mdulo Receptor.................................................................. 20

4.3

Cdigo embarcado: Clculo de posio............................ 21


4.3.1 Resposta Terica........................................................ 21
4.3.2 Resposta Prtica........................................................23

5.

CONCLUSO............................................................................................. 23

6.

REFERENCIAS BIBLIOGRFICAS........................................................... 25

7.

ANEXOS..................................................................................................... 26
7.1

Cdigo do mdulo transmissor.................................................... 26

7.2

Cdigo do mdulo receptor........................................................... 26

LISTA DE FIGURAS
Figura 1 Esquema de funcionamento do GPS. Triangulao de sinais de
satlites.................................................................................................................... 6
Figura 2 Equipamentos de viso artificial. Cmeras, controladores e
processadores......................................................................................................... 7
Figura 3 Diagrama do projeto. Disposio dos transmissores e do receptor....... 8
Figura 4 Arduino Duemilanove............................................................................. 9
Figura 5 Circuito do mdulo transmissor............................................................ 10
Figura 6 Fluxograma do cdigo do mdulo transmissor..................................... 11
Figura 7 Circuito do mdulo receptor.................................................................. 12
Figura 8 Sistema de coordenadas (x,y,z)........................................................... 14
Figura 9 Diagrama que apresenta variao de x e y no clculo dos
pontos.................................................................................................................... 15
Figura 10 Diagrama de tempos com respectivas notaes................................ 16
Figura 11 Fluxograma do cdigo do mdulo receptor................................. 17
Figura 12 Sinal de um transmissor ultrassom..................................................... 18
Figura 13 Teste de distncia: transmissores a 45, 90 e 120 cm.........................19
Figura 14 Teste de distncia: transmissores a 150, 180 e 200 cm.................... 19
Figura 15 Teste de sincronizao. Transmissores alinhados............................. 20
Figura 16 Sinal de um transmissor e sua respectiva representao no mdulo
receptor.................................................................................................................. 21
Figura 17 Resposta ao Arduino ao clculo terico............................................. 22

LISTA DE TABELAS
Tabela 1 Resposta do algoritmo aos valores tericos........................................ 22

1.

RESUMO
A fim de atender a demanda de sistemas de orientao em espaos

reduzidos, o projeto prope a utilizao de sinais de ultrassom como parmetro


para a determinao da posio de um objeto. Para tal resultado, utilizam-se trs
transmissores e um receptor para comunicao e um sistema numrico para
clculo da posio.

2.

INTRODUO
Nos ltimos anos, inmeros projetos de automao domstica tem sido

desenvolvidos para emular, atravs de robs, aes comumente efetuadas por


seres humanos.
Um dos desafios para tal propsito o desenvolvimento de sistemas de
orientao. O sistema de orientao mais empregado o GPS (Global
Positioning System), mas, em ambientes reduzidos, tal tcnica no pode ser
utilizada devido a limitaes de ordem de preciso e tempo de resposta dos
produtos comerciais.

Figura 1 Esquema de funcionamento do GPS. Triangulao de sinais de


satlites

Assim, surgiram outras solues, como o desenvolvimento de projetos de


viso artificial e softwares de reconhecimento de imagens. Ora, com a tecnologia
cada vez mais avanada de cmeras e processadores que garantem a eficcia de
algoritmos complexos, um grande avano pode ser detectado nessa rea, embora
o custo para o emprego dessas tcnicas ainda seja elevado.

Figura 2 Equipamentos de viso artificial. Cmeras, controladores e


processadores

Por isso, este projeto prope a utilizao de sinais de ultrassom com carter
peridico a fim de o mdulo receptor posicionar-se no espao em que est
alocado.
Utilizando trs transmissores dispostos em um ambiente, cujo sincronismo
de transmisso controlado por um microcontrolador Arduino, e um receptor que,
ao captar os sinais transmite-os para outro Arduino que, conhecendo o perodo
entre cada transmisso e a velocidade de propagao da onda sonora consegue
desenvolver um clculo capaz de aproximar teoricamente o valor obtido.
O projeto apresenta uma soluo de custo inferior, porm preciso superior
ao GPS em espaos reduzidos.

Receptor

T
Figura 3 Diagrama do projeto. Disposio dos transmissores e do receptor

Entre as aplicaes possveis esto o posicionamento de um produto em


uma planta industrial, um objeto que deseja-se encontrar em um ambiente ou
ainda, partindo-se do princpio que se conhece a posio de um mvel ao qual o
mdulo receptor est acoplado, utilizar o sistema de posicionamento para transitar
com o objeto guiando-o atravs de comandos de coordenadas, por exemplo.
Ainda, possvel aplicar tal sistema em outras atividades onde sejam
necessrias as atividades de monitoramento e controle de objetos, produtos e
equipamentos.
O contedo deste documento est dividido em trs itens. No primeiro deles,
no Detalhamento do Projeto, esto contidas as descries dos mdulos
transmissor e receptor - e do cdigo embarcado no microcontrolador. No item
Procedimentos de Teste e Validao do projeto sero apresentados os resultados
obtidos para cada mdulo individualmente assim como o resultado final dos
mdulos integrados .
Por ltimo, ser apresentada a concluso sobre a realizao deste projeto.

3.

DETALHAMENTO DO PROJETO

3.1

Mdulo Transmissor

O mdulo transmissor composto por um microcontrolador Arduino


Duemilanove e por trs emissores de ultrassom.

Figura 4 Arduino Duemilanove

O microcontrolador responsvel pelo sincronismo dos transmissores. Com


o cdigo embarcado e com trs de suas sadas conectadas alimentao dos
emissores, permite-se controlar a transmisso peridica dos sinais de ultrassom.
O Arduino ativa uma das sadas por 100 milissegundos a cada segundo.
Desse modo, cada transmissor efetua um pulso na frequencia de 40khz
sincronizado com a sada do Arduino. Aps a transmisso dos trs sinais, o
microcontrolador aguarda trs segundos tempo necessrio para o clculo e
visualizao do resultado no mdulo receptor at que um novo ciclo seja
iniciado.

Figura 5 Circuito do mdulo transmissor

3.1.1 Cdigo embarcado


O cdigo embarcado no mdulo transmissor serve como controlador das
transmisses dos emissores, dando a elas carter peridico.
Utilizando a funo delay() da biblioteca base do Arduino, inclui-se
facilmente os intervalos entre cada transmisso. O acionamento das portas de
sada feito atravs da funo digitalWrite(bit,level), tal que bit a porta que
deseja-se ativar e level como o nvel do sinal que deseja-se aplicar, HIGH (alto
nvel lgico 1) ou LOW (baixo nvel lgico 0).
O cdigo completo embarcado no mdulo 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 cdigo do mdulo transmissor

3.2

Mdulo Receptor

O mdulo receptor constitudo de um transdutor, que ir coletar os sinais


provenientes dos mdulos transmissores, conectado a um microcontrolador
Arduino. inerente ao transdutor a amplificao 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 nvel lgico 1 ou 0 (verdadeiro ou falso em eletrnica, nvel alto HIGH
ou baixo LOW).
Quando um sinal detectado, armazena-se o instante de tempo que o
evento ocorreu. Depois de recebidos os trs pulsos, inicia-se o processo de
clculo da posio baseado na diferena de tempo entre cada recepo.
Os valores das coordenadas obtidas so apresentados em um display do
tipo 16X2 (16 colunas x 2 linhas). Para a representao dos valores no dispay
utilizou-se as funes da biblioteca LiquidCrystal, contida no prprio pacote bsico
do Arduino.

Figura 7 Circuito do mdulo receptor

3.2.1 Cdigo embarcado


O cdigo embarcado no mdulo receptor baseado em alguns
princpios bsicos:

3.1.1.1

A velocidade conhecida

A equao 20,04T m/s descreve a velocidade de propagao


da onda longitudinal, tal que T a temperatura absoluta do ambiente
em Kelvin.
Conforme fornecido pelo Simepar (Sistema Meteorolgico do
Paran), a temperatura mdia no vero de Curitiba de 25C, o que
corresponde a 294,15K. Assim, admite-se que a velocidade de
propagao do sinal de 343.7020667 m/s.

3.1.1.2

A distncia entre transmissor e receptor pode ser

determinada

Em primeiro lugar deve ser determinada uma unidade para a


mtrica. Neste projeto, a unidade adotada foi o metro. A escolha foi
feita para evitar converses da unidade de velocidade.
A unidade de distncia importante pois ela quem define a
variao ao qual o mdulo receptor est submetido, alm de servir
como parmetro 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 equao de
distncia proveniente da Geometria Analtica para calcular a
distncia entre transmissor e receptor.
d = x+y+z

(1)

Tal que d o vetor distncia, e x, y e z so as coordenadas do


receptor.

(0,0,z)

(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 propagao pode ser determinado

Atravs da equao t = l .
c
Onde:
l = Distncia entre o receptor e o transmissor;
t = Variao de tempo entre a transmisso e a chegada
c = Velocidade de propagao da onda longitudinal.

Determina-se teoricamente o tempo necessrio para o sinal


propagar-se do transmissor ao receptor.
Ainda, gravando em uma varivel o instante de tempo (em
microssegundos funo micros()) em que ocorreu uma recepo e
obtendo as variaes entre as recepes (subtrao simples entre o tempo
da segunda recepo e o tempo da primeira recepo) procura-se, atravs
dos clculos tericos, a localizao do receptor.

Ora,

sabe-se que cada ponto no

plano

R (espao

compreendido entre os vetores x, y e z) possui valores singulares de T1 e


T2 (variao entre primeira e segunda recepo = T1 e variao entre a
segunda e a terceira recepo = 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 prprio ponto) e, encontrando-se um ponto cuja diferena entre
os valores calculados e tericos seja mnima adota-se este ponto como o
mais prximo da localizao real.
(x,y+)

(x-,y+)

(x+,y+)

(x,y)
(x-,y)

(x+,y)

(x-,y-)

(x+,y-)
(x,y-)

Figura 9 Diagrama que apresenta variao de x e y no clculo dos pontos

A frmula 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 parmetro une tempo
terico e tempo real;
tempoCalculado2 = tempo de propagao do sinal a partir de um
transmissor, segunda chegada;
deltaReal = intervalo de tempo entre recepes de dois sinais obtidos
atravs do receptor;

tempoCalculado = valor final usado como margem de erro;


tempoCalculado1 = tempo de propagao do sinal a partir de um
receptor, primeira chegada;
Os valores acima podem ser representados a partir da imagem
abaixo:

Tempo de propagao
Intervalo entre recepes

1 segundo = perodo

Tempo de propagao

Figura 10 Diagrama de tempos com respectivas notaes

Os tempos de propagao so obtidos teoricamente utilizando a


expresso

(1)

nas

funes

(2)

(3)

so

mostrados

como

tempoCalculado1 e tempoCalculado2. O perodo conhecido e deve ser


sincronizado no receptor caso haja alguma alterao no mdulo
transmissor. O intervalo entre recepes o valor obtido na prtica e nas
funes acima denominado de deltaReal.
Assim, utilizam-se valores tericos e reais como parmetro para
determinao da posio mais prxima da real.
No ponto onde a variao seja mnima, determina-se este como
melhor soluo.
Por ltimo, apresenta-se o resultado obtido em um display do
tipo 16X2, cuja implementao utilizou a biblioteca LiquidCristal do Arduino.

3.1.1.4

Fluxograma
Inicio

Configura
display

Configura portas

Armazena
tempo

Aguarda
recepo

Recepo Ok?

Aguarda
recepo

Recepo Ok?

Armazena
tempo

Armazena
tempo

Recepo Ok?

Aguarda
recepo

Calcula posio
N

Apresenta
resultado
Figura 11 Fluxograma do cdigo do mdulo receptor

4.

PROCEDIMENTOS DE TESTE E VALIDAO DO PROJETO


4.1

Transdutores
Para efeitos de teste, conectou-se os transdutores (transmissor e

receptor) alimentao de 5V CC para observar a amplitude e a frequncia do


sinal. Nesse teste, os trs transmissores e o receptor apresentaram resultados
satisfatrios at a distncia de dois metros, mais do que o valor mximo
necessrio 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 distncia: transmissores a 45, 90 e 120 cm

Figura 14 Teste de distncia: transmissores a 150, 180 e 200 cm

4.2

Mdulo Transmissor
Cabe ao mdulo transmissor enviar os sinais de maneira

sincronizada e adequada, respeitando os intervalos de tempo e garantindo


que o mdulo receptor possa interpretar os sinais corretamente.

A imagem abaixo mostra os trs transmissores alinhados enviando


os sinais a cada um segundo. Conforme apresentado, os tempos esto
sendo respeitados.

Figura 15 Teste de sincronizao. Transmissores alinhados

4.3

Mdulo Receptor
Conforme pode-se concluir das imagens acima, o receptor consegue

capturar os sinais transmitidos a uma distncia superior a requisitada pelo


projeto. Alm 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 representao no


mdulo receptor

4.3

Cdigo embarcado: Clculo de posio


4.3.1 Resposta Terica
Para testar a eficincia do algoritmo no clculo da

posio, calculou-se teoricamente os intervalos de tempo T1 e T2 de


certas coordenadas e, aplicando os valores obtidos como resposta
como base de clculo do algoritmo, esperou-se que o cdigo fosse
capaz de realizar a operao inversa e retornar as coordenadas
utilizadas como parmetro.
Ainda, utilizou-se a funo millis() da biblioteca Time do
Arduino para calcular o tempo necessrio para o algoritmo efetuar a
operao.

Figura 17 Resposta ao Arduino ao clculo terico

A tabela abaixo apresenta os resultados obtidos pelo algoritmo


no clculo da posio com base nos intervalos de tempo.

ALGORITMO DE CLCULO DE POSIO


TERICO
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 tericos

4.3.2 Resposta Prtica


Com cada mdulo funcionando a contento individualmente,
uniram-se eles a fim de testar efetivamente o funcionamento do
projeto.
Infelizmente, o resultado final no foi o esperado. Os intervalos
de tempo no condisseram com o valor terico, e como o cerne do
projeto baseia-se nestes intervalos de tempo, o clculo da posio
no pode ser realizado corretamente.

5.

CONCLUSO
Em primeiro lugar, importante ressaltar os grandes avanos obtidos aps

a alterao dos componentes. Alterando o microncontrolador MSP430 pelo


Arduino obteve-se grande avano no apenas na facilidade de programao, mas
tambm no tempo de resposta para o clculo, na possibilidade da utilizao de
bibliotecas prprias para utilizao do display e em determinados comandos que
reduziram em muito o tempo gasto na resoluo de problemas.
Ainda, a utilizao de mdulos de ultrassom prontos em substituio ao
modelo que estava sendo desenvolvido respondeu a outro grande avano. O
circuito anteriormente proposto apresenta falhas graves de resposta, devido
grande atenuao que ocorria e pela saturao, quando aumentava-se a
alimentao dos amplificadores para obter uma soluo ao problema anterior.
Alm disso, havia muito consumo de energia e a necessidade de diversas fontes
de alimentao para fornecer a tenso eficaz para cada tipo de componente era
inconveniente.
Por conta disso, perdeu-se uma quantidade generosa de tempo buscando
solues para esses problemas, que foram resolvidos quando optou-se pela
alterao quase total dos elementos do projeto.

O projeto na configurao atual apresenta grandes melhorias em relao ao


layout anterior, embora, no teste final, os resultados tenham-se apresentados
insatisfatrios.
Como descrito anteriormente, os intervalos de tempo recebidos no
condizem com o esperado valor terico. Isto implica na impossibilidade do
algoritmo resolver adequadamente o clculo.
A princpio, acreditou-se que o erro estava no fato do cdigo ser baseado
em pulling e, por isso, o intervalo de tempo entre cada verificao na porta de
entrada implicava em perda de preciso. Assim, buscou-se introduzir a tcnica de
interrupo, de forma a diminuir a margem de erro na recepo dos sinais.
No Arduino, existe uma funo denominada attachInterrupt() que pode ser
configurada para ser ativada a cada rampa de subida, de descida ou de alterao
no estado de uma porta de entrada. Esta funo, quando ativada, seria
responsvel por armazenar o instante de tempo entre cada recepo, visto que
cada rampa de subida geraria uma interrupo.
De fato, acreditou-se que a utilizao desta funo resolveria o problema, j
que durante os anos a utilizao de interrupes foi vastamente explorada e com
diversos cases de sucesso. Mas, por conta de caractersticas intrnsecas ao
receptor e ao Arduino, esta opo acabou sendo descartada na fase de testes ao
gerar interrupes mesmo quando no havia dados sendo coletados.
Outra proposta foi de reduzir os perodos de ativao do sinal e dos
intervalos entre cada transmisso, a fim de reduzir a margem de erro que tempos
na ordem de milissegundos poderiam gerar. Infelizmente os testes acabaram
mostrando que o receptor no interpretava pulsos muito velozes dos
transmissores e ainda, a faixa de ativao que interpretada est na casa dos
100 milissegundos. Por conta disso, novamente optou-se por utilizar um perodo
de 100 milissegundos e um segundo entre cada transmisso. Este ltimo poderia
ser reduzido, mas para efeitos de facilidade de clculo manteve-se este tempo.
Alm disso, mostrou-se que o Arduino, mesmo com a utilizao de variveis
de 4 bytes (double e float), cortava os valores e reduzia a preciso. Por conta
disso, modificou-se o cdigo afim de utilizar os valores em microssegundos (que

poderiam ser armazenados em variveis do tipo unsigned long, sem perda de


dados) para que a preciso pudesse ser elevada. Ainda assim, os resultados
foram insatisfatrios pois, agora utilizando valores de ordem maior os erros, alm
de permanecerem, ainda foram propagados.
Essas entre outras intempries minaram a concluso total do projeto, e
embora muitos problemas tenham sido solucionados ao longo do caminho este
ltimo, e mais importante, no pode ser resolvido.
Mesmo com tudo isso, o saldo do projeto positivo, visto que foram
includos conhecimentos em programao em dois processadores, conhecimentos
de eletrnica e outros conhecimentos gerais, como o de geometria, por exemplo.

6.

REFERNCIAS BIBLIOGRFICAS

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-snico para determinao de posio 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.
Vras, V.L.M., Simulao e Anlise de Sistema de Posicionamento Dinmico, XIX
Congresso Pan-Americano de Engenharia Naval, Transporte Martimo e
Engenharia Porturia XIX COPINAVAL, Guayaquil, Equador, 2005.

7.

ANEXOS

7.1

Cdigo do mdulo 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

Cdigo do mdulo 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 propagao do sinal em microssegundos
//Com a temperatura mdia de Curitiba no vero

double v=343.7020667;
//variao de valor aceitvel de posico
float delta=0.01;
//variao aceitvel de tempo
float deltaT=0.001;
//Variaveis para calculo de variao do tempo
double x=0,y=0;
//Vetor de variao 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){
//TRS DIMENSES
double distanciaA = sqrt((x*x)+(y*y)+1);
double tempoA = (distanciaA/v);
//TRS DIMENSES
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){
//TRS DIMENSES
double distanciaB = sqrt(((1-x)*x)+(y*y)+1);
double tempoB = (distanciaB/v);
//TRS DIMENSES
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;
}

Você também pode gostar