Postagem em destaque

Controle PID de Potência em Corrente Alternada - Arduino e TRIAC - Parte I

Este post é o primeiro de uma série de seis que escrevi tratando de controle de potência e PID (controle proporcional, integral e derivativo...

domingo, 27 de novembro de 2016

Conceitos em automação: threshold (limiar) e calibração

Sabadão estivemos mais uma vez no parque Santos Dumont para o nosso Automação no Parque.

Um projeto interessante que apareceu foi um "míssil" (na verdade uma maquete) a ser controlado por uma fonte de calor. O sensor infravermelho acabou sendo substituído por um LDR, porque o aluno apanhou do funcionamento dos primeiros. Isso, claro, não muda o conceito.

O protótipo está muito bem feito, como vcs podem ver na imagem abaixo.

Do lado esquerdo é a "ogiva", onde estão localizado os quatro sensores LDR, um pra cima, outro pra baixo, e um pra cada lado.

Em seguida vem uma plaquinha especializada que o aluno construiu para lidar com os infravermelhos. Como ele não tá usando mais esse sensor (eu sugeri que ele volte a usar), usamos um Arduino Uno em nossos testes.

Seguindo o corpo do "míssil" vcs podem ver em seguida o servo que controla as aletas de direcionamento esquerda/direita (se clicarem na figura ela dá um zoom e fica mais fácil de ver), depois vem o mecanismo de engrenagem dos eixos vertical e horizontal, e por fim vem o servo que controla o eixo da inclinação horizontal.

O aluno já trouxe um "pograminha" pronto, que não funcionava. A ideia é que eu achasse o motivo e ajudasse-o a consertar.

O aluno em questão faz parte de um programa de especialização em automação e controle aqui de SJC.

Ao analisar o programa do cabra, constatei que ele não funcionava porque ele não tinha atentado para dois conceitos básicos de automação industrial: threshold e calibração. Sem entrar na discussão sobre o porque disso, muitas vezes os alunos me procuram no Parque por esse tipo de demanda, quer dizer, está faltando um pouco de atenção talvez com o currículos desses cursos por aqui.

Como no Automação no Parque a gente mata a cobra e mostra o pau, quer dizer, ajuda a resolver os pepinos, abacaxis e outros vegetais de duplo sentido e ainda ensina a mágica, resolvemos a questão juntos e o camarada entendeu direitinho os dois conceitos, que passo a explicar aqui. Observe que minha intenção não é esgotar o assunto, mas dar uma visão geral e ao mesmo tempo prática para que os leitores possam entender e usar esses conceitos essenciais na ciência de automação.

Calibração


Podemos classificar os sensores de várias formas: ativos e passivos, elétricos, pneumáticos eou mecânicos etc. Para efeito de calibração, podemos dizer que existem sensores que precisam de calibração e os que não precisam.

Como exemplo, vamos comparar dois sensores de temperatura, um termistor e um LM35.

Resumindo o que vc pode ler nos dois links, o termistor é um sensor passivo (ou seja, não demanda energia de alimentação para funcionar) enquanto que o LM35 é um sensor ativo que possui um pequeno circuito integrado dentro.

O que mais diferencia os dois? O termistor apresenta uma variação na resistência elétrica em função da variação da temperatura, ou seja, se vc precisar fazer uma leitura da temperatura vc tem que calibrá-lo. Isso significa ser necessário determinar a resistência dele em função da temperatura em alguns pontos gerando uma curva, ajustar uma equação para essa curva e então usar a equação ajustada no seu programa para calcular a temperatura em função da resistência.

Já no caso do LM35 a leitura "já sai" calibrada e linearizada, ou seja, junto com o sensor vem publicada uma constante de mV/°C, então basta vc multiplicar a saída do sensor em mV pela constante e pronto. No caso do Arduino, vc usa o seguinte código, supondo que o sensor está

 // supondo que o sensor está ligado à porta 0 analógica  
 int mv = (analogRead(0)/1024.0)*5000;   
 int temperatura = mv * 10;  

Muito mais simples, sem necessidade de calibração.

No caso dos LDRs, sensores de luz usados pelo nosso míssil, o mesmo sofre grande influência do ambiente, então é necessário calibrá-lo em runtime, ou seja, fazer uma função que calcule o "zero" de cada sensor antes de usá-lo, facilitando a comparação entre os valores deles quando em funcionamento. Exemplo: se vc disparar o míssil com o sol posicionado à esquerda deste, o sensor do lado esquerdo dará leituras mais baixas que o do lado direito (já que quanto mais luz menos resistência) sem que tenha necessariamente um alvo a ser seguido desse lado.

Para isso, usa-se uma função de calibração semelhante à escrita abaixo, que foi usada para o projeto em questão:

 int pinL = 0;  // pinos de conexão dos sensores: esquerda, direita, acima abaixo
 int pinR = 1;  
 int pinU = 2;  
 int pinD = 3;  
 
 long calL = 0; // Valores de calibraçao, a serem calculados na função calibracao()
 long calR = 0;  
 long calU = 0;  
 long calD = 0;  
 
 int iterCal = 50; // Número de iterações para calibração  

 void calibracao()  // função de calibração
 {  
  for(int i=0;i<iterCal;i++)  
  {  
   calL += analogRead(pinL);  
   calR += analogRead(pinR);  
   calU += analogRead(pinU);  
   calD += analogRead(pinD);  
   delay(50);  
  }  
  calL /= iterCal;  
  calR /= iterCal;  
  calU /= iterCal;  
  calD /= iterCal;    
 } 
 
 void setup() {  
  calibracao();  
 } 
 
 void loop() {  
 }
  

A rotina calibração acumula iterCal leituras dos sensores e depois tira a média, achando os valores calL etc.

Para usar esses valores é muito fácil. basta descontá-los na hora da leitura dos sensores dentro do projeto:

 long valL = analogRead(pinL) - calL + 1000;   
 long valR = analogRead(pinR) - calR + 1000;   
 long valU = analogRead(pinU) - calU + 1000;   
 long valD = analogRead(pinD) - calD + 1000;   

Quando se faz essa subtração se elimina algum efeito de diferença de fabricação entre os sensores, ou de posicionamento relativo às fontes de luz ambiente etc.

E porque adicionar 1000? É que com isso nos livramos de valores negativos, já que o desconto da calibração leva a números próximos de zero mas não necessariamente positivos. Como as leituras do LDR variam mais ou menos de 40 a 300, somar 1000 faz com que os valores sejam necessariamente positivos. Para o seu sensor pode ser diferente.

Threshold ou Limiar


Quando comparamos valores de sensores temos que imaginar que eles tem imprecisões, e também que muitas vezes são mais sensíveis do que a gente necessita, captando alterações de valores que são muito pequenas para nos interessar.

Nesse caso, devemos usar um valor de threshold, que nada mais é do que um limite mínimo de variação de valores que deve ser observado para que o sistema considere realmente que houve uma variação. Assim, num sistema de aquecimento por exemplo, em vez de escrever:

if (temp< setPoint)  
   // liga o aquecedor
else 
  // desliga o aquecedor

o que poderia fazer com que o sistema ficasse oscilando, ligando e desligando o aquecimento muito rapidamente, o que no caso de um relé poderia levar a superaquecimento e deterioração do dito, podemos escrever:

if ((setPoint - temp) > threshold)  
 // liga o aquecedor.  
 else  
   if ((temp - setPoint) > threshold)  
   // desliga o aquecedor.  

E qual o valor de threshold? Bom, aí cada caso é um caso. Vc deve ajustar o seu de maneira que o circuito não oscile muito mas também não fique "insensível", ou seja, demore a responder ao distúrbio na variável medida.

Abaixo, outras imagens que o Fábio, dono do projeto, me mandou:







É isso! Por fim, a bagaça funcionando. Com uma lanterna, vou incidindo a luz em cada sensor, como dá pra ver do lado esquerdo do vídeo. Observem o detalhe do grampo de cabelo funcionando como "aleta" do foguete... isso, claro, foi feito para facilitar a percepção da posição nos testes.

Abracadabraço,

Mauro