“The White Box” – A cheap resource, simple, portable and useful for teaching PID controllers tuning.

“The White Box” – A cheap resource, simple, portable and useful for teaching PID controllers tuning.

Installation is extremely simple. Do you need a resistor, an LDR, and RGB LED. To manage together an Arduino Nano (compatible). There are two “moments” of the program:

first – the calibration mode, where it determines the brightness reading range with LED RGB completely off and then fully activated (255);

second – chosen the reference value (setpoint), and given the proportional gain, the integral time constant and the derivative time constant, simply run the code.

A picture of breadboard inside “white box”.

White box basic code (to Arduino IDE ):

// Blink LED RGB em LDR – Para fazer Exemplo de Controle PI em Malha Fechada em Estrategia Feedback
// por RDPF em 26 de maio de 2015
// leitura LDR com caixa fechada: (669/1024)*5V -> com LED RGB no MAXIMO
// leitura LDR com caixa fechada: (1013/1024)*5V -> com LED RGB desligado
// Variáveis EM RELAÇÃO INVERSA !

float setpoint=750; float erro=0.; float acao=0.; float somaerro=0.0; float taui=1.0;
float kc = 10.0;

long int memo=0;

int leitura=0; // declares leitura as INT

void setup() {
// inicializa os pinos 3, 6 e 9 como saida
pinMode(3, OUTPUT); // Red
pinMode(6, OUTPUT); // Green
pinMode(9, OUTPUT); // Blue
Serial.begin(9600);

}

// the loop function runs over and over again forever
void loop() {

long time = millis();
int calibra=2; //calibra=1 liga , =2 desligado

while (calibra==1){ // IF CALIBRA==1 CALIBRATION ON
int cor=255;

analogWrite(3, cor);
analogWrite(6, cor);
analogWrite(9, cor);
delay(50);

int leitura=0;
leitura=analogRead(A0);

Serial.println(leitura);

}

// Fim da Secção de Calibração
// END CALIBRATION

leitura=0;

for (int k=1;k<21;k++){
leitura=leitura+analogRead(A0);
delay(10);
}

float leitura2=(float)(leitura)/20;
erro= (float) leitura2-setpoint;

somaerro=somaerro+erro;

if (somaerro>500.)

{ somaerro=0.0;}

float acaop= kc*erro;

float acaoi=kc*somaerro/taui;

acao= acaop+acaoi;

//saturation filter
if (acao>255.){
acao=255.;
}
if (acao<0.){
acao=0.;
}

analogWrite(3, acao); // turn the LED on (HIGH is the voltage level)
analogWrite(6, acao); // turn the LED on (HIGH is the voltage level)
analogWrite(9, acao); // turn the LED on (HIGH is the voltage level)
long time2 = millis();

Serial.print(time2); // Print tempo
Serial.print(“,”);
Serial.print(leitura); // Print voltagem ( *5V/1024)
Serial.print(“,”);
Serial.print(setpoint); // Print voltagem ( *5V/1024)
Serial.print(“,”);
Serial.print(kc); // Print voltagem ( *5V/1024)
Serial.print(“,”);
Serial.println(acao); // Print Sinal da Acao

}

Esse post foi publicado em Uncategorized. Bookmark o link permanente.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s