Você é meu novo herói Ivan, muito obrigado pela disposição em ensinar esse processo do PID, de fato não encontrei em nenhum lugar uma explicação que chegue próxima a sua. Muito obrigado mesmo, estava procurando isso a muito tempo. Sucesso em seu canal. Ganhou mais um inscrito.
Muito boa tua aula.. Trabalho com automação industrial, utilizo CLPs, normalmente uso 20 a 25 laços PIDs em cada máquina, PID é sempre confuso, vc colocou de uma forma didática bem compreensível ..... Estou começando arduino, estou gostando dos trekinhos...
Em geral quando alguém tenta ensinar PID ou acaba não conseguindo passar os fundamentos corretamente, ou complica tanto que acaba deixando tudo muito confuso. Seus vídeos são muito bons, pois conseguem transmitir esse conhecimento de uma forma bem simples e de fácil assimilação. Parabéns!
Ivan, Depois que você deixou em formato de classe, onde eu insiro o setPoint? Ou seja, a temperatura que eu quero que fique. Devo inserir dentro da classe ou no void loop? Outra dúvida que gostaria de tirar com você é sobre qual tipo de dispositivo eu devo usar pra acionar um circuito de alta voltagem utilizando o PID, já que a saída é pwm não conseguiria utilizar um relé por exemplo, que é só liga-desliga.
Boa noite Ivan, cara não tinha percebido mais teu código possui um erro... A parte do Derivativo você está pegando o valor do erro em relação da saída anterior com a atual... até ai ok... porém se você montar o diagrama de blocos, vai perceber que o "D" fica abaixo do "PI"... no entanto a tua saída fica pid= P+I-D, pois é um controle PI-D... Se você estivesse pegando o erro da entrada, aí sim seria um controle PID somado (P+I+D)... Você pode confirmar no Ogata - Engenharia de controle moderno 5°ed - pg 542 (figura8.26) você encontrará o diagrama de blocos com o D subtraído. Mas parabéns pela explicação, muito bom!
Oi amigo parabéns pela iniciativa. Teria algum projeto prático para implementar PID com Arduíno ? Não precisa ser complexo é só para aprender o conceito.
Ivan muito obrigado por desmistificar o PID da minha mente hahaha, gostei muito da sua forma de ensinar e por fim já estou inscrito no seu canal. Parabéns pelo video.
Olá, gostaria de agradecer bastante por sua explicação. Foi o único vídeo em que consegui entender o como funciona o algoritmo PID, já havia assistido outros mas não consegui entender como funcionavam os cálculos. Parabéns pela simplicidade e por ter compartilhado estes conhecimentos com outras pessoas...👏👏
Oie Ivan, muito obrg pelo teu video. Queria te fazer uma pergunta. Acho que falta uma parte no teu codigo. A variavel de controle co controlePwm = P+I+D + 50... nao esta faltando pasar ela para 0-255, que vai ser a saida analogica PWM? Nao esta faltando um map (controlePwm Min,Max,0,255)? Si estiver certo ..... qual seria entao o MAX e o MIN desa proporcao ? Muito obrg
Olá Ivan, obrigado pelo trabalho que está disponibilizando para nós, é realmente muito interessante. O que eu gostaria de saber é que IDE é esta que você está usando e se é free, gostei muito, Obrigado!
9 лет назад+3
Parabéns. Está muito bem explicado. Tão bem que além de aprender PID, também aprendi classe =] Muito obrigado.
Muito bom o vídeo, didática absurda! Tenho uma pergunta, um vez q o 'I' e o 'D' tem essa relação com a variação de tempo, vi outros videos mostrando que seria o valor /detaTime e não *deltaTime (dividido e nao multiplicado). se me puder ajudar ja agradeço, no I e D, divide ou multiplica pelo tempo?
Olá, ótimo video, primeira vez q entendo o que é PID...rsrs...mas ficou uma dúvida quanto as constantes kI kD e kP, há alguma forma de calcula-las ? em meio ao controle de ummotor?
D=Kd *[ d e(t) / dt ] .Remember that PID is a discrete regulator when is executed in a digital system as a processor .It's impossible to reduce the timing near 0 because you call it every cycle time or in itnerrupt timer where the timing is always more then zero .Pratically the derivative is the angular coefficient of the rect which is tangent to the curve between two cycle ....
Ola *****! Gostaria de saber como faço para testar essa rotina PID. Pois estou testando ele aqui no Proteus através do simulador para o Arduino e nao estou obtento a onda PWM na saida. Pois estou utilizando um potenciômetro para simular meu sensor, setpoint = 20, kp =30 e uma das saidas PWM do uC, mas mesmo assim nao consigo obter a onda, o que poderia ser?
Cara você é muito fera! Ainda não entendo que tem gente que ainda não gosta. Você é 10. Cara queria fazer um pedido: continue com suas vídeo aulas cara, ajuda muito mesmo.
Cara boa noite! estou tendo controlar um um sistema de irrigação por PID mas não estou conseguindo acionar a bomba....poderia ver o que falta no meu código? preciso apresentar esse trabalha na sexta a noite dia 15/06/2018...estou desesperado....estou usando um Arduíno, ponte H, sensor de umidade e bomba de 5v. Por favor me ajude....
Outra coisa, descobri um erro: aonde está D = (lastSample - sample) * kD / deltaTime; lastSample = sample; na verdade deve ser D = (lastSample - error) * kD / deltaTime; lastSample = error;
Olá, Ivan. Baixei sua classe PID para utilizar num projeto, mas ao chamar meuPid.process() este só retorna "nan". Fui tentando descobrir o problema e acho que o motivo é a primeira chamada da classe. Na parte I, o I depende de um I anterior, que ainda não recebeu qualquer valor, só foi instanciado. No caso da parte D ela precisa da lastSample, que ainda não existe também na primeira chamada. Como a parte e I e D são variações, só faz sentido chamar a partir da segunda amostra pelo menos, certo? Como posso corrigir isso?
Caro Ivan, parabéns véi, mas dá uma força aí ? com eu faço pra controlar a velocidade de um motor dc usando PID e o arduino, sensor optico e encoder, parecido com o controle que vc faz com o robô Bob no primeiro vídeo que explica o que é PID ??? na vdd que usar ainda o labview junto ao arduino e os demais componentes, mas fazer isso usando só o arduino ja é um grande avanço.
O loop executa 10000 vezes por segundo, gostei do vídeo. Fiquei em duvida com a derivada, vi alguns artigos dizendo que era a variação do erro multiplicado pela constante e você apenas tirou a diferença entre a leitura atual e a ultima. É isso mesmo?
Boa tarde Ivan,Estou tentando utilizar o seu código com um giroscópio, e estou tendo muitas dificuldades, vc conseguiria me ajudar?O meu giro se fixa em 89°, e tbm fiquei em duvida aonde eu devo seta o meu set point.
Gostaria de cumprimenta-lo pela clareza e simplicidade pra apresentação dos conceitos. Contudo fiquei na dúvida quanto a correção do derivativo pois a ação de correção é maior quanto mais rápida for a variação do erro, o que não consegui entender na equação proposta.
Ola, Estou pegando a manha agora de arduino e tentando e fazendo alguns projetos. No momento eu ainda estou brincando com leds e gostaria de saber como fazer um programa para um cubo 4*4*4 porque eu ja baixei alguns, mas gostaria de fazer o meu proprio projeto, como fazer obrigado
Boa noite , tenho um trabalho para TCC na faculdade que preciso programar um PID no arduíno uno para controle de temperatura tendo um sinal de entrada de 0 a 20 ma e preciso enviar um sinal de saída de 0 a 20ma, alguém poderia me ajudar ?
esse código pode ser usado em qualquer tipo de controle, no caso só mudaria as variáveis? estou tentando fazer um controlador para um imã eletromagnético poderia usa essa estrutura de código ?
Uma dúvida: a derivada não seria a variação do erro dividido pela variação do tempo? Meio que o contrário da Integral, q é o somatório do erro vezes o tempo?
Ivan seidel muito boa videoaula mias poderia me tirar uma duvida estou fazendo um drone quadricóptero e queria aplica pid na programação esse escript q vc fez serviria como base pra um escript pra um quadricóptero, caso n , poderia me da uma ajuda ??? agradeceria sua resposta
ciao Ivan If you want to regulate a slow system as a temperature in a long inertial answer , you can do what are you doing .But don't forget , PID has to be called everytime for a fixed time .In my esperience I have used always PID control from interrupt handler to get sincronous controls .My job is to develop and write PLC program for industrial automation and control system .After more then 15 years in this sector I can tell you that there are different ways to control but if you want to get a good and stable regulation you must to call PID in a fixed time.I saw you get deltatime by millis() , but this valure changes every cycle ;) Where do you live exactly in Brasil ? I was in POA , Caxias,Garibaldi ...more or less 10 years ago , for work .....I saw Gramado , Canela ...I love RS
error = setpoint - measured_value integral = integral + error*dt derivative = (error - previous_error)/dt output = Kp*error + Ki*integral + Kd*derivative previous_error = error Normally for a temperature regulation is enough the P.I. regulation because the derivative may produces noise and bad regulation .The derivative is used for fast regulation for example each 10 mS to regulate flow or positioning ect Try this code and you will see that is not the mesma coisa ;) Saudos de Italia
Walter Porcellini Hi Walter (again) rs, Check out the final version of the code posted in the description. It is bug-free. I use to record the video, and forget things during it. That's why I usually "fix" and post the code separatedly. The video is to explain the working thing, the code, to support the understanding.. Saudos do Brasil
Ivan, não sei se alguém te falou isso e não tenho total certeza se estou certo,porque estou começando agora no arduino. As leituras dos sensores analógico não são de 0 até 1023, sendo assim tendo 1024 "estados" ?
Não entendo porque as pessoas assistem os vídeos procurando erros e não em aprender a função. O "erro" que você cita esta como forma de comentário, e nem pode se dizer um erro, e sim um engano, acontece. No código esta perfeitamente certo.
Acredito que para a derivada, termo D, se divide pelo tempo entre as duas leituras e não multiplica, visto que o conceito de derivada é taxa de variação.
ciao Ivan , just some considerations ..... if you want to get a P.I.D. controls which works in a right way you have to implement it in a interrupt routine handler function You have to set a timer to have for example 100 mS of time to regulate a temperature or more , it depends by the inertial of the system you want to regulate.The derivative component is the variation of the error between now and the last cycle and not between the last temperature and the actual temperature .For the integral part is important to call the pid at same time because the integral as you know is the area calculated as sum of each small rectangle with base 100mS in this case .Anyway in your case you just call the PID in your project but if I have other job to do it means the deltatime will be different eac cycle because it depends by the proram flow .Finally you made a good job , just I would like to say it's possible to increase the professionality ;) saudos
Walter Porcellini Hello Walter, Thanks for the tips, but actually, Using a timer is just a way to regulate the dT value, so that each step has an equal ammount of weight on the PID. In the video, as you can see (actually, the code without bugs posted in the description), that we regulate the Derivative and the Integral with the Delta Time. In this way, we don't actually have to set an very specific timing for the PID, and it will just work even if we increase/decrease the time step. The reason why I did this, is mainly because you can't count with the dT being fixed, and if it varies then kD and kI would have to change depending on the interval... Best, and saudos ;)
Ivan! Vi seu vídeo de novo hoje (pra “roubar” sua explicação pra minha aula de PID 😜) e acabei percebendo um errinho: a parte de geração do termo derivativo (D, no seu código) deveria ser divida por deltaTime, e não multiplicada. É a derivada do erro no tempo: kD*d(error)/dt. Fora isso, excelente explicação e ótimo vídeo! Grande abraço!
Felipe! isso é vdd, algumas pessoas me falaram isso quando fiz upload e acabei inserindo um texto flutuante por cima do video porem ele foi removido como feature do youtube, dai deixei o código de exemplo na descrição e um comentario dizendo que está errado haha é um erro que vai me assombrar pra sempre rs
vlw por compartilhar, sabe onde consigo apostila ou livro pra consegui programa arduino+pid+temperatura+lcd+rele, nao tenho achado nada sobre o assunto 0800. ou me da uma luz sobre é feito, fiz um projeto que faz a leitura sem pid mas nao ficou bom por causa da temperatura nao fica estável "aceitável".
Please take in mind that the derivative portion should be divided by the sample time instead of multiplied. Furthermore the 'lastSample' should be subtracted from the 'sample' instead of vice versa. Since e' = de/dt ≈ Δe/Δt = (e - e_last)/dt
Hi Tom! Yes... Someone pointed me that too! I added a note to the video fixing that. About the lastSample-sample, it is only a matter of changing the constants (-1, 1..) But will add another note too! Thanks
PARABÉNS, IVAN. Cara nunca mais fez mais videos, ele são muito importantes, vc tem uma boa didática e sabe passar com transparência o assunto, aprendi muito com seus video, eu realmente espero que vc continue.
Ivan, tenho uma dúvida sobre sintonia. Pesquisando na internet eu cheguei ao método Ziegler e nichols. Porém os resultados de TI e TD ficaram com TI=440 e TD=79. Nesta situação onde acontecem estes valores de tempo altos, como eu implemento no seu algoritmo ? OBS: chamada a cada 1 segundo travado!
Amigo, o vídeo é muito instrutivo e me ajudou muito, parabéns! Todavia, queria apontar que a equação da derivativa está errada! Primeiro que não se trata da variação do sample (Sampleatual - SampleAnterior) e sim da variação do ERRO (ErrorAtual - ErrorAnterior). Segundo, a fórmula da derivativa é DIVIDIDA pelo deltaTime e não multiplicada. Bom, espero poder ajudar a você e a todos que pretendem programar um controlador PID na plataforma Arduino!
Corrigindo, a primeira pode ser utilizada o sample SIM! E esqueci de frisar um terceiro ponto: a equação do PID também está errada, a correta é PID = P + kP*I + kP*D
Muito bom! Explicou as entranhas básicas, aritméticas, do controle PID sem jogar código enrolado e sem fazer uso de 'libraries' pré-montadas (como as PID_**.h). Parabéns!
muito legal, como sugestão talvez colocar o set point como uma entrada analógica para esclarecer a duvida do pessoal que tem problemas co o set point, pelo demais muito bom, parabens
Ivan; Poderia falar sobre a comunicação entre arduino e Software SCADA (Indosoft ou SCADABR) usando o protocolo Modbus e rede RS-485. O que acha? Seria de grande ajuda. Grande Abraço.
Marcus Aurélio Silva Pereira Bacana! Está na lista... preciso de tempo livre, e tédio em casa para fazer o próximo vídeo, os dois eu até tenho, mas juntos é dificil rsAbraços
Ivan, parabéns pelo vídeo e pela forma simples que vocês explicou o PID. Gostaria de utilizar sua biblioteca, porém o link gist.github.com/ivanseidel/b1693a3be7bb38ff3b63 não está funcionando. Poderia fornecer um novo link para biblioteca do PID por favor?
Primeiramente, parabéns pelo vídeo. Você explica muito bem. Gostaria de lhe perguntar, se tens algum código de auto sintonia do PID, como PSO, por exemplo? Se tiver, ficaria muito grato se pudesse compartilhar. Kariston.alves@gmail.com
Olá vi o vídeo pela primeira vez, não tinha intendido muita coisa, mais após estudar e rever o vídeo, hoje consegui implementar meu código com sucesso para controle de estufa, valeu ! Funcionando 100% !
Olá Ivan, Muito bom o video. Acredito que faria mais sentido processar o sample já dentro da função addNewSample. Desta forma não é necessário array de samples e o valor não se perde caso não seja processado, e com isso ter uma função que apenas retorne o valor de PID, ou mesmo um atributo.
bfx Cabral o nome é SublimeText. Ele é apenas um BOM editor de texto, específico para Programação. Se instalar o plugin "Stino", ele também suporta o upload do código pela própria IDE, sem necessitar do software padrão do Arduino
Amigo... apenas um comentário sugestivo... eh necessário um filtro digital na parte derivativa para não amplificar os erros provenientes de um sinal que tem uma variação rápida ou para eventual descontinuidade...
Eu gostei bastante da explicação, mas no seu exemplo somente foi utilizado o erro para a tomada da temperatura. Sendo que a derivada e a integral estão inutilizadas pela inicialização da constante. Para esta situação a temperatura não estaria "quicando" a cada tomada, já que o PID é justamente para evitar isso?
Olá +Acao Saber, o vídeo mostrou a forma de "implementar" o PID. Até expliquei como se faz para "tunar" ou "ajustar" ele de maneira bem rápida, mas minha intenção era o de mostrar o funcionamento. Quanto a ficar "Quicando", isso vai depender MUITO do atuador e também do sensor. Proporcionalmente, sensor + lento e atuador + lento = + "quiques", mas isso não é constante ;)
Você é meu novo herói Ivan, muito obrigado pela disposição em ensinar esse processo do PID, de fato não encontrei em nenhum lugar uma explicação que chegue próxima a sua. Muito obrigado mesmo, estava procurando isso a muito tempo. Sucesso em seu canal. Ganhou mais um inscrito.
Muito boa tua aula.. Trabalho com automação industrial, utilizo CLPs, normalmente uso 20 a 25 laços PIDs em cada máquina, PID é sempre confuso, vc colocou de uma forma didática bem compreensível .....
Estou começando arduino, estou gostando dos trekinhos...
Em geral quando alguém tenta ensinar PID ou acaba não conseguindo passar os fundamentos corretamente, ou complica tanto que acaba deixando tudo muito confuso. Seus vídeos são muito bons, pois conseguem transmitir esse conhecimento de uma forma bem simples e de fácil assimilação. Parabéns!
+Hélvio Albuquerque Obrigado =)
Concordo
Faltou apenas dividir a parcela derivativa por deltaTime em vez de multiplicar. No mais, é bom vídeo.
Ivan,
Depois que você deixou em formato de classe, onde eu insiro o setPoint? Ou seja, a temperatura que eu quero que fique. Devo inserir dentro da classe ou no void loop?
Outra dúvida que gostaria de tirar com você é sobre qual tipo de dispositivo eu devo usar pra acionar um circuito de alta voltagem utilizando o PID, já que a saída é pwm não conseguiria utilizar um relé por exemplo, que é só liga-desliga.
Boa noite Ivan, cara não tinha percebido mais teu código possui um erro... A parte do Derivativo você está pegando o valor do erro em relação da saída anterior com a atual... até ai ok... porém se você montar o diagrama de blocos, vai perceber que o "D" fica abaixo do "PI"...
no entanto a tua saída fica
pid= P+I-D,
pois é um controle PI-D...
Se você estivesse pegando o erro da entrada, aí sim seria um controle PID somado (P+I+D)...
Você pode confirmar no Ogata - Engenharia de controle moderno 5°ed - pg 542 (figura8.26) você encontrará o diagrama de blocos com o D subtraído.
Mas parabéns pela explicação, muito bom!
Can you add english subtittles please
OLA IVAN , OBRIGADO PELA AULA, VOU ESTUDA-LA, PRINCIPALMENTE A CALASSE ... BACANA . PARABENS
LUIZ
RJ
Oi amigo parabéns pela iniciativa.
Teria algum projeto prático para implementar PID com Arduíno ?
Não precisa ser complexo é só para aprender o conceito.
Ivan muito obrigado por desmistificar o PID da minha mente hahaha, gostei muito da sua forma de ensinar e por fim já estou inscrito no seu canal. Parabéns pelo video.
English subs please T_T
You are the only one who did a video about PID =.=
I'm bummed out too
Ivan, parabens!!! video aula sensacional!!! Ganhou mais um inscrito.
Olá, gostaria de agradecer bastante por sua explicação. Foi o único vídeo em que consegui entender o como funciona o algoritmo PID, já havia assistido outros mas não consegui entender como funcionavam os cálculos. Parabéns pela simplicidade e por ter compartilhado estes conhecimentos com outras pessoas...👏👏
The best PID tutorial on youtube by far, so easy to understand!
Vídeo Muito bom, vou tentar implementar o PID em um CLP.
Oie Ivan, muito obrg pelo teu video. Queria te fazer uma pergunta. Acho que falta uma parte no teu codigo. A variavel de controle co controlePwm = P+I+D + 50... nao esta faltando pasar ela para 0-255, que vai ser a saida analogica PWM? Nao esta faltando um map (controlePwm Min,Max,0,255)? Si estiver certo ..... qual seria entao o MAX e o MIN desa proporcao ? Muito obrg
Olá Ivan, obrigado pelo trabalho que está disponibilizando para nós, é realmente muito interessante.
O que eu gostaria de saber é que IDE é esta que você está usando e se é free, gostei muito, Obrigado!
Parabéns. Está muito bem explicado. Tão bem que além de aprender PID, também aprendi classe =] Muito obrigado.
Muito bom o vídeo, didática absurda!
Tenho uma pergunta, um vez q o 'I' e o 'D' tem essa relação com a variação de tempo, vi outros videos mostrando que seria o valor /detaTime e não *deltaTime (dividido e nao multiplicado). se me puder ajudar ja agradeço, no I e D, divide ou multiplica pelo tempo?
O melhor video que já vi sobre PID na prática! Parabéns Ivan! Muito bom! Muito obrigado pelo seu tempo.
Boatarde, nossa, sua aulo é otima, me tira uma duvida tem como com esse codigo no lugar dosensor de temperatura , colocar um giroscopio?
Olá, ótimo video, primeira vez q entendo o que é PID...rsrs...mas ficou uma dúvida quanto as constantes kI kD e kP, há alguma forma de calcula-las ? em meio ao controle de ummotor?
"Já procurou no Google?" Ivan Seidel - 25/06/2014
Faz um PID com o controlador dht22 fica bacana.
gracias por este tutorial... muy buena explicacion/Obrigado por este tutorial ... muito boa explicação
gracias +José Manuel Estrada Figueroa =)
D=Kd *[ d e(t) / dt ] .Remember that PID is a discrete regulator when is executed in a digital system as a processor .It's impossible to reduce the timing near 0 because you call it every cycle time or in itnerrupt timer where the timing is always more then zero .Pratically the derivative is the angular coefficient of the rect which is tangent to the curve between two cycle ....
Mto legal. Parabéns e obrigado.
Ola *****! Gostaria de saber como faço para testar essa rotina PID. Pois estou testando ele aqui no Proteus através do simulador para o Arduino e nao estou obtento a onda PWM na saida. Pois estou utilizando um potenciômetro para simular meu sensor, setpoint = 20, kp =30 e uma das saidas PWM do uC, mas mesmo assim nao consigo obter a onda, o que poderia ser?
Cara você é muito fera! Ainda não entendo que tem gente que ainda não gosta. Você é 10. Cara queria fazer um pedido: continue com suas vídeo aulas cara, ajuda muito mesmo.
Cara boa noite! estou tendo controlar um um sistema de irrigação por PID mas não estou conseguindo acionar a bomba....poderia ver o que falta no meu código? preciso apresentar esse trabalha na sexta a noite dia 15/06/2018...estou desesperado....estou usando um Arduíno, ponte H, sensor de umidade e bomba de 5v. Por favor me ajude....
Olá, Ivan.
Como eu poderia implementar esse código para fazer o controle de velocidade de um motor DC?
Obrigado.
github.com/gabrieldep/Eris
Outra coisa, descobri um erro: aonde está D = (lastSample - sample) * kD / deltaTime;
lastSample = sample; na verdade deve ser D = (lastSample - error) * kD / deltaTime;
lastSample = error;
Em qual parte do código a variável "lastTemperature" está obtendo o valor da temperatura passada? 18:39
Excelente explicação!!! Obrigado pelo seu tempo e seu trabalho de divulgação de conhecimento.
Olá, Ivan. Baixei sua classe PID para utilizar num projeto, mas ao chamar meuPid.process() este só retorna "nan".
Fui tentando descobrir o problema e acho que o motivo é a primeira chamada da classe. Na parte I, o I depende de um I anterior, que ainda não recebeu qualquer valor, só foi instanciado. No caso da parte D ela precisa da lastSample, que ainda não existe também na primeira chamada. Como a parte e I e D são variações, só faz sentido chamar a partir da segunda amostra pelo menos, certo? Como posso corrigir isso?
Caro Ivan, parabéns véi, mas dá uma força aí ? com eu faço pra controlar a velocidade de um motor dc usando PID e o arduino, sensor optico e encoder, parecido com o controle que vc faz com o robô Bob no primeiro vídeo que explica o que é PID ???
na vdd que usar ainda o labview junto ao arduino e os demais componentes, mas fazer isso usando só o arduino ja é um grande avanço.
i dont understand......can u make the video in english...many useful information...but yet i dont understand..
Ivan, a Classe não poderia ficar em um arquivo separado ? obs: no código faltou o usuário especificar o setpoint. Abç
O loop executa 10000 vezes por segundo, gostei do vídeo. Fiquei em duvida com a derivada, vi alguns artigos dizendo que era a variação do erro multiplicado pela constante e você apenas tirou a diferença entre a leitura atual e a ultima. É isso mesmo?
Boa tarde Ivan,Estou tentando utilizar o seu código com um giroscópio, e estou tendo muitas dificuldades, vc conseguiria me ajudar?O meu giro se fixa em 89°, e tbm fiquei em duvida aonde eu devo seta o meu set point.
ahahaha , try to come in europe , in winter and then you will feel what is cool .San Paolo es muito perigosa cidade ;)
Muito bom, bem explicado, nem com meus professores entendi tão bem
Parabéns....
Gostaria de cumprimenta-lo pela clareza e simplicidade pra apresentação dos conceitos. Contudo fiquei na dúvida quanto a correção do derivativo pois a ação de correção é maior quanto mais rápida for a variação do erro, o que não consegui entender na equação proposta.
Ola, Estou pegando a manha agora de arduino e tentando e fazendo alguns projetos. No momento eu ainda estou brincando com leds e gostaria de saber como fazer um programa para um cubo 4*4*4 porque eu ja baixei alguns, mas gostaria de fazer o meu proprio projeto, como fazer obrigado
Boa noite , tenho um trabalho para TCC na faculdade que preciso programar um PID no arduíno uno para controle de temperatura tendo um sinal de entrada de 0 a 20 ma e preciso enviar um sinal de saída de 0 a 20ma, alguém poderia me ajudar ?
Nossa cara parabéns, muito útil, muito mesmo! Bela explicação, em ambos os vídeos sobre pid.
Can you help me! When simulated on proteus, there are not enough parameters to find the transfer function, such as motor DC encoder, what do you do?
esse código pode ser usado em qualquer tipo de controle, no caso só mudaria as variáveis? estou tentando fazer um controlador para um imã eletromagnético poderia usa essa estrutura de código ?
Uma dúvida: a derivada não seria a variação do erro dividido pela variação do tempo? Meio que o contrário da Integral, q é o somatório do erro vezes o tempo?
Ivan seidel muito boa videoaula mias poderia me tirar uma duvida estou fazendo um drone quadricóptero e queria aplica pid na programação esse escript q vc fez serviria como base pra um escript pra um quadricóptero, caso n , poderia me da uma ajuda ??? agradeceria sua resposta
ciao Ivan
If you want to regulate a slow system as a temperature in a long inertial answer , you can do what are you doing .But don't forget , PID has to be called everytime for a fixed time .In my esperience I have used always PID control from interrupt handler to get sincronous controls .My job is to develop and write PLC program for industrial automation and control system .After more then 15 years in this sector I can tell you that there are different ways to control but if you want to get a good and stable regulation you must to call PID in a fixed time.I saw you get deltatime by millis() , but this valure changes every cycle ;)
Where do you live exactly in Brasil ? I was in POA , Caxias,Garibaldi ...more or less 10 years ago , for work .....I saw Gramado , Canela ...I love RS
Walter Porcellini Nice!
I live in São Paulo, but I'm from Espírito Santo. RS is too cold! Consider visiting a warmer city next time =)
Best,
error = setpoint - measured_value
integral = integral + error*dt
derivative = (error - previous_error)/dt
output = Kp*error + Ki*integral + Kd*derivative
previous_error = error
Normally for a temperature regulation is enough the P.I. regulation because the derivative may produces noise and bad regulation .The derivative is used for fast regulation for example each 10 mS to regulate flow or positioning ect
Try this code and you will see that is not the mesma coisa ;)
Saudos de Italia
Walter Porcellini Hi Walter (again) rs,
Check out the final version of the code posted in the description. It is bug-free.
I use to record the video, and forget things during it. That's why I usually "fix" and post the code separatedly. The video is to explain the working thing, the code, to support the understanding..
Saudos do Brasil
Ivan, não sei se alguém te falou isso e não tenho total certeza se estou certo,porque estou começando agora no arduino. As leituras dos sensores analógico não são de 0 até 1023, sendo assim tendo 1024 "estados" ?
Isso mesmo, são 10 bits. 2^10 = 1024 estados possíveis, indo de 0 até 1023! Abraços
Não assiste o vídeo todo ainda, mas você errou no inicio ..a porta analógica vai de 0 - 1023
Não entendo porque as pessoas assistem os vídeos procurando erros e não em aprender a função.
O "erro" que você cita esta como forma de comentário, e nem pode se dizer um erro, e sim um engano, acontece.
No código esta perfeitamente certo.
0 é um estado, são 1023 + 1 (no caso 0 ) estados, logo 1024.
Acredito que para a derivada, termo D, se divide pelo tempo entre as duas leituras e não multiplica, visto que o conceito de derivada é taxa de variação.
ciao Ivan , just some considerations ..... if you want to get a P.I.D. controls which works in a right way you have to implement it in a interrupt routine handler function
You have to set a timer to have for example 100 mS of time to regulate a temperature or more , it depends by the inertial of the system you want to regulate.The derivative component is the variation of the error between now and the last cycle and not between the last temperature and the actual temperature .For the integral part is important to call the pid at same time because the integral as you know is the area calculated as sum of each small rectangle with base 100mS in this case .Anyway in your case you just call the PID in your project but if I have other job to do it means the deltatime will be different eac cycle because it depends by the proram flow .Finally you made a good job , just I would like to say it's possible to increase the professionality ;) saudos
Walter Porcellini Hello Walter,
Thanks for the tips, but actually, Using a timer is just a way to regulate the dT value, so that each step has an equal ammount of weight on the PID. In the video, as you can see (actually, the code without bugs posted in the description), that we regulate the Derivative and the Integral with the Delta Time. In this way, we don't actually have to set an very specific timing for the PID, and it will just work even if we increase/decrease the time step.
The reason why I did this, is mainly because you can't count with the dT being fixed, and if it varies then kD and kI would have to change depending on the interval...
Best, and saudos ;)
Acho que faltou no setup() fazer o carregamento do setPoint da classe.
Ivan! Vi seu vídeo de novo hoje (pra “roubar” sua explicação pra minha aula de PID 😜) e acabei percebendo um errinho: a parte de geração do termo derivativo (D, no seu código) deveria ser divida por deltaTime, e não multiplicada. É a derivada do erro no tempo: kD*d(error)/dt. Fora isso, excelente explicação e ótimo vídeo! Grande abraço!
Felipe! isso é vdd, algumas pessoas me falaram isso quando fiz upload e acabei inserindo um texto flutuante por cima do video porem ele foi removido como feature do youtube, dai deixei o código de exemplo na descrição e um comentario dizendo que está errado haha é um erro que vai me assombrar pra sempre rs
Neste video o cálculo do D está errado. não multiplica pelo deltaTime mas divide pelo deltaTime.
Será que posso uzar ele para fazer trabalhar dois servos para corrigir a posição de um foguete?
Very good video; helped me a lot. Can you do one about Karman filter please?
pinchi madre redo this in ENGLISH please
vlw por compartilhar, sabe onde consigo apostila ou livro pra consegui programa arduino+pid+temperatura+lcd+rele, nao tenho achado nada sobre o assunto 0800. ou me da uma luz sobre é feito, fiz um projeto que faz a leitura sem pid mas nao ficou bom por causa da temperatura nao fica estável "aceitável".
#define pinSensorA A0
int IN3 = 10 ;
int IN4 = 9 ;
void setup() {
pinMode(pinSensorA, INPUT);
Serial.begin(9600);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
analogWrite(IN4, 0);
}
void loop() {
Serial.println(pinSensorA);
float ki;
float kd;
ki=0;
kd=0;
float kp;
kp=0.25;
float leitura;
leitura = analogRead(A0);
float erroAnterior;
float erro;
float setpoint;
float tempoAnterior,tempoAtual, dt, de,d,i;
setpoint= 600;
erroAnterior = erro;
erro = setpoint - leitura;
float p = kp*erro;
tempoAnterior = tempoAtual;
tempoAtual = millis();
dt = tempoAtual - tempoAnterior;
i = i+ki*erro*dt;
de= erro-erroAnterior;
d = kd*de/dt;
Serial.println(d);
if (i>80) i=80;
if (i 255) velocidade=255;
if (velocidade < 0) velocidade=0;
Serial.println(velocidade);
analogWrite(IN3,velocidade);
}
Sou Leigo em programação :(
Please take in mind that the derivative portion should be divided by the sample time instead of multiplied. Furthermore the 'lastSample' should be subtracted from the 'sample' instead of vice versa. Since e' = de/dt ≈ Δe/Δt = (e - e_last)/dt
Hi Tom! Yes... Someone pointed me that too! I added a note to the video fixing that.
About the lastSample-sample, it is only a matter of changing the constants (-1, 1..) But will add another note too! Thanks
BOM DIA, GOSTARIA DE SABER ESSA IDE QUE VOCÊ ESTA UTILIZANDO, OBRIGADO.
Ainda não entendi o integrador,a variavel só aumenta e soma sem controle assim tendo uma saida erada....
What is the name of a software programmable video content?
muito bem expicado parabens. fa um desses com um sensor ultrasonico gostaria de entender
PARABÉNS, IVAN. Cara nunca mais fez mais videos, ele são muito importantes, vc tem uma boa didática e sabe passar com transparência o assunto, aprendi muito com seus video, eu realmente espero que vc continue.
Ivan, tenho uma dúvida sobre sintonia.
Pesquisando na internet eu cheguei ao método Ziegler e nichols.
Porém os resultados de TI e TD ficaram com TI=440 e TD=79. Nesta situação onde acontecem estes valores de tempo altos, como eu implemento no seu algoritmo ?
OBS: chamada a cada 1 segundo travado!
Amigo, o vídeo é muito instrutivo e me ajudou muito, parabéns! Todavia, queria apontar que a equação da derivativa está errada! Primeiro que não se trata da variação do sample (Sampleatual - SampleAnterior) e sim da variação do ERRO (ErrorAtual - ErrorAnterior). Segundo, a fórmula da derivativa é DIVIDIDA pelo deltaTime e não multiplicada. Bom, espero poder ajudar a você e a todos que pretendem programar um controlador PID na plataforma Arduino!
Corrigindo, a primeira pode ser utilizada o sample SIM! E esqueci de frisar um terceiro ponto: a equação do PID também está errada, a correta é PID = P + kP*I + kP*D
Muito bom! Explicou as entranhas básicas, aritméticas, do controle PID sem jogar código enrolado e sem fazer uso de 'libraries' pré-montadas (como as PID_**.h). Parabéns!
The d time seems not correct. You multiply but i see the math need divite the delta time
muito legal, como sugestão talvez colocar o set point como uma entrada analógica para esclarecer a duvida do pessoal que tem problemas co o set point, pelo demais muito bom, parabens
Ivan;
Poderia falar sobre a comunicação entre arduino e Software SCADA (Indosoft ou SCADABR) usando o protocolo Modbus e rede RS-485. O que acha?
Seria de grande ajuda.
Grande Abraço.
Marcus Aurélio Silva Pereira Bacana! Está na lista... preciso de tempo livre, e tédio em casa para fazer o próximo vídeo, os dois eu até tenho, mas juntos é dificil rsAbraços
Olá Ivan você pode me falar qual e esse programador que você esta usando para digitar o código para Arduino ?
Olá Willian, o nome é "Sublime Text", e o plugin para o Arduino se chama "Stino"
sim..qual é a IDE?
Parabéns Mestre!! Excelente vídeo!
muito, muito bom Ivan. gostei muito da sua didatica. desconfio que vou aprender logica fuzzy em arduino com vc. ja esto procurando os videos. rsrs
Eu tô fazendo um pid de controle de nível de tanque e queria a sua ajuda
gostei muito do seu video será que você poderia me dar uma ajuda com um codigo ??
Ivan, parabéns pelo vídeo e pela forma simples que vocês explicou o PID. Gostaria de utilizar sua biblioteca, porém o link gist.github.com/ivanseidel/b1693a3be7bb38ff3b63 não está funcionando. Poderia fornecer um novo link para biblioteca do PID por favor?
qual o melhor arduino para se trabalhar mega-yun-uno?
Primeiramente, parabéns pelo vídeo. Você explica muito bem. Gostaria de lhe perguntar, se tens algum código de auto sintonia do PID, como PSO, por exemplo? Se tiver, ficaria muito grato se pudesse compartilhar. Kariston.alves@gmail.com
O que é necessário mudar para utilizar com um termopar K ligado na Max6675?
Boa tarde, Ivan
está de parabéns, estou fazendo o TCC e funcionou direitinho.
Ivan, ví alguns vídeos q demonstravam uma aplicação de PID para seguidor de linha, mas como eu sei quanto vale meu erro em um seguidor de linha ?
Olá vi o vídeo pela primeira vez, não tinha intendido muita coisa, mais após estudar e rever o vídeo, hoje consegui implementar meu código com sucesso para controle de estufa, valeu ! Funcionando 100% !
E quando ocorre overflow em deltaTime?
Esse seu PID não tem efeito anti wind-up?
Ola amigo vc poderia responder qual o nome desse site que vc falou que hospedaria esse código desde já agradeço.
Derivada é taxa de variação, não a variação...
cara quanto vc cobra pra escrever um codigo pra min??
Olá Ivan, Muito bom o video. Acredito que faria mais sentido processar o sample já dentro da função addNewSample. Desta forma não é necessário array de samples e o valor não se perde caso não seja processado, e com isso ter uma função que apenas retorne o valor de PID, ou mesmo um atributo.
Qual programa você está usando para escrever o código? Se for o software do arduino, você poderia me passar as configurações? Está bem mais eficiente.
bfx Cabral o nome é SublimeText. Ele é apenas um BOM editor de texto, específico para Programação. Se instalar o plugin "Stino", ele também suporta o upload do código pela própria IDE, sem necessitar do software padrão do Arduino
Qual IDE você está usando?
Pode me mandar um e-mail de contato para tirar um duvida ?
Amigo... apenas um comentário sugestivo... eh necessário um filtro digital na parte derivativa para não amplificar os erros provenientes de um sinal que tem uma variação rápida ou para eventual descontinuidade...
Isso evita aquelas “tremidas” na prática
show.....sua didática é muito boa ...parabéns ....
Eu gostei bastante da explicação, mas no seu exemplo somente foi utilizado o erro para a tomada da temperatura. Sendo que a derivada e a integral estão inutilizadas pela inicialização da constante. Para esta situação a temperatura não estaria "quicando" a cada tomada, já que o PID é justamente para evitar isso?
Olá +Acao Saber, o vídeo mostrou a forma de "implementar" o PID. Até expliquei como se faz para "tunar" ou "ajustar" ele de maneira bem rápida, mas minha intenção era o de mostrar o funcionamento. Quanto a ficar "Quicando", isso vai depender MUITO do atuador e também do sensor. Proporcionalmente, sensor + lento e atuador + lento = + "quiques", mas isso não é constante ;)