Tengo que agregarle a un circuito de control PID, el funcionamiento de un motor de 9v. Tengo que programar la velocidad de giro y dirección usando un transistor (2n2222, TIP120, o cualquiera que recomienden), potenciómetro y Arduino. Adjunto el código de la primera parte (control PID con 3 potenciómetros).
Gracias por leer, espero respuestas. URGENTE
// Definir pines de entrada
const int potPin1 = A0; // Potenciómetro 1 conectado a A0
const int potPin2 = A1; // Potenciómetro 2 conectado a A1
const int potPin3 = A2; // Potenciómetro 3 conectado a A2
// Definir pines de salida
const int outPin1 = 3; // Salida PWM 1 en el pin 3
const int outPin2 = 5; // Salida PWM 2 en el pin 5
const int outPin3 = 6; // Salida PWM 3 en el pin 6
// Ganancia proporcional
float Kp = 1.0;
//Ganancia derivativa
float Kd = 0.5;
//Ganancia Integral
float Ki = 0.5;
// Tiempo de muestreo
float Tm = 1.0;
// Variable para almacenar el error anterior
float previousError2 = 0.5;
// Error Integral
float previousError3 = 1.0;
float Integral = 0.0;
// Valor constante para el error
void setup() {
// Inicializar comunicación serie a 9600 baudios
Serial.begin(9600);
// Configurar pines de salida
pinMode(outPin1, OUTPUT);
pinMode(outPin2, OUTPUT);
pinMode(outPin3, OUTPUT);
}
void loop() {
// Leer valores de los potenciómetros (0-1023)
int potValue1 = analogRead(potPin1);
int potValue2 = analogRead(potPin2);
int potValue3 = analogRead(potPin3);
//error del proporcional
float error1 = map(potValue1,0,1023,0,255);
// Mapear el valor del potenciómetro 2 (0-1023) a un rango de error deseado
float error2 = map(potValue2, 0, 1023, 0, 255);
// Mapeo Potenciometro 3 (integral)
float error3 = map(potValue3, 0, 1023, 0, 255);
// Calcular la señal de control usando el error constante para outPin1 (proporcional)
int controlSignal1 = Kp * error1;
// Calcular la derivada del error
float derivative2 = (error2 - previousError2);
// Calcular la señal de control derivativa
float controlSignal2 = Kd / Tm * derivative2;
// calcular señal de control integral
Integral = (previousError3 + error3) / 2.0;
float controlSignal3 = Ki * Integral * Tm;
// Asegurarse de que la señal de control para outPin1 esté en el rango 0-255 (Proporcional)
controlSignal1 = constrain(controlSignal1, 0, 255);
// Asegurarse de que la señal de control para outPin1 esté en el rango 0-255 (Derivativo)
controlSignal2 = constrain(controlSignal2, 0, 255);
// Asegurarse de q la señal de control para pot3 esté en el rango (Integral)
controlSignal3 = constrain(controlSignal3, 0, 255);
// Generar salidas analógicas (PWM)
analogWrite(outPin1, controlSignal1);
analogWrite(outPin2, abs(controlSignal2));
analogWrite(outPin3, abs(controlSignal3));
// Enviar valores al monitor serie
Serial.print("\t");
Serial.print(controlSignal1);
Serial.print("\t");
Serial.print(controlSignal2);
Serial.print("\t");
Serial.print(potValue3);
Serial.print("\t");
Serial.println(controlSignal3);
previousError2 = error2;
previousError3 = error3;
// Esperar 1000 ms antes de la próxima lectura
delay(Tm * 1000);
}