Ir para conteúdo

Faça seu próprio PID, com arduino


viniesp

Postagens recomendadas

Bom dia, galera.

Esse semestre eu fiz meu projeto de conclusão do curso - TCC - e o tema foi construir um PID para máquinas de espresso.

Eu fiz um PID que possa ser replicado por qualquer pessoa e não só para máquinas de café, ele serve para qualquer dispositivo que precise de um PID.

Vou colocar aqui o código dele, para, quem quiser, possa instalar nas suas cafeteiras.

As peças usadas foram:

 

1- Arduino UNO (acho que o arduino nano já funciona);

2 - Relé SSR 20A;

3 -  Sensor Termopar Tipo K ( colocar na caldeira);

4 - Nanoshiel termopar max 31855;

5 - Jumpers;

6 - Protoboard

 

estes 4 acima são obrigatórios.

 

7- display OLED I2C (pode utilizar qlqr dispay que quiser, esse inclusive é bem pequeno)

 

Total das peças: R$ 244,00

 

Código (somente a programação do PID)

 

float

  kp = 50,        //valor da constante proporcional ---> esse valor pode ser alterado pelo usuario

  ki = 0.1,       //valor da constante integral ---> esse valor pode ser alterado pelo usuario

  kd = 0.1;     //valor da constante derivativa ---> esse valor pode ser alterado pelo usuario  

float

  p = 0,     //controle proporcional

  i = 0,     //controle integral

  d = 0,     //controle derivativo

  pid = 0,   //controle proporcional, integral e derivativo (PID)

  erro,                     //variável de erro

  tdecorrido = 0;                     //variável que irá receber o tempo decorrido para ocorrer o loop de controle, sendo 0 como inicio

  float setpoint = 91;                 //aqui é definida a temperatura alvo ---> esse valor pode ser alterado pelo usuário

 

  float temperatura;              //variável que vai receber a temperatura medida pelo sensor.

 

void setup()

{

 pinMode(10,OUTPUT);         //porta PWM onde será colocado o relé e definida como saída.

digitalWrite(10, LOW);      //definindo a porta como desligada por defautl

}

 

  temperatura = thermocouple.getExternal();    //a temperatura a ser guardada para controle será a temperatura externa.

  erro = setpoint - temperatura;      //calcula a variação entre a temperatura medida e a temperatura alvo. Faz parte da realimentação do sistema e no cálculo de cada controlador.

 

  float delta = ((millis() - tdecorrido))/1000.0;       //calcula a diferença em segundos entre um loop

  tdecorrido = millis();                //conta quanto tempo levou para dar um loop

 

  //controle proporcional

  p = kp*erro;

    

  //controle integral

  i += (ki*erro)*delta;

 

  //controle derivativo

  d = erro*kd/delta;

 

  //PID

  pid = p+i+d;

     

  //aqui começam os controles de fato

   if(pid>0){

     digitalWrite(10, HIGH);

   }

  else{

     digitalWrite(10, LOW);

  }

 

O PID apresentou temperatura máxima de 93,75 e mínima de 88,75, com setpoint a 91 ºC. Ele foi instalado numa Fiamma Mini Bar (single boiler)

 

No void setup() e no void loop() só coloquei os comandos do PID. Tem que adicionar a biblioteca da shield termopar e do display oled

  • Curtir 10
Link para o comentário
Compartilhar em outros sites

Como é um trabalho de conclusão, vou tomar a liberdade de ir mais fundo na teoria:

Como você levantou os paramentos do sistema (máquina de espresso) a ser controlada, para definir as constantes proporcional, integral e derivativa?

Pelo que lembro de sistemas de controle isso é fundamental para a estabilidade e desempenho do sistema em malha fechada.

 

Enviado de meu D6633 usando Tapatalk

Link para o comentário
Compartilhar em outros sites

Legal Vini! E eu estava com a mesma dúvida do Guilherme! A oscilação parece estar grande, não? Normalmente se segue os passos excitação do sistema e coleta de dados > modelagem do sistema e sensor > projeto do controlador. Sistema térmico normalmente é modelado como de 1a ordem, tranquilo de estabilizar em malha fechada... mas algum problema de estabilidade pode aparecer se a dinâmica do sensor for muito lenta.

Link para o comentário
Compartilhar em outros sites

Então, o objetivo geral do TCC foi mais ou menos esse: projetar uma solução mais acessível economicamente para baristas amadores que queiram ter um PID em suas máquinas compradas aqui no mercado nacional, fabricadas no brasil, evitando a importação de outras máquinas.

Fiz esse código baseado no método de ajuste guess and check.

Pude perceber que a limitação desse PID foi a nanoshield, ela possui uma resolução de 0,25 ºC. Dessa forma, mesmo aumentando o valor da constante proporcional (testei até com 1000000) não consegui uma melhora significativa, o sistema não ficou instável e a temperatura de acionamento do relé ficou sempre em 90,75 ºC. Ele apresentou quase o mesmo resultado. Com a shield max 31856, o sistema pode ser controlado mais eficiente.

O modo de acionamento do relé foi o digitalwrite(), ele só aceita o HIGH  - ligado -  ou - LOW - se mudar para analogwrite(), que vai de 0 a 255, dá para controlar a intensidade de acionamento do relé, não testei, mas isso pode melhorar a eficiência.

Mesmo assim, eu comparei com um PID desses que compramos lá fora, este apresentou temperaturas máximas e mínimas mais distantes do setpoint.

Esse código que fiz pode ser melhorado, por isso eu postei. Quem quiser, pode melhorar a partir do que foi feito ou até aproveitar a ideia e fazer outro com outros métodos de ajuste

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • 6 months later...

O que parece estranho é que um sistema de primeira ordem deveria ter seu erro zerado em regime permanente ao se utilizar um PID. Alias, um PI já deveria ter esse efeito.

 

Dúvida: você usou PWM para modular o SSR? Em qual frequência?

Link para o comentário
Compartilhar em outros sites

  • 1 month later...
  • 10 months later...

Boa noite, Vini!

Então, concordo com o Guilherme e o Luis. Um processo de aquecimento através de serpentinas e/ou resistência é um dos que mais se adéqua ao falho conceito de "processo de primeira ordem" (que são mais teóricos que práticos). O controle da temperatura de um fluido em um equipamento com elementos de alta capacitância, em teoria, deveria apresentar uma variação menor! Mas, para ser justo contigo, acharia difícil que atingisse a perfeita estabilização do processo de aquecimento, afinal, o atuador utilizado apresenta-se como uma "válvula ON/OFF" e de nada adianta controlar um sistema com PID se sua saída não é analógica. O seu meio de controle apresenta um funcionamento semelhante a um ar condicionado e seu termostato, deveras mais arcaico que um PID. Quem sabe se, atuando na corrente fornecida à máquina através de uma resistência variável, você não consiga melhorar o sistema?

Também gostaria de adicionar como adendo que, teorizando uma fórmula matemática que não exija o uso de integrais e derivadas (justamente a restrição que temos usando arduino), o sistema de controle PID resulta na fórmula: Kp * e + KP * e * Ki * Tempo de erro + Kp * e * Kd * Velocidade de erro. Pelo que é perceptível na linha de código, você não considera o tempo de erro, mas sim o tempo do loop, ignorando se houve ou não erro (ainda assim é funcional, afinal, apresentando erro zero, a correção integral será zero, bem como erro negativo resultará na diminuição da atuação e erro positivo em seu aumento); no entanto, o meio de controle derivativo que me pareceu um pouco menos verossímil. Num sistema PID, creio que ficaria melhor o seguinte:

void loop () {

    erro = setpoint - leitura;

    // resto do código

    d = kD * (erro - erro_anterior) / delta; //é permissível ignorar o valor do kP se o seu kD já o traz incluso

    ...

    erro_anterior = erro;

}

Mas enfim, seu sistema de controle (sem uso do tempo e velocidade de erro) realmente foi capaz de regular a temperatura, afinal, via de fato, o tempo morto de processos térmicos é gigantesco; mas um processo como seguidor de linha PID vai exigir que a velocidade de erro e o tempo de erro sejam considerados (afinal,  apresentam constantes deltas erro em um curto intervalo de tempo (como por exemplo ao detectar uma curva de 90°)). Caso aceite o desafio, gostaria de sugerir que mude seu meio de atuação para uma resistência variável, controlando a corrente, e não o tempo de atuação através de um relé, afinal, como eu mesmo disse, é um sistema de altíssimo tempo morto que, ao passo que te serve de ajuda (não requerendo o PID ao pé da letra), te serve também de atrapalhador, uma vez que a variação da temperatura vai ser medida "séculos" depois da sua atuação.

Caso queira ajuda nas linhas de código, me coloco à disposição! 

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Durante o projeto, fiquei com essa dúvida mesmo, através dos resultados notei que o sistema demorava muito para responder, apesar de não apresentar um impacto muito significativo. Sem excluir todas as outras possibilidades, notei basicamente dois motivos para isso: 1) o termopar usado tinha uma taxa de leitura de .25ºC, isso fazia a temperatura se distanciar um pouco mais do setpoint até o PID começar a realmente atuar. Na época e também atualmente, existem outros termopares com precisão melhor, isso daria maior velocidade de reação, independente do PID. 2) O fato de usar sistema on/off ao invés de usar uma resistência variável, esta última teria mostrado um resulto melhor e, se usado com um termopar com precisão melhor, modulando a corrente, tenho certeza que o pid ficará imbatível.

Não tive tempo de testar novas possibilidades, a fiamma foi vendida e agora estou com uma quickmill. Penso em colocar um pid nela, mas não quero mudar seu visual original, tampouco quero um pid que fica fora dela, como acontece com a rocket r58. Assim, não modifiquei ela ainda e ter uma nova máquina somente para testar novas opções de pid não seria uma boa opção.

Outra coisa, atualmente não sei nem se usaria um arduino, usaria um PIC para reduzir o tamanho do PID, tendo as mesma funções. 

Se vc morasse perto de mim, a gente poderia levar esse projeto para frente. Seria um prazer. Caso queira melhorá-lo, podemos  ir conversando, te mando meu tcc completo.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Então, em seu lugar, também estaria longe de meu desejo usar Arduino, ou ao menos usar SOMENTE Arduino. Primeiro por ser uma plataforma de prototipagem que, por ter diversos features, a placa é grande pra caramba, tendo inclusive algumas utilidades raramente utilizadas (como a comunicação Tx-Rx); e segundo por, mesmo sendo tão "completa", não apresentar portas integradoras e derivativas. Minha sugestão seria, portanto, o uso de amplificadores operacionais integradores e derivativos, apelando para a eletrônica e deixando o código mais fácil, justamente por não exigir a fórmula matemática simples do controle PID. Após a prototipagem com Arduino, faria uma placa própria.

Uma dúvida que tenho quanto à Quickmill é se o meio de atuação (aquecimento) é por resistência elétrica ou serpentina (vapor e tubulão internos). Caso seja caldeirado, o controle teria que ser feito por uma válvula senóide, mais complicada que controle por resistência. Mas, acima de tudo, mexer numa Quickmill seria pecado, haha. Também moro bastante longe (Salvador - BA), então te ajudar na prática é impossível, mas, caso algum dia volte a pensar num controle PID do seu equipamento, é só responder nesse post que eu tento dar AaD (ajuda a distância), hahahaha

Link para o comentário
Compartilhar em outros sites

  • 3 months later...

Assunto antigo mas sempre atual...

Acho que faltou implementar um timer pra atuar de 0 a 100% do tempo em cada ciclo. Eu uso ciclos de 500ms e a cada ciclo calculo o PID duas vezes e deixo ligado o SSR apenas o valor do PID (de 0 a 1) x 500ms...

Não precisa de um SCR, controlar corrente, PWM resolve bem. Claro que há uma boa inércia do sistema, portanto terá um overshot e depois de um tempo estabilizara com pouco erro em torno do setpoint.

Problema maior nas cafeteiras é a  extração e entrada de água fria na caldeira, ainda mais pequena. Ou se espera um tempo para estabilizar novamente, ou se pre aquece a água, ou faz uma cadeira grande. Algumas comerciais fazem os dois, caldeira de 1 a 1,5L e com pre aquecimento da agua.

Na máquina que uso trabalho eu tento estimar o fluxo com um dado da bomba que uso, mas está ruim, preciso botar um medidor de fluxo mesmo. Com esse valor já defino atuação da resistência considerando o setpoint e "chutando" 30 graus Celsius pra temperatura da água que entra (deveria medir). Como a resistência é potente, 1400w pra um caldeira de 500ml, o resultado é bom. Também daria pra desligar completamente a resistência e ter uma quedinha na temperatura, que acho bom, mas aí o tempo de recuperação aumentará. Devo testar isso.

 

Márcio. 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Processando...
×
×
  • Criar Novo...