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.
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á
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:
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:
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.
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:
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:
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
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
Comentários
Postar um comentário