Boa noite galera,
Sou novo no fórum e se estiver criando errado o tópico me desculpe, me avisem que corrigirei.
Estou querendo fazer um projeto pra faculdade sobre uma elevatória de água, queria controlar a bomba através de um sensor ultrassônico hc-sr04 utilizando PID. Porém como ainda não domino muito bem a linguagem C do arduino, estou tendo umas dificuldade para adaptar a lógica. Realizei testes isolados com a bomba e com o sensor ultrassônico para aprender sobre cada um e montar a lógica PID com os 2, porém estou cometendo erros que não sei consertar.
Minhas dúvidas:
-
Não sei mexer em bibliotecas portanto estou realizando a logica de acordo com o que vejo de exemplos. A lógica básica de PID do arduino define os pinos 0 analógico e 3 digital PWN como entrada e saída respectivamente, e o sensor ultrassônico utiliza pinos digitais PWM (utilizei 4 e 5 para trigger e echo). Não sei como relacionar os dados vindos do ultrassônico para colocar no PID. Tentei algumas conversões para jogar os valores do Echo para a entrada analógica 0 porém sem sucesso.
-
Além de não conseguir realizar a tarefa anterior, ainda possuo o seguinte problema: a minha bomba possui tensão de operação de 7,5 V a 12 V. Estou controlando ela com um driver L298N Ponte H. Caso consiga a criação da lógica, ainda terá uma parte do range de saída do PID que não surtirá efeito na bomba. Quando o nível estiver próximo do setpoint, a tensão seria muito baixa para controlar a bomba e afetaria o processo.
Segue um exemplo da lógica que eu estava mexendo:
/********************************************************
* PID Basic Example for 12V Pump - By Edes
* Reading analog input 0 to control analog PWM output 3
* Esse exemplo foi adaptado para funcionar com uma bomba 12V,
* um driver L298N e um ultrassonico
********************************************************/
#include <PID_v1.h> //Carrega a biblioteca PID
#include <Ultrasonic.h> //Carrega a biblioteca do sensor ultrassonico
#define PIN_INPUT 0 //Define os pinos para Input e Output do PID
#define PIN_OUTPUT 3
#define pino_trigger 4 //Define os pinos para o trigger e echo do ultrasom
#define pino_echo 5
int IN1 = 7; //Saídas digitais 3 e 4 ligadas à entrada da Ponte H
int IN2 = 8;
//int variacV_PonteH = 6; //Saída PWM ligada à entrada da Ponte H p/ variação de tensão do motor
int cmMsec, inMsec; //variáveis de conversão e visualização no monitor serial
//Define Variables we'll be connecting to
double Setpoint, Input, Output;
//Specify the links and initial tuning parameters
double Kp=2, Ki=5, Kd=1;
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);
//Inicializa o sensor nos pinos definidos
Ultrasonic ultrasonic(pino_trigger, pino_echo);
void setup()
{
int val = analogRead(pino_echo);
val = map(val, 0, 255, 0, 1023);
analogWrite(PIN_INPUT, val);
//initialize the variables we're linked to
Input = analogRead(PIN_INPUT);
Setpoint = 512;
//turn the PID on
myPID.SetMode(AUTOMATIC);
//Inicializa Pinos da bomba/motor e Ponte H
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
//pinMode(variacV_PonteH, OUTPUT);
//Inicia a serial com um baud rate de 9600
Serial.begin(9600);
}
void loop()
{
Input = analogRead(PIN_INPUT);
myPID.Compute();
analogWrite(PIN_OUTPUT, Output);
//Motor
//Sentido Horario:
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
//Sensor Ultrassonico
//Le as informaçoes do sensor, em cm e pol
int cmMsec, inMsec;
long microsec = ultrasonic.timing();
cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);
inMsec = ultrasonic.convert(microsec, Ultrasonic::IN);
//Teste da saida do PID para a saida da bomba
//Output = variacV_PonteH;
//imprimi os valores no monitor serial:
Serial.print("Distancia em cm: ");
Serial.print(cmMsec);
// Serial.print(" - Distancia em polegadas: ");
// Serial.print(inMsec);
Serial.print(" - ");
Serial.print(Input);
Serial.print(" - ");
Serial.println(Output);
delay(500);
}
Como dito, eu não possuo muito conhecimento de Arduino, comecei a estuda-lo a pouco tempo e acabei me arriscando em algo um pouco mais complexo haha. Agradeço quem puder me ajudar. Até mais