You are on page 1of 3

Arduino e a Aquisio de Dados O nmero de vezes em que se realiza a

amostragem em uma unidade de tempo a


A Problemtica na taxa de amostragem chamada taxa de amostragem, geralmente,
medida em Hertz.
Introduo Dizer-se que a taxa de amostragem de
objectivo deste segundo artigo, 100Hz, significa que em cada segundo so tomadas
abordando o Arduino, tentar explorar um problema 100 medidas de uma determinada variao de
que pode afectar os utilizadores que necessitem de voltagem do sinal de entrada. Dessa forma, quanto
uma maior velocidade de aquisio de dados para a maior for a taxa de amostragem, mais exacta ser
sua aplicao, nomeadamente utilizando o a representao do sinal original.
Arduino. Ao estudar-se a amostragem, necessria
Assim, abordaremos a problemtica que a sensibilizao para um dos fenmenos que podem
envolve a taxa de amostragem, j que, para fazer a ocorrer: o Aliasing.
leitura de sensores (acelermetros, termopares, Para o evitar deve-se respeitar o teorema
entre outros) com esta ferramenta, de uma forma Nyquist que, basicamente, diz-nos que a taxa de
eficiente, necessrio o controlo deste factor. amostragem deve ser no mnimo duas vezes a
Se quisermos medir o comportamento de maior frequncia que desejamos registar. Se no
um objecto em queda durante 5 segundos, mas s respeitarmos este teorema, o sinal amostrado no
amostrarmos- obter o valor da sua altura em
relao ao solo, utilizando um sensor adequado, -
de 15 em 15 segundos, facilmente se conclu que os
dados obtidos no tm utilidade. Este exemplo
ilustra assim a necessidade de abordar este
problema, pois cada vez mais se est a utilizar o
Arduino como ferramenta de aquisio de dados,
especialmente devido sua possibilidade de
interface Ethernet ou Zigbee, atravs da sua
capacidade de acrescentar um shield. Fig. 2 Exemplo de Aliasing
O Arduino uma ferramenta com enormes poder ser recuperado sem perda de informao.
potencialidades, que cada vez mais comea a ser
A onda azul na Figura 2 a reconstruo da
utilizada em projectos de relativa complexidade.
onda original (a vermelho), sem respeitar este
Isto deve-se no s ao seu baixo custo, mas
teorema. E, como se pode constatar, no existe
tambm sua simplicidade de utilizao.
uma reconstruo da onda original, havendo assim
perda de informao.
A soluo para aumentar a taxa de
amostragem no Arduino passa essencialmente por
aumentar a velocidade do conversor analgico-
Fig. 1 Exemplo de shield Zigbee e Ethernet digital (ADC) como veremos de seguida.

Fundamento terico ADC


Na leitura de sensores, as amostras so
O conversor analgico digital presente no
geralmente adquiridas em intervalos fixos de
ATmega168 (Arduino) possui 10 bit de resoluo.
tempo. Contudo, em casos especficos, a
periodicidade de amostragem pode ser alterada. O ADC est preparado para um sinal de
entrada analgica de tenso varivel de 0V a 5V,
Desta forma, quer aumentando ou
gerando nmeros binrios de 0 (0000000000) a
diminuindo o intervalo de tempo entre amostras, a
1023 (1111111111), que dependem essencialmente
principal questo prende-se com a periodicidade da
do sinal colocado na entrada. (Ver Nuno Pessanha
prpria amostragem, visto que quanto maior for,
Santos, Introduo ao Arduino, Revista
maior tero de ser tambm a capacidade de
PROGRAMAR, 17 edio)
processamento e de armazenamento.
excepo da primeira converso que leva Na tabela, podemos analisar quais as
25 ADC ciclos de clock, pois efectua a inicializao combinaes destes trs bits e a partir destas fazer
do ADC, uma converso demora 13 ADC ciclos de alguns clculos que nos possibilitam definir a taxa
clock. Ou seja, se tivermos um clock de 1 MHz de amostragem adequada, por exemplo:
vamos ter, aproximadamente: Se tivermos o bit 0 (ADPS0) a 1, o bit 1
106 (ADPS1) a 1 e o bit 2 (ADSP2) a 0, obtemos
= 77000
13 segundo a tabela acima um factor de diviso de 8.
O que vai limitar, como referido O Arduino tem um clock de sistema de 16
anteriormente, a largura de banda a utilizar para MHz, obtendo assim um input clock para o ADC de
38,5 kHz -segundo o teorema de Nyquist. 2 MHz.
16
= = 2
Arduino Vs ADC 8
O mesmo raciocnio seria tomado para
Nem sempre a maior taxa de amostragem qualquer factor de diviso possvel - 2,4,8,16,32,64
a mais indicado. Seria errado pensarmos deste e 128.
modo, pois ao aumentar a taxa de amostragem Destes 2 MHz obtidos para um factor de
vamos, tambm, aumentar o espao e o diviso de 8, temos de os dividir por 13 - Nmero de
processamento necessrio dos dados. ciclos de clock gastos na converso para obter a
Assim, dever-se- encontrar a menor taxa respectiva taxa de amostragem.
de amostragem que consiga satisfazer os nossos 2
objectivos, pois no vamos ter quaisquer melhorias = 0,15
13
no nosso objectivo ao colocar taxas de amostragem Ou seja, com esta taxa obtemos 150000
excessivamente elevadas, j que poderemos estar a amostras por cada segundo. Contudo, estes valores
exigir esforos de processamento que no podemos so apenas tericos, no sendo estes os obtidos na
fornecer. realidade.
O input clock do ADC encontra-se dividido
por um factor de diviso Prescaler. O valor Como alterar o Prescaler
deste factor pode ser modificado, alterando o valor
do contedo do registo ADCSRA. Exemplo de cdigo fonte que permite
Bit 7 6 5 4 3 2 1 0 alterar o valor do Prescaler.
(0x7A) ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0 (1) #ifndef cbi
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W (2) #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
Valor Inicial 0 0 0 0 0 0 0 0
(3) #endif
(4) #ifndef sbi
Fig. 3 Contedo do registo ADCSRA (5) #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
(6) #endif
Factor de (7) void setup(void) {
ADPS2 ADPS1 ADPS0
diviso (8) Serial.begin(9600);
(9) sbi(ADCSRA, ADPS2);
0 0 0 2 (10) cbi(ADCSRA, ADPS1);
0 0 1 2 (11) cbi(ADCSRA, ADPS0);
(12) }
0 1 0 4 (13) int a;
0 1 1 8 (14) int b;
(15) int c;
1 0 0 16
(16) void loop()
1 0 1 32 (17) { b = micros();
(18) a = analogRead(0);
1 1 0 64
(19) c = micros();
1 1 1 128 (20) Serial.print(c-b);
Fig. 4 Combinaes possveis (21) Serial.print('-');
(22) Serial.println(a);
(23) }
Os bits que nos interessam para este caso
so o ADPS2, ADPS1 e o ADPS0.
No exemplo de cdigo acima apresentado,
possvel fazer uma leitura de quanto tempo Concluso
gasto, na realidade, a efectuar a converso de
analgico para digital. O tema aqui abordado permite uma
Nas linhas 9,10 e 11 estabelecido o melhoria das capacidades do Arduino como
contedo dos registos responsveis pelo factor de datalogger.
diviso. A instruo sbi atribui o valor 1 e a fcil perceber que, recorrendo ao
instruo cbi atribui o valor 0, sendo a instruo datasheet do microcontrolador e sabendo o nome
constituda por: dos registos existentes, possvel uma
configurao mais personalizada desta
Instruo (registo, bit a estabelecer); ferramenta, isto , qualquer registo existente
assim passvel de ser configurado. O que abre
Analisando a instruo da linha 9, a ttulo
portas para um rendimento mais elevado, nas
de exemplo, podemos ver que utilizada a
aplicaes desejadas.
instruo sbi (Atribui o valor 1) ao bit 2 (ADPS2) do
registo ADCSRA. Este artigo no representa, obviamente,
tudo o que h a aprender sobre este tema, tendo o
Atravs da instruo Serial.begin, so
leitor de, caso tenha necessidade, aprofundar os
enviados, pela porta srie, os valores do tempo de
seus conhecimentos nesta rea.
converso. (Respectivamente c-b )
Se o primeiro contacto com o Arduino ou
Deste modo, ao fazer a diferena entre o
sentiu curiosidade em aprender, leia o artigo
valor c (linha 20) e o valor b (linha 18), vamos obter
Introduo ao Arduino na 17 edio da revista
o valor do tempo dispendido a executar a funo
PROGRAMAR.
analogRead. Isto , obtemos assim o valor real de
tempo dispendido a efectuar a converso de Pois o saber no ocupa espao de memria.
analgico para digital. Nuno Pessanha Santos
No obtendo, como foi referido Revista PROGRAMAMAR
anteriormente, os valores tericos calculados. Edio 20 Julho de 2009
nuno.pessanha.santos@marinha.pt
nuno.pessanha.santos@gmail.com
Escola Naval
Departamento de Armas e Electrnica

You might also like