Control PID de un Balancin con Arduino

Control PID de un Balancin con Arduino

Práctica: Control PID de un Balancín

Objetivos:

  • Controlar la posición angular de un balancín utilizando un controlador PID.
  • Medir la posición angular del balancín mediante un potenciómetro.
  • Implementar el control PID utilizando Arduino para estabilizar el balancín.

Materiales:

  • Arduino Uno.
  • Balancín (sistema de inclinación).
  • Driver Puente H (L298 o similar).
  • Potenciómetro de 10 kΩ.
  • Motor DC con hélice para aplicar fuerza en uno de los extremos del balancín.
  • Contrapeso para equilibrar el otro extremo del balancín.

Descripción del Sistema:

El balancín será controlado por un motor DC con hélice ubicado en uno de sus extremos, mientras que un potenciómetro conectado al eje de rotación del balancín medirá su inclinación. Para mantener el balancín en una posición específica, se implementará un controlador PID que ajuste la velocidad del motor en función del error entre la posición medida y la posición deseada. Un contrapeso en el lado opuesto de la hélice facilitará el movimiento del balancín.

 

Diagrama de Conexión (No Simulación):

  1. Potenciómetro:
    • Conectar el potenciómetro al eje de rotación del balancín para medir la posición angular.
    • Los pines del potenciómetro deben conectarse a 5V, GND, y la salida del cursor al pin A0 del Arduino.
  2. Motor DC:
    • El motor DC con hélice debe colocarse en uno de los extremos del balancín.
    • Controlar el motor a través del driver L298, conectando el pin Enable del driver al pin 9 del Arduino para manejar la señal PWM.
  3. Contrapeso:
    • Colocar un contrapeso en el extremo opuesto al motor para equilibrar el balancín, facilitando el control de la posición angular.

Código Arduino:

#include <PID_v1.h>

// Variables para el potenciómetro y control PWM
int valorPot;         // Variable que almacena el valor del potenciómetro
int pwm1;             // Valor de la señal PWM para controlar el motor
int pinPWM = 9;       // Pin PWM para controlar el driver L298 (Enable)

// Definición de las variables para el control PID
double posicion, Setpoint, Output, error;

// Ajuste de los parámetros del controlador PID
double Kp = 1, Ki = 0.1, Kd = 0.23;

// Inicialización del controlador PID
PID myPID(&posicion, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);

void setup() {
  Setpoint = 130;  // Posición de referencia del balancín (valor de tensión en el potenciómetro)

  pinMode(pinPWM, OUTPUT);  // Configurar el pin PWM como salida

  // Inicializar la lectura del potenciómetro
  posicion = analogRead(A0);  

  // Iniciar la comunicación serial para monitoreo
  Serial.begin(9600);  

  // Activar el modo automático del controlador PID
  myPID.SetMode(AUTOMATIC);
}

void loop() {
  // Leer la posición actual del balancín desde el potenciómetro
  posicion = analogRead(A0);

  // Calcular el error entre la posición deseada y la actual
  error = Setpoint - posicion;

  // Calcular la salida del PID
  myPID.Compute();

  // Convertir la salida del PID a un valor de PWM adecuado (0-255)
  pwm1 = map(Output, 0, 1024, 0, 255);

  // Enviar la señal PWM al motor a través del driver L298
  analogWrite(pinPWM, pwm1);

  // Mostrar los valores en el monitor serial para monitoreo
  Serial.print("Posición: ");
  Serial.println(posicion);
  
  Serial.print("Error: ");
  Serial.println(error);
  
  Serial.print("Salida PID: ");
  Serial.println(Output);
  
  Serial.print("PWM: ");
  Serial.println(pwm1);
  
  Serial.println("--------------------");

  delay(100);  // Pequeño retardo para estabilizar las lecturas
}

Explicación del Código:

  1. Lectura del Potenciómetro: El potenciómetro mide la posición angular del balancín, que se lee a través del pin A0 y se almacena en la variable posicion.
  2. Control PID: El controlador PID se encarga de ajustar la velocidad del motor según el error entre la posición deseada (Setpoint) y la posición medida. El resultado del cálculo del PID se convierte a un valor PWM (0-255) que se envía al motor.
  3. Salida PWM: La salida del PID se mapea a un valor de PWM para controlar la velocidad del motor. Este valor se utiliza para ajustar la potencia entregada al motor a través del pin 9 del Arduino y el driver L298.
  4. Monitor Serial: Se envían datos al monitor serial para visualizar la posición actual, el error, la salida del PID y el valor PWM aplicado al motor, permitiendo así monitorear el comportamiento del sistema en tiempo real.

Conclusión:

Este proyecto utiliza un controlador PID para estabilizar la posición angular de un balancín, midiendo su inclinación mediante un potenciómetro y ajustando la velocidad de un motor DC en función del error de posición. La implementación del PID permite un control suave y preciso, adaptándose a los cambios en la posición del balancín.

 

 

CÓDIGO ARDUINO

#include <PID_v1.h>

int valorpote;     //Variable que recoge el valor del potenciómetro

int pwm1;          //Variable del PWM 1

int pin2=9;   //Entrada 2 del L293D  al Enable salida PWM

//Define Variables we’ll be connecting to

double posicion, Setpoint,Output, error;

//Specify the links and initial tuning parameters

double Kp=1, Ki=0.1, Kd=0.23;

PID myPID(&posicion, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);

void setup(){

Setpoint = 130; //posicion referencia   Voltalje

pinMode(pin2,OUTPUT);

posicion = analogRead(0);

Serial.begin(9600);  //Iniciamos la comunicación con el puerto monitor serial

myPID.SetMode(AUTOMATIC);

}

void loop(){

posicion = analogRead(0);

error = Setpoint – posicion;

//  valorpote=analogRead(1);

myPID.Compute();

//Timer1.pwm(salidaPWM, Output,1000);

pwm1 = map(Output, 0, 1024, 0, 255);

// int ancho=50;

analogWrite(pin2,pwm1);

Serial.println(«x»);

Serial.println(posicion);

Serial.println(error);

Serial.println(Output);

Serial.println(pwm1);

Serial.println(«x»);

}

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *