quinta-feira, 6 de setembro de 2018

Arduino Controlador PI de Luminosidade

Implementação de um controlador PI para o controle da luminosidade do ambiente. O valor da luminosidade desejada será ajustado pelo uso das teclas “+” e “-”, onde para “+” seu valor será incrementado em 50 e para “-” seu valor será decrementado em 50.

Um controlador PI ou controlador proporcional-integral é utilizado em sistemas de controle para controlar a estabilidade de um sistema. Funcionando da seguinte forma, o controlador utiliza um sensor para as leituras do sinal na saída no sistema, esse valor é então comparado com o sinal desejado (setpoint), resultando em um erro. O esse é utilizado para o controle do sinal, onde o sinal será proporcional à integral do erro. Dessa forma, o sinal do sistema será dado pela seguinte equação (lei de controle PI):

$Sinal(t)=KP \times Erro(t)+KI \times \int_{0}^{t}Erro(t)dt $

Onde:

$Erro(t)=setpoint-leitura$

$KP$ e $KI$ são constantes de ganho

A teoria de controle é um assunto bastante extenso, a intenção aqui é apenas dá uma pequena ideia do que é possível ser realizado. Faça as ligações como na imagem a seguir: 

Figura 1. Controlador PI de luminosidade
O sensor do sistema é um divisor de tensão formado por um LDR (Light Dependent Resistor) e um resistor de 4.7 kΩ, a resistência do LDR é proporcional à luminosidade que incide sobre ele, assim, quanto maior a luminosidade, menor será sua resistência. Dessa forma, temos um sensor de luminosidade simples.

O LED branco (de preferência de alto brilho) é o atuador do sistema, seu brilho será controlador por um sinal PWM, que será calculado de acordo com a lei de controle PI. Dessa forma, o LDR deve ser colocado próximo do LED, para que sua luz incida sobre o LDR (caso necessário, encurte os terminais do LDR).

Com o circuito montado, procure um ambiente com pouca luminosidade, conecte o Arduino ao computador e upload o seguinte código:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
uint8_t pinLDR = 0;    // LDR no pino analógico A0
uint8_t pinLed = 10;   // LED no pino 10

char setSerial = 0;    // Valor enviado pelo monitor
uint16_t lum = 0;      // Luminosidade lida
uint16_t setLum = 550; // Luminosidade desejada
int16_t erro = 0;      // Erro entre as luminosidades
int16_t somaErro = 0;  // Soma os erros
int16_t duty = 0;      // Duty para luminosidade do LED

float KP = 1.25; // Constante de ganho da lei de controle
float KI = 0.75; // Constante de ganho da lei de controle

void setup()
{
  Serial.begin(9600); // Configura comunicação serial, baudrate = 9600
}

void loop()
{
  lum = analogRead(pinLDR); // Lê e armazena o valor do LDR (Luminosidade)
  erro = setLum - lum;      // Calcula o erro
  somaErro+= erro;          // Acumula o erro

  duty = KP*erro + KI*somaErro; // Calcula o duty ideal

  if(duty > 1023)  // Limita o valor máximo de duty em 1023
  {
    duty = 1023;
  }

  if(duty < 0)  // Limita o valor mínimo de duty em 0
  {
    duty = 0;
  }
  
  duty = map(duty, 0, 1023, 0, 255); // Muda a escala do duty

  analogWrite(pinLed, duty); // Ativa o PWM no LED 

  if(Serial.available()) // Espera o recebimento de dados pelo monitor
  {
    setSerial = Serial.read(); // setSerial recebe o char enviado

    switch(setSerial) 
    {
      case 43: // caso setSerial = "+" -> setLum = setLum + 50
        setLum+=50;
        break;

      case 45: // caso setSerial = "-" -> setLum = setLum - 50
        setLum-=50;
        break;
    }

    if(setLum > 1000)  // Limita o valor máximo de setLum em 1000
    {
      setLum = 1000;
    }
  
    if(setLum < 0)  // Limita o valor mínimo de setLum em 0
    {
      setLum = 0;
    }
  }
  
  Serial.print("lum = ");    // Envia os dados para o monitor
  Serial.println(lum);
  Serial.print("setLum = ");
  Serial.println(setLum);
  Serial.print("Duty = ");
  Serial.println(duty);
  delay(1000);
}

Abra o Monitor Serial do IDE do Arduino para observar a atuação do controlador PI. O valor do setpoint (setLum) foi inicializado com um valor de 550, assim, o valor do sinal PWM será gradativamente ajustado para que o valor do sensor de luminosidade estabilize próximo de 550.

Caso ocorra um aumento na luminosidade (janela ou porta seja aberta, luz externa seja acessa) o sinal PWM se ajustará a nova luminosidade do ambiente. Então, bastante impressionante, concorda?

Fique à vontade para modificar o código, por exemplo, modifique os valores de KP e KI e observe como o sistema se comporta. Enfim, espero que tenha achado interessante esse assunto, pesquise mais sobre a teoria de controle. 

<< Sumário 

Nenhum comentário:

Postar um comentário