Download - Relatorio Larissa
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.