quinta-feira, 3 de julho de 2014

Controle PID em C++ - Sensor de Chama

Então galera pra começar resolvi postar algo que sempre me chamou atenção e sempre tive vontade de fazer : Controle PID !!
Ok, mas o que é essa coisa? Como funciona? Pra que serve? .... Então eu me fazia todas essas perguntas e só consegui entender de verdade depois que assisti a um vídeo do meu colega Ivan Seidel, que explica de um jeito simples e bem prático esse conceito, vejam o vídeo e depois continuem aqui! 


E aí conseguiu entender? Sim? Não?... Ok sem problemas vou tentar explicar os detalhes a medida que mostro o projetinho.

O projeto é bem simples, ele consiste em fazer o controle de uma saida PWM do arduino a medida que a chama se afasta ou se aproxima do sensor. Além do arduino você vai precisar de:
-  Sensor de Chama;
-  Resistências, 10k(1) e 220 (2);
-  1 Led (se quiser);
-  Buzzer;
- Jumpers;

A MONTAGEM: 
















Ligue também o Led e/ou buzzer em uma saída PWM do arduino em série com as resistências de 220.( se for usar só o led ou só o buzzer usar só uma resistencia.)



O CÓDIGO:


Para fazer esse código utilizei uma ferramenta extremamente útil que consome menos processamento e memória do nosso microcontrolador essa ferramenta se chama Thread.
Para entender mais e compreender o que irá ser mostrado sugiro que você veja o vídeo também do Ivan Seidel sobre threads, aposto que você não irá querer fazer de outro jeito quando aprender a usar essa ferramenta.Link do vídeo e da biblioteca abaixo:


Já viu o vídeo e baixou a biblioteca? Então vamos ao código.

O projeto exige que se faça o controle PID unidirecional, ou seja, queremos apenas que o buzzer "grite" mais alto ou o led tenha mais brilho quanto mais perto estiver a chama do sensor, e que eles fiquem desligados caso não haja fogo. Com isso podemos estabelecer nosso setPoint como o próprio zero, já que se não houver fogo será quando o PWM ficará desligado.
 
Um pouco mais sobre o PID: 

Por que não temos integral, veja que nesse caso não termos valor de integral negativo já que:
I += (error*KI)*deltaTime mas oq é I += , isso equivale a I = I + (error*KI)*deltaTime, com isso;
error = setPoint - sensorValue , ou seja ou é 0 ou negativo., KI é negativo, sendo assim multiplicação de dois negativos é um positivo, ou seja a integral caso existisse iria sempre estar incrementando seu valor e nunca decrementando, isso apenas nessa situação!!!, com isso não utilizou-se integral nesse caso.

A proporcional pega a diferença do setpoint para o que foi lido e multiplica pela constante, e a derivada pega a variação das medições por exemplo a primeira medição foi 50 e a segunda 70 a derivada pega essa variação que é 20 e multiplica pela sua constante, que foi estabelecida por meio de testes, de acordo com o controle se estava muito "suave" ou dando muito "tranco".Tudo isso dentro de um determinado tempo que é estabelicido pelo deltaTime.

Se não entendeu sugiro que veja um outro vídeo, nesse vídeo você também aprenderá a "generalizar" seu PID, para que ele fique reutilizável.


É isso, duvidas ou sugetões tamo ae! XD



Nenhum comentário:

Postar um comentário