Você está na página 1de 22

Control PID de Barra y Bola con Arduino - Estud... http://roble.

uno/control-pid-barra-y-bola-arduino/

Control PID de Barra y Bola con Arduino


18 Agosto, 2015 111 Comments

Es fcil entender el Control PID estudiando un sistema Barra y Bola y utilizando como Controlador un Arduino. El objetivo es situar la bola en el centro de la barra inclinndola de forma conveniente mediante
un lazo cerrado de control.

Control PID de Barra y Bola con Arduino

Vdeo Resumen de 5 minutos:

001 Control PID de Barra y Bola con Arduino

Sistema Barra y Bola

Es un sistema clsico en la Ingeniera de Control.

Mediante un Sensor de distancia, medimos la posicin de la bola.


Con un Controlador, mediante control PID, calculamos el ngulo en el que deberamos inclinar la barra para colocar y estabilizar la bola en el centro de la barra.
Un Actuador modica la inclinacin de la barra.

1 de 22 10/04/17 12:04
Control PID de Barra y Bola con Arduino - Estud... http://roble.uno/control-pid-barra-y-bola-arduino/

Sistema Barra y Bola

Sensado de la posicin de la Bola

La realizamos mediante el sensor de distancia mediante luz infrarroja y detector PSD: SHARP GP2Y0A21.

Sensor SHARP

Tiene un rango de medida de 6 a 80 cm. Funciona con 5V y su salida es una tensin relacionada con la distancia medida mediante esta curva caracterstica:

Curva Sensor SHARP

Si la Bola se acerca ms de 6cm al sensor, la medida es errnea. Limitamos el movimiento de la bola en esa distancia.

Freno

Acondicionamiento de la seal del sensor

Para ltrar (paso bajo) la seal del sensor y tener una seal ms precisa y repetitiva, conectaremos un condensador electroltico de 10F entre la salida del sensor y tierra.

Efecto del condensador de ltrado

Como la tensin mxima que vamos a medir es de 3,1V, conguraremos la referencia de tensin del Arduino a 3,3V mediante la instruccin:

2 de 22 10/04/17 12:04
Control PID de Barra y Bola con Arduino - Estud... http://roble.uno/control-pid-barra-y-bola-arduino/

analogReference(EXTERNAL);

y conectaremos el pin AREF con la salida de 3,3V del Arduino:

Conexin de la Referencia Analgica a


la salida de 3,3V

De esta forma, los 1024 puntos que nos proporciona el Conversor Analgico Digital de 10 bit del Arduino tendrn un fondo de escala de 3,3V en lugar de los 5V por defecto. As, incrementamos la resolucin
de 5mV/ADC a 3mV/ADC.

Calibracin del sensor

Para relacionar la tensin proporcionada por el sensor con la distancia en centmetros, desplazaremos la bola por la barra tomando nota de la lectura en ADC. En el Software desarrollado para el Arduino, se
incluye un modo de funcionamiento en el que transmite continuamente las lecturas del sensor por el puerto serie:

if(0){// Para calibrar sensor de Distancia


Serial.print(dist);
Serial.print("mm ADC: ");
Serial.println(measure);
}

Con 9 puntos a lo largo de la barra es suciente. Obtenemos la curva de calibracin del sensor.

Calibracin del Sensor de distancia

que en el Software queda denida como:

int dcal [] = { // Calibracion de ADC a Distancia


-193, -160, -110, -60, 0, 40, 60, 90, 120};
int ADCcal [] = {
177, 189, 231, 273, 372, 483, 558, 742, 970};

y para transformar las lecturas ADC del sensor, almacenadas en la variable measure, en la posicin en mm de la variable dist, aplicamos el siguiente algoritmo:

for(int i =0; i<8; i++){ // Aplicamos curva de Calibracion de ADC a mm


if (measure >= ADCcal[i] && measure< ADCcal[i+1]){
dist = map(measure,ADCcal[i],ADCcal[i+1],dcal[i],dcal[i+1]);
}

La variable dist tiene valores negativos y positivos: -193mm en el extremo izquierdo de la barra, 120mm en el derecho y 0 en el centro. Como nuestro objetivo es dejar la bola en el punto central, esta variable
dist equivale al error utilizado en la bibliografa de sistemas de control PID.

3 de 22 10/04/17 12:04
Control PID de Barra y Bola con Arduino - Estud... http://roble.uno/control-pid-barra-y-bola-arduino/

Actuador

Inclinaremos la barra con un Servo HEXTRONIK HX5010 de 6,9 kg.cm de par motor y una biela de bra de vidrio anclada a un extremo de la barra.

Actuador Servo

Como dice la Wikipedia, controlamos el giro del servo con pulsos de duracin variable:

Control de la posicin del servo mediante pulsos

En este servo en concreto la posicin 0 se obtiene con pulsos de 0,5ms y el giro de 180 con 2,3ms.

La biblioteca estndar (incluida en el IDE de Arduino) servo, incluye la instruccin write(angle), siendo angle un integer entre 0 y 180, que nos permite ajustar la posicin del servo. sta es la instruccin que se
usa habitualmente, pero como nosotros queremos la mxima precisin en el giro del servo, utilizaremos writeMicroseconds en su lugar. Su sintaxis es: servo.writeMicroseconds(S), siendo S los
microsegundos de duracin del pulso. Dispondremos de valores entre 500 (posicin arriba) y 2300 (posicin abajo), teniendo 1800 puntos distintos en lugar de slo 180 usando la instruccin ms bsica:
write(angle).

Durante la puesta en marcha y ajuste, calcularemos la posicin de reposo (barra horizontal) con la ayuda de un nivel de burbuja.

Nivel de burbuja

Controlador

Utilizaremos un clon de Arduino con microcontrolador ATMEL ATMEGA328-PU equiparable al Arduino UNO o al antiguo Duemilanove original.

Recibe la medida de la posicin de la bola en su entrada analgica A0.


Emite pulsos para controlar el servo en su salida digital 12.
A travs de su conexin USB enva distintos juegos de datos para debug o tramas de la forma:

173,173,-5,-5$ //dist,dist,vel,vel$

que son recibidas por un PC ejecutando una aplicacin desarrollada en Processing y que nos permitir disfrutar de grcas de la posicin y la velocidad de la bola en funcin del tiempo como sta:

4 de 22 10/04/17 12:04
Control PID de Barra y Bola con Arduino - Estud... http://roble.uno/control-pid-barra-y-bola-arduino/

Grca de Processing

Como bonus, enciende un led conectado a la salida 13 cuando la bola est situada a menos de 8mm del centro.

Alimentacin de 5V

El Arduino recibe los 5V necesarios para su funcionamiento a travs de su conexin USB. La potencia de su pin de 5V es insuente para alimentar el servo, por lo que lo alimentaremos con una fuente de
alimentacin auxiliar. No olvides conectar la tierra de la fuente de alimentacin auxiliar con la tierra GND del Arduino! De lo contrario, las seales de control del servo no tendrn un referencia comn y no
funcionar.

Esquema del sistema completo

Esquema Control PID de Barra y Bola con Arduino

Conexiones

Conexiones Arduino Breadboard

Control PID

Una vez que tenemos implementado el sistema fsico, llega el momento de dar al controlador la inteligencia necesaria para mover la barra de forma tal que consigamos nuestro objetivo: Dejar la bola quieta
en el centro de la barra.

Software para Arduino: _70_Barra_y_Bola_v5_MicroSegundos

Perodo de medida y reaccin

5 de 22 10/04/17 12:04
Control PID de Barra y Bola con Arduino - Estud... http://roble.uno/control-pid-barra-y-bola-arduino/

Las secuencias de medida y reaccin (los ciclos de programa) no se harn tan rpido como pueda el microcontrolador, sino cada 50ms (valor almacenado en la variable period). Lo hacemos as porque los
sistemas de control PID funcionan mejor si los ciclos de medida y reaccin siempre tienen la misma duracin.

El microcontrolador, con reloj de 16MHz, tiene velocidad suciente para hacer el ciclo de programa en menos de 10ms. Pero con ciclos tan rpidos, la medida de la velocidad de la bola pierde precisin porque
las diferencias en la posicin de la bola entre ciclos son nmas y nosotros calculamos la velocidad de la bola como la diferencia en su posicin en 2 ciclos consecutivos de programa.

Si alargamos el periodo a 100ms, la medida de la velocidad es ms precisa, pero el servo funciona de una forma perceptiblemente intermitente.

Tras las pruebas realizadas, un perodo de 50ms aporta mediciones aceptables de la velocidad de la bola y un funcionamiento del servo uido.

Clculo de la velocidad de la bola

En el Software que implementa el control PID en el Arduino calculamos la velocidad como la diferencia entre la posicin actual de la bola (variable dist) y la que tena en el ciclo anterior (variable lastDist).
Vamos a mejorar la precisin de est medida mediante un ltro digital de paso bajo (Promediador) que consiste en obtener la media de la ltimas 5 velocidades medidas. Las almacenamos en la matriz v[], y
las tratamos con el siguiente algoritmo en cada ciclo de programa:

for (int i=0; i<nvel-1; i++){ // Movemos todas hacia la izq


v[i] =v[i+1];
}
v[nvel-1]= (dist - lastDist); // Ponemos un dato nuevo
vel=0;
for (int i=0; i<nvel; i++){ // Calculamos la media
vel = vel+ v[i];
}
vel = vel/nvel;

El valor de la velocidad lo utilizaremos para calcular la componente Derivativa del control PID. Adems lo enviamos a travs del puerto serie / cable USB para que lo reciba el software Processing y nos lo
represente grcamente.

Primera aproximacin: El trmino Proporcional

Si de lo que se trata es de llevar la bola al centro de la barra, parece lgico que debemos inclinar la barra ms, cuanto ms alejada est la bola del centro. El giro del servo, que determina la inclinacin de la
barra, lo determinamos con el valor de la variable pos que adopta valores negativos (hacia arriba):

pos < 0 : Servo Arriba

y positivos (hacia abajo) a partir del valor 0 que deja la barra en horizontal:

pos > 0 : Servo Abajo

Como tenemos la posicin de la bola en la variable dist, Inclinar ms la barra cuanto ms lejos est la bola del centro se escribe en el software como:

pos=Kp*dist

siendo Kp una constante.

6 de 22 10/04/17 12:04
Control PID de Barra y Bola con Arduino - Estud... http://roble.uno/control-pid-barra-y-bola-arduino/

As ya tenemos implementado el Trmino Proporcional del control PID.

No me digas que no es sencillo!

S, claro y que valor asignamos a Kp.

Para asignar un valor a Kp (como para los posteriores Kdiferencial y Kintegral) comenzaremos por asignarle un valor cualquiera: 1, 100, 235, 0.01 o el que te apetezca y observaremos el comportamiento del
sistema.

Estamos buscando el valor ms pequeo que sea suciente para inclinar la barra cuando la bola est cerca del objetivo pero todava no ha llegado. Valores grandes hacen que la bola alcance demasiada
velocidad y luego hay que detenerla en el centro!

Para el sistema construido, un valor adecuado es 2. Slo con el trmino proporcional, la bola nunca se estabiliza.

En el siguiente vdeo se muestran los efectos de:

Kp =1. Demasiado bajo. Con poco efecto en las proximidades del punto 0.
Kp =100. Demasiado alto. Acelera demasiado la bola.
Kp =2. Es adecuado para nuestro sistema.

Control PID de Barra y Bola con Arduino. Control Proporcional.

Deteniendo la bola: El trmino Diferencial

El trmino Diferencial opera sobre la diferencia de posiciones entre el ciclo actual y el anterior. Es decir, sobre la velocidad de la bola, ya que el tiempo transcurrido entre una medida y la siguiente es siempre
el mismo. Ese tiempo es el periodo de medida y reaccin y en nuestro sistema son 50ms.

El trmino diferencial se escribe en el software como:

pos=Kd*vel

En las 3 primeras lneas de programa denimos los valores de las 3 constantes del control PID:

float Kp =0;
float Kd = 100;
float Ki =0;

Lo que estamos haciendo es inclinar la barra oponindonos a la velocidad de la bola. Comenzamos dando un valor cualquiera a Kd.

puedo darle el valor 10, que es mi nmero favorito?

S, claro. Adelante.

Control PID de Barra y Bola con Arduino. Control Derivativo.

Hemos puesto Kp=0 para que el trmino proporcional no participe y Kd=10 como punto de partida. Se observa que es un valor insuciente porque no reacciona suciente como para detener la bola.

Subimos a Kd=100: Sobre-reacciona y el sistema es inestable.

El valor correcto est entre 10 y 100. Probamos con 50, 25 observando el comportamiento del sistema bajo control Derivativo. Un valor aceptable es Kd=35.

Conseguimos detener la bola con bastante ecacia!

Nuestro objetivo es detener la bola en el punto medio. El control proporcional acerca la bola al centro inclinando la barra ms cuanto ms lejos est. El control derivativo inclina la barra ms cuanto ms rpido

7 de 22 10/04/17 12:04
Control PID de Barra y Bola con Arduino - Estud... http://roble.uno/control-pid-barra-y-bola-arduino/

se mueva la bola y consigue detenerla. Observemos ahora la accin conjunta de los 2 trminos, deniendo la posicin del servo como:

pos=Kp*dist+Kd*vel;

Control PID de Barra y Bola con Arduino. Control Proporcional Deriv...

Esto ya funciona!

La accin combinada de los trmino Proporcional y Derivativo es un control PD, suciente para muchas aplicaciones. Una de sus debilidades es que cuando la bola se ha detenido cerca del punto central ya no
reacciona. Como la velocidad es 0, el trmino diferencial no acta. Como est cerca del punto central, la inclinacin de la barra por el trmino proporcional es pequeo y puede no ser suciente como para que
la bola se mueva. Es lo que ocurre en esta ocasin:

Control PID de Barra y Bola con Arduino. Control Integral.

Esto nunca ocurrir en posiciones alejadas del centro porque el trmino proporcional ya tendra suciente entidad como para que su inclinacin haga que la bola se mueva.

Incrementamos el trmino Proporcional?

Valores altos de Kp conllevan inestabilidad en el sistema como vimos en el vdeo anterior con Kp=100.

La solucin es la letra que nos falta para tener un autntico control PID: la I de Integral.

Incrementando la precisin: El trmino Integral

El trmino Integral considera la posicin de la bola (como el trmino Proporcional) y cunto tiempo lleva all. Dicho de una forma ms rigurosa: De la misma manera que el trmino Derivativo acta sobre la
velocidad, que es la derivada de la posicin de la bola a lo largo del tiempo, el trmino Integral acta sobre el rea que queda bajo la curva de la posicin a lo largo del tiempo.

8 de 22 10/04/17 12:04
Control PID de Barra y Bola con Arduino - Estud... http://roble.uno/control-pid-barra-y-bola-arduino/

Base de los trminos

Ese rea depende del intervalo de integracin. Si integramos ininterrumpidamente el rea bajo la curva, el trmino integral slo aporta inestabilidad en el sistema. Slo vamos a integrar la posicin de la bola
cuando sta se encuentre a menos de 4 cm del centro de la barra. Cuando est a menos de 8 mm del centro, damos por cumplido el objetivo y dejamos de integrar. Si se sale de un intervalo reiniciamos I (I=0).
Lo escribimos en el software como:

int Rint = 8;
int Rext = 40;

if(abs(dist)>Rint && abs(dist)<Rext){


I=I+dist*Ki;
}
else {
I=0;
}
pos=Kp*dist+Kd*vel+I;

Es decir, que mientras la bola est a menos de 4 cm y ms de 8mm del centro, vamos a coger su distancia al centro, la vamos a multiplicar por Ki y el resultado lo vamos a ir acumulando en I. Cuanto ms tiempo
pase ah, ms grande se va a hacer I.

Como conclusin, el trmino integral aporta ms precisin pero hay que acotar convenientemente su accin porque de lo contrario conlleva demasiada inestabilidad.

Comprtelo:

Categora: Proyectos Etiquetas: Arduino , Barra y Bola , Control PID , Processing

111 thoughts on Control PID de Barra y Bola con Arduino

obijuan
24 Septiembre, 2015

Muchsimas gracias por el post y los vdeos!!! Es un trabajo fantstico! Muchas gracias!

Angel Espeso Autor de la Entrada


25 Septiembre, 2015

Yo soy Muy Fan de tus tutoriales de freeCAD


https://www.youtube.com/user/obijuancube/playlists

Luis
24 Septiembre, 2015

Me ha encantado el artculo y el proyecto.


Justo ahora acabo de empezar a estudiar en la universidad Ingenieria de Control y despus de ver esto estoy deseando llegar a los PIDs.

9 de 22 10/04/17 12:04
Control PID de Barra y Bola con Arduino - Estud... http://roble.uno/control-pid-barra-y-bola-arduino/

Gracias!

Angel Espeso Autor de la Entrada


25 Septiembre, 2015

Disfruta tus Estudios !


Son apasionantes.
Bienvenido a mi Blog Luis.

Francisco
25 Septiembre, 2015

Fascinante!!! esto ayudara a explicarle a mis hijas. Gracias

Angel Espeso Autor de la Entrada


25 Septiembre, 2015

Qu Bueno !
Adelante.

Toni Vera
26 Septiembre, 2015

IMPRESIONANTE !! Me ha encantado t video, despus de muchos aos me he vuelto a lanzar a estudiar Ingeniera Electrnica y Automtica, y este tipo de cosas me ayudan a saber porque me reenganche a
este mundo tan apasionante.

Te seguir en tus futuros trabajos.

Angel Espeso Autor de la Entrada


26 Septiembre, 2015

Qu bueno Toni !

pedrolas
27 Septiembre, 2015

Muy bueno el proyecto y muy bien explicado.


Te seguir.

Angel Espeso Autor de la Entrada


27 Septiembre, 2015

Gracias !
Bienvenido Pedro.

Josemanu
7 Octubre, 2015

Enhorabuena por el tutorial, es fantstico.

Yo se muy bien lo que es escribir tutoriales (por eso los mios son mas cortos) as que aprecio de veras el esfuerzo que has hecho con este, est muy bien documentado.

Voy a poner un enlace desde mi web a la tuya.

Animo y sigue adelante escribiendo ms tutoriales.

Un saludo.

Angel Espeso Autor de la Entrada


7 Octubre, 2015

Gracias http://www.ardumania.es !

Martin Arias
4 Diciembre, 2015

La verdad que buen proyecto y muy interesante la verdad. Sigue as, te ganaste un fan. Saludos!!!

10 de 22 10/04/17 12:04
Control PID de Barra y Bola con Arduino - Estud... http://roble.uno/control-pid-barra-y-bola-arduino/

Post
4 Diciembre, 2015

Muchas Gracias Martin!


Un fuerte abrazo.

Antonio
9 Diciembre, 2015

Me gusto mucho la explicacion de casa una de las combinaciones de los controladores P,I y D, gracias por el video.

Tengo una duda, si utilizara un sensor ultrasonico HC-SR04 en vez del sensor optico, afectaria la velocidad del sensado de la distancia, para el control PID?

Gracias por todo

Angel Espeso
9 Diciembre, 2015

Puedes utilizar un HC-SR04 sin inconvenientes.

Saludos Antonio!

Eduardo Vargas Melndez


29 Marzo, 2017

tendras el codigo amigo

juan pablo morales


10 Enero, 2016

Hola angel! como estas? estoy interesado en realizar el sistema bola-viga que tu realizaste.Te quera preguntar si lo que usaste como bola es una pelota de pig-pong?tiene el suciente peso como para hacer
pivotar la barra? y te quera preguntar si me podes pasar la informacin de otro sensor de posicin infrarrojo alternativo al que tu usaste ya que en mi pas (Argentina) no lo consigo.Muchas gracias!!

Angel Espeso Autor de la Entrada


11 Enero, 2016

Hola Juan Pablo,


S, utilic una pelota de ping-pong ordinaria.
Puedes utilizar cualquier sistema de sensado de posicin. El infrarrojo del post lo tienes disponible en:
http://es.farnell.com/sharp/gp2y0a21yk0f/sensor-distancia-anal-gico/dp/1243869
Pero puedes utilizar cualquier otro, el de ultrasonidos: HC-SR04 o incluso puedes utilizar 2 hilos resistivos a lo largo de una viga de material aislante y una bola metlica que pise ambos y forme un
potencimetro con resistencia dependiente de la posicin de la bola.
Adelante!

Leandro
29 Enero, 2016

Desde Argentina. Excelente !!!!!!!!!!!!!!!!!!!!!!! Me encanto.

Angel Espeso Autor de la Entrada


29 Enero, 2016

Qu bueno! Gracias Leandro.

juan pablo morales


3 Febrero, 2016

hola Angel como estas?soy nuevamente juan pablo morales!ya consegui en sensor sharp!! te queria preguntar de que material es la viga?gracias!

Angel Espeso Autor de la Entrada


3 Febrero, 2016

Hola Juan Pablo!


Yo utilic un perl L de aluminio de 1,5 x 1,5 cm

Juan Pablo Morales


9 Febrero, 2016

Gracias ngel!!! Ya estoy en proceso haciendo la maqueta!! Cuando la tenga terminada te mandar un vdeo para que la veas! Un abrazo!

11 de 22 10/04/17 12:04
Control PID de Barra y Bola con Arduino - Estud... http://roble.uno/control-pid-barra-y-bola-arduino/

Angel Espeso Autor de la Entrada


9 Febrero, 2016

S, por favor. Envame el vdeo


Un abrazo!

michael
16 Marzo, 2016

Me parece un proyecto excelente pero la verdad me he confundido un poco en el orden que debe llevar el cdigo del arduino , te agradecera si me lo pudieras mandar a mi correo para vericar si lo he hecho
bien . un abrazo y muchas gracias por compartir tus conocimientos

Angel Espeso Autor de la Entrada


16 Marzo, 2016

Enviado Michael.

Un fuerte abrazo!

Alexis
8 Junio, 2016

Hola angel no me podras mandar ami tambien la programacion por que me confundi

Angel Espeso Autor de la Entrada


9 Junio, 2016

Aqu lo tienes Alexis:


http://roble.uno/wp-content/uploads/2015/08/70_Barra_y_Bola_v5_MicroSegundos.zip
Saludos.

Lis
31 Marzo, 2016

Buen dia, excelente video y expliciacin, pero tengo una duda, en que parte del cdigo dice la distancia que quiere llegar la pelota? por ejemplo, si deseo dejar la pelota en -10?

Angel Espeso Autor de la Entrada


1 Abril, 2016

Buen da !
Si quieres dejar la pelota en -10, inserta la lnea:
dist = dist + 10;
como lnea nmero 50 en el cdigo. Las lneas 49-51 quedaran:
}
dist = dist + 10;
// Calculo de la media de la VELOCIDAD

Saludos afectuosos.

Jonatan Murcia
9 Abril, 2016

Muy genial, muy bien explicado, quera hacerte una pregunta, yo quiero hacer algo muy parecido pero que la bola pueda moverse en ambos ejes, XY, seria en una tabla y con dos servos, mi pregunta es que
sensor puedo usar? haba pensado poner una cmara encima y usar visin articial y ese seria mi sensor, pero quera saber si se puede de otro modo, que sensor puedo usar? gracias.

Angel Espeso Autor de la Entrada


9 Abril, 2016

Hola Jonatan!
Puedes usar lminas tctiles del tipo:
https://www.google.es/#tbm=shop&q=l%C3%A1mina+t%C3%A1ctil&spd=9320468996252488420
como la usan en:

12 de 22 10/04/17 12:04
Control PID de Barra y Bola con Arduino - Estud... http://roble.uno/control-pid-barra-y-bola-arduino/

Ball and Plate PID control with 6 DOF Stewart platform

aunque es ms econmico la visin articial.


Saludos.

kevin SR
10 Abril, 2016

Un proyecto excelente lo entendi muy bien lo felicito eres increible es mejor que encontrado pero queria pedirte una ayuda con la programacion del arduino porque estoy un poco confundido en como
funciona cada parte de la programacion del arduino no se si me lo podrias enviar al correo y te lo agradesco mucho angel.
muchas gracias bendiciones y abrazos.

Angel Espeso Autor de la Entrada


10 Abril, 2016

Te acabo de enviar el cdigo por correo Kevin.


Celebro que te haya gustado.
Un fuerte abrazo!

Bryan Andr
16 Abril, 2016

Hola Angel! te felcitio mucho por este tutorial me ha encantado Quera preguntarte si eso que va conectado al sensor es un capacitor? y si es, de que valor seria? Y tambien si me podria pasar tu codigo que
me gustaria basarme en el para mi proyecto de sensores Te agradesco muchisimo, me gustan mucho tus tutoriales. Saludos!

Angel Espeso Autor de la Entrada


16 Abril, 2016

Hola Bryan,
Entre la salida del sensor y tierra conectamos un capacitor de 10F para acondicionar la seal.
El cdigo est a tu disposicin en:
http://roble.uno/wp-content/uploads/2015/08/70_Barra_y_Bola_v5_MicroSegundos.zip
Qu bueno que te gustara! Saludos afectuosos.

t4h4wk
19 Abril, 2016

Felicidades por el proyecto, me ha encantado. Igual me animo a replicarlo pero haciendo el control desde un PLC. Tengo una duda, las partes que se ven en azul estan hechas con impresora 3D?

Angel Espeso Autor de la Entrada


19 Abril, 2016

S. Son piezas impresas en 3D. Si las necesitaras, puedo enviarte los archivos.
Saludos!

Rafael
20 Abril, 2016

Me las envias por favor mi correo es ****, te lo agradezco Angel

Angel Espeso Autor de la Entrada


20 Abril, 2016

Te lo acabo de enviar por mail, Rafael.

13 de 22 10/04/17 12:04
Control PID de Barra y Bola con Arduino - Estud... http://roble.uno/control-pid-barra-y-bola-arduino/

Adems, he subido los archivos de FreeCAD y los .stl a:


http://roble.uno/wp-content/uploads/2016/04/Piezas-3D-de-Barra-y-Bola.zip
Saludos!

Rafael
20 Abril, 2016

Hola Angel, excelente proyecto y muy bien explicado, por favor me puedes pasar el diseo de las partes en bra de vidrio.

t4h4wk
20 Abril, 2016

Pues me haras un gran favor. Puedes ver mi correo, verdad?

Angel Espeso Autor de la Entrada


20 Abril, 2016

Enviado a tu mail.
Adems, he subido los archivos de FreeCAD y los .stl a:
http://roble.uno/wp-content/uploads/2016/04/Piezas-3D-de-Barra-y-Bola.zip
Saludos!

Armando
15 Mayo, 2016

Hola Angel excelente proyecto! Uno de los mejores que he visto por la red! Me gustara que me pasaras el diseo de las partes de ante mano gracias y sigue as!

Angel Espeso Autor de la Entrada


15 Mayo, 2016

Gracias Armando!
Aqu las tienes:
http://roble.uno/wp-content/uploads/2016/04/Piezas-3D-de-Barra-y-Bola.zip

Nathan Cross
16 Mayo, 2016

You rock man! Thanks for the script, is very useful for us (currently working in ball and plate with resistive screen). God bless you!

Angel Espeso Autor de la Entrada


16 Mayo, 2016

I am glad to hear that.


Go ahead!

Nathan Cross
16 Mayo, 2016

gracias! de hecho estoy en este preciso momento con Mauricio Salomn, el muchacho que le hizo unas consultas hace un rato.

Nathan Cross
16 Mayo, 2016

Jajaja me confund con otro foro en ingles! Lo siento!

Angel Espeso Autor de la Entrada


16 Mayo, 2016

JaJaJa
Saludos!

Mauricio Salomn
16 Mayo, 2016

Hola Angel, excelente proyecto te felicito, estoy tratando de implementar el sistema ball and plate, he visto tu cdigo y tengo una duda, creas esta variable int sensorPin=0; //Pin Analogico donde esta
conectada la seal del Sensor de distancia la cual es la que da un valor de voltaje analgico dependiendo de la posicin de la bola, mi duda es que en donde asignas ese pin como una entrada en tu cdigo? Es
que no lo veo asignado en ningn lado solo en una parte que dice measure = analogRead(sensorPin);, supongo que ah est midiendo el valor de sensorPin pero en donde le asignas sensorPin como entrada?

14 de 22 10/04/17 12:04
Control PID de Barra y Bola con Arduino - Estud... http://roble.uno/control-pid-barra-y-bola-arduino/

Gracias

Angel Espeso Autor de la Entrada


16 Mayo, 2016

Hola Mauricio,
Celebro que te guste el post. Gracias.
Los pines analgicos son slo de entrada, por eso no se denen como los digitales. Slo es eso.
Saludos afectuosos.

Mauricio Salomn
16 Mayo, 2016

Entiendo, entonces el cable de mi sensor lo conecto al pin A0(Analog In) del Arduino Uno y listo?

Angel Espeso Autor de la Entrada


16 Mayo, 2016

S, as es.

Mauricio
17 Mayo, 2016

muchas gracias, espero probarlo maana.

Mauricio
17 Mayo, 2016

otra duda jeje, que signican las constantes Rint y Rext y porqu tienen esos valores?

Mauricio
17 Mayo, 2016

Ya vi donde se explica, gracias.

Daniel Osorio
18 Mayo, 2016

Buen dia angel!


tu post a generado revuelo, me fascina que aun hay personas dispuestas a compartir su conocimiento y Me parece un proyecto excelente, la verdad me e confundido con la sintaxis del cdigo en el arduino, si
me lo pudieras enviar a mi correo quedara encantado ya que quiz omit alguna linea, un abrazo enorme y espero sigas realizando proyectos como este.

Angel Espeso Autor de la Entrada


18 Mayo, 2016

Muchas gracias Daniel!


Acabo de enviarte el cdigo a tu correo.
Un fuerte abrazo.

Daniel Osorio
22 Mayo, 2016

Recibido, gracias Angel!


de casualidad las dimensiones de las bielas las tienes, disculpa la molestia y gracias de nuevo.

Angel Espeso Autor de la Entrada


23 Mayo, 2016

La biela Servo-Barra y la varilla roscada de Soporte Central tienen una longitud de 9cm.
Saludos Daniel!

15 de 22 10/04/17 12:04
Control PID de Barra y Bola con Arduino - Estud... http://roble.uno/control-pid-barra-y-bola-arduino/

wilfer nieto
22 Mayo, 2016

buen dia te felicito excente trabajo, mu gustaria saber donde ingreso el setpoint para posicionar la bola a una distancia deseada.
Gracias

Angel Espeso Autor de la Entrada


23 Mayo, 2016

Buen Da Wilfer!
Si quieres dejar la pelota en el setpoint: 10mm, inserta la lnea:
dist = dist 10;
como lnea nmero 50 en el cdigo. Las lneas 49-51 quedaran:
}
dist = dist 10;
// Calculo de la media de la VELOCIDAD

Saludos afectuosos.

Pingback: PID en Step7: Ejemplo de control de temperatura

Raul M.
26 Mayo, 2016

Hola,

Gran post y excelente trabajo !!!


Me gustara saber dnde has comprado el servo HEXTRONIK HX5010 y si cualquier otro de ms o menos esas caractersticas cuadrara con la pieza de soporte.

Gracias,
Raul

Angel Espeso Autor de la Entrada


27 Mayo, 2016

Hola Ral,
Qu bueno que te gustara!
El servo lo puedes adquirir en http://www.dx.com/p/sg5010-r-c-helicopter-torque-servos-with-gears-and-parts-35766#.V0hr4Up95QI
Puedes utilizar cualquier otro de Dimensiones: 5.4 cm x 4.4 cm x 2 cm sobre la pieza de soporte.
Saludos.

Miguel Lara
27 Mayo, 2016

Hola que tal, de verdad es muy bueno el articulo, tu proyecto en concreto. Estoy haciendo algo parecido y queria o quiero comparar el codigo que tienes con el mio, serias tan amable de mandarmelo a mi
correo si eres tan amable? Estoy impresionado de verdad por este proyecto. Espero tu respuesta, gracias.

Angel Espeso Autor de la Entrada


27 Mayo, 2016

Enviado.
Saludos!

Raul
2 Junio, 2016

hola excelente trabajo, estoy realizando algo similar me gustara saber si me puedes compartir tu cdigo

Angel Espeso Autor de la Entrada


2 Junio, 2016

Hola Ral,
Claro. Aqu lo tienes:
http://roble.uno/wp-content/uploads/2015/08/70_Barra_y_Bola_v5_MicroSegundos.zip
Saludos

16 de 22 10/04/17 12:04
Control PID de Barra y Bola con Arduino - Estud... http://roble.uno/control-pid-barra-y-bola-arduino/

Joaquin
27 Mayo, 2016

Hola, he pasado por tu canal y me ha fascinado la colaboracin que has dado, quiero felicitarte por tener el tiempo de hacer estos trabajos y me gustara que me proporcionaras el cdigo para compararlo con
el que he echo ya que he usado un sensor ultrasonico y quiera comparar por que no me ha salido. De antemano muchas gracias y nuevamente Felicidades Angel

Angel Espeso Autor de la Entrada


27 Mayo, 2016

Hola Joaqun!
Me alegra que te gustara. Aqu tienes el cdigo:
http://roble.uno/wp-content/uploads/2015/08/70_Barra_y_Bola_v5_MicroSegundos.zip
Un fuerte abrazo.

Armando ibarra
28 Mayo, 2016

Oye disculpa que tendria que modifcar si agrego como sensor HC-SR04, soy novato, el sensor tiene 4 pines

Angel Espeso Autor de la Entrada


28 Mayo, 2016

Hola Armando!
Aqu:
http://elcajondeardu.blogspot.com.es/2014/03/tutorial-sensor-ultrasonidos-hc-sr04.html
tienes todos los detalles para utilizarlo con Arduino.
Saludos.

17 de 22 10/04/17 12:04
Control PID de Barra y Bola con Arduino - Estud... http://roble.uno/control-pid-barra-y-bola-arduino/

JESUS RDZ
2 Junio, 2016

hola felicidades por su proyecto esta muy bien explicado pero soy un novato en arduino me podria decir como quedaria su codigo si en lugar de usar el sensor infrarojo uso un sensor ultrasonico SH-SR04
GRASIAS Y MUY BUEN PROYECTO!!

Angel Espeso Autor de la Entrada


3 Junio, 2016

Hola Jess,
Celebro que te haya gustado el Post.
La lectura de la distancia con el sensor SH-SR04 la puedes hacer con el cdigo de arduino:
long distancia;
long tiempo;
void setup(){
Serial.begin(9600);
pinMode(9, OUTPUT); /*activacin del pin 9 como salida: para el pulso ultrasnico*/
pinMode(8, INPUT); /*activacin del pin 8 como entrada: tiempo del rebote del ultrasonido*/
}
void loop(){
digitalWrite(9,LOW); /* Por cuestin de estabilizacin del sensor*/
delayMicroseconds(5);
digitalWrite(9, HIGH); /* envo del pulso ultrasnico*/
delayMicroseconds(10);
tiempo=pulseIn(8, HIGH); /* Funcin para medir la longitud del pulso entrante. Mide el tiempo que transcurrido entre el envo
del pulso ultrasnico y cuando el sensor recibe el rebote, es decir: desde que el pin 12 empieza a recibir el rebote, HIGH, hasta que
deja de hacerlo, LOW, la longitud del pulso entrante*/
distancia= int(0.017*tiempo); /*frmula para calcular la distancia obteniendo un valor entero*/
/*Monitorizacin en centmetros por el monitor serial*/
Serial.println(Distancia );
Serial.println(distancia);
Serial.println( cm);
}
cablendolo segn:
http://elcajondeardu.blogspot.com.es/2014/03/tutorial-sensor-ultrasonidos-hc-sr04.html
La declaracin de variables y el setup a su sitio en el programa de Barra y Bola.
La parte del loop tienes que ponerla en lugar de esto que pertenece al mo:
// Medimos DISTANCIA
measure = analogRead(sensorPin);
measure = constrain(measure, ADCcal[0], ADCcal[8]);
lastDist = dist; // Guardamos el valor anterior de dist para calcular la velocidad
for(int i =0; i<8; i++){ // Aplicamos curva de Calibracion de ADC a mm
if (measure >= ADCcal[i] && measure< ADCcal[i+1]){ dist = map(measure,ADCcal[i],ADCcal[i+1],dcal[i],dcal[i+1]); } } Ten en cuenta que, a diferencia de en mi cdigo tu dist = 0 sera pegado al sensor. En mi
cdigo, gracias a la calibracin, dist = 0 est en el centro de la barra. Puedes aadir: dist = dist - 15; siendo 15 cm la distancia desde el sensor al centro de la barra y ya lo tendras. Al nal siempre funciona, slo
hay que seguir hasta que funcione

Lucas
23 Junio, 2016

Anjo, yo no podra hacer este cambio para incluir el SH SR04


En mi caso , creo que la distacia inicial (limitacin del sensor) sera de 40 mm , 290 mm en el centro y 540 mm en el extremo.
Yo quera saber dnde incluir y qu hay que cambiar .

Alexis
10 Junio, 2016

Excelente trabajo angel, me gusto mucho tu trabajo.. gracias por compartirnos tus conocimientos. Yo soy nuevo en la programacion y estoy realizando este mismo trabajo, pero estoy utilizando el sensor
ultrasonico sh-sr04 y no me funciono muy bien nose si me equivoque o me falta algo nose sime podrias auxiliar enviandome el codigo, para ver en lo que me equivoque y asi poder ir mejorando. Te lo
agradeseria mucho.

Lucas Ramos
18 Junio, 2016

Hola, Angel! En primer lugar quiero darle las gracias por el tutorial , que fue hecho de manera muy explicativa .
Estoy haciendo una barra y bola proyecto y tambin a utilizar un SH RS04 , he visto algunas crticas .
Cmo voy a hacer para aumentar un potencimetro lineal a cualquier posicin que lo puse , el sistema para la posicin de la bola . Como el vdeo a continuacin:

18 de 22 10/04/17 12:04
Control PID de Barra y Bola con Arduino - Estud... http://roble.uno/control-pid-barra-y-bola-arduino/

Ball & Beam - PID Controller - Arduino and Matlab

Angel Espeso Autor de la Entrada


18 Junio, 2016

Hola Lucas!
Para variar el SetPoint, que seleccionas con el potencimetro, tienes que insertar como lnea 50 en el programa:
dist = dist SetPoint;
Las lneas 49-51 quedaran:
}
dist = dist SetPoint;
// Calculo de la media de la VELOCIDAD

Saludos.

Armando ibarra
19 Junio, 2016

Excelente el trabajo que usted esta haciendo, la verdad se le agradece mucho. Maestros como usted hacen falta

Angel Espeso Autor de la Entrada


21 Junio, 2016

Muchas Gracias Armando!


Saludos afectuosos.

Lucas
21 Junio, 2016

Gracias por la respuesta! Otra pregunta sera: Si yo quiero poner un servo con un mayor par motor que inuyen en algo?
Si pongo el servomotor en el centro de la barra tendra un problema, cambiar alguna conguracin ? ( Algo as como este proyecto a continuacin https://www.youtube.com/watch?v=VGTy1MdWkhk )

Angel Espeso Autor de la Entrada


21 Junio, 2016

Puedes poner un servo de ms par sin ningn problema.


Poniendo el servo en el centro de la barra, al llevarlo a sus 0 o 180 tendras la barra en vertical y la bola se saldra del carril. Ponindolo en un extremo tienes una mayor resolucin porque los 0 180 del
servo son -10 a +10 de la barra, que son sucientes para mover la bola.
Espero ser de ayuda.
Saludos Lucas!

Lucas Ramos
22 Junio, 2016

Estimado ngel , he intentado todo aqu en mi horario con el sensor HC SR04 , pero no funciona .
Mi barra tiene 540 mm , 40 estn limitados por el sensor y el otro de 500 mm se distribuyen . Por lo que el centro es de 290 mm .
Si no es mucho pedir , que podra hacer que el cdigo para m ? Como ya he dicho he intentado todo y no fuinciona

Angel Espeso Autor de la Entrada


23 Junio, 2016

Pero tienes lecturas de la posicicin de la bola con el sensor?

gerardo

19 de 22 10/04/17 12:04
Control PID de Barra y Bola con Arduino - Estud... http://roble.uno/control-pid-barra-y-bola-arduino/

4 Julio, 2016

exelente proyecto, me encantara hacer este proyecto pero no pude cargar el cdigo al arduino nano, y me preguntaba tambin si es posible graticar los datos en matlab

Angel Espeso Autor de la Entrada


4 Julio, 2016

Celebro que te guste Gerardo.


Los datos se envan por el puerto USB. Seguro que MatLab puede leerlos.
Saludos.

Daniel
19 Septiembre, 2016

Hola he implementado el circuito y todo el montaje, pero no me funciona. el servo hace un rudo extrao y pareciera que est como forzado el balanceo de la bola lo hace muy brusco y n logro que la bola
quede en el centro, puedes ayudarme?

Angel Espeso Autor de la Entrada


19 Septiembre, 2016

Hola Daniel,
Yo intentara mover el Servo con el ejemplo Sweep que tienes en el IDE de Arduino (Archivo/Ejemplos/Servo/Sweep). Si no funciona con ese ejemplo sustituira el Servo.

Uriel MG
27 Julio, 2016

Hola me a gustado mucho su proyecto quisiera que me apoyara dicindome la lista de los componentes que utilizo, y si me puede facilitar el circuito elctrico que utilizo, de antemano muchas gracias y
felicidades por tan buen tutorial me a sido de gran ayuda.

Saludos y bendiciones

Uriel MG
10 Agosto, 2016

Disculpa que capacitores ocupaste para el circuito, podrias mostrarme como es el circuito o conexiones que realisaste.

Brandon
10 Octubre, 2016

Excelente proyecto!!!! Me ayudo mas a enterder lo que es un control PID.


Saludos

Felipe Ortiz
8 Noviembre, 2016

Hola muy buenas tardes tengo una duda, funciona con cualquier servo ? o cual es la especicacion o por que usar el HEXTRONIK HX5010 y otra pequea duda es lo mismo usar el sensor SHARP GP2Y0A21YK
?? Espero su respuesta muchas gracias !!! Muy buen Proyecto!

Angel Espeso Autor de la Entrada


8 Noviembre, 2016

Hola Felipe,
Funciona con cualquier servo.
Saludos

Felipe Ortiz
9 Noviembre, 2016

Una duda ms si mi sensor es de 10-80 cm , que es lo que variar en la programacin crees que me puedas ayudar ?

samanta
13 Noviembre, 2016

estoy interesada en el proyecto, vi los comentarios debido a que en mi pais no puedo conseguir en servo hextronik hx5010 6.9kg cm entonces vi que puso un link donde se podia conseguir pero el link se dirige
a un servo sg5010 R/C es lo mismo? misma conexion y misma programacion???

samanta

20 de 22 10/04/17 12:04
Control PID de Barra y Bola con Arduino - Estud... http://roble.uno/control-pid-barra-y-bola-arduino/

13 Noviembre, 2016

SI CAMBIA ALGO DEL SERVO NECESITO SABERLO, PARA QUE NO TENGA PROBLEMAS CON LA PROGRAMACION, LE AGRADECERIA ME INFORMARA, SI PUSO LA LIGA DE ESE SERVO ES PORQUE ES IGUAL NO
ES ASI? Y NO DEBERIA CAMBIAR NADA, SI NO QUE SERVO ES EL MAS CERCANO AL HXT5010

ANDERSON
10 Noviembre, 2016

Hola Angel.
Que buen trabajo Quera preguntar que cdigo en arduiono utilizaste para realizar el proyecto con un HC SRO4, pues estoy trabajando el mismo proyecto que realizaste pero con un ultrasonido el problema
es que el sistema se torna muy inestable y el pin pon comienza a balancearse mucho y no encuentra el equilibrio y este es el codigo que tengo hasta el momento.

#include
#include

const int servoPin = 9; //Servo Pin

oat Kp = 2.5; //Initial Proportional Gain 2.5


oat Ki = 0; //Initial Integral Gain
oat Kd = 0.9; //Intitial Derivative Gain
double Setpoint, Input, Output, ServoOutput;

PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT); //Initialize PID object, which is in the class PID.

const int pingPin = 7; //Trig Pin Arduino 7


const int pingPin2 = 6; //Echo Pin Arduino 6

Servo myServo; //Initialize Servo.

void setup()
{
pinMode(pingPin, OUTPUT);
pinMode(pingPin2, INPUT);
Serial.begin(9600); //Begin Serial
myServo.attach(servoPin); //Attach Servo
Input = readPosition(); //Calls function readPosition() and sets the balls
// position as the input to the PID algorithm
myPID.SetMode(AUTOMATIC); //Set PID object myPID to AUTOMATIC
myPID.SetOutputLimits(-10, 90); //Set Output limits to -80 and 80 degrees.
}

void loop()
{
Setpoint = 15; //15
Input = readPosition();
myPID.Compute(); //computes Output in range of -80 to 80 degrees
ServoOutput = 120 + Output; // 102 degrees is my horizontal
myServo.write(ServoOutput); //Writes value of Output to servo
}

oat readPosition() {
long duration, cm;
unsigned long now = millis();
digitalWrite(pingPin, LOW);
delayMicroseconds(5);
digitalWrite(pingPin, HIGH);
delayMicroseconds(10);
duration = pulseIn(pingPin2, HIGH);
cm = 0.017 * duration;
if (cm > 30) // 30 cm is the maximum position for the ball // make 35
{
cm = 30; // make 30
}
Serial.println(cm);
return cm; //Returns distance value.
}

samanta
13 Noviembre, 2016

estoy interesada en el proyecto, vi los comentarios debido a que en mi pais no puedo conseguir en servo hextronik hx5010 6.9kg cm entonces vi que puso un link donde se podia conseguir pero el link se dirige
a un servo sg5010 R/C es lo mismo? misma conexion y misma programacion???

Post
13 Noviembre, 2016

S. misma conexion y misma programacion.

21 de 22 10/04/17 12:04
Control PID de Barra y Bola con Arduino - Estud... http://roble.uno/control-pid-barra-y-bola-arduino/

Samanta
15 Noviembre, 2016

El sensor sharp tal cual lo describen no hay, el que encontr es de 10-80 cm. Que cambia del programa

Jose Reyes Gomez


27 Noviembre, 2016

Hola ngel.

felicidades muy buen trabajo;


Requiero de tu ayuda trabajo con un sensor sharp de 10cm-80cm y una barra de 50cm, servomotor modelo MG995
y no logro ponerlo en el centro no se en que falle, si me puedes ayudar con el programa gracias, Saludos desde mexico.

Angel Espeso Autor de la Entrada


28 Noviembre, 2016

Comprueba la Calibracin del sensor. Ah queda denida la posicin Centro.


Un fuerte abrazo Jose!

Enrique
5 Diciembre, 2016

Hola ngel muchas felicidades por el proyecto , solo una pregunta, como conecto Processing con Arduino para tener las grcas ?? me dice que hay un error: please x the size () Line to continue

Angel Espeso Autor de la Entrada


5 Diciembre, 2016

Gracias Enrique!
En la lnea 33 cambia:
size(xpant, ypant);
por:
size(1000, 500);
En las ltimas versiones, Processing no soporta variables en el comando size.
Saludos

Alvaro Rodriguez
23 Diciembre, 2016

Buenas Angel, gran trabajo.


Yo estoy haciendo algo parecido pero con un HC-SR04. El caso es que este sensor me da medidas errneas a partir de unos 15-20cm usando una pelota de pinpon. En cambio, si lo que uso es algo plano que
mire directamente al sensor, la medida es correcta. Lo he probado con otro HC-SR04 y ocurre lo mismo. Habra alguna solucin para que el sensor me detectara la pelota? Gracias y un saludo.
PD: Si a alguien le ha ocurrido algo parecido agradecera su ayuda.

Angel Espeso Autor de la Entrada


23 Diciembre, 2016

Yo utilic el sensor SHARP porque con el HC-SR04 me ocurra lo mismo que a ti.
Saludos.

Alejandro
1 Abril, 2017

Hola se que el post ya tiene algo de tiempo aqui pero si es posible , me gustaria me respondiera como hace corresponder la distancia leida por el sensor para asi utilizar la salida del control PID , en la
instruccion de salida para el servo, por que no alcanzo a comprender esa parte , lo digo por las lineas
pos=Kp*dist+Kd*vel+I;
myservo.writeMicroseconds(reposo+pos);
Pero en que parte de la programacion se asegura que la variable pos, corresponda o este dentro del rango de valores que admite la salida al servo? En este caso los microsegundos del pulso que hacen mover
al servo. Gracias

Angel Espeso Autor de la Entrada


1 Abril, 2017

Hola Alejandro,
Si reposo+pos se sale de los lmites aceptados por el servo, ste se queda en sus posiciones extremas. Saludos.

22 de 22 10/04/17 12:04

Você também pode gostar