Para uma introdução aos princípios da Condutividade veja a seção 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”.
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.
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.
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)
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.
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 22.
Equação 22. 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.
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)
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.
O gráfico de uma titulação condutométrica pode apresentar diversos perfis. A seguir alguns links com mais informações:
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)
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.
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); }
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.
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.
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 23. 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.
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.
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:
Rc e Rx estão em série e portanto a resistência equivalente Re = Rc + Rx
A diferença de potenial aplicada no circuito (ΔV) é ΔV = V8 - V7; mas como V7 = 0 (LOW) podemos assumir que ΔV = V8
Pela lei de Ohm a corrente I que atravessa o circuito é: V8 = Re × I → V8 = (Rc + Rx) × I → I = V8 / (Rc + Rx)
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
Mas a corrente I que atravessa o circuito é a mesma que passa por Rx (Ix) e portanto chegamos na equação 24
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); }
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.
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 24).
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.
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.
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.
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:
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,
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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%).
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.
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); }
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Ω .
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.
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).
Com base nesses testes, podemos fazer algunas observações:
A substituição da resistência Rc de 10kΩ para 5kΩ causou o maior aumento nas leituras de resistência.
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.
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Ω.
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.
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.
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
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.
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.
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)
Para entender os fundamentos dessa técnica transcrevo a seguir a explicação do próprio autor no artigo original:
| ||
--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)
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
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 25.
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).
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.
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 25:
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.
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:
ajustar a polaridade dos pinos 7 e 8 para garantir que o sinal do segundo pulso seja positivo para ser lido pelo Arduino.
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.
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.
3,5g NaCl -> 100 mL água (filtrada) = 3,5% NaCl
40 mL (3,5% NaCl) + 60 mL água = 100 mL solução 1,4% de NaCl
40 mL (1,4% NaCl) + 60 mL água = 100 mL solução 0,56% de NaCl
40 mL (0,56% NaCl) + 60 mL água = 100 mL solução 0,224% de NaCl
40 mL (0,224% NaCl) + 60 mL água = 100 mL solução 0,090% de NaCl
40 mL (0,090% NaCl) + 60 mL água = 100 mL solução 0,036% de NaCl
40 mL (0,036% NaCl) + 60 mL água = 100 mL solução 0,014% de NaCl
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.
Mas como o comando de leitura analogRead() consome ~100 μs de processamento fico com um tempo mínimo de pulso de 100 μs.
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.
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)
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.
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