Você está na página 1de 10

Projeto de Comunicação Via MoDem

Afonso Henrique C. Soares


Anderson Queiroz Viana
Dilson Júnior de Sousa Lopes
Rogério Fonseca Côrte Real
Faculdade de Engenharia Elétrica
Universidade Federal do Pará - UFPA
Tucuruí-PA, Brasil

Abstract—This study was designed to complement the II. IDENTIFICAÇÃO E TRANSMISSÃO


activities of the discipline Communications Laboratory. The
purpose of this project is to identify the frequency of a monophonic A identificação da frequência do sinal de entrada e a
audio signal using an Arduino and play this signal remotely with transmissão desta informação é feita por um Arduino em
another Arduino. Remote communication should be done through conjunto com alguns componentes auxiliares e um módulo de
radio frequency with digital modulation amplitude shift-keying. comunicação transmissor via RF por ASK.

Keywords— Arduino; ADC; ASK; PWM


Considerando-se que o sinal a ser identificado é um sinal de
áudio monofônico, dispensa-se uma abordagem com técnicas de
Resumo—O presente trabalho foi elaborado para processamento de áudio em tempo real. Optou-se por executar
complementar as atividades da disciplina Laboratório de uma tarefa de cada vez de forma não concorrente, isto é, executa-
Comunicações. A finalidade deste projeto é identificar a se inicialmente a amostragem do sinal, onde uma vez tomada
frequência de um sinal de áudio monofônico utilizando um todas as amostras, calcula-se seu espectro de amplitude com o
Arduino e reproduzir este sinal remotamente com outro Arduino. auxílio de uma biblioteca de transformada rápida de Fourier
A comunicação remota deve ser feita através de rádio frequência (FFT – fast Fourier transform). A partir do espectro identifica-
com modulação digital por chaveamento de amplitude. se a amplitude de maior valor e estima-se a frequência do sinal.
Transmite-se então a informação da frequência com o módulo
Palavras-chave—Arduino; ADC; ASK; PWM de transmissão RF por ASK, aguardando-se a conclusão deste
I. INTRODUÇÃO processo. Por fim o ciclo é reiniciado e repetido continuamente.
A essência do processamento digital de sinais (DSP – digital A. Amostragem
signal processing) é digitalizar um sinal usando um conversor A amostragem é um processo crucial do projeto e envolve
analógico-digital (ADC – analog-to-digital converter), basicamente dois aspectos, a quantização do nível de tensão do
manipulá-lo de algum modo e, em seguida, gerar um novo sinal sinal, feita pelo ADC, e sua discretização, que consiste de
de saída usando um conversor digital-analógico (DAC – digital- amostras tomadas a instantes de tempo uniformemente
to-analog converter). A maioria dos equipamentos modernos de espaçados.
áudio usam DSP, cujos ajustes de equalização permitem que se
controle as potências relativas das frequências altas e baixas de Para digitalizar o sinal a ser identificado utiliza-se um
uma música, por exemplo. circuito de polarização, uma vez que o ADC do Arduino
converte tensões de 0 a 5V e o sinal a ser identificado oscilará
Em geral os Arduinos não são os dispositivos ideais para ao redor de 0V com tensões positivas e negativas. A polarização
DSP. Eles não podem capturar sinais rápidos e suas saídas é realizada pelo circuito da Fig. 1, que desloca o nível de 0V do
analógicas estão limitadas a modulação por largura de pulso sinal de entrada para 2,5V do divisor de tensão, obtido através
(PWM – pulse width modulation). O Arduino Due é uma dos 2 resistores de 100kΩ. O capacitor faz a isolação e o
excessão, ele possui dois DACs verdadeiros, contudo o presente acoplamento entre o sinal AC de entrada e a tensão DC de 5V.
projeto foi desenvolvido para o Arduino Uno utilizando-se o
PWM. Quando o processo de conversão é iniciado o
microprocessador congela uma amostra do valor de tensão a ser
A comunicação entre os dois Arduinos é feita sem fios convertido. A digitalização do sinal se dá a partir de
(wireless) por rádio-frequência (RF) com modulação digital por aproximações sucessivas com uma resolução de 10 bits, de
chaveamento de amplitude (ASK - Amplitude Shift Keying). A forma que um valor de tensão de 0 a 5V corresponde a um valor
palavra modem vem da junção das palavras modulador e digital de 0 a 1023, linearmente distribuído.
demodulador, que designam o par básico de equipamentos
utilizados num sistema de comunicação.
as funções desta biblioteca sobre 256 amostras, resolução
1L
máxima VCCda biblioteca, é possível obter o espectro de amplitude

16MHz
470
16H

+5V AREF de frequências de até 601Hz, dividido em 128 partes, com

RX
TX
1L

L
470

microcontrolandos
GND ANT
16H
13 índices variando
VCC de 0 a 127. Na realidade, o limite superior é
ligeiramente DATA
inferior, pois a primeira frequência, de índice 0, é o
IOREF 12
RESET ~11 GND
~10
nível DC MODULO
com 0Hz. Já o limite superior seria a frequência de

ARDUINO
3.3V
5V ~9 TX
100k GND 8
índice 128, o qual já está fora da faixa de índices. Considerando-

WWW.MICROCONTROLANDOS.BLOGSPOT.COM - BRASIL
ATMEGA328P-PU
POWER
GND

se ainda o teorema da amostragem também não é possível

UNO
Vin 7

DIGITAL ( PWM~)
~6
identificar a frequência limite (fS /2).

ATMEL
Audio(in) A0 ~5
A1 4
100uF A2 ~3
Uma vez obtido o espectro de amplitude executa-se uma

ANALOG IN
A3 2
A4 TX - 1
busca pelo índice de maior amplitude, a fim de identificar-se a

ON
100k A5 RX - 0

frequência do sinal de entrada. Uma vez identificado é possível


ARDUINO UNO
obter a frequência a partir da razão entre a frequência limite e o
número de índices, contudo dada a frequência de amostragem e
o número de amostras, a resolução, ou a distância entre
Fig. 1. Circuito de polarização do sinal de entrada.
frequências de índices consecutivos, é de cerca de 4,7Hz.
O ADC do Arduino funciona de forma paralela e Entendeu-se que tal resolução estava fora de uma faixa
independente da execução do programa. Este pode fazer uma aceitável ao projeto. Para contornar esta limitação buscou-se
conversão individual toda vez que é solicitado ou ficar uma forma de identificar uma frequência com maior precisão a
convertendo a tensão de entrada continuamente em intervalos de partir da frequência de maior amplitude e da respectiva maior
tempo regularmente espaçados. A conversão contínua é a mais frequência lateral a esta. A TABELA I. apresenta os valores de
adequada as necessidades do presente projeto. amplitudes principal e laterais, obtidos em simulação, para
No modo contínuo uma nova amostra é obtida a cada 13 várias frequências de entrada diferentes, variando-se a
ciclos de clock do relógio. Pode-se ainda aplicar divisores de frequência de entrada entre décimos da resolução do espectro.
frequência ao ADC de forma a reduzir a velocidade de A partir destes resultados foi possível determinar uma
funcionamento deste em múltiplos de 2 até o limite de 128 vezes. correlação que resultasse numa frequência estimada conforme
A própria frequência de trabalho do Arduino, como um todo, apresentado em (3), onde fe é a frequência de entrada estimada,
pode ser reduzida com divisores de frequência também em idmáx é o índice da frequência de maior amplitude, que neste caso
múltiplos de 2 até 256, de acordo com a necessidade da varia entre 0 e 127, idsec é –1 caso o índice da frequência lateral
aplicação. Estes divisores de frequência são conhecidos como de maior valor seja inferior ao da frequência principal e 1 caso o
prescaler. índice seja superior, Ap é o valor da amplitude da frequência
Considerando o teorema da amostragem [1], deve-se ter uma principal, As é o valor da maior amplitude lateral e N é o número
frequência de amostragem superior ao dobro da maior de amostras do sinal de entrada, neste caso 256.
frequência a ser identificada, que pelas especificações de projeto
é de 490Hz. Aliando isso a frequência do Arduino de 16Mhz e   Ap  f S
aos 13 ciclos de clock necessários para executar uma conversão  f e  id máx  idsec 1    
pelo ADC, pode-se calcular o divisor de frequência necessário   2 As   N
ao projeto conforme (1).
Após exaustivas simulações utilizando-se (3) observou-se
16MHz que na faixa de frequência de 250 à 500Hz o erro era inferior a
 prescaler   1255   ±0,4Hz. Ao implementar-se o circuito obteve-se resultados
2  490Hz 13 extremamente satisfatórios para a faixa de frequência mais
ampla, com erro máximo de ±1Hz após arredondar-se o
Como o divisor de frequência precisa ser múltiplo de 2, o resultado para o inteiro mais próximo.
que melhor atende é um prescaler de 1024. Desta forma definiu-
se o prescaler do ADC no valor máximo, isto é, 128 e o TABELA I. AMPLITUDES OBTIDAS POR SIMULAÇÃO
prescaler do relógio no fator complementar de 8, de forma que
Frequência Amplitudes (não normalizadas)
a ação combinação destes gera o prescaler necessário ao projeto. de entrada
Índice
A frequência de amostragem, fS, é obtida a partir de (2). Com (Hz)
equivalente Índice 63 Índice 64 Índice 65
esta amostragem podemos identificar sinais com frequência de 298,13 63,5 7040 6528 1248
até cerca de 600Hz. 298,60 63,6 6528 7040 1680
299,07 63,7 5760 7424 2160
299,54 63,8 5376 7680 2704
16MHz
 fS   1202 Hz   300,01 63,9 4068 7936 3624
13 128  8 300,48 64 4096 7936 3872
300,95 64,1 3273 7936 4096
B. Identificação da Frequência 301,42 64,2 3136 7936 4992
301,89 64,3 2576 7680 5376
Uma vez amostrado, utiliza-se uma biblioteca [2] para 302,36 64,4 2478 7424 6144
cálculo do espectro de amplitude através da FFT. Aplicando-se 302,83 64,5 1576 7040 6528
16H

Hz
+5V AREF

RX
TX
1L

L
470

microcontrolandos
16H GND ANT
13 VCC
IOREF 12 DATA
RESET ~11 GND
~10

ARDUINO
3.3V
5V ~9 MODULO TX
100k GND 8

WWW.MICROCONTROLANDOS.BLOGSPOT.COM - BRASIL
ATMEGA328P-PU
POWER
GND

UNO
Vin 7

DIGITAL ( PWM~)
~6

ATMEL
Audio(in)
C. Transmissão via RF por ASK A0
A1
~5
4 ANT
100uF A2 ~3 GND
Após a identificação da frequência do sinal de entrada é

ANALOG IN
A3 2 GND
A4 TX - 1
necessário transmitir esta informação para reprodução remota. VCC

ON
100k A5 RX - 0

A transmissão é realizada via RF por meio de um módulo


ARDUINO UNO
externo ao Arduino, conforme observa-se na Fig. 2.
O módulo é desenhado para transmissão por modulação +5V
ASK. A modulação por ASK é uma modulação própria para
sinais digitais e, em sua implementação mais simples, consiste
VCC
em modular-se a amplitude da portadora em dois níveis, que
representam os valores binários 0 e 1. Para transmitir-se o valor microcontrolandos
OUT
GND
BUZZER
binário 0 basta não transmitir absolutamente nada, já para MODULO RX

transmitir-se o valor binário 1 transmite-se a portadora com sua


amplitude nominal. ARDUINO UNO

A codificação da informação a ser transmitida é realizada por

RX - 0
AREF

TX - 1
GND

~11
~10
~9
8

7
~6
~5
4
~3
2
13
12
uma biblioteca denominada VirtualWire [3]. Basicamente a L
DIGITAL ( PWM~)

biblioteca codifica a informação a ser transmitida com cabeçalho UNO ON

e checagem de erro por verificação de redundância cíclica (CRC TX


RX
ARDUINO

– cyclic redundancy check). A informação codificada é então 16MHz

entregue em banda base, neste caso uma sequência de bits numa WWW.MICROCONTROLANDOS.BLOGSPOT.COM - BRASIL

taxa previamente configurada, ao módulo transmissor que Fig. 3. Ligação do módulo receptor de RF. ATMEGA328P-PU
ATMEL

executa a modulação por ASK e transmite via RF.

RESET
16H

16H
470

470

IOREF
POWER ANALOG IN

1L

1L
A biblioteca usa o temporizador/contador 1 (TC1) do

3.3V

GND
GND

A0
A1
A2
A3
A4
A5
Vin
5V
III. RECEPÇÃO E RECONSTRUÇÃO DO SINAL Arduino para controle de suas funções. Após a recepção de um
A recepção da informação com a frequência do sinal a ser bloco de informação, está é checada e decodificada e a
reconstruído e a reconstrução do sinal em si é realizada por outro informação pode então ser utilizada pelo Arduino para
Arduino em conjunto com um módulo receptor de RF por ASK reconstrução do sinal original.
e um dispositivo tipo buzzer para reprodução do sinal sonoro. B. Conversão Digital-Analógico
Considerando-se que o sinal de saída do DAC do Arduíno é em
PWM, opcionalmente utilizou-se filtros para obter um sinal mais A reconstrução do sinal é realizada por um processo de
identificável com uma onda senoidal. conversão digital-analógico, que no Arduino dá-se através de
PWM. O uso desses sinais é baseado no conceito de valor médio
A. Recepção via RF por ASK de uma forma de onda periódica. Digitalmente, o valor médio de
A recepção do sinal de RF é realizada por meio de um uma forma de onda é controlado pelo tempo em que o sinal fica
módulo externo ao Arduino, conforme observa-se na Fig. 3. em nível lógico alto durante um determinado intervalo de tempo.
No PWM essa proporção de tempo é chamada de ciclo ativo
O módulo executa a demodulação do sinal e entrega os dados (duty cycle) [4]. Na Fig. 4 são apresentadas formas de onda
em banda base ao Arduino para serem processados pela PWM em que o duty cycle varia de 0 até 100%, com incrementos
biblioteca VirtualWire, a qual deve estar configurada para de 25%.
trabalhar na mesma taxa de bits por segundo que o transmissor.
O cálculo do valor médio de um sinal digital por ser obtido
utilizando-se (4).

 Vmédio  Amplitude  duty cycle  

1L +5V
16MHz

470
16H

AREF
RX
TX

1L
L

470
microcontrolandos

16H GND ANT


13 VCC
IOREF 12 DATA
RESET ~11 GND
~10
ARDUINO

3.3V
5V ~9 MODULO TX
00k GND 8
WWW.MICROCONTROLANDOS.BLOGSPOT.COM - BRASIL
ATMEGA328P-PU
POWER

GND
UNO

Vin 7
DIGITAL ( PWM~)

~6
ATMEL

A0 ~5
A1 4
A2 ~3
ANALOG IN

A3 2
A4 TX - 1
ON

00k A5 RX - 0

ARDUINO UNO Fig. 4. PWM com período T e ciclo ativo de 0%, 25%, 50%, 75% e 100%.
Fig. 2. Ligação do módulo transmissor de RF.
É importante notar que o período do sinal PWM não se nenhuma frequência. Após produzir-se uma identificação
altera, e sim sua largura de ciclo ativo. Desta forma, quando precisa do sinal de entrada tal erro não é aceitável para saída.
pretende-se gerar um sinal PWM, deve-se em primeiro lugar
determinar sua frequência de trabalho. Desenvolveu-se então um artifício para reproduzir sinais
com elevada precisão. Inicialmente ao receber-se uma nova
1) Frequência de trabalho do PWM frequência para reprodução, diferente da frequência que já esteja
A resolução do PWM em um microcontrolador é dada pelo sendo reproduzida, calcula-se seu período, T, em micro
seu número de bits e indica quantos diferentes ciclos ativos segundos, conforme (5), onde fr é a nova frequência recebida.
podem ser gerados. Por exemplo, um PWM de 8 bits pode gerar
256 diferentes níveis, começando com o nível de tensão 0 e 106
terminando com 100 % do ciclo ativo. O Arduino possui 3 TCs  T  
diferentes para gerar sinais PWM, 2 TCs de 8 bits (TC0 e TC2) fr
e um TC de 10 bits (TC1). Um contador de 8 bits atende
perfeitamente as especificações de projeto, além do que a O valor é armazenado como inteiro, desta forma possui uma
biblioteca VirtualWire já utiliza o TC1. Desta forma utilizou-se precisão de 1µs, fazendo com que para frequências de até 500Hz
o TC0 para geração do sinal PWM, com contagem de 0 até 255 o erro seja inferior a 0,05%.
no modo fast PWM.
3) Controle de fase
A cada pulso de clock do relógio o contador incrementa de O passo seguinte é o controle da fase, que é feito
uma unidade, quando a contagem atinge o valor máximo ocorre indiretamente por uma variável de controle de tempo
um estouro (overflow) e no pulso seguinte a contagem retorna a instantâneo, t, que é incrementada em 128µs a cada overflow.
zero. O pino de saída é zerado na igualdade do contador com o
Quando o valor de t atinge ou ultrapassa o valor de T, faz-se
duty cycle, que é definido através de um registrador específico,
a operação t = t – T. Isto faz com que 0 ≤ t < T de forma que a
e colocado em 1 no pulso seguinte ao overflow.
fase fique contida num intervalo que vai de 0 a um valor que seja
Como a frequência do Arduino é de 16MHz o período do menor que 2π.
PWM, equivalente a 256 clocks do relógio, seria de 16µs. Este é
A cada overflow é necessário atualizar o registrador que
um período de tempo relativamente curto em relação a maior
controla o duty cycle do sinal PWM. O primeiro passo seria o
frequência especificada no projeto, que tem um período de cerca
cálculo de um seno usando-se o controle de fase, contudo é
de 2ms.
comum o uso de valores tabelados ao invés do cálculo do seno a
Este período para o PWM não seria um problema em si, cada atualização do duty cycle, a fim de se obter um código mais
muito pelo contrário quanto menor o período do PWM melhor rápido. Optou-se por tabelar o valor do seno para 256 posições
será a reconstrução do sinal. Contudo após simulação do circuito angulares diferentes, de forma que a fase será um valor inteiro
foi possível identificar que este curto período de tempo não é proporcional a razão t / T, onde 0 ≤ fase < 256. O valor tabelado
suficiente para executar-se todas as instruções contidas no loop faz uma correspondência com um sinal senoidal onde o valor
do código, inclusive a biblioteca VirtualWire utiliza recursos de mínimo, –1, equivale a um duty cycle de 0% e o valor máximo,
interrupção e é possível que a durante a execução do código 1, a um duty cycle de 100%. Este método é interessante pois é
contido na chamada da interrupção ocorressem mais de um possível reproduzir qualquer formato de sinal apenas
overflow no TC0, o que acarretaria em alterações na frequência modificando-se os valores tabelados.
do sinal reconstruído.
C. Reprodução do Sinal
Uma forma de ajustar-se este período é aplicar um prescaler Uma vez realizada a conversão digital-analógico o sinal pode
ao TC0. Aplicando-se um prescaler de 8 o período do PWM ser reproduzido diretamente por um buzzer. Pode-se optar por
passa a ser de 128µs, equivalente a 2048 clocks do relógio, que utilizar um alto-falante, contudo deve-se atentar para potência
é suficiente para a regular execução do programa. Após testes demandada o que pode exigir a utilização de um sistema de
este período mostrou-se adequado a maior frequência amplificação.
especificada no projeto, gerando cerca de 16 ciclos de PWM por
ciclo do sinal a ser reconstruído. Para reconstrução de sinais com Uma filtragem também é importante para eliminação das
frequência mais elevada opcionalmente pode-se desenvolver um componentes de altas frequência presentes no sinal de natureza
código de programa em nível mais baixo que torne o quadrada do PWM.
processamento mais eficiente.
IV. SIMULAÇÃO
2) Frequência do sinal a ser reconstruído A simulação computacional do projeto foi realizada no
Devido à baixa taxa de ciclos de PWM por ciclo do sinal a software Proteus 8 Professional.
ser reconstruído, mesmo na frequência mais baixa definida no
projeto, não é aceitável utilizar a frequência do PWM como um A etapa de simulação foi de grande valia durante o
múltiplo inteiro da frequência do sinal de saída, sob pena de desenvolvimento dos códigos-fonte, pois foi possível ajustar
perca elevada na precisão. Na faixa de frequência do projeto detalhes importantes através de monitoração de passos
haveriam erros mais de 10Hz. Por exemplo, com 17 ciclos de intermediários do código utilizando-se a comunicação serial.
PWM por ciclo de sinal, a frequência de saída seria de 459Hz, Também foi possível ajustar o desempenho de um filtro passivo
ao mudar-se para 18 ciclos, a frequência cairia para 434Hz, ou passa baixa para reconstrução do sinal de áudio e verificar o
seja, um intervalo de 25Hz onde não seria possível reproduzir desempenho do circuito em si.
1L +5V

16MHz
470
16H

+5V AREF

RX
TX
1L

L
470

microcontrolandos
16H GND ANT
13 VCC A
IOREF 12 DATA
RESET ~11 GND B
~10

ARDUINO
3.3V
5V ~9 MODULO TX C
100k GND
WWW.MICROCONTROLANDOS.BLOGSPOT.COM - BRASIL
8
D
ATMEGA328P-PU
POWER

GND

UNO
Vin 7

DIGITAL ( PWM~)
~6
ATMEL

A0 ~5
A1 4
100uF A2 ~3 ANT
ANALOG IN

A3 2 GND
A4 TX - 1
Fig. 7. GND
Sinais de saída em PWM e de cada estágio do filtro
ON

100k A5 RX - 0 VCC
PWM f(1) f(2) f(3)
ARDUINO UNO

V(out)
RXD 10k 100k 1M
+
TXD +5V
10nF 1nF 100pF
RTS
- VCC
FM AM
CTS
OUT
microcontrolandos GND
MODULO RX
RXD

Fig. 5. Circuito simulado para identificação e transmissão RF TXD

RTS
ARDUINO UNO
Na Fig. 5 é apresentado o circuito simulado, utilizado na CTS

identificação e transmissão por RF da frequência a ser

RX - 0
AREF

TX - 1
GND

~11
~10
~9
8

7
~6
~5
4
~3
2
13
12
DIGITAL ( PWM~)

reproduzida. Já na Fig. 6 observa-se o circuito para recepção por


L

UNO ON

RF da informação de frequência e sua correspondente Fig. 8. Resposta em ARDUINO


frequência após cada estágio do filtro
TX
RX

reprodução, com filtro passa baixa de 3 estágios em cascata. 16MHz

O sinal de saída por PWM e a ação de cada estágio do filtro WWW.MICROCONTROLANDOS.BLOGSPOT.COM - BRASIL

pode ser observada na Fig. 7 onde reconstruiu-se um sinal de


ATMEGA328P-PU
microcontrolandos

ATMEL

A
500Hz.
RESET
16H

16H
470

470

IOREF

POWER ANALOG IN
1L

1L

3.3V

GND
GND

A0
A1
A2
A3
A4
A5
Vin
B
5V

TX C Cada estágio do filtro em cascata foi dimensionado


D
utilizando-se (6), onde fc é a frequência de corte, R o valor da
resistência e C o valor do capacitor. Todos os estágios têm a
ANT
mesma frequência de corte, 1,6kHz. É possível observar que a
GND
GND
cada estágio o valor da resistência é multiplicado por 10 e, para
VCC
PWM f(1) f(2) f(3)
manter-se a mesma frequência de corte, o valor do capacitor é
dividido também por 10. O aumento sucessivo das resistências
é para que cada novo estágio, que entra em paralelo ao capacitor
10k 100k 1M
V(out)
do estágio anterior, tenha uma impedância mais alta em relação
+5V
10nF 1nF 100pF
a este capacitor, de forma a não alterar significativamente o
funcionamento do estágio anterior. Na Fig. 8 é possível observar
VCC
a resposta em frequência do filtro projetado.
OUT
microcontrolandos GND
MODULO RX
RXD
1
TXD  fc   
RTS
2 RC
ARDUINO UNO
CTS

Caso a implementação do filtro se desse por 3 estágios


RX - 0
AREF

TX - 1
GND

~11
~10
~9
8

7
~6
~5
4
~3
2
13
12

DIGITAL ( PWM~)
L

UNO idênticos, a cada estágio adicionado haveria alterações nas


características do estágio anterior, e então o filtro não se
ON
ARDUINO
TX
RX

16MHz
comportaria conforme o desejado.
Na Fig. 9 é possível observar o efeito de estágio idênticos
WWW.MICROCONTROLANDOS.BLOGSPOT.COM - BRASIL

ATMEGA328P-PU

sobre o sinal PWM gerado. Houve uma grande atenuação já a


ATMEL
RESET
16H

16H
470

470

IOREF

partir do primeiro estágio, o que se justifica pela resposta em


POWER ANALOG IN
1L

1L

3.3V

GND
GND

A0
A1
A2
A3
A4
A5
Vin
5V

frequência apresentada na Fig. 10.

Fig. 6. Circuito simulado para recepção RF e reprodução


Fig. 9. Sinais de saída para estágios idênticos Fig. 12. Resposta em frequência para um acoplamento próximo ao ideal

Ao analisar-se o desempenho do filtro a partir do espectro de


amplitude para um sinal de 500Hz, é possível observar na Fig.
13 uma atenuação eficaz das componentes de frequência acima
de 1kHz.
Na Fig. 14 é possível observar o espectro de amplitude mais
detalhado nas frequências de até 1kHz. O espectro de amplitude
foi levantado a partir da análise de 1000 ciclos, ou seja, um sinal
com 2 segundos de duração, com resolução de 2,5Hz.
Devido à natureza do controle de fase implementado no
código-fonte de geração do sinal PWM, é de entender-se que
existam componentes de frequência inferiores a frequência que
Fig. 10. Resposta em frequência com estágio idênticos esteja sendo gerada. Isso ocorre porque o período do PWM é de
128µs e o período do sinal gerado é de 2000µs. Desta forma após
Numa situação oposta, onde inverteu-se a ordem dos 16 ciclos do PWM se passam 2048µs, ou seja, o ciclo seguinte
estágios inicialmente projetados, isto é, o primeiro estágio com do sinal será gerado a partir de fases diferentes. Contudo essa
a combinação 1MΩ e 100pF, o segundo estágio com 100kΩ e observação não explica o fato do porque as componentes com
1nF e o terceiro estágio com 10kΩ e 10nF, o sinal de saída foi frequência mais baixa que 500Hz foram atenuadas. Como estão
praticamente reduzido ao nível DC. A resposta em frequência na banda passante do filtro não deveriam ter sido afetadas.
para esta condição fica completamente distorcida, conforme
observa-se na Fig. 11.
Por fim um acoplamento mais próximo ao ideal poderia ser
obtido com um aumento de 100 vezes o valor da resistência a
cada novo estágio, contudo considerando-se que o primeiro
estágio precisa ter uma impedância relativamente alta, com uma
combinação de 10kΩ e 10nF, para evitar uma distorção já no
sinal do PWM fornecido pelo Arduino, o último estágio teria
uma combinação de 100MΩ e 1pF. Devido a indisponibilidade
de um capacitor neste valor em laboratório, utilizou-se o valor
deste capacitor O valor deste capacitor não estava disponível em
laboratório e desta forma não foi possível implementar esta
solução. A resposta em frequência é apresentada na Fig. 12. Fig. 13. Espectro de amplitude até 10kHz com resolução de 25Hz

Fig. 11. Resposta em frequência para os estágios invertidos Fig. 14. Espectro de amplitude até 1kHz com resolução de 2,5Hz
V. TESTES EM LABORATÓRIO
Em laboratório buscou-se verificar o desempenho do
projeto, desde a correta identificação da frequência do sinal de
entrada até a saída do sinal após a filtragem, bem como explorar
aspectos adicionais inerentes a possíveis otimizações e
aplicações correlatas ao projeto.
A. Desempenho dos Módulos de Comunicação por RF
Para confirmar o correto modo de funcionamento dos
módulos de comunicação, injetou-se um sinal senoidal no
módulo transmissor e coletou-se o sinal de saída do módulo
receptor. A Fig. 15 apresenta os sinais aplicados e coletados, nos
canais 1 e 2, respectivamente. O módulo receptor comportou-se
como o esperado, gerando uma onda quadrada mudando de nível
conforme a amplitude do sinal de entrada cruza determinado
limiar.
Explorou-se ainda a frequência máxima a que os módulos
respondiam aplicando-se uma onda quadrada. Até uma Fig. 15. Resposta dos módulos de comunicação para uma onda senoidal
frequência de 8kHz é possível observar um sinal de saída similar
ao sinal de entrada, conforme Fig. 16. Já para uma frequência de
10kHz, Fig. 17, o sinal de saída fica em nível alta por apenas
25% do período, mas ainda é possível que se consiga executar
uma comunicação de fato.
Caso o Arduino precise executar um grande número de
processamentos simultâneos poderá não ser possível explorar
taxas de comunicação elevadas. Pode-se ainda desenvolver
rotinas em código de nível mais baixo a fim de se explorar um
desempenho superior.
Não foram efetuados testes a distâncias elevadas nem com
obstáculos, estes fatores também influenciam no desempenho
dos módulos e precisam ser estudados para aplicações
específicas.
B. Identificação de Frequência
Aplicando-se uma onda senoidal com o gerador de sinais, foi
possível observar o desempenho do circuito identificador de Fig. 16. Resposta dos módulos de comunicação para uma frequência de 8kHz
frequência. Utilizou-se a comunicação serial e a partir do
monitor foi possível acompanhar o desempenho em tempo real.
Para sinais de 10 à 590Hz o erro máximo encontrado foi de
±1Hz, o que foi um resultado considerado bastante satisfatório.
Executou-se ainda testes com ondas de formatos diversos,
tipo quadrada, triangular, entre outros. Mesmo nestas condições
foi possível identificar a frequência fundamental com o mesmo
grau de precisão.
C. Comunicação por RF entre os Arduinos
A informação da frequência a ser reproduzida foi transmitida
por RF e a correta recepção do sinal foi observada a partir do
monitor serial do Arduino conectado ao módulo receptor.
D. Reconstrução do Sinal
As Fig. 18, Fig. 19 e Fig. 20 apresentam o sinal PWM e as
saídas sucessivas de cada estágio do filtro. O filtro comportou-
se praticamente conforme o esperado exceto por uma atenuação
no último estágio além da esperada. Contudo obteve-se uma Fig. 17. Resposta dos módulos de comunicação para uma frequência de 10kHz
senóide praticamente perfeita na mesma frequência que o sinal
de entrada.
Fig. 18. Sinal PWM e a saída do primeiro estágio do filtro Fig. 21. Sinal de entrada de 300Hz e respectiva reprodução após filtragem

Na Fig. 21 observa-se a correta reprodução de um sinal de


300Hz injetado no sistema.
Para obter-se o espectro de amplitude da saída PWM e de
cada estágio do filtro, foi reproduzido um sinal de 500Hz e
coletadas 2000 amostras espaçadas em 400µs.
A partir desta amostragem foi possível levantar o espectro de
amplitude até 1kHz com resolução de 1,25Hz, conforme
observa-se na Fig. 22.
Novamente observa-se a atenuação de componentes situadas
na banda passante. Acredita-se que estas anomalias no espectro
devem-se a efeito de aliasing, sendo que na realidade as
amplitudes proeminentes no sinal PWM, diferentes da
frequência está sendo gerada e suas harmônicas, na realidade
não encontram-se no sinal pois caso contrario não seriam
atenuadas pelo filtro passa baixa e continuariam presentes no
sinal de saída.
Fig. 19. Sinal PWM e a saída do segundo estágio do filtro
Espectro de Amplitude
2.5
PWM
f(1)
2 f(2)
f(3)
Amplitude (V)

1.5

0.5

0
0 100 200 300 400 500 600 700 800 900 1000
Frequência (Hz)

Fig. 22. Espectro de amplitude até 1kHz com resolução de 1,25Hz

[1] B. P. Lathi, Sinais e sistemas lineares, 2ª ed., Porto Alegre: Bookman,


2007, p. 678.
[2] Open Music Labs, “Arduino FFT Library,” 15 11 2016. [Online].
Available: http://wiki.openmusiclabs.com/wiki/ArduinoFFT. [Acesso em
20 06 2017].
[3] M. McCauley, “Virtual Wire,” 2013. [Online]. Available:
Fig. 20. Sinal PWM e a saída do terceiro estágio do filtro http://www.airspayce.com/mikem/arduino/VirtualWire/index.html.
[Acesso em 20 06 2017].
[4] C. B. d. Lima e M. V. M. Vilhaça, AVR e Arduino : técnicas de projeto,
2ª ed., Florianópolis: Ed. dos autores, 2012, p. 187.
ANEXO I
-
CÓDIGO-FONTE DE IDENTIFICAÇÃO E TRANSMISSÃO RF

#define FFT_N 256


#define LIN_OUT 1

#include <FFT.h>
#include <VirtualWire.h>

const byte PS_clock = 0x03, PS_ADC = 0x07, setADC = 0xf0 | PS_ADC;


const float Fs = 16e6 / (13 * (1 << PS_ADC) * (1 << PS_clock));

void setup() {
ADMUX = 0x40; DIDR0 = 0x01;
vw_setup(2000);
Serial.begin(115200);
}

void loop() {

// Amostragem

SREG &= 0x7F; CLKPR = 0x80; CLKPR = PS_clock;


for (int i = 0 ; i < 512 ; i += 2) {
ADCSRA = setADC; while(!(ADCSRA & 0x10));
fft_input[i] = (((ADCL | (ADCH << 8)) - 0x200) << 6); fft_input[i+1] = 0;
}
CLKPR = 0x80; CLKPR = 0x00; SREG |= 0x80;

// Identificação da Frequência

fft_window(); fft_reorder(); fft_run(); fft_mag_lin();


int idMax = 1, idSec = -1;
for (int i = 2 ; i < 127 ; i ++) if (fft_lin_out[i] > fft_lin_out[idMax]) idMax = i;
if (fft_lin_out[idMax+1] > fft_lin_out[idMax-1]) secID = 1;
float Ap = fft_lin_out[idMax], As = fft_lin_out[idMax + idSec];
unsigned int Fe = round((idMax + idSec*(1 - Ap/(2*As))) * Fs/FFT_N);

// Transmissão via RF por ASK

Serial.print("Frequencia: "); Serial.print(Fe); Serial.println(" Hz");


char msg[6]; itoa(Fe, msg, 10);
vw_send((uint8_t *)msg, 6); vw_wait_tx();
}
ANEXO II
-
CÓDIGO-FONTE DE RECEPÇÃO RF E REPRODUÇÃO DO SINAL

#include <VirtualWire.h>

const byte fmtOnda[] = {


0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,
0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,
0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf5,
0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,
0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc,
0xda,0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb3,
0xb0,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x98,0x95,0x92,0x8f,0x8c,0x89,0x86,0x83,
0x80,0x7c,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x63,0x60,0x5d,0x5a,0x57,0x54,0x51,
0x4f,0x4c,0x49,0x46,0x43,0x40,0x3e,0x3b,0x38,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,
0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x12,0x10,0x0f,0x0d,0x0c,0x0a,
0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08,
0x09,0x0a,0x0c,0x0d,0x0f,0x10,0x12,0x13,0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23,
0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3b,0x3e,0x40,0x43,0x46,0x49,0x4c,
0x4f,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,0x67,0x6a,0x6d,0x70,0x73,0x76,0x79,0x7c};

unsigned long T = 128, t = 96;


unsigned int freq = 0;
byte fase = 191;
uint8_t buf[6], buflen = 6;

void setup() {
TCCR0A = 0x83; TCCR0B = 0x02; TIMSK0 = 0x00; DDRD = 0x40;
vw_setup(2000); vw_rx_start();
Serial.begin(115200);
}

void loop() {

// Recepção via RF por ASK

if (vw_get_message(buf, &buflen)) {
unsigned int Fr = atoi((char*)(buf));
if (Fr != freq) {
Serial.print("Frequencia...: "); Serial.print(Fr); Serial.println(" Hz");
T = 1e6 / Fr; t = map(fase, 0, 255, 0, T); freq = Fr;
}
}

// Reprodução do sinal

if (TIFR0 &= 0x01) {


OCR0A = fmtOnda[fase]; t += 128; if (t >= T) t -= T; fase = map(t, 0, T, 0, 255);
}
}

Você também pode gostar