Controle PID Digital de Luminosidade com Arduino Uno

Font Size

Noções de Controle Automático

O dia 19 de abril de 2021 vai ficar conhecido como uma conquista inédita para humanidade. A primeira vez que um objeto voa na atmosfera de um outro planeta! Um drone da NASA da sonda Perseverança fez seu primeiro voo na superfície de marte. Uma grande conquista para engenharia, em especial para a engenharia de controle. 

Controle. Esta palavra possui várias interpretações e aplicações. Você talvez não sabia, mas o controle está dentro de você! O controle de temperatura do seu corpo, o controle dos batimentos do coração são exemplos típicos de um controle biológico. De forma mais avançada e consciente, o controle está presente nas complexas malhas de controle formadas nas sinapses do seu cérebro quando você aprendeu a andar ou mesmo quando dirige um carro ou anda de bicicleta. 

Então, agora que você já sabe que não consegue fugir do “controle”, vamos aprender a usá-lo de forma bem simples através de uma prática de um controle  automático digital de luminosidade. Primeiramente, vamos definir algumas peças fundamentais do nosso quebra cabeça. Posteriormente, vamos juntar as peças formando uma malha de controle completa. Por fim, vamos  colocar a mão na massa montando uma planta de baixo custo e estudar a dinâmica do sistema em pleno funcionamento. Então, vamos começar a dar uma luz nas suas ideias de controle?

Definindo alguns termos importantes

Imagino que você está ansioso para colocar a mão na massa, contudo, antes de apreciar as diversas aplicações práticas do controle automático, precisamos definir alguns conceitos básicos teóricos essenciais:

Variável controlada ou medida (PV – Process Variable)

Variável envolvida no processo a qual se deseja controlar. Por exemplo, entre as principais variáveis controladas em uma indústria de processos temos temperatura, vazão, nível e pressão.

Referência ou Setpoint 

Define o valor de referência da variável controlada. Em outras palavras, o objetivo primordial do controle é a deixar a variável controlada próxima deste valor, dentro de limites toleráveis para não afetar a qualidade do processo. Por exemplo, ao ajustar a temperatura de um sistema de refrigeração em 19,5° C, este é o valor de setpoint, conforme mostrado na Figura 1.

Figura 1 – Exemplo de ajuste de setpoint de temperatura.

Elemento primário ou sensor

Responsável por medir  a a variável controlada, gerando outra grandeza que pode ser reconhecida por um controlador. Ou seja, o elemento primário apenas converte a grandeza que se deseja medir em outra grandeza. Por exemplo, um termômetro simples pode ser considerado um elemento primário ou sensor.

Atuador

Os atuadores tem a função de converter um sinal em uma ação de algum tipo de energia, usualmente mecânica. No caso das válvulas de controle, um atuador é o elemento responsável por fornecer a força para que a válvula realize trabalho. Porém, também existem atuadores que controlam grandezas elétricas como tensão ou corrente através de circuitos eletrônicos. A válvula de um chuveiro é um exemplo simples de atuador manual.

Erro ou desvio 

Representa a diferença entre a referência e o valor da variável medida. Ou seja, se o setpoint é 30°C e a variável medida é 29,5, o erro é 0,5 °C. 

Variável manipulada (MV – manipulated variable)

É a variável que recebe ação direta de um sistema de controle, geralmente por meio de um atuador. Contudo,  pode ser igual ou diferente da variável controlada. Por exemplo, no controle de velocidade de um carro, a variável manipulada é o pedal do acelerador no caso do controle manual ou mais especificamente o sistema de injeção de combustível.

Controlador

Elemento responsável por manter a variável controlada com valores próximos ou iguais ao valor  de ajuste (setpoint), fornecendo um sinal de correção para a variável manipulada. Por exemplo, o controlador de temperatura de uma geladeira tenta corrigir a temperatura (variável controlada) em valores próximos de uma temperatura pré-determinada (setpoint), realizando para isso  ações de correção ao ligar e desligar o compressor  da geladeira (variável manipulada)

Figura 2 – Exemplo de controlador Industrial.

Perturbação ou distúrbio 

É qualquer alteração, variação ou ruído que cria mudanças em alguma das variáveis de um sistema de controle. Numa sala com aparelho de ar condicionado, por exemplo, o efeito de entrarem diversas pessoas rapidamente em  sala de aula causa uma perturbação no sistema de controle de temperatura.

Malha de controle

Agora que você já sabe os principais termos, vamos entender o conceito de  malha de controle. Ao se tratar de controle automático, existem basicamente duas formas de controle: O controle em malha aberta e o controle em malha fechada. No controle em malha aberta o sinal de controle não depende da saída, enquanto que um controle em malha fechada a ação de controle depende de um sinal de retorno, geralmente conhecido como realimentação ou feedback. Por exemplo, um sinal de trânsito simples é considerado um sistema em malha aberta visto que ocorre um controle do tráfego, mesmo sem retorno da quantidade de carros. Já uma boia de uma caixa d’água é considerado uma malha fechada, tendo em vista que boia  envia o sinal de retorno para a válvula controlar o nível.

O papel da realimentação  é desempenhado por sensores  que são  capazes de filtrar o sinal de saída de uma forma que o controlador possa realizar a  leitura e efetuar as devidas correções.  A malha de controle de nosso sistema é do tipo SISO (Single Input and Single output) sendo mostrada na figura 3.

Figura 3 – Malha do controle de luminosidade

Ações de Controle

Para fornecer maior precisão e estabilidade em um processo contínuo é comum a utilização de um controlador PID: Proporcional, integral e derivativo.  A seguir são explicados em mais detalhes cada tipo de ação deste controlador. 

Ação Proporcional

A ação corretiva  proporcional ao desvio, conhecida como ação proporcional. Os gráficos a seguir representam a  ação de controle proporcional em malha aberta. Por exemplo, observe quando o desvio deixa de ser zero, a ação da variável manipulada (linha azul) é proporcional ao erro de forma constante.

Figura 4  Ação Proporcional em malha aberta

Porém, em malha fechada só a ação proporcional não é capaz de eliminar o erro estacionário, ou seja, a diferença entre o valor desejado e o valor medido quando o sistema está em estado permanente. Pode-se até aumentar o valor da constante proporcional da correção para amenizar o erro, mas corre-se o risco de tornar o sistema muito oscilante ou instável. Assim, precisamos implementar a ação integral, vista a seguir, para corrigir este erro estacionário.

Ação Integral

Em linhas gerais, a ação integral consiste de uma integração (somatório) do desvio ao longo do tempo, permitindo a eliminação do erro estacionário. Ao passo que, enquanto existir diferença entre o valor de setpoint e o valor da variável de processo(PV), ocorrerá um correção de forma lenta para eliminar o erro. Por exemplo, observe a figura 5 a seguir que, a medida que o erro fica com um valor positivo ao longo do tempo, os valores de MV (linha azul) vão integrando e aumentando ao longo do tempo para tentar corrigir o erro.

Figura 5  Ação Integral em malha aberta

Ação derivativa

Enquanto a ação integral tenta corrigir acumulando dados do passado a ação derivativa consiste em uma resposta que é proporcional à  variação do desvio. Esta ação tende a reduzir a velocidade das mudanças da variável medida, evitando variações bruscas. Em outras palavras, a ação derivativa só atua quando existe variação no desvio. Por exemplo, observe a figura 6  que uma taxa de crescimento no erro faz subir imediatamente o valor de MV (linha azul) graças a ação derivativa.

Figura  6  Ação Derivativa em malha aberta

Colocando a mão na massa

Com o avanço das tecnologias computacionais na área de controle é possível utilizar microprocessadores e microcontroladores para efetuar  os controle de plantas industriais, deixando os processos mais seguros e eficientes, ao passo que o controle manual não é mais utilizado. Desta forma, sem entrarmos em mais detalhes na parte matemática, aproximamos  o algoritmo do controlador PID analógico por uma fórmula digital. Este controle agora é baseado no tempo de amostragem dos sinais digitais em vez de uma leitura constante de sinais analógicos utilizando o padrão ISA. Além disso, utilizaremos itens de baixo custo e bem fáceis de serem encontrados no mercado. Mas, caso você deseje implementar do zero o controle PID em uma planta de controle virtual de nível, sugiro ler o seguinte post.

Material

Montando o circuito

Por fim, para efetuar o controle utilizaremos no papel de controlador a placa arduino uno r3. O objetivo é definir um valor de referência de luminosidade em um potenciômetro e o controlador irá efetuar as devidas correções aumentando e diminuindo o brilho do led. Resumidamente, a fim de tornar os cálculos mais simples adota-se todas as variáveis analógicas com uma variação de 0 a 1023 e a ação de controle com valores variando de 0 a 254. 

Figura 4 – Elementos da malha de controle de luminosidade e relação com a malha de controle

Programa do controle PID digital

A seguir é mostrado o programa principal para o controle de luminosidade com controle PID digital. Em destaque para as linhas que efetuam o controle digital com controlador PID.

#include <TimerOne.h>
int spValue = 0, pvValue = 0;
int sensorValue = 0;
const int pin_mv = 9;
const int pin_pv = A4; //Pino de entrada para o variável medida
const int pin_sp = A0; //Pino de entrada para o setpoint
const int lim_int_sup = 29000;
const int lim_int_inf = -29000;
const int lim_pwm_sup = 254;// adotou-se 254 porque a saída do pwm em 255 é muito diferente do valor em 254, podendo gerar instabilidade na malha fechada
void setup()
{
Serial.begin(9600); //define velocidade serial de 9600bps
pinMode(pin_mv, OUTPUT);
pinMode(10, OUTPUT);
Timer1.initialize(1000);      // Inicializa o Timer1 e configura para um período de 1 ms
Timer1.attachInterrupt(amostragem); //define a rotina de amostragem da interrupção do PID digital
delay(2000);
}
int teste = 0, mv, teste2 = 0, display_7seg;
float kp = 0.01;  //constante ganho proporcional
float Ti = 0.5;   //Tempo Integral
float Td = .1;    //Tempo Integral
float erro = 0;   //Erro
float erro_ant = 0; //erro anterior para ação derivativa
float P = 0;    //Ação Proporcional
float S = 0;    //Integrador
float I = 0;    //Ação Integral
float D = 0;    //Ação Integral
float acao;     //Ação na variável manipulada

void amostragem()
{
teste++;
teste2++;
if (teste > 30)
{
      teste = 0;
      spValue = analogRead(pin_sp); //leitura do valor de setpoint
      pvValue = analogRead(pin_pv); //leitura do valor de setpoint
      erro = pvValue - spValue;
      P = erro * kp;
      S = S + erro;    //fórmula do integrador
      if (S > lim_int_sup) //limitador Integral superior
      {
             S = lim_int_sup;
      }
      if (S < lim_int_inf) //limitador Integral inferior
      {
             S = lim_int_inf;
      }
      I = kp * S / Ti; //fórmula da ação integral
      D = (erro_ant - erro) * Td;
      erro_ant = erro;
      acao = P + I + D;   //cálculo da ação final do controlador PI
      if (acao > lim_pwm_sup) //limitador saída superior pwm
      {
             acao = lim_pwm_sup;
      }
      if (acao < 0) //limitador saída inferior pwm
      {
             acao = 0;
      }
      analogWrite(pin_mv, acao); //linha principal para ação na variável manipulada
}
if (teste2 > 1000) //atualiza o gráfico do plotter serial a cada 1 segundo
{
      teste2 = 0;
      Serial.println(); // a linhas a seguir servem para mostrar as variáveis e no plotter serial do arduino
      Serial.print("sp=");
      Serial.print(spValue); //legenda setpoint
      Serial.print(" pv=");
      Serial.print(pvValue); //legenda variável medida
      Serial.print(" mv=");
      Serial.print(acao); //legenda variável manipulada
      Serial.print(" erro=");
      Serial.print(erro); //legenda desvio ou erro
      Serial.println();
      Serial.print(" ");
      Serial.print(spValue); //gráfico setpoint
      Serial.print(" ");
      Serial.print(pvValue); //gráfico variável medida
      Serial.print(" ");
      Serial.print(acao); //gráfico variável manipulada
      Serial.print(" ");
      Serial.print(erro); //gráfico desvio ou erro
}
}

void loop()
{
}

 

Teste  do controle PID digital

Na figura 5 são testadas três situações de controle utilizando níveis de distúrbios em diferentes patamares para verificar a resposta de nosso controlador. Utilizamos o recurso plotter serial da própria IDE do arduino para traçar todas as variáveis importantes. Para ver o gráfico basta ir no menu “Ferramentas” e escolher a opção “Plotter serial” na IDE do arduino.

Figura 5 – Resultados do controle PID digital com três situações de perturbação

Conclusão

Quem estuda a parte prática da área de controle geralmente utiliza plantas que possuem  custo elevado ou geralmente recorrem à simulação computacional utilizando programas específicos sem contato prático com uma parte física. A ideia deste post foi dar um passo inicial utilizando materiais de baixo custo para montar um sistema físico para controle PID digital  indo na linha da cultura maker e do faça você mesmo.

Espero que tenham apreciado o circuito montado e o programa apresentado. Desejo que eles sejam bastante úteis na sua aprendizagem no campo do controle automático e da automação de processos.

Referências

Imagens (www.pixabay.com)

Tinkercad.com

BEGA, Egídio Alberto et al (Org.). Instrumentação Industrial. 3. ed. Rio de Janeiro: Interciência, 2011

 

Posts relacionados

Conhecendo o Arduino Lilypad e os Circuitos Vestíveis

por Luan Fernandes
3 anos ago

Realizando efeito Scroll no display LCD

por Danilo Nogueira
6 anos ago

Como utilizar Processing com Arduino: Parte 3

por Danilo Nogueira
6 anos ago
Sair da versão mobile