domingo, 9 de junio de 2013

Mejora en el control de movimiento de un servomotor utilizando teoría básica de control discreto


Resumen:

A continuación se presenta  un informe sobre la utilización de control discreto con el fin de mejorar la respuesta de un servomotor a la señal de control aplicada por medio de un potenciómetro. Para la implementación del sistema de control de eligió la tarjeta de desarrollo “Arduino uno”, por ser una plataforma de desarrollo libre y de muy fácil uso.    


Procedimiento:
En primer lugar, se implementó un sistema sin control alguno, es decir, que la señal del potenciómetro de aplico directamente al servomotor. Tal como se muestra en el código siguiente, el cual fue grabado en la tarjeta.

//****************************************************************************
#include <Servo.h>


Servo servo1;
int lectura;

void setup(){
  servo1.attach(3);
  Serial.begin(9600);
}

void loop() {
//Se lee la señal del potenciómetro.
  lectura = analogRead(A0);
// Se escala la señal de 1024 niveles a 180 grados.
  lectura = map(lectura, 0, 1023, 0, 179);
//  Se establece el valor del servo. 
  servo1.write(lectura);
//Se envia la lectura por el puerto serial
  Serial.println(lectura, DEC);
//  Reardo que establece la frecuencia de muestreo.
  delay(30);
}
//****************************************************************************


·         Resultado preliminar: Al probar el código anterior se obtuvo como resultado un movimiento errático del servomotor debido al ruido propio del potenciómetro. El cual se puede evidenciar en el siguiente gráfico, obtenido de los datos del puerto serial. 

Control: Es necesario hacer énfasis en que para esta aplicación en específico, estamos limitados a la utilización de un sistema de control a laso abierto, ya que no disponemos de una forma de medir directamente la posición del servomotor. Esto podría solucionarse con la inclusión de un giroscopio en el servomotor, pero esto supondría un gasto innecesario.  

La función de transferencia del control propuesto es la siguiente:

Que se conoce con el nombre de “Moving Average Filter” y consiste en esencia  en realizar un promedio de las muestras para obtener la salida.
Veamos entonces  como se implementó esta función de transferencia en Arduino:
El orden elegido fue N = 5, al expandir la función de transferencia obtenemos:



Con lo que se implementó el siguiente código:


//****************************************************************************
#include <Servo.h>

Servo servo1;
int lectura[5];
int N = 5;

void setup(){
  int i;
  servo1.attach(3);
  Serial.begin(9600);
  for(i=0;i<N;i++)
    lectura[i] = 0;
}

void loop() {
 
  int i,suma,promedio,salida;
 
//Se lee la señal del potenciómetro.
  for(i=0;i<N-1;i++)
    lectura[i] = lectura[i+1]; 
  lectura[N-1] = analogRead(A0);
  suma = 0;
  for(i=0;i<N;i++)
    suma += lectura[i];
  promedio = suma/N;
// Se escala la señal de 1024 niveles a 180 grados.
  salida = map(promedio, 0, 1023, 0, 179);
//  Se establece el valor del servo. 
  servo1.write(salida);
//Se envia la lectura por el puerto serial
  Serial.println(salida, DEC);
//  Reardo que establece la frecuencia de muestreo.
  delay(30);
}
//****************************************************************************



Obteniendo un movimiento suave como el siguiente:


Implementos utilizados:

·        Tarjeta Arduino uno: 

·        Potenciómetro:


Servomotor:












3 comentarios:

  1. para mover varios servos cada uno con su potenciometro se tiene que hacer en cada uno el promedio? salduos

    ResponderEliminar
  2. para mover varios servos cada uno con su potenciometro se tiene que hacer en cada uno el promedio? salduos

    ResponderEliminar
  3. How to login into the casino in 2021
    Here is herzamanindir how to do this: Step 1. Go to the website. · nba매니아 Click on the “Login” link on the right-hand side. · Click on the “Login” button to enter a https://vannienailor4166blog.blogspot.com/ live chat number. https://octcasino.com/ · Enter the

    ResponderEliminar