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.
Un buen proyecto de control sigue asi y ojala puedas subir mas proyectos :)
ResponderBorrarMuchas gracias Julio ☺ y si, seguire subiendo mas proyectos. ������
Borrarsiii sigue asi intentare hacer un proyecto similar veraz soy aprendiz en esto y porfa no se si me pudieses ayudar en la realizacion de un pequeño proyecto que me encargaron... es sobre la obtencion de las señales de sonido que percibe el medio ambiente por medio de programacion en simulink y obtener solo su grafica si sabes algo al respecto y me puedas ayudar te lo agradeceria mucho tu eres master en esto ;) saludos y nuevamente gracias
ResponderBorrarhola que tipo de sensor usaste para saber la posición de la pelota?
ResponderBorrar