Escolar Documentos
Profissional Documentos
Cultura Documentos
16MHz
470
16H
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
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
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
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~)
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
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).
1L +5V
16MHz
470
16H
AREF
RX
TX
1L
L
470
microcontrolandos
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
RTS
ARDUINO UNO
Na Fig. 5 é apresentado o circuito simulado, utilizado na CTS
RX - 0
AREF
TX - 1
GND
~11
~10
~9
8
7
~6
~5
4
~3
2
13
12
DIGITAL ( PWM~)
UNO ON
O sinal de saída por PWM e a ação de cada estágio do filtro WWW.MICROCONTROLANDOS.BLOGSPOT.COM - BRASIL
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 - 1
GND
~11
~10
~9
8
7
~6
~5
4
~3
2
13
12
DIGITAL ( PWM~)
L
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
16H
470
470
IOREF
1L
3.3V
GND
GND
A0
A1
A2
A3
A4
A5
Vin
5V
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
1.5
0.5
0
0 100 200 300 400 500 600 700 800 900 1000
Frequência (Hz)
#include <FFT.h>
#include <VirtualWire.h>
void setup() {
ADMUX = 0x40; DIDR0 = 0x01;
vw_setup(2000);
Serial.begin(115200);
}
void loop() {
// Amostragem
// Identificação da Frequência
#include <VirtualWire.h>
void setup() {
TCCR0A = 0x83; TCCR0B = 0x02; TIMSK0 = 0x00; DDRD = 0x40;
vw_setup(2000); vw_rx_start();
Serial.begin(115200);
}
void loop() {
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