Powered By Blogger

domingo, 19 de maio de 2013

Arduino PID - Controlando a velocidade de um ventilador




Arduino PID - FAN Control

Este post é um complemento do post anterior "Controle de velocidade com Arduino PID".

Desse modo não é necessário nenhum tipo de explicação teórica sobre o projeto a não ser nosso objetivo.


OBJETIVOS:

Queremos agora controlar a velocidade de uma unidade FAN (ventilador) de acordo com um sensor de posicionamento (que mede a distância relativa a  um anteparo).

Quanto maior a velocidade da FAN (maior a ventilação, quantidade de vento), mais longe estará o anteparo; quanto menor a velocidade da FAN (menor ventilação, quantidade de vento), mais perto estará o anteparo.

Para isto utilizei um pêndulo formado por um anteparo superior que coleta o vento da FAN e um anteparo inferior que se moverá em relação ao sensor de distância. Assim, é possível controlar a unidade FAN com a técnica PID e usando o Arduino como controlador e o  FrontEnd_PID como interface gráfica.



Abaixo os detalhes do circuito e os detalhes construtivos.

O sketch utilizado no Arduino é o mesmo do post anterior (http://arduinobymyself.blogspot.com.br/2013/04/controle-de-luminosidade-com-arduino-pid.html)... visite este post para poder ver todos os detalhes.

Este é o link para download do sketch:
http://www.4shared.com/file/Y5BIbUdR/LED_PIDcontroller_2.html

Vejam os vídeos para maiores detalhes.



Interconexão do Arduino com os outros componentes

Esquema do Driver do motor DC (FAN)
Para o driver foi usado um MOSFET IRF-250.
O diodo em paralelo com o motor é um BY-127.
O capacitor é de 100 nF.
Cuidado com o sentido de rotação do motor (para o sistema ser ventilador  e não exaustor).

Esquema do sensor de distância com o TCRT5000, este sensor deve ser analógico!


FOTOS REAIS:

O material utilizado para construir a estrutura metálica é uma tira de metálica perfurada, que pode sem encontrada em casa de materiais de construção em pequenos rolos.
É só dobrar para formar a estrutura.
Use sua imaginação para construir conforme sua necessidade.

A fonte é de 5/12 V e 10A

O motor DC deve ser de alta rotação e ter um bom torque.
Usei um de máquina de cortar cabelos (das de qualidade).

Fonte externa de 5V e 12V/10A

Estrutura metálica e pendulo com os anteparos

Arduino, Driver do motor DC e potenciômetro de ajuste do "Setpoint"

Estrutura metálica e sensor de distância

Driver do motor DC com o MOSFET IRFP-250

Detalhe do driver

Estrutura metálica

Detalhe do pêndulo em ação e da torre do FAN

Sensores: são 3 mas foi utilizado somente o central (esse éra de um seguidor de linha)

Detalhe da torre e do motor DC do FAN
Notar que foi utilizado material de garrafa PET para confeccionar o anteparo superior e a hélice do FAN.
Para construir a hélice, marque dois circulos (unidos), utilize uma moeda de 1 real, recorte e então dobre pelas pontas para dar este formato:       \___ 
                                                                                                     \
e do outro lado faça no modo contrário... pronto feito a hélice.
                                                                 

Detalhe da Hélice

Vista geral do conjunto

Vista geral do conjunto (frente)

Vista geral do conjunto (superior)

Vista geral do conjunto (parte de trás)

Vista geral do conjunto (lateralmente)



VÍDEOS:

Atenção!
Agora o Blog está mudando para a língua Inglesa, tentando alcançar outros continentes.
Desculpe pelo transtorno.
Qualquer dificuldade entre em contato.

Visite meu novo site em:
http://www.instructables.com/id/ArduinoPID-FAN-Controller/

Dúvidas e sugestões para: arduinobymyself@gmail.com
http://youtu.be/stxiWXFUf2Y

http://youtu.be/IqzPXTjiRvQ

http://youtu.be/CVNB4Wrq82g

http://youtu.be/lS7MZwqZ2k4







sexta-feira, 26 de abril de 2013

Controle de Luminosidade com Arduino PID





Controle de luminosidade utilizando controlador PID (proporcional Integral Derivativo).


Controlador proporcional integral derivativo, controlador PID ou simplesmente PID, é uma técnica de controle de processos que une as ações derivativa, integral e proporcional, fazendo assim com que o sinal de erro seja minimizado pela ação proporcional, zerado pela ação integral e obtido com uma velocidade antecipativa pela ação derivativa.
É baseado na resposta da modelagem matemática de uma malha de processo a ser controlada.
Na prática os PID são encontrados no interior de controladores eletrônicos chamados "single-loop", muitas vezes com microprocessadores, e também através de software em Controladores programáveis e outros equipamentos de controle.

Neste projeto, vamos simular um controle de luminosidade com Arduino, rodando a biblioteca PID que pode ser encontrada no site:


Para isso necessitamos baixar além da biblioteca PID para o Arduino, também o PID Front-End para processing, que é uma interface gráfica para podermos configurar os parâmetros: P, I, D, Set Point, modos de trabalho, etc...; fazendo a interface com o Arduino.
Você pode baixar o Front-End no link acima.

Como vamos trabalhar com Arduino e Processing, necessitamos ter a IDE 1.0.1 do arduino e o Processing 2.0b8 instalados no computador.
Para o Processing, precisamos da biblioteca ContorlP5 para processing instalada. Baixe a biblioteca no site:


Para mairoes detalhes sobre controle PID de processos, aconselho a visitarem o site do criador da Biblioteca PID_V1.


E o site do Control Guru para maiores detalhes sobre automação e controle.

Vamos agora aos aspectos construtivos do nosso projeto:

Faremos dois testes; um com o ambiente simulado por um tubo escuro, que não admite interferência externa, e o outro aonde poderemos interferir externamente e verificar a resposta do sistema.

Teste - 1
O ambiente será simulado por um tubo negro, com um LED Branco brilhante em uma das pontas (para iluminar o "ambiente") e um LDR na outra ponta (para podermos gerenciar a quantidade de luminosidade no "ambiente").
A ligação com o arduino é muito simples:
Pino D3 (como output) ligado ao LED que tem um resistor de R220 para controlar a corrente.
Pino A0 ligado ao LDR que tem um resistor de pull-down de 10K.

Abaixo o circuito desenhado com o fritzing e fotos reais do sistema.

Entre o LED e o LDR existe um tubo preto vedado, simulando ambiente totalmente escuro


Detalhe do tubo preto (foi utilizado um carretel de linha, vedado por dois passadores de fios de borracha

Detalhe do lado LED

Detalhe do lado LDR


Teste - 2

Agora o ambiente pode sofrer ações externas,chamados de distúrbios do nosso sistema, tais como: sombras e ou luz excessiva no ambiente.
Os distúrbios serão automaticamente controlados pelo Arduino PID.

Outro detalhe é que o valor do Setpoint, é controlado por um potenciômetro, não sendo mais necessário usar o Setpoint do PID_FrontEnd.

Abaixo o circuito desenho em fritizing e as fotos reais do sistema.


Controle do SetPoint feito pelo potenciômetro



Controle via Software:

1 - Descarregar e descompactar as bibliotecas;
PID_V1 no diretório de bibliotecas da IDE do Arduino
Front-End PID, em uma pasta no seu micro
ControlP5, no diretório de bibliotecas do Processing

2 - Iniciar a IDE do Arduino e abrir o arquivo "PID_FrontEnd_ArduinoSampleCode" da pasta PID_FrontEnd.
Enviar este scketch para o arduino.

3 - Iniciar o Processing e abrir o arquivo "PID_FrontEnd_v03" da pasta PID_FrontEnd.
Executar a aplicação.

Abaixo algumas figuras:


Pastas pertencentes ao PID_FrontEnd.

O arquivo PID-FrontEnd_v03, deve ser aberto no Processing e executado

O arquivo PID_FrontEnd_ArduinoSampleCode, deve ser aberto na IDE do Arduino e enviado

IDE Arduino e Processing, é só enviar e executar.


Ao executar a aplicação no Processing, a janela PID_FrontEnd irá abrir.

SetPoint = 950, Kp=0,01, Ki=0,28 e Kd=0


Nesta janela, podemos notar:
TOGGLE_AM - muda o modo para automático PID ou manual;
SETPOINT - valor desejado de luminosidade no ambiente;
INPUT - valor real de luminosidade do ambiente (medido pelo LDR e retornado como feedback medido no pino A0);
OUTPUT - valor de controle retornado pelo Arduino como controlador PID (controle de luminosidade do LED no pino D3);
KP - constante de controle proporcional;
KI - constante de controle Integral;
KD - Constante de controle Derivativo;
TOOGLE_DR - muda a direção (se a saída cresce conforme cresce a entrada ou o inverso);
SEND_TO_ARDUINO - enviar os dados para o arduino;

PID Input/Setpoint - Janela gráfica das curvas setpoint (valor desejado de luminosidade) e entrada (medida de luminosidade do LDR)
PID Output - Janela gráfica da curva de saída de controle do LED

Linha verde = Set Point SP; Linha Vermelha = Variável Controlada PV; Linha Azul = Variável Manipulada MV

Nesta figura, podemos notar o setpoint configurado para 950 (linha verde), a variável de entrada (linha vermelha) sofrendo o controle PID e a variável de saída (linha azul) para controle da luminosidade.


Podemos entender também as informações descritas acimas através de um diagrama de blocos (figura abaixo).
Onde podemos notar o que o Error = SP - PV e o erro é aplicado ao controlador PID que gera a MV para o controle do processo.

Cada controlador P, I, e D pode ser utilizado independentemente, ou de forma conjunta, tal como:
Controlador P (muito utilizado)
Controlador PI (muito utilizado)
Controlador PD (raramente utilizado)
Controlador PID (o mais usado)



Exemplo de Controlador PI com realimentação direta








Aqui nesta figura, observamos uma variação no valor do setpoint (de 950 para 700 e para 950) e a atuação do controle PID em cima da variável de entrada.
Vejam que houve um pouco de oscilação no controle (característica de cada sistema controlado, de primeira ou segunda ordem).



Para o segundo teste, vamos enviar para o Arduino, o sketch abaixo:
(este será usado em lugar do arquivo "PID_FrontEnd_ArduinoSampleCode")

http://www.4shared.com/file/Y5BIbUdR/LED_PIDcontroller_2.html

Lembrando que o controle do Setpoint é feito pelo potenciômetro.
Como fonte de distúrbio, podemos usar uma lanterna para incidir mais luz ou um anteparo para fazer sombra no LDR.
Ao temos um distúrbio no processo (por exemplo sombra), o controlador irá aumentar/diminuir a luminosidade do LED para tentar manter a saída sob controle e no nível estabelecido pelo SetPoint (no caso de fazer uma "sombra no LDR, o controlador irá aumentar a intensidade de luz do LED), poderemos ver estas variações no PID_FrontEnd de forma gráfica.

Abaixo algumas figuras relacionadas.

Kp=0, Ki=10, Kd=0 -- aplicação de disturbio e variações no SP

Kp=0, Ki=10, Kd=0 -- aplicação de disturbio (com bloqueio e sem bloqueio)


A seta indica a mudança de parametros Kp=0,01; Ki=0,28; Kd=0 (notar que a atuação ficou mais lenta e com menos overshoot)
 Ao testar os parametros, foi verificado um comportamento semelhante para os dois testes.



Vídeos explicativos:

Dúvidas e sugestões para: arduinobymyself@gmail.com



http://youtu.be/Y267-qba12M





No Próximo Projeto, irei apresentar mais um exemplo de controle PID
Aguardem!






domingo, 17 de março de 2013

LINUSBot - Line Follower Robot - Controle PID






LINUSBot - Controle PID


Este é um complemento do primeiro posto do LINUSBot.

Agora o controle dos movimentos do seguidor de linha é com PID; controle Proporcional, Integral, Derivativo. Isso torna os movimentos durantes as curvas muito mais suave e durante as retas, ele pode desenvolver maior velocidade, chegando à velocidade máxima.
O controle PID proporciona ao Robot uma "aprendizagem", fazendo com que o robot possa desenvolver melhor nas curvas e retas do circuito.

Agora vamos a uma breve introdução e resumo sobre o controle PID.
Basicamente, este tipo de controlador efetua as seguintes ações:


Sistema PID básico


1 - Controle Proporcional:
Multiplica o "erro" corrente por uma constante Kp.
O "erro", é a diferença entre a saída real e a saída desejada e é realimentado no sistema, ou seja: 
A saída real é subtraída da saída desejada (set point), assim, é calculado o erro.  Esse erro é inserido no controlador PID como entrada, e o controlador PID (calculando os termos P I D), comanda o sistema para tentar eliminar esse erro.
Garantindo assim o ganho necessário para chegar próximo do sinal de saída desejado o mais rápido possível e com a melhor estabilidade do sistema.

2 - Controle Integral:
O termo Integral, multiplica o erro corrente e sua duração por uma constante Ki, fazendo uma somátorio de toda essa informação.
O termo Integral quando somado ao termo Proporcional; acelera o processo de chegar ao estado estacionário do seu sistema, além de proporcionar um sinal mais próximo da saída desejada. Em outras palavras, ele também elimina (ou pelo menos tenta eliminar) a parcela residual de erro e chega mais rápido ao resultado desejado.


3 - Controle Derivativo:
O termo Derivativo, faz com que a razão de mudança do sinal de erro seja multiplicada por uma constante Kd. A intensão é predizer o erro e assim diminuir a taxa com que os erros produzem mudanças no sistema.



Podemos usar os 3 termos juntos para formar um controlador PID, ou suas variaçãoes, tais como:


Controlador P (algumas vezes utilizado):
Neste caso o uso de pequenos vlores da constante Kp é a melhor maneira de conseguir chegar ao valor desejado, mas o seu controle será lento (ele demora pra chegar ao valor desejado).  Se você aumentar o valor de Kp, sobre-impulsos podem ocorrer e o seu sistema ficará estável.



Controlador PI (mais usado):

Ele remove a parcela residual de erro no caso estacionário (melhorando a resposta a transientes), mas neste caso você poderá ter sobre-impulso e também inversão de estado, ocorrendo oscilação do sistema e causando instabilidade, podendo o sistema ser sobre-amortecido,  ou sub-amortecido, ou oscilatório.
Este tipo de controle deixa o sistema mais lento. Usando valores maiores de Ki, é possível deixar o sistema mais rápido, porem aumenta o sobre-impulso diminuíndo a margem de estabilidade do seu sistema.


Controlador PD (raramente utilizado):
Usado para diminuir a magnetude do sobre-impulso dos sistemas que usam Controlador Integral e melhorar a estabilidade do sistema. Porém o controle Derivativo, amplifica a magnetude de ruído do termo de erro do sistema e pode deixar o processo instável. O controlador PD diminui o tempo para chegar ao valor desejado, consideravelmente.... para isso o ganho derivativo Kd deve ser alto. Isso diminui o tempo de controle, porém aumenta a largura de banda do sistema, deixando o sistema susceptível a ruídos.


Controlador PID (algumas vezes utilizado):
Usando PID (combinação de PI+PD), removemos a razão de erro do sistema e diminuímos  o tempo da resposta com uma resposta transistória razoável (sem oscilações ou instabilidades).


Este estudo pode ser encontrado no link: http://www.youtube.com/watch?v=wbmEUi2p-nA




Esta é  o modo básico de implementação de um PID via software:


previous_error = 0
integral = 0 
start:
  error = setpoint - measured_value
  integral = integral + error*dt
  derivative = (error - previous_error)/dt
  output = Kp*error + Ki*integral + Kd*derivative
  previous_error = error
  wait(dt)
  goto start


Veja Mais em: http://en.wikipedia.org/wiki/PID_controller

No projeto do LINUSBot, foi usado os seguintes parãmetros:
Kp = 1/20 
Ki  = 1/10000
Kd = 3/2

O código completo pode ser baixado do link:



http://www.4shared.com/file/iPVAVCwy/LINUSBot_9_3pi_modelo_PID.html


Obtenha todos os arquivos necessários no GitHub:
https://github.com/Arduinobymyself/LINUSBot.git


Veja o vídeo do LINUSBot em ação e confira os resultados.

http://www.youtube.com/watch?v=FKq6WeBBH14




Dúvidas e sugestões para: arduinobymyself@gmail.com





sábado, 16 de março de 2013

CUBO de LEDs 3x3x3






CUBO de LEDs 3 x 3 x 3


Bem vindos!
Este é o meu primeiro projeto do Cubo de LEDs 3x3x3.
Este projeto foi baseado no projeto do colega GZIP: "LED Cube and Arduino Lib".
Vá até o site http://www.instructables.com/id/LED-Cube-and-Arduino-Lib/?ALLSTEPS,
Neste site, você encontrará todos os detalhes de construção do Cubo de LEDs e ainda a bibliotéca para Arduino com código exemplo.

No meu caso, eu tenho dois programas com diferentes efeitos para o Cubo de LEDs e diferentes estilos de programação.

O primeiro sketch ativa a comunicação serial e imprime o nome do efeito que está sendo executado.

O segundo sketch tem novos efeitos, usando uma outra codificação. Este código foi baseado no projeto do nosso colega "Stringstretcher" e pode ser encontrado no link abaixo.

http://www.instructables.com/id/3X3-LED-Cube-Programming-tips-Arduino-based/?ALLSTEPS

Os códigos e a bibliotéca, podem ser baixados diretamente do 4shared:


http://www.4shared.com/file/O4NfNmJw/MyLEDCube_1.html
http://www.4shared.com/file/yz2Oma8p/MyLEDCube_4.html


http://www.4shared.com/zip/GfdglOVq/LedCube.html


Todos os aquivos necessários estão aqui:

https://github.com/Arduinobymyself/LEDCube3x3x3.git

DIAGRAMA:




Detalhes de ligação dos pinos do arduino na placa de LEDs

VÍDEO:

Abaixo o vídeo de funcionamento do cubo de LED.
Está em Ingles, pois o blog está migrando para o site "Instructables".

Espero que gostem.
Qualquer dúvida entrem em contato e façam seus comentários no youtube e no blog.

Dúvidas e sugestões para: arduinobymyself@gmail.com

Obrigado a todos.

http://www.youtube.com/watch?v=IEv1FGR6Yhc






FOTOS: