Hola muy Buenos días :)
Aquí me tienen nuevamente con otra entrada muy interesante, para la implementación del proyecto, utilizamos la tarjeta de Arduino Uno.
Espero que sea de su interés y claro lo mas importante, que les sea de gran utilidad para la realización de algún trabajo similar :)
Ball and Beam |
El sistema de ball and beam (bola y viga) es uno de los sistemas mas importantes para el estudio de los sistemas de control. Muchos métodos de control clásico y moderno se han utilizado para estabilizar el sistema de ball and beam.
Una bola se coloca sobre una viga (figura siguiente), donde se le permite rodar con 1 grado de libertad a lo largo de la longitud de la viga. Un brazo de palanca esta unido a la viga en un extremo y del otro extremo un servomotor. A medida que el servomotor gira en un ángulo , la palanca cambia el ángulo de la viga por un ángulo .
Cuando el ángulo se cambia desde la posición horizontal, la gravedad hace que la bola ruede a largo de la viga.
Sistema Ball and Beam |
Material
Arduino Uno |
Servomotor * Un balin (tamaño pequeño) * Una viga (yo adapte dos reglas pequeñas pegandolas de los costados con forma de V) |
Una vez explicado como funciona el sistema ball and beam, procedo a mostrarles el código implementado en Arduino.
Código Arduino
//Programa Ball and Beam
//Adriana Manzanárez
///////////////////////////////
#include <Servo.h>
Servo myservo; // Creamos el objeto servo.
const int numReadings = 15;
int readings[numReadings];
int index = 0;
int total = 0;
int input = 0;
int angle = 0; //Variable del servomotor.
int kp= 10;//2.4 //Ganancia Proporcional
float ki = 3.3;//1.7 - 2.4 //Ganancia Integral
float kd = 17; //3.3 -2.6 //Ganancia Derivativa
float Pterm = 0;
float Iterm = 0;
float Dterm = 0;
int t = 10;
int error = 0;
int setpoint = 0;
float val_1 = 0;
float val_2 = 0;
float delta = 0;
float aceleracion = 0;
int inputPin = 0; // Declaramos la entrada analogica
void setup(){
//Serial.begin(9600);
for (int thisReading = 0; thisReading < numReadings; thisReading++ )
readings[thisReading] = 0;
myservo.attach(9);
}
void loop(){
val_1 = analogRead(inputPin); //Lee el valor del pin analogico
val_1 = map(val_1,77, 810, -366, 3669) ; // 0, 1023, 0, 17//77, 810, -366, 366
delay(t);
val_2 = analogRead(inputPin); //Lee el valor del pin analogico
val_2 = map(val_2,77, 810, -366, 366) ;
delta = delta + val_2 - val_1; //Se calclula la posición de delta.
aceleracion = delta/t; //Se calcula la aceleración del balin
total = total - readings[index]; // Sustrae la última posición
readings[index] = analogRead(inputPin); // Es leido desde el sensor
total = total + readings[index]; //Agrega la siguiente posición.
index = index + 1; //Establece la siguiente posición.
if (index <= numReadings)
index = 0;
input = total/numReadings; //Calcula el promedio
input = map(input, 77, 810, -366, 366); //Se crea una regresión lineal.
error = input - setpoint; // Calculamos el error.
Pterm = error * input; //Calculamos el valor proporcional
Iterm = input; //Calculamos el valor integral.
Dterm = aceleracion; // Calculamos el valor derivativo.
angle = (kp*Pterm) + (ki*Iterm) + (kd*Dterm); //Multiplicamos el controlador PID con las ganancias del PID
angle = map(angle, -366, 366, 100, 125);
Serial.print ("Pocisión del Balin = ");
Serial.print (input,DEC);
Serial.print ("Ángulo del Servomotor = ");
Serial.print (angle,DEC);
Serial.print ("Error = ");
Serial.print (error,DEC);
myservo.write(angle);
delay(t);
}
Dejen comentarios si tienen alguna duda o sugerencias :) Muchas gracias por leerme!!! <3
Que tengan un gran día
.
-La única diferencia entre un buen y mal día es tu actitud.-Dennis S. Brown.