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:
para mover varios servos cada uno con su potenciometro se tiene que hacer en cada uno el promedio? salduos
ResponderEliminarpara mover varios servos cada uno con su potenciometro se tiene que hacer en cada uno el promedio? salduos
ResponderEliminarHow to login into the casino in 2021
ResponderEliminarHere 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