Artigo visualizado 1850 vezes

Lendo múltiplas entradas analógicas no Arduino: Cuidados e Recomendações

Introdução

Diversos projetos envolvendo Arduino UNO R3/Arduino Nano (e outros), ou mesmo apenas o microcontrolador ATmega328P, podem necessitar efetuar medições de grandezas analógicas, por vezes mais de uma grandeza na mesma aplicação.

O ATmega328 em encapsulamento plástico com fileira dupla de terminais em linha, mais conhecido como DIP (Dual Inline Package) dispõe de seis pinos de acesso para entrada analógica, e sua versão em encapsulamento TQFP (Thin Profile Quad Flat Package) e QFN/MLF (Quad Flat No-Lead /Micro Lead Frame Package), dispõe de oito pinos de acesso para entrada analógica.

CódigoEncapsulamentoTipificação
Atmega328-AU
Atmega328-AUR
32A32 terminais TQFP
(Thin Plastic Quad Flat Package)
Atmega328-MMH
Atmega328-MMHR
28M128 terminais QFN/MLF
(Quad Flat No-Lead/Micro Lead Frame Package)
Atmega328-MU
Atmega328-MUR
32M1-A32 terminais QFN/MLF
(Quad Flat No-Lead/Micro Lead Frame Package)
Atmega328-PU28P328 terminais PDIP
(Plastic Dual Inline Package)
Tabela 1: Códigos do cmponente X encapsulamento

O dispositivo possui um único Conversor Analógico-Digital (ADC) de aproximação sucessiva com resolução de 10 bits. O ADC é conectado a um multiplexador analógico de 8 canais que permite oito entradas de tensão nos terminais a partir da Porta A do microcontrolador. As entradas de tensão têm como referência o 0V (GND).

O ADC contém um circuito Amostra e Retenção (Sample and Hold) que garante que a tensão de entrada no ADC seja mantida em um nível constante durante a conversão.

O ADC tem um pino de tensão de alimentação analógica separado do restante dos circuitos do microcontrolador, o AVCC. AVCC não deve diferir mais do que ± 0,3V do VCC.

Cuidados no projeto de hardware próprio

Caso esteja fazendo o projeto da placa de circuito impresso para o seus protótipo, ao invés de usar uma placa de Arduino, por exemplo: UNO ou NANO, ou também, se estiver programando fora do framework do Arduino, leve em conta as seguintes recomendações, extraídas da folha de dados do fabricante do ATmega328.

Os circuitos digitais dentro e fora do ATmega328 geram EMI (Interferência Eletromagnética) que pode afetar a precisão das medições analógicas. Se a precisão da conversão for crítica, o nível de ruído pode ser reduzido aplicando as seguintes técnicas:

  • Mantenha os caminhos dos sinais analógicos o mais curtos possível. Certifique-se de que as trilhas analógicas percorram o plano de aterramento analógico e mantenha-as bem longe das trilhas digitais de comutação de alta velocidade;
  • O pino AVCC do ATmega328 deve ser conectado à tensão de alimentação VCC digital por meio de uma rede LC, conforme mostrado na figura a seguir;
  • Use a função de cancelador de ruído do ADC para reduzir o ruído induzido da CPU;
  • Se qualquer tipo de porta ADC[3:0] for usada como saída digital, é essencial que eles não sejam comutados enquanto uma conversão estiver em andamento. No entanto, o uso da interface de 2 fios (ADC4 e ADC5) afetará apenas a conversão no ADC4 e ADC5 e não nos outros canais ADC.
Conexões de energia na alimentação analógica recomendadas pelo fabricante do ATmega328P
Figura 1: Diagrama da conexão de energia, para prevenir ruídos indesejados na conversão A/D

Se estiver utilizando o framework do Arduino sem utilizar programação direta do registradores, não terá controle suficiente para determinar como usar a técnica apontada no item 1.2 anterior.

Para melhor compreensão da operação um diagrama de blocos do ADC é mostrado aqui e comentado a seguir.

Diagrama de Blocos do conversor analógico digital do ATmega328P
Figura 2: Diagrama em Blocos do Conversor Analógico Digital do ATmega328P

canal de entrada analógica é selecionado escrevendo nos bits MUX no Registrador de Seleção do Multiplexador ADC ADMUX.MUX[3:0]. Qualquer um dos pinos de entrada do ADC, bem como GND e uma tensão de referência de intervalo fixo de bandgap[1], podem ser selecionados como entradas independentes para o ADC. O ADC é habilitado escrevendo um lógico no bit de Habilitação do ADC no Registrador A de Controle e Status do ADC (ADCSRA.ADEN). As seleções de referência de tensão e canal de entrada não terão efeito até que ADEN seja definido. O ADC não consome energia quando o ADEN é apagado, portanto, é recomendável desligar o ADC antes de entrar no modo de economia de energia.


[1] a) Os AVRs modernos têm uma referência de tensão de bandgap que pode ser usada com o ADC ao invés do AVCC. Na maioria dos AVRs, essa tensão é em torno de 1,1V e permite uma resolução melhorada do ADC ao medir tensões abaixo de 1V. A folha de dados indica que o bandgap pode variar entre 1,0V e 1,2V.

b) Na engenharia de semicondutores, bandgap, ou Banda Proibida em português, é a “quantidade” de energia necessária para que o elétron efetue a transição da banda de valência para a banda de condução.


O ADC gera um resultado de 10 bits que é apresentado nos Registradores de Dados ADC, ADCH e ADCL. Por padrão, o resultado é apresentado alinhado  à direita, mas pode ser opcionalmente apresentado alinhado à esquerda definindo o bit ADMUX.ADLAR de Resultado de Ajuste à Esquerda do ADC.

Se o resultado for alinhado à esquerda e não forem necessários mais de 8 bits de precisão, é suficiente ler ADCH. Caso contrário, ADCL deve ser lido primeiro, depois ADCH, para garantir que o conteúdo dos Registradores de Dados pertença à mesma conversão: Uma vez que o ADCL é lido, o acesso do ADC aos Registradores de Dados é bloqueado. Isso significa que se o ADCL tiver sido lido e uma segunda conversão for concluída antes da leitura do ADCH, nenhum dos registradores será atualizado e o resultado da segunda conversão será perdido. Quando ADCH é lido, o acesso ADC aos registradores ADCH e ADCL é reativado.

O ADC tem sua própria interrupção, que pode ser acionada quando uma conversão é concluída. Quando o acesso ADC aos Registradores de Dados é proibido entre a leitura de ADCH e ADCL, a interrupção será acionada mesmo se o resultado for perdido.

Circuito da enrada analógica

O circuito de entrada analógica para canais individuais é ilustrado a seguir. Uma fonte analógica aplicada ao ADCn está sujeita à capacitância do pino e a fuga de entrada desse pino, independentemente de o canal estar selecionado como entrada para o ADC. Quando o canal é selecionado, a fonte deve conduzir o capacitor S/H

(Sample and Hold) através da resistência em série (resistência combinada do caminho de entrada).

O ADC é otimizado para sinais analógicos com uma impedância de saída de aproximadamente 10 kohm ou menos. Se tal fonte for usada, o tempo de amostragem será insignificante. Se uma fonte com impedância mais alta for usada, o tempo de amostragem dependerá de quanto tempo a fonte precisa para carregar o capacitor S/H, que pode variar amplamente. Recomenda-se ao usuário usar apenas fontes de baixa impedância com sinais de variação lenta, pois isso minimiza a transferência de carga necessária para o capacitor S/H.

Os componentes do sinal mais altos do que a frequência de Nyquist[2] (fADC/2) não devem estar presentes para nenhum dos tipos de canais, para evitar distorção da convolução imprevisível do sinal. Ao usuário é aconselhado a remover os componentes de alta frequência com um filtro passa-baixa antes de aplicar os sinais nas entradas do ADC.

Circuito equivalente simplificado da entrada analógica do ATmega328P
Figura 3: Circuito equivalente da Entrada Analógica do ATmega328P

[2] Teorema da amostragem de Nyquist-Shannon


Para saber mais sobre a operação do conversor analógico-digital, busque informações na sessão ADC – Converso Analógico Digital da folha de dados do ATmega328P.

Efetuando leituras analógicas no Arduino

Todo sensor com uma saída analógica, potencialmente, será conectado, e portanto, lido por uma entrada analógica do Arduino (ou do ATmega328).

Porquanto apenas uma leitura analógica for efetuada, não se encontra nenhuma dificuldade, pois o circuito de Amostragem e Retenção (S/H) lerá sempre um mesmo sinal  de entrada, assim sua variação será perfeitamente copiada por ele.

Problemas podem surgir a partir do momento em que se efetuam mais de uma leituras analógicas.

Por hipótese, os diferentes sinais conectados às diferentes entradas, podem naturalmente apresentar, num mesmo instante, valores bastante diversos uma vez que podem ser sinais oriundos de fontes não correlacionadas.

A título de exemplo, um escritório de projetos de arquitetura, necessita-se de iluminação farta e temperatura ambiente amena. Desta forma os transdutores tanto de luminosidade, quanto de temperatura podem oferecer tensões de saída proporcionais às grandezas que medem, admitindo-se que a tensão oferecida pelo  luxímetro seja razoavelmente maior que a oferecida pelo termômetro.

Assim se luxímetro e termômetro forem cada um conectados a entradas analógicas do Arduino (ou ATmega328), atende que as medições analógicas serão feitas ora sobre uma oferta de tesão alta ora sobre uma oferta de tensão baixa.

Foi visto na introdução que o Arduino (ou ATmega328) se utiliza de um único conversor A/D cuja entrada é multiplexada pelo pinos de entrada analógica. Bem a retenção da tensão a ser quantificada pelo conversor é levada a cabo por um capacitor, que deverá ser carregado, ou descarregado, até o valor de tensão a medir. Em função da impedância tanto da fonte de sinal, quanto do circuito interno do microcontrolador, determina-se um tempo de carga, ou descarga, do capacitor.

Circuito de ensaios utilizado

O diagrama esquemático do circuito utilizado neste ensaio é apresentado a seguir, e mais adiante um registro fotográfico do protótipo.

Deve-se observar que não são utilizadas entradas analógicas contiguas do Arduino, de forma a evitar a inferência de resultados alterados devido a seleção de entrada em sequência.

Diagrama esquemático do circuito de teste usado nos ensaios
Figura 4: Diagrama esquemático do circuito de ensaio

As condições ambientais são controladas por meio de iluminação artificial de aproximadamente 520Lux, em câmara escura e temperatura controlada por sistema de ar-condicionado próximo a 26,5 °C.

Imaginemos medir uma tensão de, digamos, 3V relativa ao luxímetro (LDR R2 no diagrama esquemático) correspondendo a aproximadamente aos 500lux acima referidos e no momento seguinte medir uma tensão de, talvez, 250mV relativa ao termômetro (LM35DZ U1 no diagrama esquemático) correspondendo aos 26,5°C acima referidos, que constitui uma diferença considerável de valores entre as tensões.

Leituras realizadas isoladamente

Nestas condições efetuando cada leitura isoladamente ambos são corretamente coletados, a seguir dois sketchs cada um para leitura de um dos sinais analógicos e em seguida uma relação simples dos valores obtidos em cada situação.

/* Leitura do sensor de luz */
#define  sensorLuz A0

int intensLuz = 0;

void setup() {
  Serial.begin(115200);
  Serial.println("Iniciando leituras repetitivas.\n");
}
void loop() {
  intensLuz = analogRead(sensorLuz);
  Serial.print(millis());
  Serial.print("\t");
  Serial.print("Intensidade de luz: ");
  Serial.print(intensLuz);
  Serial.println();
  delay(50);
}
/* Leitura do sensor de temperatura */
#define  sensorTemp A3

int valTemp = 0;

void setup() {
  Serial.begin(115200);
  Serial.println("Iniciando leituras repetitivas.\n");
}
void loop() {
  valTemp = analogRead(sensorTemp);
  Serial.print(millis());
  Serial.print("\t");
  Serial.print("Temperatura: ");
  Serial.print((float)map(valTemp,0,1023,0,50000)/100);
  Serial.println();
  delay(50);
}
#Luminosidade
[Lux]
#Temperatura
[°C]
1516126,88
2516226,39
3519326,88
4525426,88
5532526,88
6536626,88
7538726,39
8537826,88
9535926,88
105291026,88
Tabela 2: Leituras efetuadas isoladamente
LuminosidadeTemepratura
Moda516LuxModa26,88°C
Média528,30LuxMédia26,78°C
Desvio Padrão8,744Desvio Padrão0,270
Tabela 3: Relatório analítico das leituras efetuadas isoladamente

razoavelmente elevada estando em 8,744 de desvio padrão e em valores absolutos variando 9,7 Lux para mais e 12,3 Lux para menos em um intervalo de 22,0Lux.

A temperatura média das medições aponta uma diferença de 0,38 °C a maior, com uma baixa dispersão das leituras estando em 0,207 de desvio padrão e em valores absolutos variando 0,343 °C para mais e 0,147 °C para menos em um intervalo de 0,49°C.

Leituras realizadas em sequência

Agora faremos a medição “simultânea” das duas grandezas em um só sketch, mostrado a seguir e logo após os dados coletados.

/* Leitura dos sensores */
#define  sensorLuz A0
#define  sensorTemp A3

int intensLuz = 0;
int valTemp = 0;

void setup() {
  Serial.begin(115200);
  Serial.println("Iniciando leituras repetitivas.\n");
  Serial.println("Luminosidade - temperatura");
}
void loop() {
  intensLuz = analogRead(sensorLuz);
  valTemp = analogRead(sensorTemp);
  Serial.print(millis());
  Serial.print("\t");
  Serial.print(intensLuz);
  Serial.print("\t");
  Serial.print((float)map(valTemp,0,1023,0,50000)/100);
  Serial.println();
  delay(50);
}
#Luminosidade
[Lux]
#Temperatura
[°C]
1517121,99
2517221,99
3524321,50
4533421,50
5538521,50
6538621,50
7533721,50
8524821,99
9517921,50
105151021,50
Tabela 4: Leituras efetuadas em sequência
LuminosidadeTemperatura
Moda517LuxModa21,50°C
Média525,60LuxMédia20,65°C
Desvio Padrão9,168Desvio Padrão0,237
Tabela5: Relatório analítico das leituras efetuadas em sequência

Comparando-se os resultados dos dois métodos de coleta de dados, pode-se observar a alteração das média e a maior dispersão dos dados.

No caso da iluminação, a alteração na média de 2,7 Lux para menos não é significativa (0,5%), no entanto a dispersão das leituras teve um aumento de 4,8% apresentando desvio padrão de 9,168 e em valores absolutos variando 12,4Lux para mais e 10,6Lux para menos em um intervalo de 23Lux.

No caso da temperatura, a alteração na média de 5,14°C para menor é extremamente significativa (19,17%), já a dispersão das leituras teve um aumento significativo porém mais brando de 14,5% apresentando desvio padrão de 0,237 e em valores absolutos variando 0,35°C para mais e 0,15°C para menos em um intervalo de 0,49°C.

Estes resultados, consolidados no quadro comparativo abaixo,  deixam claro que há alguma influência em efetuar mais de uma medidas analógicas sequenciadas com o ATmega328.

Luminosidadeem [LUX]Temperaturaem [°C]
ModalidadeMédiaDesvio PadrãoMédiaDesvio Padrão
Isoladas528,38,74426,780,207
Sequenciadas525,69,16821,650,237
Tabela 6: Resultados dos sketchs 1, 2 e 3 consolidados

Isto leva à hipótese de que o capacitor usado para fazer a retenção do dado para amostra está, falando por analogia, contaminado com a amostra imediatamente anterior e não teve tempo suficiente para alterar sua carga, seja para maior seja para menor. Para verificar está hipótese temos duas experimentações a fazer. A primeira é garantir um tempo mínimo entre as medidas de cada canal, e a segunda é efetuar uma dupla leitura de cada canal.

A primeira possibilidade trabalha no circuito RC equivalente que se forma quando o multiplex conecta um canal de entrada do circuito de Amostra e Retenção (S/H). A segunda possibilidade trabalha na estabilização da conexão do circuito.

Assim teremos novos sketchs em execução, conforme códigos, coletas de dados e relatórios analíticos que seguem.

Leituras com Intervalo de guarda entre si

Neste sketch há a inserção de um intervalo de 50ms entre as medições da grandezas luminosidade e temperatura, e esta é a única diferenciação com o sketch anterior.

/* Leitura dos sensores */
#define  sensorLuz A0
#define  sensorTemp A3

int intensLuz = 0;
int valTemp = 0;

void setup() {
  Serial.begin(115200);
  Serial.println("Iniciando leituras repetitivas.\n");
  Serial.println("Luminosidade - temperatura");
}
void loop() {
  intensLuz = analogRead(sensorLuz);
  delay(50);
  valTemp = analogRead(sensorTemp);
  delay(50);
  Serial.print(millis());
  Serial.print("\t");
  Serial.print(intensLuz);
  Serial.print("\t");
  Serial.print((float)map(valTemp,0,1023,0,50000)/100);
  Serial.println();
  delay(50);
}
#Luminosidade
[Lux]
#Temperatura
[°C]
1512127,37
2518224,92
3521338,12
4517424,92
5508524,92
6500633,72
7498736,16
8504825,41
9514938,12
105211024,92
Tabela 7: Leituras efetuadas em sequência comintervalo de 50ms
LuminosidadeTemperatura
Moda521LuxModa24,92°C
Média511,30LuxMédia29,85°C
Desvio Padrão8,447Desvio Padrão5,913
Tabela 8: Relatório analítica dqas leituras efetuadas em sequência com intervalo do 50ms

Os dados coletados demonstram que este método não melhora a qualidade das leituras.

No caso da iluminação, a alteração na média de 17Lux para menos também não é significativa (3,2%), assim como a dispersão das leituras teve uma redução de 3,4% apresentando desvio padrão de 8,447 e em valores absolutos variando 9,7Lux para mais e 13,3Lux para menos em um intervalor der 23Lux.

No caso da temperatura, a alteração na média de 3,1°C para maior é muito significativa (11,49%), já a dispersão de leituras teve um aumento espantoso de 2756,5% apresentando desvio padrão de 5,913 e em valores absolutos variando 8,3°C para mais e 4,9°C para menos em uma intervalo de 13,2°C.

Estes resultados, consolidados no quadro comparativo abaixo, deixam claro que não é o intervalo entre as leituras das grandezas físicas agrava o problema da divergência de valores.

Luminosidadeem [Lux]Temperaturaem [°C]
ModalidadeMédiaDesvioMédiaDesvio
Isoladas528,38,74426,880,207
Com intervalo511,38,44729,865,913
Tabela 9: Resultados dos sketchs 1, 2 e 4 consolidados

Leituras duplas de cada grandeza

Neste outro sketch não há intervalo entre as leitura, no entanto, cada grandeza física é lida duas vezes sendo desprezada a primeira e tomada a segunda como válida.

/* Leitura dos sensores */
#define  sensorLuz A0
#define  sensorTemp A3

int intensLuz = 0;
int valTemp = 0;

void setup() {
  Serial.begin(115200);
  Serial.println("Iniciando leituras repetitivas.\n");
  Serial.println("Luminosidade - temperatura");
}
void loop() {
  analogRead(sensorLuz);
  intensLuz = analogRead(sensorLuz);
  analogRead(sensorTemp);
  valTemp = analogRead(sensorTemp);
  Serial.print(millis());
  Serial.print("\t");
  Serial.print(intensLuz);
  Serial.print("\t");
  Serial.print((float)map(valTemp,0,1023,0,50000)/100);
  Serial.println();
  delay(50);
}
#Luminosidade
[Lux]
#Temperatura
[°C]
1537126,39
2535225,90
3527325,90
4516426,39
5519525,90
6519625,90
7527725,90
8536826,39
9534926,39
105241026,39
Tabela 10: Leituras efetuadas em sequência com dupla coleta
LuminosidadeTemperatura
Moda527LuxModa26,39°C
Média527,40LuxMédia26,15°C
Descio Padrão7,820Desvio Padrão0,258
Tabela 11: Relatório analítico das leituras efetuadas em sequência com dupla coleta

Comparando-se os resultados dos dois métodos de coleta de dados, o primeiro e este, pode-se observar a alteração das média e a maior dispersão dos dados.

No caso da iluminação, a alteração na média de 0,9Lux para menos é desprezível (0,17%), e a dispersão das leituras teve uma redução de 10,6% apresentando desvio padrão de 7,820 e em valores absolutos variando 9,6Lux para mais e 11,4Lux para menos em um intervalo de 21Lux.

No caso da temperatura, a alteração na média de 0,64°C para menor é razoavelmente pequena (2,38%), já a dispersão das leituras teve um aumento significativo de 25,0% apresentando desvio padrão de 0,258 e em valores absolutos variando 0,25°C para mais e 0,25°C para menos em um intervalo de 0,49°C.

Estes resultados, consolidados no quadro comparativo abaixo,  deixam claro que a influência em efetuar mais de duas medidas analógicas sequenciadas com o ATmega328 deixou de acontecer.

Luminosidadeem [Lux]Temperaturaem [°C]
ModalidadeMédiaDesvioMédiaDesvio
Isoladas528,38,74426,780,207
Leituras duplas527,47,82026,150,258
Tabela 12: Resultados dos sketchs 1, 2 e

Desta forma a independência das medições da duas grandezas tomou níveis bastante satisfatórios com esta tática de coleta de dados.

Aquisição de leituras duplas com média móvel

Resta ainda, principalmente na medição de luminosidade, a preocupação com a variação das diversas medições, que na medição de temperatura já está satisfatório. Aplicando-se a tática de cálculo de média móvel nas diversas medições de cada grandeza, teremos uma medição bastante mais estável e para tanto vamos utilizar o sketch a seguir, utilizando como medida a média das últimas 20 medições de cada uma das grandezas (a média de 10 leituras já dá resultados bastante satisfatórios).

/* Leitura dos sensores */
#define  sensorLuz A0
#define  sensorTemp A3

#define AMOSTRAS  20  // Quantidade de componentes da média móvel
#define ENTIDADES 2     // Quantidade de médias móveis a serem calculadas
#define LUMINOSIDADE  0  // Índice da média 1
#define TEMPERATURA   1             // Índice da média 2

/* Matriz com as medições para as médias móveis	
   Cada linha é o conjunto de dados de uma média */
int values[ENTIDADES+1][AMOSTRAS+1]; 

float mLumi;              // Média das medições de luminosidade
float mTemp;              // Média das medições de temperatura

/* *****************************************************************
   movingAverage - Cálculo de média móvel
   *****************************************************************
   Parâmetros de entrada:
       PARM1: grandeza - Entidade a ter a média calculada
       PARM2: newValue - Novo valor a entrar para a média móvel
   Observações e Notas:
       A operação segue as seguintes etapas:
       1- Desloca todos os elementos do vetor na dimensão
          informada no primeiro parâmetro da chamada, desprezando
          o elemento mais antigo
       2- Insere o novo valor informado na chamada na primeira
          posição do vetor na dimensão indicada por PARM1
       3- Efetua a somatória de todos os elementos do vetor na dimensão
          informada por PARM1
       4- Calcula a razão da soma dos elementos pelo número de elementos
          e retorna com este valor para o chamador da função
   *************************************************************** */
int moving_average(byte grandeza, int newValue) {
  int i;          //variável auxiliar para iterações
  long acc = 0;   //acumulador

  // Desloca elementos do vetor eliminando o mais antigo
  for (i = AMOSTRAS; i > 0; i--)
    values[grandeza][i] = values[grandeza][i-1];

  // Insere o novo valor informado
  values[grandeza][0] = newValue;

  // Calcula a média dos AMOSTRAS valores
  for (i = 0; i < AMOSTRAS; i++)
    acc += values[grandeza][i];
  return (int)(acc / AMOSTRAS);      //Retorna a média móvel
} // Fim moving_average

/* ************************************************************** */
void setup() {
  Serial.begin(115200);
  Serial.println("Iniciando leituras repetitivas.\n");
  Serial.println("Luminosidade - temperatura");
}

/* ************************************************************** */
void loop() {
  analogRead(sensorLuz);
  mLumi = moving_average(LUMINOSIDADE, analogRead(sensorLuz));
  analogRead(sensorTemp);
  mTemp = (float)moving_average(TEMPERATURA, \
  map(analogRead(sensorTemp), 0, 1023, 0, 50000))/100;
  Serial.print(millis());
  Serial.print("\t");
  Serial.print(mLumi, 0);
  Serial.print("\t");
  Serial.print(mTemp);
  Serial.println();
  delay(50);
}
#Luminosidade
[Lux]
#Temperatura
[°C]
1524126,41
2523226,41
3524326,41
4524426,41
5524526,41
6524626,41
7523726,41
8524826,41
9524926,41
105241026,41
Tabela 13: Leituras efetuadas em sequência com coleta dupla e média móvel de 20 medições
LuminosidadeTemperatura
Moda524LuxModa26,41°C
Média523,88LuxMédia26,41°C
Desvio Padrão0,422Desvio Padrão0,0

Comparando-se os resultados do primeiro método de coleta de dados, com os resultados desta tática aprimorada temos resultados estáveis (baixíssima dispersão de dados) suficientemente fiéis aos padrões impostos ao ambiente de teste.

No caso da medição de luminosidade, a alteração na média de 4,5 Lux para menos implica em uma variação desprezível na prática (0,85%), igualmente a dispersão das leituras teve uma redução de 95,2% apresentando desvio padrão de 0,422 e em valores absolutos variando 0,2Lux para mais e 0,8Lux para menos em um intervalo de 1Lux.

No caso da temperatura, a alteração na média de 0,37°C para menor é pouco significativa (1,4%) podendo ser desprezada. Já a dispersão das leituras teve uma melhora absoluta, deixando de haver dispersão das leituras apresentando desvio padrão de 0,0 , portanto, sem valores absolutos a exibir.

Estes resultados, consolidados no quadro comparativo a seguir,  deixam claro que há alguma influência em efetuar mais de uma medidas analógicas sequenciadas com o ATmega328.

Luminosidadeem [Lux]Temperaturaem [°C]
ModalidadeMédiaDesvioMédiaDesvio
Isoladas528,38,74426,780,207
Com média móvel523,80,42226,410,0
Tabela 15: Resultados do sketchs 1, 2 e 6 consolidados

Agora aplicados todos os dispositivos de melhoria das medições obtemos dados muito estáveis e bastante próximos dos parâmetros ambientais estipulados para as medições.

É importante ressaltar que a variação observada nas leituras de luminosidade é devida à fonte de luz, uma lâmpada de LEDs tubular ligada na rede elétrica que leva a uma variação com frequência de 120Hz, como mostra a fotografia abaixo da captura de sinal em TP1.

Fotografia da tela do osciloscópico com o sinal do sensor de luz
Figura 5: Registro do sinal de leitura do sensor de luminosidade

Segue um registro da montagem do protótipo de ensaio usado nas tomadas de leituras. Foi usado um Arduino UNO um protoboard de 400 pontos, um LM35DZ como sensor de temperatura, um LDR um resistor de 10kohm à terra fazendo o divisor de tensão com o LDR para sensoriar a luminosidade.

Fotografia do circuito de ensaio ligado ao osciloscópio mostrando na tela o sinal do sensor de luz
Figura 6: Fotografia da montagem do protótipo de ensaio, ligado ao osciloscópio exibindo em tela o sinal do sensor de luminosidade

Considerações finais

Uma vez realizados estes seis ensaios é possível tirar algumas boas práticas do processo como um todo.

Inicialmente as recomendações do fabricante do ATmega328:

  • Mantenha os caminhos dos sinais analógicos o mais curtos possível. Certifique-se de que as trilhas analógicas percorram o plano de aterramento analógico e mantenha-as bem longe das trilhas digitais de comutação de alta velocidade.
  • O pino AVCC do ATmega328 deve ser conectado à tensão de alimentação VCC digital por meio de uma rede LC, observando a máxima diferença de potencial entre VCC e AVCC (máximo de 0,3V).
  • Se qualquer tipo de porta ADC[3:0] for usada como saída digital, é essencial que eles não sejam comutadas enquanto uma conversão estiver em andamento. No entanto, o uso da interface de 2 fios (ADC4 e ADC5) afetará apenas a conversão no ADC4 e ADC5 e não nos outros canais ADC.
  • Se trabalhando fora do framework do Arduino use a função de cancelador de ruído do ADC para reduzir o ruído induzido da CPU.

E as recomendações resultantes da observações deste trabalho:

  • Procure, sempre que possível, seja por custo ou por tamanho do circuito, utilizar filtro passa-baixa na linha do sinal analógico a ser lido (como aqui no sensor de luminosidade).
  • Se efetuando a leitura analógica de mais de uma entrada efetuar leitura dupla da entrada, desprezando a primeira leitura e tomando a segunda como válida.
  • Se não for um limitador em relação ao espaço utilizado na RAM, empregue uma rotina de cálculo de média móvel para as leituras dos sinais analógicos.

Referências

Banda Proibida. In: Wikipédia: a enciclopédia livre. 21 out. 2020. Disponível em:  <https://pt.wikipedia.org/wiki/Banda_proibida>. Acessado em 15 mar. 2021

Iazzetta, Fernando. Comprimento de Onda. [s.d.]            Disponível em: <http://www2.eca.usp.br/prof/iazzetta/tutor/audio/a_digital/a_digital.html>. Acesso em: 16 mar. 2021

MICROCHIP. ATmega328P 8-bit AVR Microcontroller with 32K Bytes In-Systems Programmable Flash:  Datasheet. 2015. Disponível em: <https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf>. Acesso em: 01 mar. 2021

Ralph, Nerd. ATmega328p bandgap voltage reference. 23 out. 2015. Disponível em: <http://nerdralph.blogspot.com/2015/10/atmega328p-bandgap-voltage-reference.html>. Acesso em: 15 mar. 2021

Shenzhen Senba Optical & Eletronic CO. LTD. GL55 Series Photoresistor. [s.d.]. Disponível em: <http://akizukidenshi.com/download/ds/senba/GL55%20Series%20Photoresistor.pdf>. Acesso em: 19 mar. 2021

Tavares. Projeto de filtro passivo RC. In: Caderno de Laboratório. 29 nov. 2020. Disponível em: <https://cadernodelaboratorio.com.br/projeto-de-filtro-passivo-rc/>. Acesso em: 17 mar. 2021

Teorema de Nyquist-Shannon. In: EA – Elettro Amici. 18 jun. 2018. Disponível em: <https://www.elettroamici.org/pt/teorema-di-nyquist-shannon/>. Acesso em: 16 mar. 2021

Teorema da amostragem de Nyquist-Shannon. In: Wikipédia: a enciclopédia livre. 12 dez. 2019. Disponível em: <https://pt.wikipedia.org/wiki/Teorema_da_amostragem_de_Nyquist%E2%80%93Shannon>. Acesso em: 16 mar. 2021

Texas Instruments. LM35 Precision Centigrade Temperature Sensors datasheet. dec 2017. Disponível em: <https://www.ti.com/lit/ds/symlink/lm35.pdf>. Acesso em: 18 mar. 2021

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.