viniesp Postado 12 Dezembro 2015 Denunciar Share Postado 12 Dezembro 2015 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 10 Citar Link para o comentário Compartilhar em outros sites More sharing options...
Jose Alexandre Postado 12 Dezembro 2015 Denunciar Share Postado 12 Dezembro 2015 show de bola! e fotos? Citar Link para o comentário Compartilhar em outros sites More sharing options...
viniesp Postado 12 Dezembro 2015 Autor Denunciar Share Postado 12 Dezembro 2015 Olha ai, as fotos. <iframe width="480" height="360" src="http://s1298.photobucket.com/user/viniesp/embed/slideshow/"></iframe> 2 Citar Link para o comentário Compartilhar em outros sites More sharing options...
GuilhermeB Postado 13 Dezembro 2015 Denunciar Share Postado 13 Dezembro 2015 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
Luis Paulo Postado 13 Dezembro 2015 Denunciar Share Postado 13 Dezembro 2015 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
viniesp Postado 14 Dezembro 2015 Autor Denunciar Share Postado 14 Dezembro 2015 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 2 Citar Link para o comentário Compartilhar em outros sites More sharing options...
GuilhermeB Postado 10 Julho 2016 Denunciar Share Postado 10 Julho 2016 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? Citar Link para o comentário Compartilhar em outros sites More sharing options...
viniesp Postado 8 Setembro 2016 Autor Denunciar Share Postado 8 Setembro 2016 Eu não modulei o SSR, mas isso é uma possibilidade. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Hugo_Mendes Postado 3 Agosto 2017 Denunciar Share Postado 3 Agosto 2017 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! 2 Citar Link para o comentário Compartilhar em outros sites More sharing options...
viniesp Postado 3 Agosto 2017 Autor Denunciar Share Postado 3 Agosto 2017 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. 1 Citar Link para o comentário Compartilhar em outros sites More sharing options...
Hugo_Mendes Postado 3 Agosto 2017 Denunciar Share Postado 3 Agosto 2017 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
Edison Postado 3 Agosto 2017 Denunciar Share Postado 3 Agosto 2017 Só para inspiração: http://www.home-barista.com/espresso-machines/no-more-guesswork-naked-truth-of-e61-temperature-revealed-t319.html#p1717 1 Citar Link para o comentário Compartilhar em outros sites More sharing options...
Carneiro Postado 4 Novembro 2017 Denunciar Share Postado 4 Novembro 2017 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. 1 Citar Link para o comentário Compartilhar em outros sites More sharing options...
Postagens recomendadas
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.