viernes, 30 de octubre de 2015

Ball and Beam

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 $\theta$, la palanca cambia el ángulo de la viga por un ángulo  $\alpha$.
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.



4 comentarios:

  1. Un buen proyecto de control sigue asi y ojala puedas subir mas proyectos :)

    ResponderBorrar
    Respuestas
    1. Muchas gracias Julio ☺ y si, seguire subiendo mas proyectos. ������

      Borrar
  2. siii 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

    ResponderBorrar
  3. hola que tipo de sensor usaste para saber la posición de la pelota?

    ResponderBorrar