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