SlideShare uma empresa Scribd logo
1 de 10
Baixar para ler offline
MEDIÇÃO DE DISTÂNCIA DOS OBSTÁCULOS UTILIZANDO SENSORES
DE INFRAVERMELHO E PLATAFORMA ARDUINO

CAROLINE A. ALCÂNTARA, FRANCISCO A. ALVES, LUCAS M. BATISTA, PATRICIA M. K. N.
TEIXEIRA, VANESSA B. , WELLINGTON PASSOS
Departamento de Engenharia Elétrica, Universidade Federal da Bahia
Rua Prof. Aristides Novis, 2 - Federação- Salvador – Bahia – Brasil
E-mails: carolinedealcantara@gmail.com, franciscoalvessf@gmail.com,
lucasmarbatista@gmail.com, patriciamartinezkn@gmail.com,
bryvanessa@gmail.com, passos.well@gmail.com

Abstract - This article presents distance measurement by a infrared sensor model GP2Y0A21YK0F and one arduino kit
AtMega2560. The measurement conversion of sensor and the stocked results are performed by the arduino platform. The principles
of sensor calibration, the achievment of the funcion volts x distance and the programming were realized by studied concepts in the
disciplines Microprocessed System and Statistic Methods.
Keywords - Arduin, calibration, distance, sensor.
Resumo - Este artigo apresenta um medidor de distância através do sensor por infravermelho modelo GP2Y0A21YK0F e um kit
Arduino AtMega2560. A conversão da medição dos sensores e os resultados armazenados são realizados pela plataforma Arduíno.
Os princípios de calibragem dos sensores, a caracterização da função voltagem x distância e a programação foram realizados
utilizando conceitos abordados nas disciplinas Sistemas Microprocessados e Métodos Estatísticos.
Palavras-chave - Arduino, calibração, distância, sensor.

1



As

etapas

básicas

do

processo

Conversão desse valor de tensão para o
valor referente à distância encontrado
através da curva de caracterização calculada
da função Tensão x Distância.



Armazenamento dos valores da distância de
cada sensor em um vetor.



O projeto de medição das distâncias do objeto
aos obstáculos consiste em utilizar 10 sensores
do tipo infravermelho que produzirão leituras
em formato de tensão ao encontrarem objetos no
seu campo de alcance. Essas leituras foram
captadas pelo Arduino que efetuará a conversão
das tensões em distâncias através de seu código
de programação. As leituras referentes a cada
sensor foram armazenadas pelo Arduino como
um vetor de distâncias o qual podem ser
acessados e enviados caso necessário via
protocolo I2C.

Conversão do sinal digital para medidas em
formato de tensão. (O sinal digital virá em
uma faixa entre 0 e 1023, já que estamos
utilizando uma resolução de 10 bits)



Introdução

Transmissão serial dos valores da distância
de cada sensor via I2C.

foram:
2 Desenvolvimento



Calibração do sensor, medindo a tensão que
o sensor produz entre uma distância mínima
de 10cm e máxima de 80cm.



Caracterização da curva da função Tensão x
Distância do sensor diante de obstáculos de
cores escuras e claras.



Utilizar
10
sensores
modelo
GP2Y0A21YK0F para medir distâncias;

Conversão da leitura analógica do sensor
para formato digital através do Arduino.



Enviar os valores das distâncias medidas
por cada sensor por um canal I2C;



2.1 Especificações do Projeto
São exigências do projeto:

1
A luz refletida incide no receptor e é transmitida
a um pequeno dispositivo de carga acoplada
(CCD) localizado dentro do sensor, que tem
como função determinar o ângulo de reflexão.
Os ângulos formados no triângulo variam de
acordo com a distância que está o objeto.
Assim, o sensor calcula a distância a partir desse
ângulo de reflexão e emite uma tensão no seu
pino de saída correspondente à distância
detectada.

2.2 Sensor de distância GP2Y0A21YK0F
GP2Y0A21YK0F é um sensor infravermelho,
composto de uma combinação integrada entre
um PSD (position sensitive detector, detector de
posição), um IRED (infrared emitting diode,
diodo emissor de infravermelho) e um circuito
processador de sinal.

Este método oferece grande imunidade contra a
interferência da luz ambiente e a variação de cor
do obstáculo. Porém, a relação entre a tensão de
saída e a distância torna-se não linear,
aparentando uma curva logarítmica, como
mostra a Figura 3 obtida do datasheet do
dispositivo. É possível observar também que
para distâncias fora da faixa de operação do
sensor, a saída torna-se não proporcional e deve
ser rejeitada.
Figura 1 - Diagrama de blocos da organização interna do
sensor GP2Y0A21YK0F

Segundo o datasheet disponibilizado pelo
fabricante, são características relevantes do
dispositivo:





Faixa de distâncias de medida: 10 a 80cm;
Tipo de saída: tensão analógica entre 0 e
5V;
Corrente média de consumo típica: 30mA;
Faixa de tensões de alimentação: 4,5 a
5,5V.

O GP2Y0A21YK0F utiliza um método de
triangulação para calcular a distância de um
determinado objeto. Um pulso de luz
infravermelha é emitido pelo emissor e se
propaga até encontrar um objeto. Ao encontrar
um obstáculo, esta luz é refletida e forma-se um
triângulo entre o emissor, o ponto de reflexão e
o detector do sensor, conforme Figura 2.

Figura 3 – Curva característica do sensor
GP2Y0A21YK0F

2.3 Obtenção da curva característica do
sensor
A curva característica do sensor, fornecida pelo
datasheet, foi ilustrada na Figura 3. Entretanto,
cada sensor possui um comportamento
específico, devido à sua estrutura interna. Por
isso, foi necessário realizar uma série de
medidas experimentais para verificar a curva
característica de um determinado sensor.

Figura 2 – Triangulação do sensor GP2Y0A21YK0F

2
Figura 5 – Dados da tensão e distância obtidos através de
um obstáculo de cor branca.

Para realizar essa medição, foi necessário
conectar os três terminais do sensor, respeitando
a indicação da Figura 4. A alimentação Vcc
utilizada foi de 5V, que está de acordo com a
condição de operação “Supply voltage”
recomendada pelo datasheet do produto, que
varia de 4,5 a 5,5V. A partir daí, foi possível ler
os resultados de tensão no terminal Vo do
sensor, através de um multímetro, na medida em
que variávamos a distância entre o mesmo e um
obstáculo.
Devido
à
precisão
do
GP2Y0A21YK0F, só foi possível medir a
voltagem referente ao intervalo de distância de
10 a 80cm.

Figura 6 – Curva característica da função
“Voltagem x Distância” para obstáculo branco.

Visualmente, percebe-se que a curva resultante,
apresentada no gráfico acima, é próxima à curva
fornecida pelo datasheet. Além disso, a partir
desses dados coletados, foi possível encontrar a
equação da curva que mais se aproxima do
comportamento “voltagem x distância” do
sensor. Para isso, foi utilizado o método de
regressão não linear (do tipo potência) no qual
ajustamos a curva da função através de uma
ferramenta no Excel chamada Linha de
Tendência obtendo o seguinte resultado:

Figura 4 – Pinagem referente ao sensor
GP2Y0A21YK0F

As medidas foram realizadas com duas cores de
obstáculo diferente: uma folha de papel A4
branco de gramatura 75g/m² e um
paralelepípedo envolvido em couro preto.
Os dados referentes ao obstáculo branco podem
ser observados na tabela a seguir:

Figura 7 – Ajuste da Linha de Tendência realizada no
Excel para amostras feitas com obstáculo branco.

A própria ferramenta do Excel nos fornece a
equação da curva que é apresentada abaixo.

V  15,5109  d -0,8778

(1)

Sendo:
d = distância do sensor ao obstáculo de cor
branca.
V = tensão escrita pelo sensor para representar
aquela distância ao obstáculo.

3
curva do datasheet. Este resultado pode
explicado devido a erros dos operadores
medição, e pode ser constatado através
equação encontrada para este conjunto
medidas, utilizando o mesmo método
regressão supracitado.

O R² indicado no gráfico é um parâmetro,
chamado de coeficiente de determinação, que
avalia a qualidade da regressão. Quanto mais
próximo de 1, melhor o ajuste entre a função e
os dados coletados. O R² varia de 0 a 1,
indicando em porcentagem o quanto o modelo
consegue explicar os valores observados.

ser
da
da
de
de

Nesse caso temos um R² = 0,9982 , o que
significa que 99,82% da variável dependente
consegue ser explicada pelos regressores
presentes no modelo.
Quando utilizamos um obstáculo preto para
fazer as medidas da tensão em relação à
distância desse objeto até o sensor, encontramos
um resultado não satisfatório.

Figura 10 – Ajuste da Linha de Tendência realizada no
Excel para amostras feitas com obstáculo preto.

A equação da curva feita pelo Excel é
apresentada abaixo.

V  13,262  d -0,769

(2)

Sendo:
d = distância do sensor ao obstáculo de cor
preta.
V = tensão escrita pelo sensor para representar
aquela distância ao obstáculo.
Nesse caso temos um R² = 0,9545 , o que
significa que 95,45% da variável dependente
consegue ser explicada pelos regressores
presentes no modelo.
Figura 8 – Dados da tensão e distância obtidos através de
um obstáculo de cor preta.

Observamos que o nível de confiança é maior se
trabalharmos com obstáculos de cor branca, já
que a curva das amostras de distância por tensão
que coletamos está mais próxima da equação de
regressão que calculamos. Com um coeficiente
de determinação de 99,82%, referente à análise
de dados do obstáculo branco, temos uma
segurança maior para aplicarmos o método
utilizado para representar a curva característica
do sensor.

2.4 Condicionamento do sinal do sensor
O condicionamento de sinais é necessário para
converter os sinais oriundos dos sensores e
então “interfaciar” de forma adequada com o
controlador. Mesmo em aplicações envolvendo
processamento digital, algum tipo de

Figura 9 – Curva característica da voltagem x distância.

Neste caso, percebe-se que a curva encontrada
possui distorções em relação à curva referente
ao obstáculo branco, e também em relação à

4
processamento analógico é requerido antes que
a conversão analógico-digital seja feita,
limitando a largura de banda do sinal à no
máximo metade da taxa de amostragem,
“casando” sua amplitude com a faixa de entrada
do conversor e eliminando ruídos no sinal que
venha do sensor.

2.5 Controlador Arduino

O sensor GP2YOA21YKOF é pouco
susceptível à variação de reflexão sobre o
objeto, a temperatura ambiente e o tempo de
operação do sensor. O datasheet menciona que
para reduzir o ruído, precisa-se colocar um
capacitor de 10 uF entre o terra e a entrada de
voltagem. Mesmo assim, tem uma presença de
ruído. Para eliminar esse ruído, adiciona-se na
saída do sensor um filtro ativo de primeira
ordem.

O Arduino foi escolhido devido a facilidade de
programação, de obtenção do kit para testes e
pela quantidade de portas analógicas presentes
para conversão Análogico/Digital da tensão dos
10 sensores.

Os
10
sensores
infravermelhos
GP2Y0A21YK0F são utilizados no projeto na
intenção de medir distância e para isso
utilizamos o microcontrolador Atmega2560 da
plataforma Arduino Mega2560.

São as principais características do Arduino
Mega2560:









Tensão de operação: 5V, proveniente de
fonte externa ou da porta USB de um
computador;
54 pinos de entrada e saída digital, sendo 15
portas com capacidade para PWM;
16 pinos de entrada analógica;
Corrente máxima por pino digital de 40mA;
Memória de programa flash de 256KB,
incluindo bootloader;
Memória RAM de 8KB;
Memória EEPROM de 4KB;
Clock de 16MHz.

Suas especificações são visualizadas de forma
clara na Figura 12.

Figura 11 – Mapeamento do circuito utilizando o
software Protheus Isis 7. Sensor associado a um filtro
passa-baixa.

O ATMEGA2560 contem um único conversor
analógico-digital de 10 bits com uma frequência
de amostragem igual à 15 kHz. Conforme o
teorema de Nyquist, a frequência máxima do
sinal de entrada do conversor deve ser igual ou
menor que 7.5 kHz, desta forma eliminamos o
efeito chamado aliasing ou foldover em que a
alta frequência é medida erroneamente como
sendo de frequência mais baixa. Os valores dos
componentes são escolhidos tal que R1 = R2 =
10kΩ (já que o ganho do filtro passa-baixa
obedece a equação K = -R2/R1 = -1) e C1 =
4,7nF de maneira a ter uma frequência de corte
Fc = 1/(2π.R2.C1) = 3.4 kHz.

Figura 12 –Plataforma detalhada do Arduino Mega2560

O Arduino é um projeto de circuito baseado em
microprocessador de código aberto, da indústria
Atmel. É uma placa física com circuitos de
entrada/saída simples, microcontrolada e
desenvolvida sobre uma biblioteca que
simplifica a escrita da linguagem de
programação em C/C++. Sua linguagem de
programação é baseado na linguagem Wiring
(prototipagem eletrônica de hardware livre

5
composta por uma linguagem de programação,
um ambiente de desenvolvimento integrado e
um microcontrolador de placa única) e seu
ambiente de desenvolvimento é baseado no
Processing.

matemática para realização dos cálculos no
microcontrolador.
É importante salientar que neste relatório
informamos somente a calibragem de um
sensor, por conta da acessibilidade aos materiais
do projeto. No entanto, durante a programação
deixamos uma parte do código reservado para
incluir as outras funções características advindas
das calibrações dos outros 9 sensores.

O Arduino tem a funcionalidade de interpretar
as variáveis do ambiente e transformá-las em
sinal elétrico, através de sensores ligados aos
terminais de entrada, controlando ou acionando
algum
outro
elemento
eletro-eletrônico
conectado
ao
terminal
de
saída.
Resumidamente, o Arduino é uma ferramenta de
entrada e saída de dados que pode ser acionada
por um sensor, e depois processada para poder
acionar um atuador. Esse funcionamento é
simplificado no esquema abaixo.

Quando há mudança de cor do objeto de branco
(clara) para preto (escura) ou vice-versa foi
possível perceber que a tensão no sensor muda
mantendo a mesma distância. Isso ocorre, pois a
reflexão do infravermelho será menor quando a
cor do objeto for preta. Nesse projeto iremos
considerar que os objetos encontrados serão da
cor branca.
Com as amostras de tensão para cada distância
que obtivemos, encontramos a relação Distância
x Tensão pelo método dos mínimos quadrados.
Essa relação, que será usada durante a
programação, é escrita como:

Figura 13 –Diagrama simplificado de funcionamento do
Arduíno.

d  26,1049  V -1,13718

Com o Arduino pode-se desenvolver objetos
interativos, permitindo a entrada de sensores ou
chaves, controlando uma variedade de luzes,
motores ou saídas físicas. Com ele pode-se
manipular o hardware (sensores, portas,
alarmes) através do software.
Algumas de suas
utilização são:





grandes

vantagens

(3)

Sendo:
d = distância do sensor ao obstáculo de cor
branca
V = tensão escrita pelo sensor para representar a
distância ao obstáculo

de

A curva para calibragem foi apresentado no
gráfico abaixo.

Preço: Relacionando com as outras
plataformas de microcontroladores, o
Arduino possui um preço relativamente
baixo.
Multi-plataforma: O seu software roda no
Windows, Linux e Macintosh OSX.
Utilização simples e clara: O seu ambiente
de programação é de fácil uso e seu código
fonte é aberto e pode ser aperfeiçoado por
programadores mais experientes.

2.6 Lógica de programação, Fluxograma e
código

Figura 14 - Curva de calibragem construída
utilizando uma folha de papel A4 da Chamex modelo
multi, gramatura 75g/m2, como obstáculo.

Para conversão de valores de tensão para
valores de distância foi necessário fazer uma
calibragem no sensor infravermelho que
consiste em obter os valores experimentais de
tensão para cada distância. Após várias
medições é possível gerar uma função

Com a função da distância bem definida,
iniciamos a escrita do código de programação
do Arduino.
Todo código necessita da inclusão de
bibliotecas. Como o nosso código irá conter

6
funções matemáticas, incluímos em nossa
programação a biblioteca math.h.
Além disso, nosso projeto deverá conter uma
comunicação serial via I2C que servirá para
enviar os dados dos valores da distância quando
solicitados. Portanto, será necessário incluir a
biblioteca Wire.h.

float sensor = é o dado enviado pelo sensor ao
encontrar o obstáculo. Esse dado virá na faixa
de 0 a 1023 que é a faixa considerada para a
resolução de 10 bits que estamos utilizando.
Como os dados do sensor será um sinal
analógico, é necessário pedir que o compilador
leia esse sinal. Por isso usamos a chamada
analogRead() que permite a leitura do pino que
recebe o sinal analógico. Considerando o canal
de conversão analógico-digital de 10 bits que
estamos utilizando, o Arduino irá mapear
tensões de entrada entre 0 e 5V em valores
inteiros entre 0 e 1023. O que produz uma
resolução de leitura de 5 volts por 1024
unidades.
A chamada analogRead() vem especificando
entre os parênteses o pino que recebe o sinal
analógico. Como usamos a porta A0, A1, A2,
A3, A4, A5, A6, A7, A8, A9 como pinos de
entrada dos sinais analógicos (10 portas, pois
usamos 10 sensores), especificamos no
analogRead() o pino (i + 14), sendo i um
número inteiro que varia entre 0 e 9, e 14 o
valor conhecido pelo compilador como porta A0
(15 é a porta A1, 16 é a porta A2, 17 é a porta
A3 e assim sucessivamente).

Iniciamos nosso código também com o préprocessador #define que exige que compilador
ao longo do programa faça a substituição da
constante definida pelo pré-processador por um
valor também pré definido.
No nosso caso fizemos #define canaisAD 10
que substitui tudo que estiver escrito como
canaisAD por 10. Esses canais AD são todos os
canais analógicos-digitais que temos para
converter os sinais analógicos advindos dos
sensores. Como possuímos 10 sensores, logo
necessitamos de 10 conversores ADs, então
definimos canaisAD como 10.
Declaramos o inteiro i que servirá como valor
que varia entre 0 e 9 para ajudar na função dos
vetores que criamos para armazenar dados.
Foi necessário declarar também as constantes
das funções característica de cada sensor, bem
como os expoentes dessas funções. Para tal
criamos
dois
vetores
a[canaisAD]
e
b[canaisAD] que armazena as 10 constantes e
os 10 expoentes da função de cada sensor
respectivamente.

float volt = é a tensão que iremos calcular
através do dado recebido pelo float sensor.
Como o dado do sensor virá numa faixa entre 0
e 1023, para transformar esse número num valor
em Volts usamos a fórmula abaixo:

O esboço de nossa programação inicializa com a
função void setup() no qual se usa para
inicializar variáveis, seleção de pinagens, etc.
Dentro dessa função, é necessário inicializar a
comunicação serial, informando a taxa de dados
em bits por segundo para transmissão de dados
serial. Cada serial possui um nível diferente de
taxa de dados de transmissão que variam entre
300 à 115200 bits por segundo. Como estamos
conectando o computador via serial, este exige
somente uma taxa de 9600 bits por segundo.
Nessa função será necessário, também,
inicializar a comunicação via I2C, através da
função Wire.begin().

volt 

5  sensor
1023.0

(4)

Sendo:
5 = a tensão máxima em volt (tensão de
alimentação)
sensor = o valor recebido do sensor (que varia
de 0 a 1023)
1023 = o máximo valor da faixa recebida do
sensor
float dist = é o valor da distância do sensor ao
obstáculo. Esse valor é calculado pela fórmula
(3) já mencionada. Como queremos armazenar
os valores da distância de cada sensor aos
obstáculos, fizemos a variável dist como vetor,
escrevendo como dist [canaisAD - 1]. Como o
vetor distância armazena dados de cada canal
analógico-digital, definimos que este vetor
possui o tamanho igual à dos canaisAD, ou seja,
é um vetor que armazena 10 valores de distância
(que varia de 0 à 9). Ao aplicar a fórmula (3)
para calcular a distância, usamos o vetor dist
como sendo dist [i], com i variando entre 0 e 9.
A fórmula fica:

Depois de criar uma função setup(), que
inicializa e define os valores iniciais, a função
void loop() faz exatamente o que seu nome
sugere, laços consecutivos, permitindo que o
programa continue em seu processo de leitura,
manipulação de dados e escrita.
Nas definições de variáveis temos:

7
dist[i]  a[i]  volt b[i ]

O código do programa é indicado abaixo:

(5)

#include <Wire.h> // Biblioteca I2C
#include <math.h> // Biblioteca matemática

A cada valor de i variando de 0 a 9, possuímos
novos valores de tensão calculados para cada
dado recebido pelo sensor. Desta forma, temos
os diferentes valores das distâncias armazenados
no vetor que varia de dist [0] à dist [9]. Observe
também que a[i] é o vetor que armazena as
constantes e b[i] o vetor que armazena os
expoentes da função característica de cada
sensor, definida após calibragem.

#define canaisAD 10 // números de canais AD
// dos sensores (temos 10
// canais)
int i = 0;
//declaração das constantes de calibração de
//cada sensor, usados para calcular distância,
// os valores para outros sensores devem ser
//obtidos como segue no artigo:

Para que cada valor do vetor distância seja
escrito no monitor do computador, indicamos a
função Serial.println(dist[i]). Além disso, será
necessário uma interrupção do programa à cada
escrita dos valores das distâncias obtidas. Essa
interrupção é importante para que possamos ver
com clareza os valores no monitor do
computador. Para isso, é necessário utilizar a
função delay(300), no qual colocamos uma
parada de 300 milisegundos (0,3 segundos) de
uma escrita para outra.
Para o envio do vetor distância (dist[i]) via I2C,
quando solicitado, implementamos no código a
função Wire.write(int (dist[i])).

const float a[canaisAD] = {26.1049,
constante2,constante3,...,constante10};
const float b[canaisAD] = {-1.13718,
expoente2,expoente3,...,expoente10};
void setup( ) {
// Inicializa comunicação serial em 9600
//bits por segundo:
Serial.begin(9600);
// Inicia o I2C:
Wire.begin( );

O valor de i é incrementado (somado 1) cada
vez que um valor de distância for armazenado
no vetor.
Quando o valor de i chegar à 10 (valor de
canaisAD) o compilador zera i (coloca i = 0) e
retorna ao início do loop, onde recomeçará a
leitura das distâncias do obstáculo à cada
sensor.

}
// A rotina roda num loop roda para sempre:
void loop( ) {

Segue adiante o fluxograma que simplifica
todas essas etapas da programação.

float sensor = analogRead(i+14);
// porta A0 é chamada de 14 pelo programa, A1
// é 15 e assim sucessivamente
float volt;
float dist [canaisAD];
// Imprime o dado para leitura
// cálculo para achar o valor em volts no sensor:
volt = 5*sensor/(1023.0);
// cria um vetor que contém canaisAD valores
//de distâncias que serão lidas pelo sensor:
dist[i] = a[i]*pow(volt,b[i]);
if( (dist[i] > 70.0) || (dist[i] < 15.0)) {
Serial.print(“Sensor ”);
Serial.print(i);
Serial.println(“ excedeu a faixa”);
}

Figura 15 - Fluxo de execução do código feito para
Arduino.

8
// Imprime no Serial Monitor o valor:
Serial.println(dist[i]);

Segue o circuito modelo utilizado para leitura de
dados do sensor e retorno de valores de
distância entre sensor e obstáculo:

// Envia via I2C os valores das distâncias.
//Envia em formato inteiro, pois não funciona
//com ponto flutuante:
Wire.write(int (dist[i]));
delay(300); // Espera 0,3 s
i++;
if (i = = canaisAD) {
// Se chegar igual a canaisAD volta a 0 e mede o
//valor da primeira porta novamente.
i=0;
}
}
3 Resultados práticos

Figura 16: Circuito usado para teste de código.
Arduino utilizado para teste, Arduino Nano.

Para implementação e teste do código de
programação do projeto, foi utilizado somente 1
sensor ligado ao Arduino Nano (placa pequena
baseada no ATmega326) no qual possui as
seguintes características:









Para ligação do sensor à placa do Arduino
utilizamos a referência da pinagem do sensor
encontrada em seu datasheed. Conectamos as 2
entradas do sensor (GND e Vcc) e a saída do
sensor (Vo) às portas do Arduino.
Observa-se na imagem que a saída Vo do sensor
está ligado à porta A0 da placa. Esse sinal Vo é
o sinal referente às distâncias do sensor ao
obstáculo, e esse sinal que será aplicado no
nosso programa para definirmos os valores das
distâncias através da equação (5).
A porta 5V da placa é conectada ao pino de
entrada Vcc do sensor. Essa porta 5V serve de
alimentação ao sensor e é a tensão proveniente
da alimentação entregue pelo computador ao
Arduino (via USB).
A porta GND da placa é conectada ao pino de
entrada GND do sensor para finalizar as
ligações suficiente para a interação entre
microprocessador e sensor.

Tensão de operação: 5V, proveniente de
fonte externa ou da porta USB de um
computador;
14 pinos de entrada e saída digital, sendo 6
portas com capacidade para PWM;
8 pinos de entrada analógica;
Corrente máxima por pino digital de 40mA;
Memória de programa flash de 32KB,
incluindo bootloader;
Memória RAM de 2KB;
Memória EEPROM de 1KB;
Clock de 16MHz.

O que diferencia de fato esse Arduino Nano ao
Arduino Mega2560 são as quantidades de pinos
de entrada analógica, pinos de entrada e saída
digital e capacidade de memórias flash, RAM e
EEPROM. No entanto, para efeito de teste da
programação, essa diferença não afetaria nosso
projeto, já que testaremos a programação
utilizando somente 1 sensor. Com o teste
validando a qualidade do nosso programa,
bastou somente alterar o código do programa
para mais 9 sensores, implementando um loop e
criando vetor de dados.

4 Conclusão
O projeto em questão analisou o comportamento
do sensor infravermelho em diferentes tipos de
obstáculos e permitiu a caracterização da função
Distância por Voltagem através de calibração e
regressão não linear dos valores das amostras.
Foi feita a escolha em trabalhar com a melhor
curva que caracteriza-se nosso sistema, por isso

9
foi feita a análise do coeficiente de
determinação de cada tipo de obstáculo (o da
cor branca e o da cor preta) ficando clara a
maior confiabilidade diante da equação
característica ao se utilizar obstáculo de cor
branca.
Diante do objetivo em desenvolver um
programa que informasse ao usuário a distância
dos sensores aos obstáculos, foi possível
perceber a facilidade de manuseio e o bom
desempenho ao se utilizar do microprocessador
Arduino que consegue atender de forma prática
e simples aos objetivos finais no trabalho.
De forma geral, os resultados obtidos foram
satisfatórios e fiéis ao esperado teoricamente. O
projeto permitiu o aprofundamento do
conhecimento de microcontroladores e da
facilidade de manipulação de dados que estes
podem nos fornecer. Além disso, o projeto
permitiu enxergar a importância das análises
estatísticas referente às amostras durante
calibração de componentes.

Zuben , Fernando J. V., 2013, Notas de aula do
curso EA616 , DCA/FEEC/UNICAMP
Ibrahim, Dogan, 2006, Microcontroller Based
Applied
DigitalControl John Wiley & Sons, Ltd.
Seguine, Dennis, July 15, 2011, Associated
Application Notes: AN2095, AN2219,Cypress
MCU Application Design Team, Choi, June,
1D/A Converter by Using PWM, 8-bit
Microcontroller Application Note
http://www.mantech.co.za/datasheets/products/
A000047.pdf
http://www.cefetsp.br/edu/sertaozinho/professor
es/Fernando_Fortuna/material_341_3ano.pdf
http://www.acroname.com/robotics/info/articles
/sharp/sharp.html

A participação no trabalho, nos permitiu
identificar possíveis aplicações do projeto em
trabalhos como sensoriamento de posição de um
robô através destes sensores conectados à
diversas partes da sua estrutura, permitindo até
um estudo da presença do robô no espaço
inserido, informado a sua localização ou mesmo
onde existem obstáculos e como ele deverá agir
diante dessas barreiras físicas.

http://arduino.cc/en/Reference/HomePage
http://www.arduino.cc/

São sugestões para o melhoramento do projeto,
estudar como tornar o sistema de medição de
distância imune a variação de cores, ou até
mesmo permitir que através dos dados enviados
pelos sensores o programa possa identificar e
informar as cores captadas pelos sensores,
ajudando a reconstruir a imagem do ambiente.
5 Agradecimentos
Os autores deste artigo agradecem ao professor
Jés Cerqueira pela colaboração e orientação ao
longo do desenvolvimento do projeto.
6 Referências Bibliográficas
Taylor, C. W. (1994). Power System Voltage
Stability. Ed McGraw-Hill , Inc..
OGATA, Katsuhiko, 2003, Engenharia de
controle moderno. 4. ed. São Paulo: PrenticeHall do Brasil

10

Mais conteúdo relacionado

Mais procurados

Introduction To Data Mining
Introduction To Data Mining   Introduction To Data Mining
Introduction To Data Mining
Phi Jack
 
Best Practices in DataOps: How to Create Agile, Automated Data Pipelines
Best Practices in DataOps: How to Create Agile, Automated Data PipelinesBest Practices in DataOps: How to Create Agile, Automated Data Pipelines
Best Practices in DataOps: How to Create Agile, Automated Data Pipelines
Eric Kavanagh
 

Mais procurados (20)

Information management
Information managementInformation management
Information management
 
Data Strategy
Data StrategyData Strategy
Data Strategy
 
Citizens Bank: Data Lake Implementation – Selecting BigInsights ViON Spark/Ha...
Citizens Bank: Data Lake Implementation – Selecting BigInsights ViON Spark/Ha...Citizens Bank: Data Lake Implementation – Selecting BigInsights ViON Spark/Ha...
Citizens Bank: Data Lake Implementation – Selecting BigInsights ViON Spark/Ha...
 
Data, Information And Knowledge Management Framework And The Data Management ...
Data, Information And Knowledge Management Framework And The Data Management ...Data, Information And Knowledge Management Framework And The Data Management ...
Data, Information And Knowledge Management Framework And The Data Management ...
 
From Data to Visualization, what happens in between?
From Data to Visualization, what happens in between?From Data to Visualization, what happens in between?
From Data to Visualization, what happens in between?
 
Big Data & Analytics (Conceptual and Practical Introduction)
Big Data & Analytics (Conceptual and Practical Introduction)Big Data & Analytics (Conceptual and Practical Introduction)
Big Data & Analytics (Conceptual and Practical Introduction)
 
Big data landscape version 2.0
Big data landscape version 2.0Big data landscape version 2.0
Big data landscape version 2.0
 
Introduction To Data Mining
Introduction To Data Mining   Introduction To Data Mining
Introduction To Data Mining
 
Best Practices in DataOps: How to Create Agile, Automated Data Pipelines
Best Practices in DataOps: How to Create Agile, Automated Data PipelinesBest Practices in DataOps: How to Create Agile, Automated Data Pipelines
Best Practices in DataOps: How to Create Agile, Automated Data Pipelines
 
Building an effective and extensible data and analytics operating model
Building an effective and extensible data and analytics operating modelBuilding an effective and extensible data and analytics operating model
Building an effective and extensible data and analytics operating model
 
Implementing Effective Data Governance
Implementing Effective Data GovernanceImplementing Effective Data Governance
Implementing Effective Data Governance
 
Introduction to Big Data Analytics and Data Science
Introduction to Big Data Analytics and Data ScienceIntroduction to Big Data Analytics and Data Science
Introduction to Big Data Analytics and Data Science
 
Building an Effective & Extensible Data & Analytics Operating Model
Building an Effective & Extensible Data & Analytics Operating ModelBuilding an Effective & Extensible Data & Analytics Operating Model
Building an Effective & Extensible Data & Analytics Operating Model
 
Data Catalog as a Business Enabler
Data Catalog as a Business EnablerData Catalog as a Business Enabler
Data Catalog as a Business Enabler
 
THE FUTURE OF RETAIL 2018: ARTIFICIAL INTELLIGENCE
THE FUTURE OF RETAIL 2018: ARTIFICIAL INTELLIGENCETHE FUTURE OF RETAIL 2018: ARTIFICIAL INTELLIGENCE
THE FUTURE OF RETAIL 2018: ARTIFICIAL INTELLIGENCE
 
Metadata and ontologies
Metadata and ontologiesMetadata and ontologies
Metadata and ontologies
 
Is Enterprise Data Literacy Possible?
Is Enterprise Data Literacy Possible?Is Enterprise Data Literacy Possible?
Is Enterprise Data Literacy Possible?
 
Data Modeling, Data Governance, & Data Quality
Data Modeling, Data Governance, & Data QualityData Modeling, Data Governance, & Data Quality
Data Modeling, Data Governance, & Data Quality
 
Evolution of Analytics
Evolution of AnalyticsEvolution of Analytics
Evolution of Analytics
 
Data Governance
Data GovernanceData Governance
Data Governance
 

Semelhante a Medição de distância dos obstáculos utilizando sensores de infravermelho e plataforma arduino

Anon Practicas Electronica Circuitos Electricos
Anon  Practicas Electronica   Circuitos ElectricosAnon  Practicas Electronica   Circuitos Electricos
Anon Practicas Electronica Circuitos Electricos
F Blanco
 
18.ago esmeralda 11.00_187_celpe
18.ago esmeralda 11.00_187_celpe18.ago esmeralda 11.00_187_celpe
18.ago esmeralda 11.00_187_celpe
itgfiles
 
Guião - Sessão 5 - Programacao com Arduinos.pdf
Guião - Sessão 5 - Programacao com Arduinos.pdfGuião - Sessão 5 - Programacao com Arduinos.pdf
Guião - Sessão 5 - Programacao com Arduinos.pdf
riodurval
 

Semelhante a Medição de distância dos obstáculos utilizando sensores de infravermelho e plataforma arduino (20)

Artigo inovarhte
Artigo inovarhte  Artigo inovarhte
Artigo inovarhte
 
Anon Practicas Electronica Circuitos Electricos
Anon  Practicas Electronica   Circuitos ElectricosAnon  Practicas Electronica   Circuitos Electricos
Anon Practicas Electronica Circuitos Electricos
 
Cap-2-Caracteristicas Estaticas e Dinamicas.ppt
Cap-2-Caracteristicas Estaticas e Dinamicas.pptCap-2-Caracteristicas Estaticas e Dinamicas.ppt
Cap-2-Caracteristicas Estaticas e Dinamicas.ppt
 
Implementacao analisador sinais elétricos - sistema monofásico
Implementacao analisador sinais elétricos - sistema monofásicoImplementacao analisador sinais elétricos - sistema monofásico
Implementacao analisador sinais elétricos - sistema monofásico
 
Aula 3 e 4 - TEÓRICA - Engenharia Elétrica 6NA - Sinais e Sistemas
Aula 3 e 4 - TEÓRICA - Engenharia Elétrica 6NA - Sinais e SistemasAula 3 e 4 - TEÓRICA - Engenharia Elétrica 6NA - Sinais e Sistemas
Aula 3 e 4 - TEÓRICA - Engenharia Elétrica 6NA - Sinais e Sistemas
 
18.ago esmeralda 11.00_187_celpe
18.ago esmeralda 11.00_187_celpe18.ago esmeralda 11.00_187_celpe
18.ago esmeralda 11.00_187_celpe
 
Mr7
Mr7Mr7
Mr7
 
125406
125406125406
125406
 
Et 2022 a-1102
Et 2022 a-1102Et 2022 a-1102
Et 2022 a-1102
 
INSTRUMENTACAO-ELETRONICA.pdf
INSTRUMENTACAO-ELETRONICA.pdfINSTRUMENTACAO-ELETRONICA.pdf
INSTRUMENTACAO-ELETRONICA.pdf
 
Detector de curto
Detector de curtoDetector de curto
Detector de curto
 
Relatório 1
Relatório 1Relatório 1
Relatório 1
 
Guião - Sessão 5 - Programacao com Arduinos.pdf
Guião - Sessão 5 - Programacao com Arduinos.pdfGuião - Sessão 5 - Programacao com Arduinos.pdf
Guião - Sessão 5 - Programacao com Arduinos.pdf
 
Cap2 medição de grandezas elétricas
Cap2 medição de grandezas elétricasCap2 medição de grandezas elétricas
Cap2 medição de grandezas elétricas
 
ADS1800
ADS1800ADS1800
ADS1800
 
Projeto – Transmissão de voz digital
Projeto – Transmissão de voz digitalProjeto – Transmissão de voz digital
Projeto – Transmissão de voz digital
 
Apostila de instrumentação_industrial_-_senai
Apostila de instrumentação_industrial_-_senaiApostila de instrumentação_industrial_-_senai
Apostila de instrumentação_industrial_-_senai
 
P01 introducao elvis-ii
P01 introducao elvis-iiP01 introducao elvis-ii
P01 introducao elvis-ii
 
AULA 01-instrumentaçao elétrica
AULA 01-instrumentaçao elétricaAULA 01-instrumentaçao elétrica
AULA 01-instrumentaçao elétrica
 
Q83
Q83Q83
Q83
 

Medição de distância dos obstáculos utilizando sensores de infravermelho e plataforma arduino

  • 1. MEDIÇÃO DE DISTÂNCIA DOS OBSTÁCULOS UTILIZANDO SENSORES DE INFRAVERMELHO E PLATAFORMA ARDUINO CAROLINE A. ALCÂNTARA, FRANCISCO A. ALVES, LUCAS M. BATISTA, PATRICIA M. K. N. TEIXEIRA, VANESSA B. , WELLINGTON PASSOS Departamento de Engenharia Elétrica, Universidade Federal da Bahia Rua Prof. Aristides Novis, 2 - Federação- Salvador – Bahia – Brasil E-mails: carolinedealcantara@gmail.com, franciscoalvessf@gmail.com, lucasmarbatista@gmail.com, patriciamartinezkn@gmail.com, bryvanessa@gmail.com, passos.well@gmail.com Abstract - This article presents distance measurement by a infrared sensor model GP2Y0A21YK0F and one arduino kit AtMega2560. The measurement conversion of sensor and the stocked results are performed by the arduino platform. The principles of sensor calibration, the achievment of the funcion volts x distance and the programming were realized by studied concepts in the disciplines Microprocessed System and Statistic Methods. Keywords - Arduin, calibration, distance, sensor. Resumo - Este artigo apresenta um medidor de distância através do sensor por infravermelho modelo GP2Y0A21YK0F e um kit Arduino AtMega2560. A conversão da medição dos sensores e os resultados armazenados são realizados pela plataforma Arduíno. Os princípios de calibragem dos sensores, a caracterização da função voltagem x distância e a programação foram realizados utilizando conceitos abordados nas disciplinas Sistemas Microprocessados e Métodos Estatísticos. Palavras-chave - Arduino, calibração, distância, sensor. 1  As etapas básicas do processo Conversão desse valor de tensão para o valor referente à distância encontrado através da curva de caracterização calculada da função Tensão x Distância.  Armazenamento dos valores da distância de cada sensor em um vetor.  O projeto de medição das distâncias do objeto aos obstáculos consiste em utilizar 10 sensores do tipo infravermelho que produzirão leituras em formato de tensão ao encontrarem objetos no seu campo de alcance. Essas leituras foram captadas pelo Arduino que efetuará a conversão das tensões em distâncias através de seu código de programação. As leituras referentes a cada sensor foram armazenadas pelo Arduino como um vetor de distâncias o qual podem ser acessados e enviados caso necessário via protocolo I2C. Conversão do sinal digital para medidas em formato de tensão. (O sinal digital virá em uma faixa entre 0 e 1023, já que estamos utilizando uma resolução de 10 bits)  Introdução Transmissão serial dos valores da distância de cada sensor via I2C. foram: 2 Desenvolvimento  Calibração do sensor, medindo a tensão que o sensor produz entre uma distância mínima de 10cm e máxima de 80cm.  Caracterização da curva da função Tensão x Distância do sensor diante de obstáculos de cores escuras e claras.  Utilizar 10 sensores modelo GP2Y0A21YK0F para medir distâncias; Conversão da leitura analógica do sensor para formato digital através do Arduino.  Enviar os valores das distâncias medidas por cada sensor por um canal I2C;  2.1 Especificações do Projeto São exigências do projeto: 1
  • 2. A luz refletida incide no receptor e é transmitida a um pequeno dispositivo de carga acoplada (CCD) localizado dentro do sensor, que tem como função determinar o ângulo de reflexão. Os ângulos formados no triângulo variam de acordo com a distância que está o objeto. Assim, o sensor calcula a distância a partir desse ângulo de reflexão e emite uma tensão no seu pino de saída correspondente à distância detectada. 2.2 Sensor de distância GP2Y0A21YK0F GP2Y0A21YK0F é um sensor infravermelho, composto de uma combinação integrada entre um PSD (position sensitive detector, detector de posição), um IRED (infrared emitting diode, diodo emissor de infravermelho) e um circuito processador de sinal. Este método oferece grande imunidade contra a interferência da luz ambiente e a variação de cor do obstáculo. Porém, a relação entre a tensão de saída e a distância torna-se não linear, aparentando uma curva logarítmica, como mostra a Figura 3 obtida do datasheet do dispositivo. É possível observar também que para distâncias fora da faixa de operação do sensor, a saída torna-se não proporcional e deve ser rejeitada. Figura 1 - Diagrama de blocos da organização interna do sensor GP2Y0A21YK0F Segundo o datasheet disponibilizado pelo fabricante, são características relevantes do dispositivo:     Faixa de distâncias de medida: 10 a 80cm; Tipo de saída: tensão analógica entre 0 e 5V; Corrente média de consumo típica: 30mA; Faixa de tensões de alimentação: 4,5 a 5,5V. O GP2Y0A21YK0F utiliza um método de triangulação para calcular a distância de um determinado objeto. Um pulso de luz infravermelha é emitido pelo emissor e se propaga até encontrar um objeto. Ao encontrar um obstáculo, esta luz é refletida e forma-se um triângulo entre o emissor, o ponto de reflexão e o detector do sensor, conforme Figura 2. Figura 3 – Curva característica do sensor GP2Y0A21YK0F 2.3 Obtenção da curva característica do sensor A curva característica do sensor, fornecida pelo datasheet, foi ilustrada na Figura 3. Entretanto, cada sensor possui um comportamento específico, devido à sua estrutura interna. Por isso, foi necessário realizar uma série de medidas experimentais para verificar a curva característica de um determinado sensor. Figura 2 – Triangulação do sensor GP2Y0A21YK0F 2
  • 3. Figura 5 – Dados da tensão e distância obtidos através de um obstáculo de cor branca. Para realizar essa medição, foi necessário conectar os três terminais do sensor, respeitando a indicação da Figura 4. A alimentação Vcc utilizada foi de 5V, que está de acordo com a condição de operação “Supply voltage” recomendada pelo datasheet do produto, que varia de 4,5 a 5,5V. A partir daí, foi possível ler os resultados de tensão no terminal Vo do sensor, através de um multímetro, na medida em que variávamos a distância entre o mesmo e um obstáculo. Devido à precisão do GP2Y0A21YK0F, só foi possível medir a voltagem referente ao intervalo de distância de 10 a 80cm. Figura 6 – Curva característica da função “Voltagem x Distância” para obstáculo branco. Visualmente, percebe-se que a curva resultante, apresentada no gráfico acima, é próxima à curva fornecida pelo datasheet. Além disso, a partir desses dados coletados, foi possível encontrar a equação da curva que mais se aproxima do comportamento “voltagem x distância” do sensor. Para isso, foi utilizado o método de regressão não linear (do tipo potência) no qual ajustamos a curva da função através de uma ferramenta no Excel chamada Linha de Tendência obtendo o seguinte resultado: Figura 4 – Pinagem referente ao sensor GP2Y0A21YK0F As medidas foram realizadas com duas cores de obstáculo diferente: uma folha de papel A4 branco de gramatura 75g/m² e um paralelepípedo envolvido em couro preto. Os dados referentes ao obstáculo branco podem ser observados na tabela a seguir: Figura 7 – Ajuste da Linha de Tendência realizada no Excel para amostras feitas com obstáculo branco. A própria ferramenta do Excel nos fornece a equação da curva que é apresentada abaixo. V  15,5109  d -0,8778 (1) Sendo: d = distância do sensor ao obstáculo de cor branca. V = tensão escrita pelo sensor para representar aquela distância ao obstáculo. 3
  • 4. curva do datasheet. Este resultado pode explicado devido a erros dos operadores medição, e pode ser constatado através equação encontrada para este conjunto medidas, utilizando o mesmo método regressão supracitado. O R² indicado no gráfico é um parâmetro, chamado de coeficiente de determinação, que avalia a qualidade da regressão. Quanto mais próximo de 1, melhor o ajuste entre a função e os dados coletados. O R² varia de 0 a 1, indicando em porcentagem o quanto o modelo consegue explicar os valores observados. ser da da de de Nesse caso temos um R² = 0,9982 , o que significa que 99,82% da variável dependente consegue ser explicada pelos regressores presentes no modelo. Quando utilizamos um obstáculo preto para fazer as medidas da tensão em relação à distância desse objeto até o sensor, encontramos um resultado não satisfatório. Figura 10 – Ajuste da Linha de Tendência realizada no Excel para amostras feitas com obstáculo preto. A equação da curva feita pelo Excel é apresentada abaixo. V  13,262  d -0,769 (2) Sendo: d = distância do sensor ao obstáculo de cor preta. V = tensão escrita pelo sensor para representar aquela distância ao obstáculo. Nesse caso temos um R² = 0,9545 , o que significa que 95,45% da variável dependente consegue ser explicada pelos regressores presentes no modelo. Figura 8 – Dados da tensão e distância obtidos através de um obstáculo de cor preta. Observamos que o nível de confiança é maior se trabalharmos com obstáculos de cor branca, já que a curva das amostras de distância por tensão que coletamos está mais próxima da equação de regressão que calculamos. Com um coeficiente de determinação de 99,82%, referente à análise de dados do obstáculo branco, temos uma segurança maior para aplicarmos o método utilizado para representar a curva característica do sensor. 2.4 Condicionamento do sinal do sensor O condicionamento de sinais é necessário para converter os sinais oriundos dos sensores e então “interfaciar” de forma adequada com o controlador. Mesmo em aplicações envolvendo processamento digital, algum tipo de Figura 9 – Curva característica da voltagem x distância. Neste caso, percebe-se que a curva encontrada possui distorções em relação à curva referente ao obstáculo branco, e também em relação à 4
  • 5. processamento analógico é requerido antes que a conversão analógico-digital seja feita, limitando a largura de banda do sinal à no máximo metade da taxa de amostragem, “casando” sua amplitude com a faixa de entrada do conversor e eliminando ruídos no sinal que venha do sensor. 2.5 Controlador Arduino O sensor GP2YOA21YKOF é pouco susceptível à variação de reflexão sobre o objeto, a temperatura ambiente e o tempo de operação do sensor. O datasheet menciona que para reduzir o ruído, precisa-se colocar um capacitor de 10 uF entre o terra e a entrada de voltagem. Mesmo assim, tem uma presença de ruído. Para eliminar esse ruído, adiciona-se na saída do sensor um filtro ativo de primeira ordem. O Arduino foi escolhido devido a facilidade de programação, de obtenção do kit para testes e pela quantidade de portas analógicas presentes para conversão Análogico/Digital da tensão dos 10 sensores. Os 10 sensores infravermelhos GP2Y0A21YK0F são utilizados no projeto na intenção de medir distância e para isso utilizamos o microcontrolador Atmega2560 da plataforma Arduino Mega2560. São as principais características do Arduino Mega2560:         Tensão de operação: 5V, proveniente de fonte externa ou da porta USB de um computador; 54 pinos de entrada e saída digital, sendo 15 portas com capacidade para PWM; 16 pinos de entrada analógica; Corrente máxima por pino digital de 40mA; Memória de programa flash de 256KB, incluindo bootloader; Memória RAM de 8KB; Memória EEPROM de 4KB; Clock de 16MHz. Suas especificações são visualizadas de forma clara na Figura 12. Figura 11 – Mapeamento do circuito utilizando o software Protheus Isis 7. Sensor associado a um filtro passa-baixa. O ATMEGA2560 contem um único conversor analógico-digital de 10 bits com uma frequência de amostragem igual à 15 kHz. Conforme o teorema de Nyquist, a frequência máxima do sinal de entrada do conversor deve ser igual ou menor que 7.5 kHz, desta forma eliminamos o efeito chamado aliasing ou foldover em que a alta frequência é medida erroneamente como sendo de frequência mais baixa. Os valores dos componentes são escolhidos tal que R1 = R2 = 10kΩ (já que o ganho do filtro passa-baixa obedece a equação K = -R2/R1 = -1) e C1 = 4,7nF de maneira a ter uma frequência de corte Fc = 1/(2π.R2.C1) = 3.4 kHz. Figura 12 –Plataforma detalhada do Arduino Mega2560 O Arduino é um projeto de circuito baseado em microprocessador de código aberto, da indústria Atmel. É uma placa física com circuitos de entrada/saída simples, microcontrolada e desenvolvida sobre uma biblioteca que simplifica a escrita da linguagem de programação em C/C++. Sua linguagem de programação é baseado na linguagem Wiring (prototipagem eletrônica de hardware livre 5
  • 6. composta por uma linguagem de programação, um ambiente de desenvolvimento integrado e um microcontrolador de placa única) e seu ambiente de desenvolvimento é baseado no Processing. matemática para realização dos cálculos no microcontrolador. É importante salientar que neste relatório informamos somente a calibragem de um sensor, por conta da acessibilidade aos materiais do projeto. No entanto, durante a programação deixamos uma parte do código reservado para incluir as outras funções características advindas das calibrações dos outros 9 sensores. O Arduino tem a funcionalidade de interpretar as variáveis do ambiente e transformá-las em sinal elétrico, através de sensores ligados aos terminais de entrada, controlando ou acionando algum outro elemento eletro-eletrônico conectado ao terminal de saída. Resumidamente, o Arduino é uma ferramenta de entrada e saída de dados que pode ser acionada por um sensor, e depois processada para poder acionar um atuador. Esse funcionamento é simplificado no esquema abaixo. Quando há mudança de cor do objeto de branco (clara) para preto (escura) ou vice-versa foi possível perceber que a tensão no sensor muda mantendo a mesma distância. Isso ocorre, pois a reflexão do infravermelho será menor quando a cor do objeto for preta. Nesse projeto iremos considerar que os objetos encontrados serão da cor branca. Com as amostras de tensão para cada distância que obtivemos, encontramos a relação Distância x Tensão pelo método dos mínimos quadrados. Essa relação, que será usada durante a programação, é escrita como: Figura 13 –Diagrama simplificado de funcionamento do Arduíno. d  26,1049  V -1,13718 Com o Arduino pode-se desenvolver objetos interativos, permitindo a entrada de sensores ou chaves, controlando uma variedade de luzes, motores ou saídas físicas. Com ele pode-se manipular o hardware (sensores, portas, alarmes) através do software. Algumas de suas utilização são:    grandes vantagens (3) Sendo: d = distância do sensor ao obstáculo de cor branca V = tensão escrita pelo sensor para representar a distância ao obstáculo de A curva para calibragem foi apresentado no gráfico abaixo. Preço: Relacionando com as outras plataformas de microcontroladores, o Arduino possui um preço relativamente baixo. Multi-plataforma: O seu software roda no Windows, Linux e Macintosh OSX. Utilização simples e clara: O seu ambiente de programação é de fácil uso e seu código fonte é aberto e pode ser aperfeiçoado por programadores mais experientes. 2.6 Lógica de programação, Fluxograma e código Figura 14 - Curva de calibragem construída utilizando uma folha de papel A4 da Chamex modelo multi, gramatura 75g/m2, como obstáculo. Para conversão de valores de tensão para valores de distância foi necessário fazer uma calibragem no sensor infravermelho que consiste em obter os valores experimentais de tensão para cada distância. Após várias medições é possível gerar uma função Com a função da distância bem definida, iniciamos a escrita do código de programação do Arduino. Todo código necessita da inclusão de bibliotecas. Como o nosso código irá conter 6
  • 7. funções matemáticas, incluímos em nossa programação a biblioteca math.h. Além disso, nosso projeto deverá conter uma comunicação serial via I2C que servirá para enviar os dados dos valores da distância quando solicitados. Portanto, será necessário incluir a biblioteca Wire.h. float sensor = é o dado enviado pelo sensor ao encontrar o obstáculo. Esse dado virá na faixa de 0 a 1023 que é a faixa considerada para a resolução de 10 bits que estamos utilizando. Como os dados do sensor será um sinal analógico, é necessário pedir que o compilador leia esse sinal. Por isso usamos a chamada analogRead() que permite a leitura do pino que recebe o sinal analógico. Considerando o canal de conversão analógico-digital de 10 bits que estamos utilizando, o Arduino irá mapear tensões de entrada entre 0 e 5V em valores inteiros entre 0 e 1023. O que produz uma resolução de leitura de 5 volts por 1024 unidades. A chamada analogRead() vem especificando entre os parênteses o pino que recebe o sinal analógico. Como usamos a porta A0, A1, A2, A3, A4, A5, A6, A7, A8, A9 como pinos de entrada dos sinais analógicos (10 portas, pois usamos 10 sensores), especificamos no analogRead() o pino (i + 14), sendo i um número inteiro que varia entre 0 e 9, e 14 o valor conhecido pelo compilador como porta A0 (15 é a porta A1, 16 é a porta A2, 17 é a porta A3 e assim sucessivamente). Iniciamos nosso código também com o préprocessador #define que exige que compilador ao longo do programa faça a substituição da constante definida pelo pré-processador por um valor também pré definido. No nosso caso fizemos #define canaisAD 10 que substitui tudo que estiver escrito como canaisAD por 10. Esses canais AD são todos os canais analógicos-digitais que temos para converter os sinais analógicos advindos dos sensores. Como possuímos 10 sensores, logo necessitamos de 10 conversores ADs, então definimos canaisAD como 10. Declaramos o inteiro i que servirá como valor que varia entre 0 e 9 para ajudar na função dos vetores que criamos para armazenar dados. Foi necessário declarar também as constantes das funções característica de cada sensor, bem como os expoentes dessas funções. Para tal criamos dois vetores a[canaisAD] e b[canaisAD] que armazena as 10 constantes e os 10 expoentes da função de cada sensor respectivamente. float volt = é a tensão que iremos calcular através do dado recebido pelo float sensor. Como o dado do sensor virá numa faixa entre 0 e 1023, para transformar esse número num valor em Volts usamos a fórmula abaixo: O esboço de nossa programação inicializa com a função void setup() no qual se usa para inicializar variáveis, seleção de pinagens, etc. Dentro dessa função, é necessário inicializar a comunicação serial, informando a taxa de dados em bits por segundo para transmissão de dados serial. Cada serial possui um nível diferente de taxa de dados de transmissão que variam entre 300 à 115200 bits por segundo. Como estamos conectando o computador via serial, este exige somente uma taxa de 9600 bits por segundo. Nessa função será necessário, também, inicializar a comunicação via I2C, através da função Wire.begin(). volt  5  sensor 1023.0 (4) Sendo: 5 = a tensão máxima em volt (tensão de alimentação) sensor = o valor recebido do sensor (que varia de 0 a 1023) 1023 = o máximo valor da faixa recebida do sensor float dist = é o valor da distância do sensor ao obstáculo. Esse valor é calculado pela fórmula (3) já mencionada. Como queremos armazenar os valores da distância de cada sensor aos obstáculos, fizemos a variável dist como vetor, escrevendo como dist [canaisAD - 1]. Como o vetor distância armazena dados de cada canal analógico-digital, definimos que este vetor possui o tamanho igual à dos canaisAD, ou seja, é um vetor que armazena 10 valores de distância (que varia de 0 à 9). Ao aplicar a fórmula (3) para calcular a distância, usamos o vetor dist como sendo dist [i], com i variando entre 0 e 9. A fórmula fica: Depois de criar uma função setup(), que inicializa e define os valores iniciais, a função void loop() faz exatamente o que seu nome sugere, laços consecutivos, permitindo que o programa continue em seu processo de leitura, manipulação de dados e escrita. Nas definições de variáveis temos: 7
  • 8. dist[i]  a[i]  volt b[i ] O código do programa é indicado abaixo: (5) #include <Wire.h> // Biblioteca I2C #include <math.h> // Biblioteca matemática A cada valor de i variando de 0 a 9, possuímos novos valores de tensão calculados para cada dado recebido pelo sensor. Desta forma, temos os diferentes valores das distâncias armazenados no vetor que varia de dist [0] à dist [9]. Observe também que a[i] é o vetor que armazena as constantes e b[i] o vetor que armazena os expoentes da função característica de cada sensor, definida após calibragem. #define canaisAD 10 // números de canais AD // dos sensores (temos 10 // canais) int i = 0; //declaração das constantes de calibração de //cada sensor, usados para calcular distância, // os valores para outros sensores devem ser //obtidos como segue no artigo: Para que cada valor do vetor distância seja escrito no monitor do computador, indicamos a função Serial.println(dist[i]). Além disso, será necessário uma interrupção do programa à cada escrita dos valores das distâncias obtidas. Essa interrupção é importante para que possamos ver com clareza os valores no monitor do computador. Para isso, é necessário utilizar a função delay(300), no qual colocamos uma parada de 300 milisegundos (0,3 segundos) de uma escrita para outra. Para o envio do vetor distância (dist[i]) via I2C, quando solicitado, implementamos no código a função Wire.write(int (dist[i])). const float a[canaisAD] = {26.1049, constante2,constante3,...,constante10}; const float b[canaisAD] = {-1.13718, expoente2,expoente3,...,expoente10}; void setup( ) { // Inicializa comunicação serial em 9600 //bits por segundo: Serial.begin(9600); // Inicia o I2C: Wire.begin( ); O valor de i é incrementado (somado 1) cada vez que um valor de distância for armazenado no vetor. Quando o valor de i chegar à 10 (valor de canaisAD) o compilador zera i (coloca i = 0) e retorna ao início do loop, onde recomeçará a leitura das distâncias do obstáculo à cada sensor. } // A rotina roda num loop roda para sempre: void loop( ) { Segue adiante o fluxograma que simplifica todas essas etapas da programação. float sensor = analogRead(i+14); // porta A0 é chamada de 14 pelo programa, A1 // é 15 e assim sucessivamente float volt; float dist [canaisAD]; // Imprime o dado para leitura // cálculo para achar o valor em volts no sensor: volt = 5*sensor/(1023.0); // cria um vetor que contém canaisAD valores //de distâncias que serão lidas pelo sensor: dist[i] = a[i]*pow(volt,b[i]); if( (dist[i] > 70.0) || (dist[i] < 15.0)) { Serial.print(“Sensor ”); Serial.print(i); Serial.println(“ excedeu a faixa”); } Figura 15 - Fluxo de execução do código feito para Arduino. 8
  • 9. // Imprime no Serial Monitor o valor: Serial.println(dist[i]); Segue o circuito modelo utilizado para leitura de dados do sensor e retorno de valores de distância entre sensor e obstáculo: // Envia via I2C os valores das distâncias. //Envia em formato inteiro, pois não funciona //com ponto flutuante: Wire.write(int (dist[i])); delay(300); // Espera 0,3 s i++; if (i = = canaisAD) { // Se chegar igual a canaisAD volta a 0 e mede o //valor da primeira porta novamente. i=0; } } 3 Resultados práticos Figura 16: Circuito usado para teste de código. Arduino utilizado para teste, Arduino Nano. Para implementação e teste do código de programação do projeto, foi utilizado somente 1 sensor ligado ao Arduino Nano (placa pequena baseada no ATmega326) no qual possui as seguintes características:         Para ligação do sensor à placa do Arduino utilizamos a referência da pinagem do sensor encontrada em seu datasheed. Conectamos as 2 entradas do sensor (GND e Vcc) e a saída do sensor (Vo) às portas do Arduino. Observa-se na imagem que a saída Vo do sensor está ligado à porta A0 da placa. Esse sinal Vo é o sinal referente às distâncias do sensor ao obstáculo, e esse sinal que será aplicado no nosso programa para definirmos os valores das distâncias através da equação (5). A porta 5V da placa é conectada ao pino de entrada Vcc do sensor. Essa porta 5V serve de alimentação ao sensor e é a tensão proveniente da alimentação entregue pelo computador ao Arduino (via USB). A porta GND da placa é conectada ao pino de entrada GND do sensor para finalizar as ligações suficiente para a interação entre microprocessador e sensor. Tensão de operação: 5V, proveniente de fonte externa ou da porta USB de um computador; 14 pinos de entrada e saída digital, sendo 6 portas com capacidade para PWM; 8 pinos de entrada analógica; Corrente máxima por pino digital de 40mA; Memória de programa flash de 32KB, incluindo bootloader; Memória RAM de 2KB; Memória EEPROM de 1KB; Clock de 16MHz. O que diferencia de fato esse Arduino Nano ao Arduino Mega2560 são as quantidades de pinos de entrada analógica, pinos de entrada e saída digital e capacidade de memórias flash, RAM e EEPROM. No entanto, para efeito de teste da programação, essa diferença não afetaria nosso projeto, já que testaremos a programação utilizando somente 1 sensor. Com o teste validando a qualidade do nosso programa, bastou somente alterar o código do programa para mais 9 sensores, implementando um loop e criando vetor de dados. 4 Conclusão O projeto em questão analisou o comportamento do sensor infravermelho em diferentes tipos de obstáculos e permitiu a caracterização da função Distância por Voltagem através de calibração e regressão não linear dos valores das amostras. Foi feita a escolha em trabalhar com a melhor curva que caracteriza-se nosso sistema, por isso 9
  • 10. foi feita a análise do coeficiente de determinação de cada tipo de obstáculo (o da cor branca e o da cor preta) ficando clara a maior confiabilidade diante da equação característica ao se utilizar obstáculo de cor branca. Diante do objetivo em desenvolver um programa que informasse ao usuário a distância dos sensores aos obstáculos, foi possível perceber a facilidade de manuseio e o bom desempenho ao se utilizar do microprocessador Arduino que consegue atender de forma prática e simples aos objetivos finais no trabalho. De forma geral, os resultados obtidos foram satisfatórios e fiéis ao esperado teoricamente. O projeto permitiu o aprofundamento do conhecimento de microcontroladores e da facilidade de manipulação de dados que estes podem nos fornecer. Além disso, o projeto permitiu enxergar a importância das análises estatísticas referente às amostras durante calibração de componentes. Zuben , Fernando J. V., 2013, Notas de aula do curso EA616 , DCA/FEEC/UNICAMP Ibrahim, Dogan, 2006, Microcontroller Based Applied DigitalControl John Wiley & Sons, Ltd. Seguine, Dennis, July 15, 2011, Associated Application Notes: AN2095, AN2219,Cypress MCU Application Design Team, Choi, June, 1D/A Converter by Using PWM, 8-bit Microcontroller Application Note http://www.mantech.co.za/datasheets/products/ A000047.pdf http://www.cefetsp.br/edu/sertaozinho/professor es/Fernando_Fortuna/material_341_3ano.pdf http://www.acroname.com/robotics/info/articles /sharp/sharp.html A participação no trabalho, nos permitiu identificar possíveis aplicações do projeto em trabalhos como sensoriamento de posição de um robô através destes sensores conectados à diversas partes da sua estrutura, permitindo até um estudo da presença do robô no espaço inserido, informado a sua localização ou mesmo onde existem obstáculos e como ele deverá agir diante dessas barreiras físicas. http://arduino.cc/en/Reference/HomePage http://www.arduino.cc/ São sugestões para o melhoramento do projeto, estudar como tornar o sistema de medição de distância imune a variação de cores, ou até mesmo permitir que através dos dados enviados pelos sensores o programa possa identificar e informar as cores captadas pelos sensores, ajudando a reconstruir a imagem do ambiente. 5 Agradecimentos Os autores deste artigo agradecem ao professor Jés Cerqueira pela colaboração e orientação ao longo do desenvolvimento do projeto. 6 Referências Bibliográficas Taylor, C. W. (1994). Power System Voltage Stability. Ed McGraw-Hill , Inc.. OGATA, Katsuhiko, 2003, Engenharia de controle moderno. 4. ed. São Paulo: PrenticeHall do Brasil 10