relatorio larissa

34
RELATÓRIO FINAL DAS ATIVIDADES DO BOLSISTA (Relatório individual por bolsista por projeto) 1. IDENTIFICAÇÃO DO PROJETO Título do Projeto: Sistema para medição de campos eletromagnéticos debaixa frequência para monitoração desubestações eambientes industriais Professor responsável pelo Projeto (identificar o nome do líder do grupo de pesquisa): Marcílio André Félix Feitosa Equipe Executora Docente Departamento e-mail Marcílio André Félix Feitosa Engenharia Elétrica [email protected] Gustavo Oliveira Cavalcanti Engenharia Elétrica [email protected] 2. IDENTIFICAÇÃO DO BOLSISTA Nome do Aluno Curso Matrícula e-mail Larissa Maria Figueirôa Bacelar Engenharia Eletrotécnica 09735080435 [email protected] 3. PERÍODO DE REALIZAÇÃO Início ___01___ / ___08___ / ___12____ Término ___31___ / ___07___ / ___13____

Upload: larissa-bacelar

Post on 27-Dec-2015

33 views

Category:

Documents


3 download

TRANSCRIPT

RELATÓRIO FINAL DAS ATIVIDADES DO BOLSISTA

(Relatório individual por bolsista por projeto) 1. IDENTIFICAÇÃO DO PROJETO

Título do Projeto:

Sistema para medição de campos eletromagnéticos debaixa frequência para monitoração desubestações eambientes industriais

Professor responsável pelo Projeto (identificar o nome do líder do grupo de pesquisa): Marcílio André Félix Feitosa

Equipe Executora

Docente Departamento e-mail

Marcílio André Félix Feitosa Engenharia Elétrica [email protected]

Gustavo Oliveira Cavalcanti Engenharia Elétrica [email protected]

2. IDENTIFICAÇÃO DO BOLSISTA

Nome do Aluno Curso Matrícula e-mail

Larissa Maria Figueirôa Bacelar

Engenharia Eletrotécnica

09735080435 [email protected]

3. PERÍODO DE REALIZAÇÃO

Início ___01___ / ___08___ / ___12____

Término ___31___ / ___07___ / ___13____

3. Sobre o Projeto

3.1 Resumos do Projeto (Introdução, Objetivos)

Linhas de transmissão e equipamentos eletrônicos, entre outros, são fonte de radiação eletromagnética de alta ou baixa frequência. O campo gerado nestas situações pode ser prejudicial à saúde [1] e gerar interferência em equipamentos eletrônicos [2]. A lei que regulamenta a intensidade de campo é a resolução normativa Nº 398 da ANEEL, de 23 de março de 2010 [3]. Esta norma prevê que, para o público em geral, a máxima intensidade de campo elétrico e magnético devem ser de 4,17 kV/m e 83,33 μT (0,83 Gauss), respectivamente. Para a população ocupacional as intensidades máximas devem ser de 8,33 kV/m 416,67 μT (4,167 Gauss) para campos elétricos e magnéticos, respectivamente. Este projeto se destina ao estudo e desenvolvimento de um sensor de campo magnético e a construção de um equipamento de medição de campos magnéticos de baixas e médias frequências, com capacidade de medição de campos de intensidade várias vezes maior que os níveis aceitáveis pela resolução normativa mencionada. O projeto também prevê atividades de monitoração em áreas residenciais localizadas próximas a torres de transmissão de alta tensão para determinar se as intensidades dos campos estão dentro dos níveis aceitos por lei.

O objetivo do projeto foi desenvolver um sistema capaz de medir campos magnéticos

de baixas e médias freqüências a um baixo custo, visto que já existem equipamentos capazes de fazer a mensuração. O sensor escolhido é composto por ligas magneto-resistivas, comercializado na forma de circuitos integrados, capaz de medir as componentes magnéticas dos campos. Um sistema baseado na plataforma Arduino foi desenvolvido para fazer a aquisição do sinal analógico proveniente dos sensores, realização de todos os cálculos necessários e apresentação dos resultados dos campos medidos em um display. O esquema está indicado na Figura 1. O sistema desenvolvido será aplicado na medição dos campos gerados por equipamentos elétricos e linhas de transmissão, para comparação com os níveis de intensidade de campo permitidos por lei [3].

Figura 1: Diagrama ilustrativo dos circuitos constituintes do projeto.

Inicialmente foi feito um estudo sobre os tipos de sensores de campo magnético

disponíveis no mercado e qual tipo a ser selecionado. Existem dois tipos principais de sensores de campo magnético: os magneto-resistivos e os que se baseiam no efeito Hall.

Sensores magneto-resistivos [5] consistem basicamente de elementos magneto-resistivos, ou seja, componentes cuja resistência muda de acordo com o campo magnético que incide sobre eles. Tal fenômeno ocorre em alguns materiais ferrosos, e para a aplicação em sensores é utilizada uma liga de Ferro e Níquel. Tais componentes são montados numa configuração chamada ponte de Wheatstone, mostrada na Figura 2, composta por quatro

resistores, formando dois divisores de tensão em paralelo. É aplicada uma tensão alimentando esse circuito e mede-se a diferença da tensão entre os dois divisores de tensão.

Figura 2: Ponte de Wheatstone.

Quando não há nenhum campo magnético incidindo sobre o circuito, a tensão é zero,

pois todos os elementos magneto-resistivos apresentam a mesma resistência. Ou seja, dizemos que a ponte está balanceada. Porém, ao aplicarmos um campo magnético perpendicular a esse circuito, a resistência desses materiais varia e a ponte ficará desbalanceada, surgindo uma tensão entre os dois pontos centrais dos divisores de tensão. Essa diferença poderá ser negativa ou positiva, dependendo do sentido do campo magnético.

Figura 3: Ponte de Wheatstone ao aplicar campo magnético em sentidos opostos

Assim como um acelerômetro, esse sensor mede o campo magnético em determinados

eixos, sendo que para cada eixo há uma ponte de Wheatstone composta por elementos magneto-resistivos. Esses são basicamente os únicos elementos do sensor, exceto alguns componentes utilizados para uma possível regulagem do sensor.

Existem também os sensores cujo funcionamento é baseado no efeito Hall [5], baseiam-se no princípio de interação entre campos magnéticos e cargas elétricas. Quando uma corrente passa por um material condutor, ela distribui-se uniformemente ao longo do material e não há nenhuma diferença de potencial (tensão) entre as laterais do material. Porém, ao aproximarmos um imã, o campo magnético perturbará a distribuição da corrente ao longo do material. Haverá um acúmulo de cargas negativas (elétrons) em um dos lados do condutor, o que gerará uma tensão entre suas laterais. Se invertermos o sentido do campo magnético, a tensão presente no material também será invertida.

Essa diferença de tensão é muito pequena, mas se for amplificada, pode ser monitorada por um circuito externo. Essa amplificação já é feita internamente no sensor. A saída desse sensor pode ser analógica ou digital. Os sensores analógicos possuem uma saída

correspondente à intensidade do campo magnético que incide sobre eles. Já nos digitais, sua saída estará num nível lógico alto enquanto não houver um campo magnético. Se o campo magnético ultrapassar certo valor, então a sua saída se encontrará num nível lógico baixo. Desse modo, os sensores de efeito Hall digitais comportam-se como chaves digitais acionadas por imãs.

Sensores de efeito Hall são empregados principalmente em indústrias, como sensores de posição, pois são duráveis e práticos. Basta colocar um imã na estrutura que se deseja controlar o movimento e utilizar um sensor para detectar quanto o imã aproxima-se do sensor.

Os dois tipos de sensores possuem certas diferenças em relação ao seu funcionamento. Em geral, os magneto-resistivos são mais sensíveis e podem detectar campos magnéticos a distâncias maiores. Já os de efeito Hall têm a vantagem de possuírem um maior ângulo de cobertura.

Baseando-se nessas definições escolheu-se o sensor HMC5883L[4] constituído por ligas magneto-resistivas, fabricado pela Honeywell. Trata-se de um sensor magnético construído para medir a direção e a magnitude de campos magnéticos nos três eixos (x, y, z), com baixa tensão de operação (2.16 a 3.6 V) e baixo consumo de corrente (127 μA), tem como protocolo de comunicação: I2C digital interface [6], mensura uma faixa bem estreita de campo magnético:-/+8 Gauss, além de detectar dados de campo em uma frequência de 160 Hz. De acordo com o critério de Nyquist [7], a frequência de amostragem de um sinal analógico, para que possa posteriormente ser reconstituído com o mínimo de perda de informação, deve ser igual ou maior a duas vezes a maior frequência do espectro desse sinal. Portanto, tal sensor é capaz de amostrar adequadamente os sinais de campo magnético de 60 Hz das linhas de transmissão.

Após a escolha do sensor, foram desenvolvidos códigos que continham bibliotecas de comandos referentes ao barramento I2C e ao HMC5883L, capazes de fazer a aquisição dos sinais analógicos provenientes do sensor. Os dados referentes aos campos magnéticos eram simultaneamente obtidos pelo sensor e enviados via comunicação serial pelo Arduino para o computador. Tais dados eram provenientes do campo magnético produzido por um transformador ligado em vazio. Com os resultados obtidos do Arduino fez-se uma análise do sinal, baseada em algoritmos como a Transformada rápida de Fourier (FFT- Fast Fourier Transform) [8] [9] que calcula a transformada de Fourier discreta (DFT) [10]. A transformada de Fourier converte tempo (ou espaço) em frequência e vice-versa. Os resultados calculados pelo Arduino foram devidamente comparados a resultados calculados por softwares matemáticos e as amplitudes confirmaram os resultados do Arduino. Essa análise do sinal foi essencial para descobrir a componente fundamental do sinal e garantir que o sensor captava campos na frequência de 60 HZ e obter as respectivas amplitudes. Em seguida o código foi implementado para mostrar esses dados em um display LCD.

3.2 Cronograma proposto

3.3 Material de Estudo

Na primeira etapa do projeto os materiais de estudo foram os datasheets dos possíveis sensores, haja vista que existe uma larga variedade de sensores de campo magnético. Os principais levantamentos das características dos sensores consistiam de: garantir que o sensor

era capaz de mensurar o campo magnético e não simplesmente fazer detecção; buscar aquele mais sensível, pois a faixa de campo de magnético produzido pelas linhas de transmissão é muito pequena (0,83 Gauss a 4,167 Gauss). Portanto, o sensor procurado deveria ser capaz de medir uma faixa escolhida de aproximadamente 0.4 Gauss a 10 Gauss, com a finalidade de constatar uma possível fuga da Norma mencionada anteriormente; analisar as frequências de amostragem dos mesmos bem como suas características elétricas de operação para que não ocorresse problema na comunicação com o Arduino.

Quando encerrado o estudo dos datasheets e escolhido o sensor já mencionado, foi necessário um aprofundamento em programação no arduino, como linguagem de programação, funções disponíveis, bibliotecas para a comunicação I2C para finalmente elaboração dos códigos.

Em seguida, pesquisas sobre análise de processamento de sinais foram estudadas para a criação de algoritmos capazes de fazer o devido tratamento do sinal de campo

magnético. 3.4 Delineamento experimental e tratamentos utilizados

A fim de mensurar amplitudes de campos magnéticos obtidos pelo sensor HMC5883L todo o delineamento experimental foi computacional com o auxílio do Arduino e sua linguagem própria.

A elaboração dos códigos foi feita em etapas. Inicialmente o código desenvolvido tinha como objetivo: o estabelecimento correto de comunicação entre o sensor e o Arduino, configuração dos registradores do sensor bem como a visualização dos dados impressa na tela do computador via USB.

3.4.1 Comunicação entre o sensor e o Arduino: Como já dito anteriormente a comunicação entre o sensor e o Arduino é feita pelo protocolo I2C que é usado para interconexão de diversos circuitos integrados a um único barramento de quatro linhas físicas. O barramento I2C possui uma linha para enviar/receber dados, chamada linha serial de dados (SDA) e outra linha usada para o clock que sincroniza a comunicação, denominada linha serial de clock (SCL) e as outras duas linhas são formadas pelo positivo (VDD) e o terra (GND)

A comunicação entre o HMC5883L e o Arduino foi toda feita através da interface I2C onde o sensor é o escravo e o Arduino o mestre da seguinte forma:

Tabela 1: Ligação dos pinos do sensor com o Arduino.

Sensor (HMC5883L) Arduino

GND GND

VCC 3.3 V

SDA Pino A4 (Arduino UNO) / Pino 20 (Arduino Mega)

SCL Pino A5 (Arduino UNO / Pino 21 (Arduino Mega)

Figura 4: Ligação dos pinos do sensor com o Arduino.

3.4.2 Configuração dos registradores do sensor:

Foram feitos alguns ajustes em alguns registradores específicos para que o sensor operasse na forma desejada para o projeto. Os registradores alterados estão mostrados abaixo juntamente com os respectivos comandos feitos pelo Arduino. Os outros registradores mantiveram-se como modelo de fábrica que estão mais detalhados no Datasheet do sensor [4]. Para o registrador B: O registrador B consiste nas configurações de ganho do sensor, ou seja, a faixa de campo detectada pelo sensor. A configuração de fábrica é para uma faixa de campo entre ±1.3 Gauss, que não serviria para o projeto. Portanto, a alteração feita no registrador B foi para colocá-lo na configuração de aquisição de campos magnéticos de intensidade entre +/-8.1 Gauss, que seria a máxima intensidade de campo detectada pelo sensor, essa intensidade estaria dentro da faixa escolhida mencionada acima (0.4 Gauss a 10 Gauss). Comandos enviados pelo Arduino: Wire.beginTransmission(MAG_ADDRESS);

Wire.write((byte) 0x01); //Grava os dados de endereço do registrador

B.

Wire.write((byte) 0xE0);//Grava os dados de configuração do

registrador B, define o ganho de +/-8.1 Gauss (0xE0-11100000)

Wire.endTransmission();

Tabela 2: Configuração alterada do Registrador B.

CRB7 CRB6 CRB5 CRB4 CRB3 CRB2 CRB1 CRB0

GN2 (1) GN1 (1) GN0 (1) (0) (0) (0) (0) (0)

Tabela 3: Designação dos Bits do Registrador B (retirada do Datasheet).

Tabela 4: Configurações de Ganho (retirada do Datasheet)

Para o registrador de Modo:

O registrador de modo consiste nas configurações de modo de medição como, por exemplo: medição contínua ou medição simples. A configuração de fábrica desse registrador é para que o sensor meça continuamente. Como o intuito foi fazer medições a uma taxa de amostragem conhecida, foi necessário alterar este registrador para o modo de medição simples, alterando o tempo de espera para a próxima aquisição para aproximadamente 8 ms. Comandos enviados pelo Arduino: Wire.beginTransmission(MAG_ADDRESS);

Wire.write((byte) 0x02);// Grava os dados de endereço do registrador

de Modo.

Wire.write((byte) 0x01);//Grava os dados de configuração do

registrador de modo e define o modo de medição única (00000001).

Wire.endTransmission();

Tabela 5: Configuração alterada do Registrador de Modo

MR7 MR6 MR5 MR4 MR3 MR2 MR1 MR0

(0) (0) (0) (0) (0) (0) MD1 (0)* MD0 (1)*

Tabela 6: Designação dos Bits do Registrador de Modo (retirada do Datasheet)

Tabela 7: Modos de operação (retirada do Datasheet)

3.4.3 Código inicial: //Código que acessa os dados correspondentes as medidas de campo

magnético nas direções X, Y e Z, calcula sua taxa de amostragem e

imprime os resultados obtidos na tela do computador via comunicação

Serial.

//Aquisição dos dados em 8ms em 8ms, o que corresponde a uma

freqüência de 125HZ, atendendo ao critério de Nyquist.

#include <Wire.h>

#define MAG_ADDRESS ((char) 0x1E)// define o endereço da comunicação

I2C no sensor.

uint8_t mag_buffer[6];//vetor sem sinal, de tamanho 6 com 8 bits cada,

armazenado na memória temporária (SRAM) {(X MSB(8) XLSB(8); YMSB(8)

YLSB(8); ZMSB(8) ZLSB(8)}

int16_t mag_raw[3];// Vetor de tamanho 3 com 16 bits cada {valor bruto

de X(16); Y(16); Z(16)}

long tempo1 = 0, tempo2 = 0;// variáveis utilizadas para o cálculo do

tempo de amostragem, considerando o tempo de comunicação com o

Arduino.

// Função configMag

Void configMag()

{

uint8_t mag_name;

//Configuração do registrador B

Wire.beginTransmission(MAG_ADDRESS);

Wire.write((byte) 0x01);//Grava os dados de endereço do registrador B.

Wire.write((byte) 0xE0); //Grava os dados de configuração do

registrador B, define o ganho de +/-8.1 Gauss (0xE0-11100000)

Wire.endTransmission();

// Configuração do registrador de modo

Wire.beginTransmission(MAG_ADDRESS);

Wire.write((byte) 0x02);//Grava os dados de endereço do registrador B.

Wire.write((byte) 0x01);//Grava os dados de configuração do

registrador de modo e define o modo de medição única (00000001).

Wire.endTransmission();

}

// ler 6 bytes (x,y,z medidos do campo magnético) do sensor

voidreadMag() {

// leitura dos dados dos registradores(de 0x03 a 0x08)

Wire.beginTransmission(MAG_ADDRESS);

Wire.write((byte) 0x03); // o endereço do primeiro byte de dado

Wire.endTransmission();

Wire.beginTransmission(MAG_ADDRESS);

Wire.requestFrom(MAG_ADDRESS, 6); // Requisita 6 bytes

int i = 0;

while(Wire.available()) // Retorna o número de bytes disponíveis:

{

mag_buffer[i] = Wire.read(); // Lê o primeiro byte e coloca no vetor

mag_buffer

i++; // incrementa até i ser igual a 6

}

Wire.read();// Lê todos os bytes requisitados

Wire.endTransmission();

// Combina os dados brutos em números ineiros (O HMC588L envia

primeiro o byte MSB)

// ________ MSB _______ _____ LSB ____

mag_raw[0] = (mag_buffer[0] << 8) | mag_buffer[1];

mag_raw[1] = (mag_buffer[2] << 8) | mag_buffer[3];

mag_raw[2] = (mag_buffer[4] << 8) | mag_buffer[5];

// Coloca o dispositivo de volta no modo de medição única.

Wire.beginTransmission(MAG_ADDRESS);

Wire.write((byte) 0x02);

Wire.write((byte) 0x01);

Wire.endTransmission();

}

void setup()

{

Serial.begin(115200);//inicia a comunicação serial a 115200 bps.

Serial.println("Inicializando...");//imprime.

Serial.print (" Campo X");

Serial.print(" ");

Serial.print ("Campo Y");

Serial.print(" ");

Serial.print ("Campo Z"); Serial.print(" ");

Serial.println ("Tempo de amostragem");

Wire.begin();//inicia a biblioteca wire referente ao barramento I2C.

configMag();//chama a função configMag.

tempo1 = millis();//atribui a variável tempo1 o número de

milissegundos contados desde o início do funcionamento do programa até

este ponto.

}

void loop() {

readMag();// chama a função readMag

delay(6); // espera 6.5 ms para a próxima aquisição, pois somado ao

tempo que o sensor gasta (aproximadamente 1.5 ms)obtém-se um tempo de

amostragem igual a 8ms.

tempo2 = (millis() - tempo1);//atribui a variável tempo2 o número de

microssegundos contados referente ao laço de leitura e converte em

milissegundos.

Serial.print(" ");Serial.print(mag_raw[0]); Serial.print("

");//imprime valores brutos do eixo X;

Serial.print(mag_raw[1]); Serial.print(" ");//imprime valores

brutos do eixo Y;

Serial.print(mag_raw[2]); Serial.print(" ");//imprime valores

brutos eixo Z;

Serial.println(tempo2);

}

Resultados: Na execução desse código não havia presença de campo magnético induzido. Observa-se que o tempo de amostragem é aproximadamente 8ms.

Figura 5: Amostras obtidas do código, sem campo induzido.

Em seguida utilizou-se o mesmo código com o sensor próximo a um transformador

110/220V, e obteve-se o seguinte resultado:

Figura 6: Amostras obtidas do código, com campo induzido.

3.5 Variáveis analisadas e resultados parciais obtidos

A principal variável analisada foi o campo magnético obtido nos resultados apresentados acima. Os sinais nas três direções foram decompostos para descobrir as componentes fundamentais e verificar se eram as componentes de 60 Hz, em seguida foram analisadas as amplitudes das mesmas. Para isso calculou-se a transformada de Fourier dos dados, no software gráfico Origin. Os gráficos são mostrados abaixo:

Gráficos dos sinais utilizando o transformador:

0 10 20 30 40 50 60

-50

0

50

100

150

200

250

300

350

Am

pli

tude

do C

ampo n

a dir

eção

X(m

G)

Frequência (Hz)

Figura 7: Gráfico da Amplitude do Campo na direção X, utilizando o transformador.

0 10 20 30 40 50 60

0

200

400

600

800

1000

1200

Am

pli

tude

do C

ampo n

a dir

eção

Y (

mG

)

Frequência (Hz)

Figura 8: Gráfico da Amplitude do Campo na direção Y, utilizando o transformador.

0 10 20 30 40 50 60

0

50

100

150

200

250

Am

pli

tude

do C

ampo n

a dir

eção

Z (

mG

)

Frequência (Hz)

Figura 9: Gráfico da Amplitude do Campo na direção Z, utilizando o transformador

Gráficos dos sinais sem campo induzido:

0 10 20 30 40 50 60

-1

0

1

2

3

4

5

6

7

Am

pli

tude

do C

ampo n

a dir

eção

X (

mG

)

Frequência (Hz)

Figura 10: Gráfico da Amplitude do Campo na direção X, sem o transformador

0 10 20 30 40 50 60

-1

0

1

2

3

4

5

6

7

8

Am

pli

tude

do C

ampo n

a dir

eção

Y(m

G)

Frequência (Hz)

Figura 11: Gráfico da Amplitude do Campo na direção Y, sem o transformador

0 10 20 30 40 50 60

0

2

4

6

8

10

12

Am

pli

tude

do C

ampo n

a dir

eção

Z

Frequência (Hz)

Figura 12: Gráfico da Amplitude do Campo na direção Z, sem o transformador

Portanto, ao analisar os gráficos pôde-se concluir que o sensor foi capaz de detectar os campos de 60 Hz.

Em seguida, o projeto se focou em fazer os cálculos da Transformada de Fourier no Arduino para mostrar como resultado final apenas a componente de 60 Hz no display LCD.

Para o cálculo da DFT: considerando-se N amostras do sinal no domínio do tempo, denotadas f(t), t=0,1,2,...,N-1, a DFT é dada por um conjunto de N amostras do sinal no domínio da freqüência , denotadas por F(u), u= 0,1,2,...,N-1 e definidas por

( )

∑ ( ) ( )

Diz-se então que f(k) ↔ F(n) formam um par transformada e a reobtenção do sinal no

domínio do temporal pode ser feita usando a transformada inversa discreta de Fourier:

( ) ∑ ( )

( )

Quando se deseja trabalhar com os valores de freqüência e tempo, usa-se:

( ) (

), onde (

) ∑ ( )

( )

ao invés da notação simplificada f(k) ↔ F(n).

Desenvolvendo a equação (1):

( )

∑ ( ) ( ) ( )

( )

∑ ( ) ( )

( )

( ) √( ( )) ( ( ))

( )

Essas equações foram desenvolvidas no Arduino em diferentes testes. O primeiro teste

consistia em utilizar o código para calcular a DFT das amostras de uma senóide de amplitude 10 V e freqüência 60 Hz, gerada pelo Excel. Essas amostras estão mostradas a seguir:

0.00, 1.25, -2.49, 3.68, -4.82, 5.88, -6.85, 7.71, -8.44, 9.05, -9.51, 9.82, -9.98, 9.98, -9.82, 9.51, -9.05, 8.44, -7.71, 6.85, -5.88, 4.82, -3.68, 2.49, -1.25, 0.00, 1.25, -2.49, 3.68, -4.82, 5.88, -6.85, 7.71, -8.44, 9.05, -9.51, 9.82, -9.98, 9.98, -9.82, 9.51, -9.05, 8.44, -7.71, 6.85, -5.88, 4.82, -3.68, 2.49, -1.25, 0.00, 1.25, -2.49, 3.68, -4.82, 5.88, -6.85, 7.71, -8.44, 9.05, -9.51, 9.82, -9.98, 9.98, -9.82, 9.51, -9.05, 8.44, -7.71, 6.85, -5.88, 4.82, -3.68, 2.49, -1.25, 0.00, 1.25, -2.49, 3.68, -4.82, 5.88, -6.85, 7.71, -8.44, 9.05, -9.51, 9.82, -9.98, 9.98, -9.82, 9.51, -9.05, 8.44, -7.71, 6.85, -5.88, 4.82, -3.68, 2.49, -1.25, 0.00, 1.25, -2.49, 3.68, -4.82, 5.88, -6.85, 7.71, -8.44, 9.05, -9.51, 9.82, -9.98, 9.98, -9.82, 9.51, -9.05, 8.44, -7.71, 6.85, -5.88, 4.82, -3.68, 2.49, -1.25, 0.00, 1.25, -2.49, 3.68, -4.82, 5.88, -6.85, 7.71, -8.44, 9.05, -9.51, 9.82, -9.98, 9.98, -9.82, 9.51, -9.05, 8.44, -7.71, 6.85, -5.88, 4.82, -3.68, 2.49, -1.25, 0.00, 1.25, -2.49, 3.68, -4.82, 5.88, -6.85, 7.71, -8.44, 9.05, -9.51, 9.82, -9.98, 9.98, -9.82, 9.51, -9.05, 8.44, -7.71, 6.85, -5.88, 4.82, -3.68, 2.49, -1.25, 0.00, 1.25, -2.49, 3.68, -4.82, 5.88, -6.85, 7.71, -8.44, 9.05, -9.51, 9.82, -9.98, 9.98, -9.82, 9.51, -9.05, 8.44, -7.71, 6.85, -5.88, 4.82, -3.68, 2.49, -1.25, 0.00, 1.25, -2.49, 3.68, -4.82, 5.88, -6.85, 7.71, -8.44, 9.05, -9.51, 9.82, -9.98, 9.98, -9.82, 9.51, -9.05, 8.44, -7.71, 6.85, -5.88, 4.82, -3.68, 2.49, -1.25, 0.00, 1.25, -2.49, 3.68, -4.82, 5.88, -6.85, 7.71, -8.44, 9.05, -9.51, 9.82, -9.98, 9.98, -9.82, 9.51, -9.05, 8.44, -7.71, 6.85, -5.88, 4.82, -3.68, 2.49, -1.25, 0.00, 1.25, -2.49, 3.68, -4.82, 5.88

Um aumento na quantidade N de amostras consideradas (e uma escolha do tempo de amostragem Ts) implica em uma melhor representação do espectro.

O tempo de amostragem escolhido como já dito anteriormente foi de 8ms para atender ao critério de Nyquist. Pois para um tempo de amostragem de 8ms a freqüência é 125Hz, maior que duas vezes a freqüência do sinal do campo: 60Hz. Para o número de amostras, nesse teste, escolheu-se 256 amostras, pois esse seria o tamanho máximo permitido pela memória do Arduino para o desenvolvimento dos cálculos da DFT. O código e os resultados obtidos estão mostrados abaixo.

1º Teste: Código da DFT para uma senóide: // Calculo da DFT de uma senóide de 256 pontos, amplitude 10 V e

freqüência 60Hz.

#include<math.h>

int n=256; // Quantidade das amostras

float Ts= 0.008;// Tempo de amostragem (8ms)

// Vetor dos valores de entrada

double Amostras [256] = {0.00, 1.25, -2.49, 3.68, -4.82, 5.88, -6.85,

7.71, -8.44, 9.05, -9.51, 9.82, -9.98, 9.98, -9.82, 9.51, -9.05, 8.44,

-7.71, 6.85, -5.88, 4.82, -3.68, 2.49, -1.25, 0.00, 1.25, -2.49, 3.68,

-4.82, 5.88, -6.85, 7.71, -8.44, 9.05, -9.51, 9.82, -9.98, 9.98, -

9.82, 9.51, -9.05, 8.44, -7.71, 6.85, -5.88, 4.82, -3.68, 2.49, -1.25,

0.00, 1.25, -2.49, 3.68, -4.82, 5.88, -6.85, 7.71, -8.44, 9.05, -9.51,

9.82, -9.98, 9.98, -9.82, 9.51, -9.05, 8.44, -7.71, 6.85, -5.88, 4.82,

-3.68, 2.49, -1.25, 0.00, 1.25, -2.49, 3.68, -4.82, 5.88, -6.85, 7.71,

-8.44, 9.05, -9.51, 9.82, -9.98, 9.98, -9.82, 9.51, -9.05, 8.44, -

7.71, 6.85, -5.88, 4.82, -3.68, 2.49, -1.25, 0.00, 1.25, -2.49, 3.68,

-4.82, 5.88, -6.85, 7.71, -8.44, 9.05, -9.51, 9.82, -9.98, 9.98, -

9.82, 9.51, -9.05, 8.44, -7.71, 6.85, -5.88, 4.82, -3.68, 2.49, -1.25,

0.00, 1.25, -2.49, 3.68, -4.82, 5.88, -6.85, 7.71, -8.44, 9.05, -9.51,

9.82, -9.98, 9.98, -9.82, 9.51, -9.05, 8.44, -7.71, 6.85, -5.88, 4.82,

-3.68, 2.49, -1.25, 0.00, 1.25, -2.49, 3.68, -4.82, 5.88, -6.85, 7.71,

-8.44, 9.05, -9.51, 9.82, -9.98, 9.98, -9.82, 9.51, -9.05, 8.44, -

7.71, 6.85, -5.88, 4.82, -3.68, 2.49, -1.25, 0.00, 1.25, -2.49, 3.68,

-4.82, 5.88, -6.85, 7.71, -8.44, 9.05, -9.51, 9.82, -9.98, 9.98, -

9.82, 9.51, -9.05, 8.44, -7.71, 6.85, -5.88, 4.82, -3.68, 2.49, -1.25,

0.00, 1.25, -2.49, 3.68, -4.82, 5.88, -6.85, 7.71, -8.44, 9.05, -9.51,

9.82, -9.98, 9.98, -9.82, 9.51, -9.05, 8.44, -7.71, 6.85, -5.88, 4.82,

-3.68, 2.49, -1.25, 0.00, 1.25, -2.49, 3.68, -4.82, 5.88, -6.85, 7.71,

-8.44, 9.05, -9.51, 9.82, -9.98, 9.98, -9.82, 9.51, -9.05, 8.44, -

7.71, 6.85, -5.88, 4.82, -3.68, 2.49, -1.25, 0.00, 1.25, -2.49, 3.68,

-4.82, 5.88};

double tfr[256]; // Vetor transformada de Fourier Real

double tfi[256]; // Vetor transformada de Fourier Imaginário

double raiz [256]; //Vetor módulo da transformada de Fourier

void setup ()

{

Serial.begin ( 9600 ); // Inicialização da porta serial

}

void loop ()

{

for(int u=0;u<(n/2)+1;u++)

{

tfr[u]=0;

tfi[u]=0;

for(int x=0;x<n;x++)

{

// Calculo da parte real da DFT

tfr[u]+=Amostras[x]*19ou(2*M_PI*u*(double)x/(double)n);

// Calculo da parte imaginária da DFT

tfi[u]-=Amostras[x]*sin(2*M_PI*u*(double)x/(double)n);

}

raiz[u]= sqrt ((19ou[u]*19ou[u])+(tfi[u]*tfi[u]));

raiz[u]/=(double)(n/2);

Serial.print (“ \t Frequência: “);

Serial.print (u/(n*Ts));

//Corresponde ao Delta de Frequência F(u/(n*tempo de amostragem))

Serial.print(“ Hz”);

Serial.print(“ Amplitude: “);

Serial.print (“ V”);

Serial.println (raiz[u]);

}

}

Resultado: Na figura abaixo, pode-se observar que o código foi capaz de identificar a maior amplitude (aproximadamente 10 V) na freqüência do sinal (aproximadamente 60 Hz).

Figura 13: Resultado do cálculo da DFT.

O Segundo teste consistia em utilizar o mesmo código, porém adaptado para um sinal

de um gerador de ondas chegando a uma porta analógica do Arduino. Para impressão dos resultados na tela do computador seria mostrada apenas a maior amplitude do sinal na faixa entre 45 Hz e 60Hz.

2º Teste: Código da DFT para um sinal analógico: #include<math.h>

int n=256; // Quantidade das amostras

floatTs= 0.008;// Tempo de amostragem (8ms)

// Vetor dos valores de entrada

double Amostras [256];

double Frequencia[256];

double tfr[256]; // Vetor transformada de Fourier Real

doublet fi[256]; // Vetor transformada de Fourier Imaginário

double raiz [256]; //Vetor modulo da transformada de Fourier

void setup ()

{

Serial.begin ( 9600 ); // Inicialização da porta serial

}

void loop() {

Captura();

FFT();

Output();

}

voidCaptura()

{

for(inti=0;i<n;i++)

{

Amostras[i] = analogRead ( 3 ); // Chegada do sinal

Amostras[i]=Amostras[i]*5/1024;//Conversão AD 10 bits

delay (8);

}

}

void FFT ()

{

for(int u=0;u<(n/2)+1;u++)

{

tfr[u]=0;

tfi[u]=0;

for(int x=0;x<n;x++)

{

// Calculo da parte real da DFT:

tfr[u]+=Amostras[x]*cos(2*M_PI*u*(double)x/(double)n);

// Calculo da parte imaginaria da DFT

tfi[u]-=Amostras[x]*sin(2*M_PI*u*(double)x/(double)n);

}

raiz[u]= sqrt ((tfr[u]*tfr[u])+(tfi[u]*tfi[u]));

raiz[u]/=(double)(n/2);

Frequencia [u] =(u/(n*Ts)););

}

}

void Output()

{

float maior = raiz [100];

int x = 100;

for(int u=101;u<(n/2)+1;u++)

{

if (raiz [u] > maior)

{

maior= raiz[u];

x = u;

}

}

Serial.print (" \t Frequencia: ");

Serial.print (Frequencia [x]);

Serial.print("Hz");

Serial.print (" \t Amplitude: ");

Serial.print (maior);

Serial.println ("V");

}

Resultado:

Colocar aqui Fotos do laboratorio

No terceiro teste, o código da DFT foi implementado ao código inicial de aquisição de

dados do sensor. Dessa forma os dados seriam primeiramente capturados, armazenados em um vetor, a DFT calcularia os dados do vetor e os resultados referentes as maiores amplitudes nas três direções de campo entre a faixa de 45Hz a 60 Hz seriam por fim impressos no Display. Como o código se tornou maior e o número de vetores também aumentou, visto que a DFT seria calculada em três vetores diferentes, correspondentes às três direções de campo, o número de amostras teve que ser novamente reduzido para 128 amostras devido à capacidade de memória do Arduino.O código e o resultado impresso na tela pode ser visto abaixo:

3º Teste: Código da DFT para o sinal de campo magnético vindo do sensor:

// Código que calcula a DFT dos dados obtidos do HMC5883L

#include <Wire.h>

#include <math.h>

#define MAG_ADDRESS ((char) 0x1E)// define o endereço da comunicação

I2C no sensor

uint8_t mag_buffer[6];//vetor sem sinal, de tamanho 6 com 8 bits cada,

armazenado na memória temporária (SRAM) {(X MSB(8) XLSB(8); YMSB(8)

YLSB(8); ZMSB(8) ZLSB(8)}

int16_t mag_raw[3];// Vetor de tamanho 3 com 16 bits cada {valor bruto

de X(16); Y(16); Z(16)}

// Definição de variáveis

int l;//variável contador até 128

int n=128; // Quantidade das amostras

float Ts=0.007;// Tempo de amostragem

// Vetor dos valores de entrada

int16_t CampoX [128];

int16_t CampoY [128];

int16_t CampoZ [128];

double Frequencia[128];// Veto valores de frequencia.

double tfrCamp_X[128];// Vetor transformada de Fourier Real Campo X

double tfiCamp_X [128];// Vetor transformada de Fourier Imaginário

Campo X

double tfrCamp_Y[128];// Vetor transformada de Fourier Real Campo Y

double tfiCamp_Y[128];// Vetor transformada de Fourier Imaginário

Campo Y

double tfrCamp_Z[128];// Vetor transformada de Fourier Real Campo Z

double tfiCamp_Z[128];// Vetor transformada de Fourier Imaginário

Campo Z

double raizCamp_X[128];// Vetor Módulo da transformada de Fourier do

Campo X

double raizCamp_Y[128];// Vetor Módulo da transformada de Fourier do

Campo Y

double raizCamp_Z[128];// Vetor Módulo da transformada de Fourier do

Campo Y

// Função configMag

void configMag()

{

uint8_t mag_name;

//Configuração do registrador B

Wire.beginTransmission(MAG_ADDRESS);

Wire.write((byte) 0x01);//Grava os dados de endereço do registrador B.

Wire.write((byte) 0xE0); //Grava os dados de configuração do

registrador B, define o ganho de +/-8.1 Gauss (0xE0-11100000)

Wire.endTransmission();

// Configuração do registrador de modo

Wire.beginTransmission(MAG_ADDRESS);

Wire.write((byte) 0x02);//Grava os dados de endereço do registrador B.

Wire.write((byte) 0x01);//Grava os dados de configuração do

registrador de modo e define o modo de medição única (00000001).

Wire.endTransmission();

}

// ler 6 bytes (x,y,z medidos do campo magnético) do sensor

void readMag()

{

for(l=0;l<n;l++)

{

// leitura dos dados dos registradores(de 0x03 a 0x08)

Wire.beginTransmission(MAG_ADDRESS);

Wire.write((byte) 0x03); // o endereço do primeiro byte de dado

Wire.endTransmission();

Wire.beginTransmission(MAG_ADDRESS);

Wire.requestFrom(MAG_ADDRESS, 6); // Requisita 6 bytes

int i = 0;

while(Wire.available()) // Retorna o número de bytes disponíveis:

{

mag_buffer[i] = Wire.read(); // Lê o primeiro byte e coloca no vetor

mag_buffer

i++; // incrementa até i for igual a 6

}

Wire.read();// Lê todos os bytes requisitados

Wire.endTransmission();

// Combina os dados brutos em números inteiros (O HMC588L envia

primeiro o byte MSB)

// ________ MSB _______ _____ LSB ____

mag_raw[0] = (mag_buffer[0] << 8) | mag_buffer[1];

mag_raw[1] = (mag_buffer[2] << 8) | mag_buffer[3];

mag_raw[2] = (mag_buffer[4] << 8) | mag_buffer[5];

CampoX [l] = mag_raw[0];// Atribui ao vetor CampoX os dados referentes

ao eixo X

CampoY [l] = mag_raw[1];// Atribui ao vetor CampoY os dados referentes

ao eixo Y

CampoZ [l] = mag_raw[2] ;// Atribui ao vetor CampoZ os dados

referentes ao eixo Z

delay (6);

// Coloca o dispositivo de volta no modo de medição única.

Wire.beginTransmission(MAG_ADDRESS);

Wire.write((byte) 0x02);

Wire.write((byte) 0x01);

Wire.endTransmission();

}

}

// Função DFT

void dft ()

{

for(int u=0;u<(n/2)+1;u++)

{

tfrCamp_X[u]=0;

tfrCamp_Y[u]=0;

tfrCamp_Z[u]=0;

tfiCamp_X[u]=0;

tfiCamp_Y[u]=0;

tfiCamp_Z[u]=0;

for(int x=0;x<n;x++)

{

tfrCamp_X[u]+=CampoX [x]*cos(2*M_PI*u*(double)x/(double)n); // Calculo

da parte real da DFT do Campo X

tfiCamp_X[u]-=CampoX [x]*sin(2*M_PI*u*(double)x/(double)n); // Calculo

da parte imaginaria da DFT do Campo X

tfrCamp_Y[u]+=CampoY [x]*cos(2*M_PI*u*(double)x/(double)n);// Calculo

da parte real da DFT do Campo Y

tfiCamp_Y[u]-=CampoY [x]*sin(2*M_PI*u*(double)x/(double)n);// Calculo

da parte imaginaria da DFT do Campo Y

tfrCamp_Z[u]+=CampoZ [x]*cos(2*M_PI*u*(double)x/(double)n);// Calculo

da parte real da DFT do Campo Z

tfiCamp_Z[u]-=CampoZ [x]*sin(2*M_PI*u*(double)x/(double)n);// Calculo

da parte imaginaria da DFT do Campo Z

}

raizCamp_X[u]=sqrt

((tfrCamp_X[u]*tfrCamp_X[u])+(tfiCamp_X[u]*tfiCamp_X[u]));// Calculo

do modulo da DFT do Campo X

raizCamp_Y[u]= sqrt

((tfrCamp_Y[u]*tfrCamp_Y[u])+(tfiCamp_Y[u]*tfiCamp_Y[u]));// Calculo

do modulo da DFT do Campo Y

raizCamp_Z[u]= sqrt

((tfrCamp_Z[u]*tfrCamp_Z[u])+(tfiCamp_Z[u]*tfiCamp_Z[u]));// Calculo

do modulo da DFT do Campo Z

raizCamp_X [u]/=(double)(n/2);

raizCamp_Y [u]/=(double)(n/2);

raizCamp_Z [u]/=(double)(n/2);

Frequencia [u] = (u /(n*Ts)); //Corresponde ao Delta de Frequencia

F(u /(n*tempo de amostragem))

}

}

//Função Output: Procura a maior amplitude em uma faixa de frequencia

proximo a 60 HZ.

void Output()

{

float maior_X = raizCamp_X [0];

float maior_Y = raizCamp_Y [0];

float maior_Z = raizCamp_Z [0];

int x = 0;

for(int u=0;u<(n/2)+1;u++)

{

if (raizCamp_X [u] > maior_X && raizCamp_Y [u] > maior_Y &&

raizCamp_Z [u] > maior_Z)

{

maior_X= raizCamp_X [u];

maior_Y = raizCamp_Y [u];

maior_Z = raizCamp_Z [u];

x = u;

}

}

Serial.print (maior_X);

Serial.print (" mG ");

Serial.print (maior_Y);

Serial.print (" mG ");

Serial.print (maior_Z);

Serial.print(" mG ");

Serial.print (" Frequencia: ");

Serial.print (Frequencia [x]);

Serial.println("Hz");

}

void setup()

{

Serial.begin(115200);//inicia a comunicação serial a 115200 bps.

Serial.println("Campo X Campo Y Campo Z");

Wire.begin();//inicia a biblioteca wire referente ao barramento I2C.

configMag();//chama a função configMag que configura os registradores

do sensor.

}

void loop()

{

readMag();// chama a função readMag

dft();// chama a função dft

Output();// chama a função Output

}

Resultado:

Figura 14: DFT calculada com os dados obtidos do sensor.

E finalmente no quarto teste, o código foi adaptado para enviar os valores de campo das três direções para o display LCD. O código e as fotos do protótipo podem ser vistos abaixo: 4º Teste: Código da DFT para o sinal de campo magnético vindo do sensor e resultado impresso no display:

// Código que calcula a DFT dos dados obtidos do HMC5883L

#include <Wire.h>

#include <math.h>

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

#define MAG_ADDRESS ((char) 0x1E)// define o endereço da comunicação

I2C no sensor

uint8_t mag_buffer[6];//vetor sem sinal, de tamanho 6 com 8 bits cada,

armazenado na memória temporária (SRAM) {(X MSB(8) XLSB(8); YMSB(8)

YLSB(8); ZMSB(8) ZLSB(8)}

int16_t mag_raw[3];// Vetor de tamanho 3 com 16 bits cada {valor bruto

de X(16); Y(16); Z(16)}

// Definição de variáveis

int l;// Variável contador até 128

int n=128; // Quantidade das amostras

float Ts=0.007;// Tempo de amostragem

// Vetor dos valores de entrada

int16_t CampoX [128];

int16_t CampoY [128];

int16_t CampoZ [128];

double Frequencia[128];// Veto valores de frequencia.

double tfrCamp_X[128];// Vetor transformada de Fourier Real Campo X

Double tfiCamp_X[128];// Vetor transformada de Fourier Imaginário

Campo X

double tfrCamp_Y[128];//Vetor transformada de Fourier Real Campo Y

double tfiCamp_Y[128];//Vetor transformada de Fourier Imaginário Campo

Y

double tfrCamp_Z[128];// Vetor transformada de Fourier Real Campo Z

double tfiCamp_Z[128];// Vetor transformada de Fourier Imaginário

Campo Z

double raizCamp_X[128];// Vetor Módulo da transformada de Fourier do

Campo X

double raizCamp_Y[128];// Vetor Módulo da transformada de Fourier do

Campo Y

double raizCamp_Z[128];// Vetor Módulo da transformada de Fourier do

Campo Y

// Função configMag

void configMag()

{

uint8_t mag_name;

//Configuração do registrador B

Wire.beginTransmission(MAG_ADDRESS);

Wire.write((byte) 0x01);//Grava os dados de endereço do registrador B.

Wire.write((byte) 0xE0); //Grava os dados de configuração do

registrador B, define o ganho de +/-8.1 Gauss (0xE0-11100000)

Wire.endTransmission();

// Configuração do registrador de modo

Wire.beginTransmission(MAG_ADDRESS);

Wire.write((byte) 0x02);//Grava os dados de endereço do registrador B.

Wire.write((byte) 0x01);//Grava os dados de configuração do

registrador de modo e define o modo de medição única (00000001).

Wire.endTransmission();

}

// ler 6 bytes (x,y,z medidos do campo magnético) do sensor

void readMag() {

for(l=0;l<n;l++)

{

// leitura dos dados dos registradores(de 0x03 a 0x08)

Wire.beginTransmission(MAG_ADDRESS);

Wire.write((byte) 0x03); // o endereço do primeiro byte de dado

Wire.endTransmission();

Wire.beginTransmission(MAG_ADDRESS);

Wire.requestFrom(MAG_ADDRESS, 6); // Requisita 6 bytes

int i = 0;

while(Wire.available()) // Retorna o número de bytes disponíveis:

{

mag_buffer[i] = Wire.read(); // Lê o primeiro byte e coloca no vetor

mag_buffer

i++; // incrementa até i for igual a 6

}

Wire.read();// Lê todos os bytes requisitados

Wire.endTransmission();

// Combina os dados brutos em números inteiros (O HMC588L envia

primeiro o byte MSB)

// ________ MSB _______ _____ LSB ____

mag_raw[0] = (mag_buffer[0] << 8) | mag_buffer[1];

mag_raw[1] = (mag_buffer[2] << 8) | mag_buffer[3];

mag_raw[2] = (mag_buffer[4] << 8) | mag_buffer[5];

CampoX [l] = mag_raw[0];// Atribui ao vetor CampoX os dados referentes

ao eixo X

CampoY [l] = mag_raw[1];// Atribui ao vetor CampoY os dados referentes

ao eixo Y

CampoZ [l] = mag_raw[2] ;// Atribui ao vetor CampoZ os dados

referentes ao eixo Z

delay (6);

// Coloca o dispositivo de volta no modo de medição única.

Wire.beginTransmission(MAG_ADDRESS);

Wire.write((byte) 0x02);

Wire.write((byte) 0x01);

Wire.endTransmission();

}

}

// Função DFT

void dft ()

{

for(int u=0;u<(n/2)+1;u++)

{

tfrCamp_X[u]=0;

tfrCamp_Y[u]=0;

tfrCamp_Z[u]=0;

tfiCamp_X[u]=0;

tfiCamp_Y[u]=0;

tfiCamp_Z[u]=0;

for(int x=0;x<n;x++)

{

tfrCamp_X[u]+=CampoX [x]*cos(2*M_PI*u*(double)x/(double)n); // Calculo

da parte real da DFT do Campo X

tfiCamp_X[u]-=CampoX [x]*sin(2*M_PI*u*(double)x/(double)n); // Calculo

da parte imaginaria da DFT do Campo X

tfrCamp_Y[u]+=CampoY [x]*cos(2*M_PI*u*(double)x/(double)n);// Calculo

da parte real da DFT do Campo Y

tfiCamp_Y[u]-=CampoY [x]*sin(2*M_PI*u*(double)x/(double)n);// Calculo

da parte imaginaria da DFT do Campo Y

tfrCamp_Z[u]+=CampoZ [x]*cos(2*M_PI*u*(double)x/(double)n);// Calculo

da parte real da DFT do Campo Z

tfiCamp_Z[u]-=CampoZ [x]*sin(2*M_PI*u*(double)x/(double)n);// Calculo

da parte imaginaria da DFT do Campo Z

}

raizCamp_X[u]=sqrt

((tfrCamp_X[u]*tfrCamp_X[u])+(tfiCamp_X[u]*tfiCamp_X[u]));// Calculo

do modulo da DFT do Campo X

raizCamp_Y[u]=sqrt

((tfrCamp_Y[u]*tfrCamp_Y[u])+(tfiCamp_Y[u]*tfiCamp_Y[u]));// Calculo

do modulo da DFT do Campo Y

raizCamp_Z[u]=sqrt

((tfrCamp_Z[u]*tfrCamp_Z[u])+(tfiCamp_Z[u]*tfiCamp_Z[u]));// Calculo

do modulo da DFT do Campo Z

raizCamp_X [u]/=(double)(n/2);

raizCamp_Y [u]/=(double)(n/2);

raizCamp_Z [u]/=(double)(n/2);

Frequencia [u] = (u /(n*Ts)); //Corresponde ao Delta de Frequencia

F(u /(n*tempo de amostragem))

}

}

//Função Output: Procura a maior amplitude em uma faixa de frequencia

proximo a 60 HZ.

void Output()

{

float maior_X = raizCamp_X [0];

float maior_Y = raizCamp_Y [0];

float maior_Z = raizCamp_Z [0];

int x = 0;

for(int u=0;u<(n/2)+1;u++)

{

if (raizCamp_X [u] > maior_X && raizCamp_Y [u] > maior_Y &&

raizCamp_Z [u] > maior_Z)

{

maior_X= raizCamp_X [u];

maior_Y = raizCamp_Y [u];

maior_Z = raizCamp_Z [u];

x = u;

}

}

// Imprime no LCD.

lcd.setCursor(0,0);

lcd.print("X:");

lcd.setCursor(2,0);

lcd.print (maior_X);

lcd.setCursor(7,0);

lcd.print("mG");

lcd.setCursor(10,0);

lcd.print("Y:");

lcd.setCursor(12,0);

lcd.print(maior_Y);

lcd.setCursor(18,0);

lcd.print("mG");

lcd.setCursor(0,1);

lcd.print("Z:");

lcd.setCursor(2,1);

lcd.print(maior_Z);

lcd.setCursor(8,1);

lcd.print("mG");

}

void setup()

{

Serial.begin(115200);//inicia a comunicação serial a 115200 bps.

Wire.begin();//inicia a biblioteca wire referente ao barramento I2C.

configMag();//chama a função configMag que configura os registradores

do sensor.

lcd.begin(20, 2); //Configuração do LCD

lcd.clear();

}

void loop()

{

readMag();// chama a função readMag

dft();// chama a função dft

Output();// chama a função Output

}

Figura 15: Foto final do protótipo.

3.6 Conclusões

Com a análise dos dados e dos gráficos obtidos durante o projeto concluímos que o sensor foi realmente adequado ao nosso propósito, e os códigos criados foram eficazes para o tratamento do sinal.

Devido ao tempo gasto na resolução das dificuldades encontradas no desenvolvimento do trabalho não houve tempo para a utilização do protótipo na medição de campo magnético nas regiões próximas às linhas de transmissão, como proposto no objetivo deste trabalho. A única fonte de campo magnético foi o transformador, utilizado com o principal objetivo de conferir os resultados obtidos do algoritmo da DFT do que de analisar precisamente os valores das amplitudes, já que não foi estipulado nenhum parâmetro para designação do campo magnético gerado pelo transformador. O protótipo também não foi comparado a nenhum magnetômetro devidamente calibrado. Entretanto, ainda pretendemos concluir o projeto em trabalhos futuros.

3.7 Dificuldades encontradas

Ao longo do percurso que nossa pesquisa tomou, várias dificuldades foram encontradas. A primeira foi a escolha do sensor. Não foi rápido encontrar o sensor adequado para o projeto, tive dificuldades em entender claramente as especificações dos possíveis sensores a serem estudados para o projeto, pois os Datasheets encontrados não eram bastante claros e me deixava dúvidas sobre alguns aspectos, tais como taxa de amostragem, faixa de campo magnético detectado pelo sensor, entre outros.

Outro grande empecilho encontrado foi na linguagem e elaboração dos algoritmos, pois eu, que sou do curso de Eletrotécnica não tinha muita experiência em programação, principalmente no Arduino que tem uma linguagem própria, bem como um bom entendimento sobre a comunicação feita entre o micro controlador e o sensor. Os mais diversos erros apareciam durante a fase de testes com os algoritmos e a falta de experiência no assunto decorria em dificuldades para solucioná-los. Inicialmente, optei por pesquisar códigos já prontos para a comunicação entre o sensor e o Arduino, mas esses códigos incluíam bibliotecas que eram difíceis de fazer alterações necessárias ao projeto. Foi bastante difícil

elaborar os códigos do início, apesar de ter ajudas dos professores orientadores e de algumas pessoas que já trabalham com o Arduino.

Outros erros ocorreram durante a fase de desenvolvimento do Algoritmo para a DFT,devido limitação de memória do Arduino,. Boa parte do tempo da pesquisa foi dedicada à apuração e identificação de tais erros.

3.8 Referências Bibliográficas [1].Roy C. Haupt and James R. Nolfi ” The Effects of High Voltage Transmission Lineson the Health of Adjacent” Public Health, January 1984, Vol. 74, No. 1. [2].Christof Kolb, Bernhard Zrenner and Claus Schmitt “Incidence of Electromagnetic Interference in Implantable Cardioverter Defibrillators” Journal of Pacing and Clinical Electrophysiology, Volume 24, No. 4, Part 1, April 2001. [3].Resolução Normativa ANEEL Nº 398, de 23 de março de 2010, disponível em www.aneel.gov.br/cedoc/ren2010398.pdf. Acesso em: 26 de Agosto de 2013. [4] Datasheet do sensor HMC5883L, disponível em http://zip.net/bfkLrL. Acesso em 26 de Agosto de 2013. [5] Patsko, L. F. “Tutorial Aplicação, funcionamento e utilização de sensores”, disponível em http://zip.net/bfkLsj. Acesso em: 26 de Agosto de 2013. [6] Protocolo I2C no Arduino disponível em http://zip.net/bjkLfv. Acesso em 26 de Agosto de 2013. [7] Critério de Nyquist disponível em http://zip.net/bpkLTz. Acesso em 26 de Agosto de 2013. [8] FFT- Fast Fourier Transform disponível em http://zip.net/btkLCT. Acesso em 26 de Agosto de 2013. [9] Macêdo Fechine, J. Grupo PET Computação, “A Transformada de Fourier e suas aplicações” disponível em http://zip.net/bjkLhq. Acesso em 26 de Agosto de 2013. [10] FFT e DFT disponível em http://zip.net/bpkLVT. Acesso em 26 de Agosto de 2013. [11] Tutorial online da plataforma de desenvolvimento Arduino disponível em

http://www.arduino.cc/. Acesso em 26 de Agosto de 2013

[12] Arduino Character LCD Tutorial disponível em http://zip.net/bpkNk2. Acesso em 29 de

Agosto de 2013. [13] Datasheet do display disponíevel em http://zip.net/brkMHZ. Acesso em 29 de Agosto de 2013.