17. Detecção de Parâmetro Físico-Químico - Condutividade (Parte I)

Para uma introdução aos princípios da Condutividade veja a seção Condutimetria.

17.1. Aplicações da Condutimetria

A condutividade da solução é uma propriedade agregada resultante da combinação de todos os eletrólitos dissolvidos e portanto não é capaz de discriminar a contribuição de cada eletrólito individualmente. Mas apesar dessa limitação as medidas de condutividade são de grande utilidade e podem ser usadas de forma direta ou indireta.

17.1.1. Condutometria Direta

A condutometria direta pode ter uma aplicação quantitativa quando se deseja monitorar a concentração de soluções que contenham apenas um tipo de eletrólito, ou a concentração de misturas de eletrólitos cuja proporção relativa seja conhecida (Ex: água do mar).

Mas também é útil para monitorar a pureza de águas quanto à presença de eletrólitos. Por exemplo:

  • a pureza de água destilada ou deionizada,

  • a concentração de sais dissolvidos em águas de abastecimento e em águas minerais,

  • a variação da salinidade da água em regiões estuarinas e no mar,

  • a concentração de sais dissolvidos na água usada em caldeiras para a geração de vapor ou como fluido térmico nas torres de resfriamento,

  • a concentração da solução nutritiva em sistemas de hidroponia ou na fertirrigação.

17.1.2. Condutometria Indireta - Titulação Condutométrica

Titulação é uma técnica de análise quantitativa que consiste na adição controlada da solução de um reagente, com concentração conhecida, a uma amostra contendo o analito de interesse, em concentração desconhecida, o qual irá reagir quantitativamente (completamente) com o reagente adicionado.

Nota

A estequiometria da reação entre o reagente adicionado e o analito presente na amostra deve ser previamente conhecida.

E a partir do conhecimento do volume da amostra, do volume gasto do reagente e da estequiometria da reação é possível calcular a concentração do analito na amostra.

Mas para se obter o volume gasto do reagente é preciso algum método para identificar o momento exato em que todo o analito reagiu com o reagente. Para isso é necessário obter algum tipo de informação que indique o ponto de equivalência da titulação.

Para identificar o ponto de equivalência da titulação é necessário monitorar a variação de alguma propriedade relacionada à reação que está ocorrente durante a titulação e localizar o ponto de inflexão no gráfico da propriedade em função do volume do reagente adicionado.

Por exemplo, a análise de uma solução contendo um ácido pode ser feita pela titulação com uma base e monitorada pela variação do pH do meio, com o uso de um eletrodo de pH ou com a adição de reagentes indicadores que mudam de cor em faixas determinadas de pH. No ponto de equivalência o pH sofre uma variação significativa no gráfico pH × Volume Titulante.

Um exemplo típico de titulação ácido-base é a titulação de um ácido forte (HCl) com uma base forte (NaOH), como mostra a figura 155

Figura 155. Gráfico da variação do pH durante uma titulação ácido-base de uma amostra de 25 mL contendo ácido clorídrico (HCl) 0,100M e usando como reagente titulante uma solução de hidróxido de sódio (NaOH) 0,100M (Fonte: Modern Analytical Chemistry, 2000)

Gráfico da variação do pH durante uma titulação ácido-base de uma amostra de 25 mL contendo ácido clorídrico (HCl) 0,100M e usando como reagente titulante uma solução de hidróxido de sódio (NaOH) 0,100M (Fonte: Modern Analytical Chemistry, 2000)

Observe que no início da titulação o pH aumenta lentamente até o volume próximo de 25mL do titulante, quando então pequenos incrementos de volume de NaOH provocam um um aumento rápido do pH que varia de ~2 (antes do ponto de equivalência) para ~12 (após o ponto de equivalência).

Além do pH o ponto de equivalência também pode ser localizado pelo monitoramento de outros parâmetros tais como: potencial eletroquímico, temperatura, cor e condutividade.

Dica

Para conhecer com mais detalhes as técnicas de Titulação veja Titrimetric Methods.

Para entender os princípios da titulação condutométrica vamos analisar com mais detalhes o que acontece em uma reação entre dois eletrólitos.

A adição de um eletrólito a uma solução de um outro eletrólito, sob condições que não levem a uma mudança apreciável do volume, afetará a condutividade à medida em que ocorra uma reação iônica.

Se não ocorrer uma reação iônica, como na adição de um sal simples a outro, por exemplo cloreto de potássio (KCl) a nitrato de sódio (NaNO3), a condutância simplesmente aumentará. Mas se ocorrer uma reação iônica, a condutância poderá aumentar ou diminuir.

Vamos entender como a variação da condutividade durante uma reação iônica pode ser usada para indicar o ponto final em uma Titulação Condutométricas (ou Condutimétricas).

Imagine que em uma solução contendo o eletrólito forte A+B- vamos adicionando pequenas quantidades de uma solução concentrada do eletrólito forte C+D- que reagem entre si segundo a reação 19.

Equação 19. Reação iônica entre os eletrólitos fortes A+B- e C+D- produzindo a espécie AD pouco ionizada e fracamente solúvel. (Fonte: http://zeus.qui.ufmg.br/~valmir/livros/Condutometria-Otto.pdf)


Até o ponto de equivalência, a titulação envolve a gradual substituição dos íons A+ da amostra pelos íons C+ do reagente titulante, enquanto os íons B- permanecem inalterados durante a titulação.

Nota

Considere que o reagente titulante é 20 a 100 vezes mais concentrada do que a amostra de tal forma a minimizar a variação de volume da amostra durante a titulação.

O perfil de variação da condutividade durante a titulação vai depender, dentre outros fatores, da condutância relativa dos íons C+ (adicionado) e dos íons A+ (removido).

Se a condutância do cátion C+ for menor do que o cátion A+ a condutância da solução decresce até o ponto de equivalência e volta a subir após o ponto de equivalência como mostra a figura 156.

Figura 156. Gráfico da variação da condutividade durante uma titulação ácido-base de uma amostra de 25 mL contendo ácido clorídrico (HCl) 0,100M e usando como reagente titulante uma solução de hidróxido de sódio (NaOH) 0,100M (Fonte: Modern Analytical Chemistry, 2000)

Gráfico da variação da condutividade durante uma titulação ácido-base de uma amostra de 25 mL contendo ácido clorídrico (HCl) 0,100M e usando como reagente titulante uma solução de hidróxido de sódio (NaOH) 0,100M (Fonte: Modern Analytical Chemistry, 2000)

Na titulação do HCl com NaOH a condutividade cai, a princípio, devido à substituição do íon hidrogênio (H+ condutividade 350) pelo cátion sódio adicionado (Na+ condutividade 40-80). Mas depois do ponto de equivalência a condutividade volta a subir com novas adições da base (NaOH) devido à grande condutividade do íon hidroxila (OH- condutividade 198).

Os dois ramos do gráfico são linhas, retas desde que a concentração do titulante seja alta e portanto o volume adicionado seja desprezível. O ponto de equivalência é determinado pela interseção das duas retas.

Mas em uma titulação de um ácido forte com uma base fraca, por exemplo, a titulação de ácido sulfúrico (H2SO4) com uma solução de amônia (NH4OH), a condutividade cai até o ponto de equivalência (PE) como resultado da remoção dos íons H+. Mas depois do PE o gráfico se torna quase horizontal pela baixa ionização da amônia na presença de sulfato de amônio (Figura 157).

Figura 157. Gráfico da variação da condutividade durante uma titulação ácido-base de uma amostra de ácido sulfúrico e usando como reagente titulante uma solução de amônia.

Gráfico da variação da condutividade durante uma titulação ácido-base de uma amostra de ácido sulfúrico e usando como reagente titulante uma solução de amônia.

O gráfico de uma titulação condutométrica pode apresentar diversos perfis. A seguir alguns links com mais informações:

17.2. Experimentos de Condutividade com Arduino

No passado as medidas de condutividade eram comumente feitas com o uso de ponte de Wheatstone, mas com a evolução da microeletrônica os condutivímetros passaram a usar circuitos baseados em Amplificadores Operacionais.

Ao pesquisar na Internet você vai encontrar vários projetos para medição da condutividade na água e no solo, e acho que a maioria deles não levam em conta a polarização dos eletrodos que podem acelerar processos corrosivos nos eletrodos. Por isso resolvi dedicar algum tempo explorando o comportamento dessas montagens com Arduino nas quais a solução (ou o solo) desempenham o papel de uma das resistências de um divisor de tensão.

Não tenho a intenção de fazer críticas a esses projetos, e como não sou especialista no assunto quero apenas conhecer com mais detalhes o comportamento e as características dessas alternativas. O meu objetivo é apenas aprender & compartilhar.

E como ponto de partida usei o projeto Water Conductivity/Numerical Output do livro Environmental Monitoring with Arduino (Environmental Monitoring with Arduino, 2012)

17.2.1. O Circuito e o Sketch

O circuito é relativamente simples e consiste basicamente de um divisor de tensão, o mesmo conceito usado no circuito para o SRF, onde a solução a ser analisada exerce o papel de uma resistência variável (figura 158). E a tensão no ponto M é o parâmetro usado para quantificar a resistência da solução e a partir daí a condutividade.

Figura 158. Diagrama do circuito de um condutivímetro usando o Arduino.

Diagrama do circuito de um condutivímetro usando o Arduino.

Usei inicialmente o seguinte código:

byte electrode_1 = 7; //Pino que servirá como eletrodo
byte electrode_2 = 8; //Pino que servirá como eletrodo
int  reading_pin = 0; //Pino analógico para leitura
int  reading;         //Variável que irá armazenar as leituras
                                                        
void setup() 
{ 
  
  Serial.begin(9600);     
  pinMode(electrode_1, OUTPUT); 
  pinMode(electrode_2, OUTPUT);
}                                    
void loop()                    
{ 
   
  digitalWrite(electrode_2, HIGH ); //Colocar eletrodo 2 como polo positivo (5V)
  digitalWrite(electrode_1, LOW);   //Colocar eletrodo 1 como polo negativo (0V)
  delay(100);                         //Aguardar estabilização
  reading = analogRead(reading_pin);  //Medir tensão entre o divisor de voltagem
  digitalWrite(electrode_2, LOW);     //Desligar eletrodo 1
  Serial.println(reading);
  delay(500);
} 

17.2.2. Eletrodos, Suporte e Eletrólito (solução)

Inicialmente escolhi usar como eletrodo o fio de uma resistência elétrica de chuveiro.

E por que?

Simplesmente porque é um material acessível e é feito para ser usado em contato constante com água e resistir a processos corrosivos.

Uma outra alternativa de eletrodo poderia ser o grafite de lápis ou as buchas usadas em motores de corrente alternada, ou a ponta das velas de ignição de automóveis, ou CDtrodo de ouro.

Usando seringas para insulina montei 2 eletrodos como mostra a figura 159.

Figura 159. Eletrodos feitos com fio de resistência elétrica de chuveiro e seringas de insulina.

Eletrodos feitos com fio de resistência elétrica de chuveiro e seringas de insulina.

Cortei a extremidade das seringas e usei os septos de borracha da seringa para evitar a entrada da solução dentro da seringa e garantir um tamanho constante do fio em contato com a solução.

Também providenciei a montagem de um suporte (Figura 160) usando placas de acrílico e pedaços de plástico de uma impressora. O suporte permite manter os eletrodos em uma posição fixa durante as medidas e também testar o efeito da distância entre os eletrodos durante as medidas.

Figura 160. Suporte dos eletrodos.

Suporte dos eletrodos.

Em seguida preparei uma solução de NaCl a 3,5% (concentração média aproximada de sais na água do mar) dissolvendo 1,75g de NaCl em 50 mL de água.

Equação 20. Cálculo da massa de NaCl para o preparo de 50 mL de uma solução salina a 3,5% de NaCl para testes iniciais de condutividade


Os eletrodos foram então colocados na solução salina e conectados ao Arduino conforme a figura 161.

Figura 161. Montagem dos eletrodos na solução salina com as conexões ao Arduino em uma protoboard.

Montagem dos eletrodos na solução salina com as conexões ao Arduino em uma protoboard.

17.2.3. Primeiras Leituras

Ao carregar para o Arduino o código inicial e abrir o monitor serial pude observar que as leituras começaram em torno de 196, mas ao longo do tempo as leituras iam aumentando paulatinamente chegando a valores em torno de 246.

O conversor Analógico-Digital (AD) da placa Arduino possui uma resolução[10] de 10 bits, ou seja, consegue converter a escala de 0-5V com uma resolução de:

210 = 1024

Ou seja tem a resolução de uma parte em (1024) e portanto se a faixa medida é de 0-5 V, a resolução será:

resolução = 5 V / (1024) = 0,00488 ou 4,88 mV

E portanto o comando analogRead na linha reading = analogRead(reading_pin); faz a leitura do potencial no ponto intermediário do divisor de tensão e retorna na unidade do conversor AD que pode variar de 0 (0V) a 1023 (5V).

Para converter essa leitura em Volts podemos definir a variável Vm com o comando float Vm e incluir o comando Vm = reading * 0.00488 que irá converter a leitura de unidades ADC para Volts e armazenar na variável Vm.

Mas antes mesmo de fazer essa alteração notei que as leituras foram aumentando de ~196 até ~246, e observei também algumas bolhas de gás adsorvidas na superfície dos eletrodos. Imaginei que pudesse ser algum processo eletrolítico. Mais tarde voltamos a este assunto.

Após fazer a conversão para volts passamos a registrar as leituras de ~0,96V.

Mas o que fazer com essas leituras?

O objetivo agora será determinar o valor da Resistência da solução e a partir daí calcular a Condutância da solução.

Mas antes vamos entender como funciona o divisor de tensão?

O circuito foi montado conforme a figura 162.

Figura 162. Diagrama do divisor de tensão para o condutivímetro usando o Arduino.

Diagrama do divisor de tensão para o condutivímetro usando o Arduino.

Rc é um resistor constante que vale 10Kohm e Rx representa a resistência variável da solução. O ponto M é ponto médio do divisor de tensão. E a tensão no ponto M (VM) é obtida experimentalmente através da leitura analógica no pino A0.

Agora a questão é: Como calcular a resistência Rx a partir da tensão no ponto M (VM), tensão no pino 8 (V8) e Rc?

Vamos fazer as seguintes considerações:

  1. Rc e Rx estão em série e portanto a resistência equivalente Re = Rc + Rx

  2. A diferença de potenial aplicada no circuito (ΔV) é ΔV = V8 - V7; mas como V7 = 0 (LOW) podemos assumir que ΔV = V8

  3. Pela lei de Ohm a corrente I que atravessa o circuito é: V8 = Re × I → V8 = (Rc + Rx) × I → I = V8 / (Rc + Rx)

  4. E pela lei de Ohm a tensão no ponto M (VM) aplicada à resistência da solução (Rx) é dada por VM = Rx × Ix → Ix = VM / Rx

  5. Mas a corrente I que atravessa o circuito é a mesma que passa por Rx (Ix) e portanto chegamos na equação 21

Equação 21. Equação do divisor de tensão para o cálculo da resistência da solução (Rx)


Agora basta substituir os valores de VM (obtido experimentalmente), a tensão no pino 8 (V8 = 5,00V) e Rc (10Kohm) e calcular a resistência Rx da solução.

O Sketch com as novas variáveis e a fórmula de conversão fica:

/*
  Condutivímetro 01
  Mede a tensão no ponto médio do divisor de tensão e converte em Volts
  Calcula a resistencia da solução a partir da tensão no ponto médio do divisor de tensão
*/
const float V_arduino = 5.00; //Tensão nos pinos digitais do Arduino
byte electrode_1 = 7; //Pino que servirá como eletrodo
byte electrode_2 = 8; //Pino que servirá como eletrodo
int  reading_pin = A0; //Pino analógico para leitura (0 ou A0)
int  reading;         //Variável que irá armazenar as leituras em unidades ADC
float Vm;   //Variável que irá armazenar as leituras em Volts no ponto médio do divisor de tensão
float Rc = 10000; //Resistência constante
float Rx; //Resistência da solução

void setup() 
{ 
  
  Serial.begin(9600);     
  pinMode(electrode_1, OUTPUT); 
  pinMode(electrode_2, OUTPUT);
}                                    

void loop()                    
{ 
   
  digitalWrite(electrode_2, HIGH ); //Colocar eletrodo 2 como polo positivo 5V
  digitalWrite(electrode_1, LOW);   //Colocar eletrodo 1 como polo negativo 0V
  delay(100);                         //Aguarda estabilização (?)
  reading = analogRead(reading_pin);  //Medir tensão entre o divisor de voltagem
  digitalWrite(electrode_2, LOW);     //Desliga eletrodo 1
  Vm = reading * 0.0048;    //Converte de ADC para Volts
  Rx = Rc * Vm / (V_arduino - Vm); //Calcula a resistência equivalente da solução
  Serial.print("Tensão (V) = ");
  Serial.print(Vm);
  Serial.print("-> Resistencia (ohms) = ");
  Serial.println(Rx);
  delay(2000);
} 

17.2.4. Estudando o Efeito Capacitivo da Dupla Camada

Estamos considerando que a solução se comporta como uma resistência (Rx), mas vários trabalhos mostram que existem vários componentes capacitivos em uma célula condutimétrica que podem ser representados pelo circuito equivalente (simplificado) da figura D.37. Por isso resolvi fazer alguns teste para observar, na prática, como varia e qual o intervalo de tempo necessário para estabilizar o potencial no ponto médio (VM) após ser aplicado uma diferença de potencial entre os eletrodos.

E para isso criei um Sketch com uma variável do tipo Array para armazenar leituras sucessivas do potencial em pequenos intervalos de tempo. E para ter uma noção nos intervalos de tempo entre cada leitura utilizei o comando Millis o qual retorna o número de milissegundos desde que a placa Arduino começou a rodar o programa atual.

/*
  Efeito Capacitivo da Dupla Camada Elétrica
  Programa que mede a variação do potencial no ponto médido do divisor de tensão
  para avaliar o efeito capacitivo da Dupla Camada Elétrica
*/

byte electrode_1 = 7; //Pino que servirá como eletrodo
byte electrode_2 = 8; //Pino que servirá como eletrodo
int  reading_pin = A0; //Pino analógico para leitura (0 ou A0)
int  readings[100];   //Variável do tipo array que irá armazenar as leituras sucessivas em unidades ADC
unsigned long time_int;
long time_read;
int int_read = 50;

void setup()

{
  
  Serial.begin(115200); 
  pinMode(electrode_1, OUTPUT); 
  pinMode(electrode_2, OUTPUT);
}                              

void loop()                    
{

  Serial.println("Ligando");
  
  int i;
  long t;
  
  digitalWrite(electrode_2, HIGH );
  digitalWrite(electrode_1, LOW );
  
  time_int = millis();
  for (i = 0; i < 100; i++) {

  readings[i] = analogRead( reading_pin );
  delay(int_read);
  }

  time_int = millis() - time_int;
  time_read = time_int/100;
  
  
for (i = 0; i < 100; i++) {
  
  t = i*time_read;
  Serial.print(t);
  Serial.print(" ");
  Serial.println(readings[i]);
  
  
}

  Serial.println();

  delay(5000);

  Serial.println("Desligando");

  time_int = millis();

  digitalWrite(electrode_2, LOW );

  for (i = 0; i < 100; i++) {

  readings[i] = analogRead( reading_pin );
    delay(100);
  }

  time_int = millis() - time_int;
  time_read = time_int/100;

  
for (i = 0; i < 100; i++) {
  
  t = i*time_read;
  Serial.print(t);
  Serial.print(" ");
  Serial.println(readings[i]);
  
  
}
 
}

Depois de alguns ajustes nos intervalos de tempo pude observar que foi necessário um tempo de no mínimo 1,2 segundos para estabilizar a leitura de potencial no valor máximo, como mostra a figura 163

Figura 163. Variação do potencial (em unidades ADC) após ligar o eletrodo em uma célula de condutividade conforme circuito da figura 158.

Variação do potencial (em unidades ADC) após ligar o eletrodo em uma célula de condutividade conforme circuito da figura 158.

Com base nos resultados indicados no gráfico da figura 163 decidi aumentar o intervalo de tempo entre o comando para ligar o eletrodo e o início das leituras, que estavam em 100 ms, conforme a referência original (Environmental Monitoring with Arduino, 2012), e foi alterado para 1500 ms.

Após essa modificação pude observar que as leituras ficaram bem mais estáveis em torno de 1,78V e resistência Rx de 5508 ohms (calculada pela equação 21).

Com esses valores podemos calcular a corrente que circula através do circuito considerando que se a tensão no ponto médio M é de ~1,78V a diferença de potencial entre os terminais de Rc (10000 ohms) é de 5,00V - 1,78V = 3,22V. E portanto pela lei de Ohm: 3,22 = 10000 × I -> I = 0,000322 A (322 μA).

E os testes de descarregamento indicaram um tempo ainda maior conforme mostra o gráfico da figura 164.

Figura 164. Variação do potencial (em unidades ADC) após desligar o eletrodo em uma célula de condutividade conforme circuito da figura 158.

Variação do potencial (em unidades ADC) após desligar o eletrodo em uma célula de condutividade conforme circuito da figura 158.

Resolvi então substituir a solução por um resistor com valor próximo ao valor medido e utilizei um resistor de 4,99 Kohm para visualizar o comportamento do circuito, e obtive uma leitura de resistência de 4824 ohms pelo condutivímetro. As medidas de carregamento e descarregamento mostram que o potencial no ponto médio assume os valores máximo e mínimo instantaneamente, como mostra a figura 165.

Figura 165. Variação instantânea do potencial (em unidades ADC) no circuito onde a solução foi substituída por um resistor de 4,99Kohm.

Variação instantânea do potencial (em unidades ADC) no circuito onde a solução foi substituída por um resistor de 4,99Kohm.

Em seguida incluí um capacitor em série com Rx no valor de 0,1 μF e repeti as leituras, e para minha surpresa a leitura de tensão foi de 4,91V e resistência de 548038 ohms.

Isto se deve ao fato do capacitor assumir, após o carregamento completo, o potencial aplicado pelo pino 8, ou seja ~5V. Nesse ponto não há mais passagem de corrente.

Figura 166. Variação do potencial (em unidades ADC) nos circuitos que simulam a solução com apenas um resistor de 4,99Kohm e com um resistor em série com um capacitor de 0,1μF.

Variação do potencial (em unidades ADC) nos circuitos que simulam a solução com apenas um resistor de 4,99Kohm e com um resistor em série com um capacitor de 0,1μF.

Não me preocupei em reduzir os intervalos de leitura, pois apenas queria ter uma idéia do comportamento que poderíamos esperar de uma solução iônica. Com esses resultados acredito que com o potencial aplicado nos eletrodos mergulhados na solução estão induzindo uma reação eletrolítica, o que permite a passagem de uma corrente constante (faradaica) através da solução.

Na ausência de um processo eletrolítico, o potencial no ponto médio deveria subir até próximo do valor máximo e sem a passagem de corrente através da solução.

A ocorrência de reações eletrolíticas pôde ser confirmada pois era possível perceber um ligeiro escurecimento do eletrodo ligado ao polo positivo.

A partir dessas observações pensei em duas alternativas:

  1. continuar aplicando uma tensão de 1,78V mantendo a resistência Rc de 10Kohm e a tensão do pino Arduino (5V), e implementar as rotinas no código para inversão da polaridade, pino 7 com 5V (HIGH) e pino 8 com 0V (LOW), ou seja, aplicar um potencial alternado com diferentes frequências,

  2. e/ou aumentar a resistência Rc para valores até 100Kohm para baixar a tensão aplicada na solução. Mas nesse caso as tensões lidas no ponto M ficariam muito pequenas e reduziriam a resolução das leituras analógicas do Arduino. E para compensar poderíamos amplificar esse sinal com um circuito amplificador não-inversor.

Por simplicidade achei melhor manter, por enquanto, o circuito do jeito que está e investir no software para fazer as leituras com potencial alternado.

17.2.5. Potencial Alternado

Com base no tutorial Multi-tasking the Arduino - Part 1 comecei a trabalhar um Sketch que permitisse controlar a inversão da polaridade dos pinos 7 e 8, mas sem usar o comando delay() e fazer sucessivas leituras apenas quando o pontencial no pino 8 estiver em 5V.

/*
  Condutivímetro 04
  Polariza um dos eletrodos
  Mede a tensão no ponto médio do divisor de tensão e converte em Volts
  Inverte a polaridade dos eletrodos para neutralizar os efeitos de correntes faradaicas
  Repete o ciclo anterior e faz sucessivas leituras da tensão
  Calcula a resistencia da solução a partir da tensão no ponto médio do divisor de tensão
*/

const float V_arduino = 5.00; //Tensão nos pinos digitais do Arduino

byte pin_electrode_1 = 7; //Pino que ficará conectado ao eletrodo 1
byte pin_electrode_2 = 8; //Pino que ficará conectado ao eletrodo 2

int  state_electrode_1 = LOW; //Estado do eletrodo 1
int  state_electrode_2 = HIGH; //Estado do eletrodo 2

long time_pol = 1; //Tempo (ms) de polarização de cada eletrodo - define a frequência de inversão da polaridade
unsigned long time_init = 0; //Tempo da última inversão de polaridade

unsigned long time_init_read = 0; //Tempo da última leitura de condutividade
long time_read = 2000; //Intervalo de tempo entre as leituras de condutividade

int  reading_pin = A0; //Pino analógico para leitura (0 ou A0)
float reading; //Variável float que irá armazenar o somatório de leituras de potencial (ADC) dentro de um único ciclo
float  readings[100];   //Variável array que irá armazenar as leituras sucessivas de potencial (ADC) durante vários ciclos
float sum_readings; //Variável que irá armazenar a soma das leituras sucessivas de potencial (ADC)
float av_readings; //Valor médio das leituras sucessivas de potencial (ADC) durante vários ciclos

int i = 0;

float freq; //Frequência de leitura (Hz)
float Vm;   //Variável que irá armazenar as leituras em Volts no ponto médio do divisor de tensão
float Rc = 10000; //Resistência constante
float Rx; //Resistência da solução

void setup() 
{ 
  
  Serial.begin(115200);     
  pinMode(pin_electrode_1, OUTPUT); 
  pinMode(pin_electrode_2, OUTPUT);
}                                    

void loop()                    
{ 
   
  unsigned long time_current = millis(); //Tempo no instante atual para controlar as leituras de potencial
  
  unsigned long time_current_read = millis(); //Tempo no instante atual para controlar as leituras de condutividade
  
  if (time_current_read - time_init_read > time_read) {
      
    if (i < 100) {
      
     if(time_current - time_init > time_pol) {
     
      if(state_electrode_1 == HIGH) {
        state_electrode_1 = LOW; //Colocar eletrodo 1 como terra
        state_electrode_2 = HIGH; //Colocar eletrodo 2 como polo positivo 5V
        time_current = millis();
        time_init = time_current;
        digitalWrite(pin_electrode_1, state_electrode_1); 
        digitalWrite(pin_electrode_2, state_electrode_2);     

      } else {
        
        int j;
        for(j = 0; j < 10; j++) {
          reading += analogRead(reading_pin);
        }
//        readings[i] = analogRead(reading_pin );
        readings[i] = reading/10;
        reading = 0;
        i++;
        
        state_electrode_1 = HIGH; //Colocar eletrodo 1 como polo positivo 5V
        state_electrode_2 = LOW;  //Colocar eletrodo 2 como terra
        time_current = millis();
        time_init = time_current;
        digitalWrite(pin_electrode_1, state_electrode_1); 
        digitalWrite(pin_electrode_2, state_electrode_2);
      }
    }
    
  } else {

  state_electrode_1 = LOW; //Colocar eletrodo 1 como terra
  state_electrode_2 = LOW;  //Colocar eletrodo 2 como terra
  digitalWrite(pin_electrode_1, state_electrode_1); 
  digitalWrite(pin_electrode_2, state_electrode_2);

     //Descartando as 50 primeiras leituras para usar apenas as leituas estabilizadas
     for (i = 49; i < 100; i++) {
     //  Serial.print("Leitura ");
     //  Serial.print(i);
     //  Serial.print(" ");
     //  Serial.println(readings[i]);
       sum_readings += readings[i];
     }

    av_readings = sum_readings/float(50); 
        
    Vm = av_readings * 0.0048;    //Converte de ADC para Volts
    Rx = Rc * Vm / (V_arduino - Vm); //Calcula a resistência equivalente da solução
    freq = 500/(2*time_pol); //Frequência de leitura (Hz) calculada com base no time_pol em milisegundos
   
    Serial.print("Freq. (Hz) = ");
    Serial.print(freq);
    Serial.print(" Tensao (V) = ");
    Serial.print(Vm);
    Serial.print(" Resistencia (ohms) = ");
    Serial.println(Rx);
    i = 0;
    sum_readings = 0; //Zera o conteúdo de sum_readings para a próxima leitura de condutividade

    time_init_read = millis();  
    
   }
  
 }
 
}

Para visualizar o perfil de variação do potencial no ponto M para diferentes frequências usei um osciloscópio simples e um código simplificado apenas com os comandos de inversão da polaridade, e sem os comandos para leitura de potencial e envio dos resultados pela porta serial.

/*
  Efeito da Frequencia de Despolarização
  Polariza um dos eletrodos e mantém a polarização durante o tempo time_pol
  Em seguida inverte a polaridade dos eletrodos para neutralizar os efeitos de correntes faradaicas
*/

byte pin_electrode_1 = 7; //Pino que ficará conectado ao eletrodo 1
byte pin_electrode_2 = 8; //Pino que ficará conectado ao eletrodo 2

int  state_electrode_1 = LOW; //Estado do eletrodo 1
int state_electrode_2 = HIGH; //Estado do eletrodo 2

long time_pol = 1; //Tempo de polarização de cada eletrodo - define a frequencia
unsigned long time_init = 0; //Tempo da última inversão de polaridade

int i = 0;


void setup() 
{ 
  
  Serial.begin(115200);     
  pinMode(pin_electrode_1, OUTPUT); 
  pinMode(pin_electrode_2, OUTPUT);
}                                    

void loop()                    
  { 
   unsigned long time_current = millis(); //Tempo no instante atual

    if (i < 100) {
      
     if(time_current - time_init > time_pol) {
     
      if(state_electrode_1 == HIGH) {
        state_electrode_1 = LOW; //Colocar eletrodo 1 como terra
        state_electrode_2 = HIGH; //Colocar eletrodo 2 como polo positivo 5V
        time_current = millis();
        time_init = time_current;
        digitalWrite(pin_electrode_1, state_electrode_1); 
        digitalWrite(pin_electrode_2, state_electrode_2);     

      } else {
        
        readings[i] = analogRead(reading_pin );
        i++;
        
        state_electrode_1 = HIGH; //Colocar eletrodo 1 como polo positivo 5V
        state_electrode_2 = LOW;  //Colocar eletrodo 2 como terra
        time_current = millis();
        time_init = time_current;
        digitalWrite(pin_electrode_1, state_electrode_1); 
        digitalWrite(pin_electrode_2, state_electrode_2);
      }
    }
    
  } else {

   i = 0;
    
  }
  
} 

Os resultados estão na figura 167.

Figura 167. Efeito da frequência de inversão da polaridade na variação do potencial.

Efeito da frequência de inversão da polaridade na variação do potencial.

As frequências observadas experimentalmente estão razoavelmente próximas das frequências calculadas (1000/2 × time_pol) com exceção das frequência medida com tempo de polarização de 1 ms. É provável que quanto menor o tempo de polarização maior o efeito dos atrasos na execução dos comandos pelo processador.

Confesso que no início não consegui entender o perfil de variação no sinal mas na medida que fui analisando com mais calma o padrão foi ficando mais claro.

A figura 168 indica alguns detalhes da variação do potencial no ponto M. Para identificar qual segmento corresponte ao pino 8 com potencial de 5V, alterei o tempo de polarização (time_pol) do pino 8 no programa.

Figura 168. Características da variação do potencial no ponto M com tempos de polarização de 12ms.

Características da variação do potencial no ponto “M” com tempos de polarização de 12ms.

O instrumento não oferece muitos recursos mas foi possível estimar alguns valores. Por exemplo, quando o pino 8 é polarizado em 5V observa-se uma queda no potencial de ~4,7V e durante o intervalo de polarização de 12 milisegundos o potencial aumenta em ~3V. O mesmo padrão observado na parte inicial do gráfico na figura 163.

Resolvi então tentar visualizar com mais detalhes as variações nas leituras de potencial registrando e colocando em gráfico as 100 leituras de potencial armazenadas na variável do tipo array readings[].

E novamente fiquei surpreso com a oscilação das leituras como mostra o gráfico da figura 169.

Figura 169. Gráfico de uma sequência de leituras do potencial no ponto M com tempo de polarização de 1 ms.

Gráfico de uma sequência de leituras do potencial no ponto “M” com tempo de polarização de 1 ms.

Nota

Lembrar que cada ponto de leitura é feito durante o período de um semiciclo de polarização quando o pino 8 está polarizado em 5V.

Mas como cada operação de leitura, realizada com o comando analogRead demora 100 microsegundos, além de outros comandos incluídos neste semiciclo, é provável que este semiciclo seja ligeiramente maior do que o semiciclo de despolarização (pino 8 - 0V).

Para tentar minimizar essa oscilação incluí alguns comandos para obter a média de 10 leituras em cada ciclo de polarização.

int j;
for(j = 0; j < 10; j++) {
    reading += analogRead(reading_pin);
   }
//        readings[i] = analogRead(reading_pin );
readings[i] = reading/10;
reading = 0;
i++;

Após essa alteração foi obtido o gráfico da figura 170.

Figura 170. Gráfico de uma sequência de leituras do potencial no ponto M com tempo de polarização de 1 ms e média de 10 leituras em cada ciclo.

Gráfico de uma sequência de leituras do potencial no ponto “M” com tempo de polarização de 1 ms e média de 10 leituras em cada ciclo.

E finalmente resolvi aproveitar somente a segunda metade, ou seja, as últimas 50 leituras de potencial para calcular a condutividade da solução, obtendo o gráfico 171 .

Figura 171. Gráfico das 50 últimas leituras de potencial no ponto M com tempo de polarização de 1 ms.

Gráfico das 50 últimas leituras de potencial no ponto “M” com tempo de polarização de 1 ms.

Para verificar se há realmente uma diferença significativa nos tempos de polarização direta e inversa fiz alterações no código do condutivímetro retirando os comandos para cálculo da resistência e envio de dados seriais mas mantendo os comandos de leitura no semiciclo de polarização e o resultado está na figura 172.

Figura 172. Diferença entre os tempos de polarização direta e inversa devido os comandos de leitura analógica do semiciclo de polarização direta.

Diferença entre os tempos de polarização direta e inversa devido os comandos de leitura analógica do semiciclo de polarização direta.

O gráfico mostra claramente que os comandos de leitura analógica no semiciclo de polarização direta começam a fazer diferença quando se utiliza um intervalo de polarização de 1 ms. Os comandos de leitura aumentam a duração do semiciclo de polarização direta para valores na faixa de ~3ms enquanto a polarização inversa dura ~1,8 milisegundos.

Uma alternativa para compensar essa diferença seria incluir o mesmo número de comandos no semiciclo de polarização inversa para tentar igualar os tempos de cada semiciclo de polarização e despolarização e minimizar as correntes faradaicas e os consequentes processos eletrolíticos.

Mas tenho que reconhecer que essa é uma alternativa muito ineficiente pois o ideal seria otimizar o código e torná-lo mais rápido reduzindo o tempo de execução de alguns comandos tais como os comandos digitalWrite e analogRead.

Encontrei algumas dicas úteis para reduzir o tempo de execução dos comandos digitalWrite e analogRead nas páginas: Fast digitalRead(), digitalWrite() for Arduino, ADC conversion on the Arduino (analogRead) e Faster analogRead().

Por enquanto, o código ficou assim:

/*
  Condutivímetro 05
  Polariza um dos eletrodos
  Mede a tensão no ponto médio do divisor de tensão e converte em Volts
  Inverte a polaridade dos eletrodos para neutralizar os efeitos de correntes faradaicas
  Repete o ciclo anterior e faz sucessivas leituras da tensão
  Calcula a resistencia da solução a partir da tensão no ponto médio do divisor de tensão
*/

const float V_arduino = 5.00; //Tensão nos pinos digitais do Arduino

byte pin_electrode_1 = 7; //Pino que ficará conectado ao eletrodo 1
byte pin_electrode_2 = 8; //Pino que ficará conectado ao eletrodo 2

int  state_electrode_1 = LOW; //Estado do eletrodo 1
int  state_electrode_2 = HIGH; //Estado do eletrodo 2

long time_pol = 1; //Tempo de polarização de cada eletrodo - define a frequencia
unsigned long time_init = 0; //Tempo da última inversão de polaridade

unsigned long time_init_read = 0;
long time_read = 500; //Intervalo de tempo entre as leituras de condutividade

int  reading_pin = A0; //Pino analógico para leitura (0 ou A0)
float reading;
float  readings[100];   //Variável array que irá armazenar as leituras sucessivas em unidades ADC
float sum_readings; //Variável que irá armazenar a soma das leituras sucessivas em unidades ADC
float av_readings; //Valor médio

int i = 0;

float freq; //Frequência de leitura (Hz)
float Vm;   //Variável que irá armazenar as leituras em Volts no ponto médio do divisor de tensão
float Rc = 10000; //Resistência constante
float Rx; //Resistência da solução

float reading_trash;
float readings_trash[100];

void setup() 
{ 
  
  Serial.begin(115200);     
  pinMode(pin_electrode_1, OUTPUT); 
  pinMode(pin_electrode_2, OUTPUT);
}                                    

void loop()                    
{ 
   
  unsigned long time_current = millis(); //Tempo no instante atual
  
  unsigned long time_current_read = millis();
  
  if (time_current_read - time_init_read > time_read) {
      
    if (i < 100) {
      
     if(time_current - time_init > time_pol) {
     
      if(state_electrode_1 == HIGH) {
        
        //Comandos incluidos apenas para igualar os tempos dos semiciclos de polarizacao e despolarizacao
        int j;
        for(j = 0; j < 10; j++) {
          reading_trash += analogRead(reading_pin);
        }
        readings_trash[i] = reading_trash/10;
        reading_trash = 0;
        j++;
        
        state_electrode_1 = LOW; //Colocar eletrodo 1 como terra
        state_electrode_2 = HIGH; //Colocar eletrodo 2 como polo positivo 5V
        time_current = millis();
        time_init = time_current;
        digitalWrite(pin_electrode_1, state_electrode_1); 
        digitalWrite(pin_electrode_2, state_electrode_2);     

      } else {
        
        int j;
        for(j = 0; j < 10; j++) {
          reading += analogRead(reading_pin);
        }
        readings[i] = reading/10;
        reading = 0;
        i++;
        
        state_electrode_1 = HIGH; //Colocar eletrodo 1 como polo positivo 5V
        state_electrode_2 = LOW;  //Colocar eletrodo 2 como terra
        time_current = millis();
        time_init = time_current;
        digitalWrite(pin_electrode_1, state_electrode_1); 
        digitalWrite(pin_electrode_2, state_electrode_2);
      }
    }
    
  } else {

  state_electrode_1 = LOW; //Colocar eletrodo 1 como terra
  state_electrode_2 = LOW;  //Colocar eletrodo 2 como terra
  digitalWrite(pin_electrode_1, state_electrode_1); 
  digitalWrite(pin_electrode_2, state_electrode_2);

     //Descartando as 50 primeiras leituras para usar apenas as leituas estabilizadas
     for (i = 49; i < 100; i++) {
      // Serial.print("Leitura ");
      // Serial.print(i);
      // Serial.print(" ");
      // Serial.println(readings[i]);
       sum_readings += readings[i];
     }

    av_readings = sum_readings/float(50); 
        
    Vm = av_readings * 0.0048;    //Converte de ADC para Volts
    Rx = Rc * Vm / (V_arduino - Vm); //Calcula a resistência equivalente da solução
    freq = 500/time_pol; //Frequência de leitura (Hz) calculada com base no time_pol em milisegundos
   
    Serial.print("Freq. (Hz) = ");
    Serial.print(freq);
    Serial.print(" Tensao (V) = ");
    Serial.print(Vm);
    Serial.print(" Resistencia (ohms) = ");
    Serial.println(Rx);
    i = 0;
    sum_readings = 0;

    time_init_read = millis();  
    
   }
  
 }
 
} 

Para ter idéia da utilidade deste procedimento para soluções com diferentes condutividades, fiz medidas de condutividade com soluções de sal nas seguintes concentrações: 3,5%, 1,75%, 0,875%, 0,437% e 0,218%, e os resultados estão na figura 173.

Figura 173. Medidas de condutividade usando o programa condutivímetro 05.

Medidas de condutividade usando o programa condutivímetro 05.

Esperava ter uma faixa de linearidade mais ampla, mas antes mesmo de tentar aumentar a faixa linear (Ex: modificando a distância e/ou geometria dos eletrodos) comecei a achar que essa estratégia estava ficando muito complexa e cheia de remendos. Então resolvi interromper essa abordagem e investir na técnica do Pulso Bipolar.

17.2.6. Pulso Bipolar com Divisor de Tensão

Recentemente encontrei alguns artigos sobre a técnica de Pulso Bipolar, que foi proposta em 1970. (D. E. Johnson e C. G. Enke, 1970 - Analytical Chemistry)

A técnica do Pulso Bipolar para medidas de resistividade de uma solução minimiza os efeitos capacitivos (em série e paralelo) que estão presentes em uma célula de condutividade. A técnica consiste na aplicação, na célula de condutividade, de pulsos de voltagem de igual intensidade e duração mas com polaridades opostas e medida da corrente na célula exatamente no final do segundo pulso. (Fonte: Laboratory Techniques in Electroanalytical Chemistry 1996)

Mais tarde a técnica foi aperfeiçoada e usada com pulsos de corrente.(P. H. Daum e D. F. Nelson, 1973)

Ou seja, a minha intenção é aplicar dois pulsos rápidos e invertidos e ler a tensão no ponto médio do divisor de tensão. O comando analogRead do Arduino gasta ~100 μs. Mas a referência (Laboratory Techniques in Electroanalytical Chemistry 1996) cita que esses pulsos podem ter uma duração de 10μs até 10ms. Por isso acredito que seja possível usar o Arduino para gerar esses pulsos e fazer as leituras.

Fiquei interessado nessa técnica pois ele promete fazer leituras rápidas de condutividade minimizando os problemas de corrosão dos eletrodos e ainda promete o seu uso em uma faixa mais ampla de condutividades, do que a técnica convencional, sem a troca de eletrodos.

Nota

Achei interessante que o único artigo que encontrei sobre este assunto e disponível para download gratuito foi o trabalho de 4 chineses: Design of Intelligent Conductive Meter Based on MSP430F149. Mas o curioso é que os autores do trabalho não faz qualquer referência aos autores originais da técnica (D. E. Johnson e C. G. Enke, 1970 - Analytical Chemistry) dando a impressão que eles, os chineses, foram os autores originais.

Por isso resolvi fazer uma série de ensaios, com o par de eletrodos que montamos (Figura 159), variando a distância entre os eletrodos, a resistência Rc e a duração dos pulsos, para soluções com diferentes quantidades adicionadas de NaCl (3,5%, 1,4%, 0,56%, 0,224%, 0,0896% e 0,03584%).

Nota

Na falta de água destilada como solvente preparei as soluções dissolvendo sal de cozinha em água filtrada.

Ao variar a distância entre os eletrodos estamos variando o parâmetro l (comprimento) que aparece na equação da resistência (Equação 159).

Ao variar Rc do divisor de tensão (Figura 158) estamos variando o potencial aplicado na cela de condutividade.

E ao variar a duração dos pulsos, a minha intenção é avaliar se haveria um tempo mínimo de pulso necessário para carregar completamente os componentes capacitivos da cela de condutividade, a partir da qual as leituras de resistência da solução seriam constantes.

O objetivo é fazer um estudo exploratório para avaliar qualitativamente o efeito desses diferentes fatores na linearidade das leituras de condutividade ao longo de diferentes concentrações de salinidade.

A avaliação do efeito de todos esses parâmetros daria um trabalho experimental muito grande. Por isso selecionei apenas alguns valores para ter uma noção aproximada dos efeitos dos diferentes fatores nas leituras de condutividade utilizando a técnica de pulso bipolar.

Dica

Uma alternativa mais elegante para fazer esse tipo de estudo seria o usa da técnica estatística de Planejamento Fatorial. Mas devido à falta de tempo não pude investir no uso dessa técnica.

Mas em Outubro de 2019 tive a oportunidade de organizar uma seção dedicada a esse assunto: Planejamento de Experimentos.

Todos esses testes foram feitos usando o comando delayMicroseconds() para controlar a duração do primeiro pulso e descontando 100μs no segundo pulso para o comando de leitura analogRead, o qual demanda ~100μs para sua execução.

/*
  Condutivímetro 09
  Estudo do Pulso Bipolar
  Aplicar pulsos de carga de 5 (500us), 10(1000us = 1ms) e 20 (2000us = 2ms) 
  e tempos de descarga iguais aos tempos de carga
  Descontar 100us no segundo pulso para a execução do comando de leitura analogRead
*/

const float V_arduino = 5.00; //Tensão nos pinos digitais do Arduino

byte pin_electrode_1 = 7; //Pino que ficará conectado ao eletrodo 1
byte pin_electrode_2 = 8; //Pino que ficará conectado ao eletrodo 2

unsigned long start, finished, elapsed; //http://tronixstuff.com/2011/06/22/tutorial-arduino-timing-methods-with-millis/

int  reading_pin = A0; //Pino analógico para leitura (0 ou A0)
int reading;

int i = 0;

float Vm;   //Variável que irá armazenar as leituras em Volts no ponto médio do divisor de tensão
float Rc = 10000; //Resistência constante
float Rx; //Resistência da solução

void setup() 
{ 
  
  Serial.begin(115200);     
  pinMode(pin_electrode_1, OUTPUT); 
  pinMode(pin_electrode_2, OUTPUT);

}                                    

void loop()                    
{ 
 
 
  //Pino 7 = 0V e Pino 8 = 5V
  digitalWrite(pin_electrode_1, LOW); 
  digitalWrite(pin_electrode_2, HIGH);
  
    delayMicroseconds(2000);
  
  //Pino 7 = 5V e Pino 8 = 0V
  digitalWrite(pin_electrode_1, HIGH); 
  digitalWrite(pin_electrode_2, LOW);
  
   delayMicroseconds(1900);
   reading = analogRead(reading_pin);  //Medir tensão entre o divisor de voltagem
  
 
  digitalWrite(pin_electrode_1, LOW);   
  digitalWrite(pin_electrode_2, LOW);

  Vm = reading * 0.0048;    //Converte de ADC para Volts
  Rx = Rc * (V_arduino - Vm) / Vm; //Calcula a resistência equivalente da solução
  
  Serial.print(Vm);
  Serial.print(" ");
  Serial.println(Rx);
  
  delay(500); 
  
} 

Nota

Prestar atenção que a fórmula de cálculo da resistência da solução deve levar em conta a polaridade relativa dos pinos 7 e 8 que estão aplicando o pulso.

Ou seja, se a polaridade do segundo pulso for invertida a fórmula de cálculo também deve ser alterada.

A figura 174 mostra o efeito dos pulsos com duração de 0,5ms, 1,0ms e 2,0ms, com uma distância de 2cm entre os eletrodos e Rc de 10kΩ.

Figura 174. Medidas da resistência da solução para diferentes concentrações salinas variando a duração do pulso bipolar (0,5ms, 1,0ms e 2,0ms), com uma distância de 2cm entre os eletrodos e Rc de 10kΩ .

Medidas da resistência da solução para diferentes concentrações salinas variando a duração do pulso bipolar (0,5ms, 1,0ms e 2,0ms), com uma distância de 2cm entre os eletrodos e Rc de 10kΩ .

O que se nota a partir do gráfico é que as leituras de resistência não são lineares ao longo da faixa de concentração utilizada. Além disso o efeito da duração do pulso é um pouco mais significativo em concentrações baixas.

A figura 175 mostra o efeito do aumento da tensão aplicada na célula com a mudança de Rc de 10kΩ para 5kΩ, mantendo constante a distância entre os eletrodos.

Figura 175. Medidas da resistência da solução para diferentes concentrações salinas variando Rc (tensão aplicada entre os eletrodos) e com uma distância de 2cm entre os eletrodos.

Medidas da resistência da solução para diferentes concentrações salinas variando Rc (tensão aplicada entre os eletrodos) e com uma distância de 2cm entre os eletrodos.

O gráfico mostra que o aumento da tensão é um fator mais significativo do que a duração dos pulsos. Mas esse efeito é mais pronunciado na região de baixa concentração.

E finalmente o efeito da distância (l) entre os eletrodos pode ser visto na figura 176.

Figura 176. Medidas da resistência da solução para diferentes concentrações salinas variando a distância entre os eletrodos (1cm e 2cm) e a duração dos pulsos (1ms e 2ms).

Medidas da resistência da solução para diferentes concentrações salinas variando a distância entre os eletrodos (1cm e 2cm) e a duração dos pulsos (1ms e 2ms).

Com base nesses testes, podemos fazer algunas observações:

  1. A substituição da resistência Rc de 10kΩ para 5kΩ causou o maior aumento nas leituras de resistência.

  2. O aumento da distância entre os eletrodos de 1cm para 2cm provocou um aumento nas leituras de resistência, porém menor do que o efeito da resistência Rc.

  3. O aumento na duração dos pulsos se mostrou o fator de menor impacto dentre os três avaliados, sendo que o seu efeito foi um pouco mais significativo com o uso da resistência Rc de 5kΩ.

17.2.6.1. Eletrodos placas planas

Para tentar avaliar o efeito do aumento da área dos eletrodos providenciei a montagem de dois eletrodos do tipo placas planas.

Com uma tesoura para cortar lata retirei um pedaço de uma bandeja supostamente de aço inox (made in China), e a partir desse material cortei duas pequenas tiras, com um pequeno quadrado na ponta para servir de eletrodo. Para manter apenas a área quadrada exposta à solução usei uma seringa de insulina cortada e o septo de borracha (Figura 177)

Figura 177. Bandeja da qual retiramos as tira de aço inox, seringa de insulina e septo utilizados para a montagem de um eletrodo.

Bandeja da qual retiramos as tira de aço inox, seringa de insulina e septo utilizados para a montagem de um eletrodo.

Em seguida fizemos um corte chanfrado na extremidade da tira de aço para furar o septo e manter apenas a área quadrada do eletrodo para fora do tubo da seringa e exposta à solução (Figura 178)

Figura 178. Detalhe do corte da tira de aço, septo colocado na tira e finalmente o eletrodo montado no tubo da seringa.

Detalhe do corte da tira de aço, septo colocado na tira e finalmente o eletrodo montado no tubo da seringa.

E finalmente os eletrodos montados no suporte com as garras jacaré para o contato elétrico e mergulhados na solução para leitura.

Figura 179. Eletrodos montados no suporte, com as garras jacaré para o contato elétrico e mergulhados na solução para leitura

Eletrodos montados no suporte, com as garras jacaré para o contato elétrico e mergulhados na solução para leitura

Essa foi a maneira que eu encontrei para montar um eletrodo para medidas de condutividade com placas planas. Se você tiver uma sugestão mais adequada, manda pra gente. :^)

Com os eletrodos montados fizemos mais alguns testes comparando com os eletrodos confeccionados com fio (Figura 159). Os resultados estão no gráfico da figura 180

Figura 180. Medidas da resistência da solução para diferentes concentrações salinas variando a área (a) e a distância (l) entre os eletrodos.

Medidas da resistência da solução para diferentes concentrações salinas variando a área (a) e a distância (l) entre os eletrodos.

Basicamente os resultados do teste mostram que a resistência nas leituras com eletrodos de placas planas são menores do que com os eletrodos de fio, e que os eletrodos de fio são mais sensíveis a variações na distância entre os eletrodos.

17.2.7. Pulso Bipolar com Amplificador Operacional

No entanto, ainda não estou satisfeito com esse gráfico de resistência em função da concentração de NaCl. Pois esperava um faixa liear mais ampla.

Na região que vai de ~0,5% até 3,5% a variação na resistência é muito pequena e dessa forma a sensibilidade para variações nessa faixa fica muito baixa. Enquanto que a variação é muito maior para concentrações menores do que 0,5% mas muito não-linear.

Comecei a analisar o circuito divisor de voltagem e percebi que ao variar a resistência da solução, não apenas a corrente que atravessa a solução muda, mas a tensão aplicada sobre os eletrodos da solução também muda. Ou seja, as três grandezas (R, V e I) mudam simultâneamente ao variar a resistência da solução ao longo de uma curva de calibração.

Ao variar a resistência da solução varia a resistência total entre os pinos 7 e 8 e portanto a corrente muda. Mas além disso ao variar a resistência da solução mas mantendo Rc constante, ocorre uma variação da tensão no ponto médio (VM do divisor de tensão e consequentemente uma variação da diferença de potencial entre os eletrodos.

No entanto o artigo original que propõem a técnica do pulso bipolar (D. E. Johnson e C. G. Enke, 1970 - Analytical Chemistry) utiliza uma fonte de tensão constante conforme pode ser visto na figura 181).

Figura 181. Circuito original para medidas de condutancia por pulso bipolar (Fonte: D. E. Johnson e C. G. Enke, 1970)

Circuito original para medidas de condutancia por pulso bipolar (Fonte: D. E. Johnson e C. G. Enke, 1970)

Para entender os fundamentos dessa técnica transcrevo a seguir a explicação do próprio autor no artigo original:

 


At the beginning of the first pulse, Cp will charge quickly causing a spike in the cell current.
If t1 << RxCx, the voltage, ec, developed across Cx will be small and increase approximately linearly with time.
Thus the current flowing through Rx and Cx will drop slightly during t1 due to the charging of Cx.
When the polarity is reversed at the start of t2, Cp  will again charge quickly to the new potential.
The current through Rx and Cx will be enhanced by the potential, ec, accumulated during t1.
However during t2, Cx will discharge the same number of Coulombs that it charged during t1.
This causes a decrease in current until, at the end of t2, ec = 0, and no current is flowing through Cp since it is at constant potential.
Therefore, the instantaneous current through the cell at the end of t2 is simply i = e2/Rx.
Thus, the instantaneous current measured at this time is directly proportional to the conductance and independent of Cx and Cp.

 
 --D. E. Johnson e C. G. Enke, 1970

E a seguir uma tradução feita com a ajuda do Google tradutor:


No início do primeiro pulso, Cp carrega rapidamente causando um pico de corrente na célula.
Se t1 << RxCx, a tensão, ec, que se desenvolve através de Cx será pequena e aumenta de forma aproximadamente linear com o tempo.
Assim, a corrente que flui através de Rx e Cx vai cair ligeiramente durante t1 devido ao carregamento de Cx.
Quando a polaridade é invertida no início de t2, Cp irá carregar de novo rapidamente para o novo potencial.
A corrente através de Rx e Cx será reforçada devido ao potencial, ec, acumulado durante t1.
No entanto, durante t2, Cx irá descarregar o mesmo número de Coulombs que foram carregados durante t1.
Isto provoca uma diminuição da corrente até que, no fim de t2, ec = 0, e nenhuma corrente flui através de Cp uma vez que ele está em um potencial constante.
Portanto, a corrente instantânea através da célula, no final de t2 é simplesmente i = e2/Rx.
Assim, a corrente instantânea medida neste momento é diretamente proporcional à condutância e independente de Cx and Cp.

O meu grande interesse nessa técnica é principalmente a possibilidade de controle das condições de medida e a promessa (segundo o autor) de ser aplicável a uma ampla faixa de resistência (100 Ω - 1MΩ).

Mais tarde encontrei o artigo A Computer-Controlled Bipolar Pulse Conductivity Apparatus (Nikos Papadopoulos e Maria Limniou, 2001) com orientações de como utilizar a técnica de pulso bipolar na qual os autores utilizaram uma placa com uma interface D/A (Digital -> Analógico), para a geração dos pulsos de tensão, e uma placa A/D (Analógico -> Digital), para fazer as leituras de corrente gerada pela solução, conforme a figura 181.

Figura 182. Circuito para aplicação de pulsos bipolares usando uma interface D/A e A/D controladas por um computador. (Fonte: Nikos Papadopoulos e Maria Limniou, 2001)

Circuito para aplicação de pulsos bipolares usando uma interface D/A e A/D controladas por um computador. (Fonte: Nikos Papadopoulos e Maria Limniou, 2001)

Esse artigo foi útil para eu ter uma idéia de como fazer a aplicação dos pulsos e as leituras de corrente. Mas para usar o Arduino era necessário algum mecanismo para gerar pulsos bipolares a partir do Arduino que é monopolar.

Para gerar os pulsos bipolares a partir do Arduino montei um circuito usando um divisor de tensão para gerar tensões intermediárias entre 0 e 5V, um amplificador diferencial para gerar pulsos bipolares e finalmente um circuito amplificador inversor (ou conversor I-V), cuja saída é lida pelo pino analógico do Arduino conforme o circuito da figura 183.

Figura 183. Diagrama do circuito com um divisor de tensão, amplificador diferencial e amplificador inversor para a geração de pulsos bipolares com o Arduino

Diagrama do circuito com um divisor de tensão, amplificador diferencial e amplificador inversor para a geração de pulsos bipolares com o Arduino

Onde: R1 = 1kΩ,R2 = 5kΩ, R3, R4, R5, R6 e R7 = 40kΩ

Aplicamos nas entradas inversora (V-) e não-inversora (V+) do amplificador diferencial as tensões entre um dos resistores do divisor de tensão.

Por sua vez o amplificador diferencial aplica em um dos eletrodos da solução uma tensão de saída (Vo) que é proporcional à diferença entre as tensões aplicadas nas entradas não-inversora (V+) e inversora (V-).

Quando invertemos a polaridade entre os pinos 7 e 8 do Arduino as tensões aplicadas no AO são também invertidas, passando de um pulso positivo para negativo ou vice-versa.

No segundo eletrodo é gerada uma tensão (Vi) que é aplicada na entrada inversora (V-) do segundo AO chamado de conversor corrente tensão, mas que consiste basicamente em um amplificador inversor, o qual gera uma tensão de saída (Vo) cujo intensidade é dada pela equação 22.

Para testar a viabilidade de montar esse circuito usando componentes facilmente disponíveis resolvi usar inicialmente um amplificador bem comum como o 741 (Figura 184).

Figura 184. Diagrama do circuito com o AO 741 para a geração de pulsos bipolares com o Arduino

Diagrama do circuito com o AO 741 para a geração de pulsos bipolares com o Arduino

E usei o seguinte código para poder visualizar o perfil dos sinais pelo osciloscópio:

/*
  Condutivímetro com Pulso Bipolar 00
Estudo do Pulso Bipolar usando circuito com amplificadores operacionais
Aplicar pulsos cíclicos com 1000us (+) -> 900us (-) -> analogRead -> 500us (0)
Avaliar com osciloscópio o perfil do sinal e as intensidades
*/

byte pin_electrode_1 = 7; //Pino que ficará conectado ao eletrodo 1
byte pin_electrode_2 = 8; //Pino que ficará conectado ao eletrodo 2

void setup() 
{ 
  
  pinMode(pin_electrode_1, OUTPUT); 
  pinMode(pin_electrode_2, OUTPUT);

}                                    

void loop()                    
{ 
 
 
  //Pino 7 = 0V e Pino 8 = 5V
  digitalWrite(pin_electrode_1, LOW); 
  digitalWrite(pin_electrode_2, HIGH);
  
    delayMicroseconds(1000);
  
  //Pino 7 = 5V e Pino 8 = 0V
  digitalWrite(pin_electrode_1, HIGH); 
  digitalWrite(pin_electrode_2, LOW);
  
   delayMicroseconds(900);
   reading = analogRead(reading_pin);  //Medir tensão entre o divisor de voltagem
  
 
  digitalWrite(pin_electrode_1, LOW);   
  digitalWrite(pin_electrode_2, LOW);

  delayMicroseconds(4000); 
  
} 

Nos testes com solução de 1,4%, aplicando um pulso com tensão máxima de 800mV, a tensão de pico na saída do amplificador inversor ficou na faixa de 4V (Figura 185).

Figura 185. Leituras com o osciloscópio dos pulsos aplicados na célula e o pulso gerado na saída do amplificador inversor.

Leituras com o osciloscópio dos pulsos aplicados na célula e o pulso gerado na saída do amplificador inversor.

Para tentar reduzir a tensão máxima na saída do amplificador inversor para a faixa de 2V resolvi mudar a resistência para 4,7kΩ mas a tensão continuou na faixa de 4V.

Conforme foi mostrado na equação B.3, a fórmula para o cálculo do ganho de um circuito amplificador inversor é dada pela equação 22:

Equação 22.

Vo = Vi × (− Rf/Rx)


Onde Rf é a resistência fixa de retorno (feedback) e Rx representa a resistência da solução. Portanto a razão (com sinal negativo) -Rf/Rx é o ganho do amplificador inversor.

Se a resistência da solução Rx for muito menor do que Rf o ganho será muito alto. Segundo o osciloscópio, a voltagem ponto a ponto do pulso bipolar aplicado na célula é de 1,6V e portanto a tensão de pico é de 800mV. Portanto se a solução de 1,4% tiver uma resistência na faixa de 500 Ω o ganho será de 9,4 (4700/500) e portanto com uma Vi de 0,8V teremos uma tensão de saída Vo de 7,52V, ou seja bem acima do que o AO pode fornecer com uma tensão de alimentação de 5,0V.

A tensão de alimentação do AO é de 5,0V, e como a tensão máxima é um pouco menor do que a tensão de alimentação faz sentido termos uma tensão de saída na faixa de 4V.

Ajustei o trimpot do divisor de tensão para baixar a tensão de cada pulso para ~100mV e substituí Rf por um trimpot de 1kΩ para poder ajustar o ganho do amplificador inversor.

Após essas modificações a tensão máxima de saída no primeiro pulso ficou um pouco abaixo de 1V e a tensão máxima do segundo pulso ficou próxima de 1,5V. Por isso o osciloscópio indicou uma tensão de pico a pico de ~2,5V como pode ser visto na figura 186.

Figura 186. Leituras com o osciloscópio dos pulsos aplicados na célula e o pulso gerado na saída do amplificador inversor após reduzir a tensão aplicada na célula.

Leituras com o osciloscópio dos pulsos aplicados na célula e o pulso gerado na saída do amplificador inversor após reduzir a tensão aplicada na célula.

Pode-se perceber que o sinal de saída apresenta um perfil bem característico de um circuito com componentes capacitivos, com um pico inicial e uma queda na tensão até próxima de 0.

O conversor ADC do Arduino só faz leituras de tensões positivas, por isso imaginei duas alternativas:

  1. ajustar a polaridade dos pinos 7 e 8 para garantir que o sinal do segundo pulso seja positivo para ser lido pelo Arduino.

  2. montar um conversor de sinal bipolar->unipolar para converter a saída bipolar do conversor corrente-tensão em um sinal monopolar para ser lido pelo pino analógico do Arduino

A conversão da saída bipolar do amplificador inversor em um sinal unipolar pode-se ser feita aplicando a saída bipolar no ponto central de um divisor de tensão conforme a figura 187.

Figura 187. Conversor de sinal bipolar para unipolar.

Conversor de sinal bipolar para unipolar.

Onde R1 = R2 = 5kΩ.

O divisor de tensão gera uma tensão no ponto médio de 2,5V e se R7 for ajustado para ter uma saída no intervalo de -2,5V até +2,5V a tensão no pino analógico será de 0V (quando a saída do AO for -2,5V) e 5V (quando a saída do AO for de +2,5V).

No entando é importante lembrar que com esse recurso a saída do conversor I-V deve ser de no máximo 2,5V, o que reduz a resolução nas leituras de condutividade.

Resolvi inicialmente apenas alterar o programa e ajustar a sequência dos pulsos para garantir que o sinal do segundo pulso seja positivo e para testar a linearidade nas leituras de condutividade preparei 8 soluções com diferentes concentrações de NaCl.

Procedimento: dissolver 3,5g de NaCl (sal de cozinha) em 100 mL de água (filtrada). A partir dessa solução a 3,5% de NaCl (adicionado) preparei as soluções seguintes retirando 40 mL da solução original e diluindo para 100mL.

  1. 3,5g NaCl -> 100 mL água (filtrada) = 3,5% NaCl

  2. 40 mL (3,5% NaCl) + 60 mL água = 100 mL solução 1,4% de NaCl

  3. 40 mL (1,4% NaCl) + 60 mL água = 100 mL solução 0,56% de NaCl

  4. 40 mL (0,56% NaCl) + 60 mL água = 100 mL solução 0,224% de NaCl

  5. 40 mL (0,224% NaCl) + 60 mL água = 100 mL solução 0,090% de NaCl

  6. 40 mL (0,090% NaCl) + 60 mL água = 100 mL solução 0,036% de NaCl

  7. 40 mL (0,036% NaCl) + 60 mL água = 100 mL solução 0,014% de NaCl

  8. 40 mL (0,014% NaCl) + 60 mL água = 100 mL solução 0,006% de NaCl

O tempo de duração do pulso tem um efeito muito grande no sinal ao longo da escala de concentrações como pode ser visto na figura 188.

Figura 188. Efeito da duração do pulso bipolar nas medidas de resistência (Rx) e condutância (G) para diferentes concentrações de NaCl.

Efeito da duração do pulso bipolar nas medidas de resistência (Rx) e condutância (G) para diferentes concentrações de NaCl.

Mas como o comando de leitura analogRead() consome ~100 μs de processamento fico com um tempo mínimo de pulso de 100 μs.

17.2.7.1. Módulo sample and hold

Para permitir leituras em intervalos menores do que 100 μs passei a pesquisar a montagem de um circuito sample and hold (amostragem e retenção), entre a saída do amplificador inversor e a entrada analógica do Arduino, para armazenar o sinal no final do pulso e manter esse sinal estável para uma operação de leitura.

Com a ajuda dos colegas da lista sis_embarcados planejei incluir os componentes da Figura 189 no circuito original.

Figura 189. Módulo sample and hold com dois MOSFETs (IRFZ46N) controlados por pinos digitais do Arduino, um capacitor C (cerâmico) e um seguidor de tensão.

Módulo “sample and hold” com dois MOSFETs (IRFZ46N) controlados por pinos digitais do Arduino, um capacitor C (cerâmico) e um seguidor de tensão.

Um MOSFET funcionaria como chave e controlaria o tempo de carregamento do capacitor e o outro MOSFET seria usado para descarregar o capacitor. Também foi incluido um seguidor de tensão entre o capacitor e a porta analógica do Arduino para evitar queda de tensão do capacitor durante a leitura analógica.

Fiz alguns testes com esse circuito mas não funcionou. Aparentemente não consegui fazer o MOSFET chaver a corrente.

Também não foi fácil conseguir reconhecer o padrão dos sinais com o osciloscópio. Percebi que apenas ao aproximar as mãos da protoboard para ajustar o ganho do amplificador o perfil do sinal sofria interferência.

Talvez seja o efeito de capacitância parasita devido ao emaranhado que ficou o circuito montado na protoboard (Figura 190)

Figura 190. Circuito para geração de pulsos bipolares montado na protoboard.

Circuito para geração de pulsos bipolares montado na protoboard.

Resolvi substituir o MOSFET por um diodo e usar um pino digital do Arduino para fazer o descarregamento do capacitor, seguindo as recomendações do projeto: www.arduino.cc/en/Tutorial/CapacitanceMeter, conforme a figura 191

Figura 191. Diagrama do circuito sample and hold com um diodo (1N4148) e o descarregamento do capacitor feito por um pino digital do Arduino com uma resistência de 220 Ω para proteção.

Diagrama do circuito “sample and hold” com um diodo (1N4148) e o descarregamento do capacitor feito por um pino digital do Arduino com uma resistência de 220 Ω para proteção.

Alguns links sobre sample and hold:



[10] Para entender o conceito de resolução na conversão AD consulte o tutorial http://emc5710.lago.prof.ufsc.br/arquivos/5conversao AD 122.pdf