Automatización Libre

En el mundo industrial y de la automatización en general no es ningún secreto que está dominado por el software y el hardware propietario, unas pocas empresas crean los componentes con los que una gran  cantidad de empresas integradoras se las ingenian para adaptar a los requisitos del sistema en concreto. Al final lo que encontramos es una red descentralizada donde montones de integradores y clientes finales dependen exclusivamente de unas pocas empresas que tienen generalmente su sede en Estados Unidos o Alemania.

Son pocos los que intentan nadar contracorriente en este mundillo, algunos que han tirado la toalla y otros que han encontrado soluciones nuevas a viejos problemas, pero para introducirnos en la automatización libre primero debemos hacer una cartografía de las comunidades que se dedican a producirlo y en eso consiste este post.

Automatización Industrial

El proyecto en que más esperanzas tengo puestas desde el punto de vista industrial se trata de OSADL, se trata de un laboratorio de desarrollo de automatización open source, ofrecen apoyo para la implementación de software libre a nivel industrial, se centran sobre todo en Linux y liberan una versión estable del kernel Linux RT, versión del kernel muy importante en los sistemas industriales. Por ejemplo, otro proyecto que hace uso del Linux RT es LinuxCNC, una distribución GNU/Linux para usar de base de máquinas de control numérico, utilizadas en todo tipo de procesos de manufacturación. Desgraciadamente LinuxCNC se basa en HAL para la realización de scripts con que se controlan las máquinas, un proyecto que se abandonó hace años para incluirlo su funcionalidad en udev. Esto hace que dependan de kernels bastante antiguos.

Otro proyecto importante en automatización es AutomationML, se trata de una recopilación de estándares para compartir información de entornos industriales en formato XML. Lo mejor del proyecto es que no intenta reinventar la rueda, utiliza por ejemplo COLLADA del Khronos Group para geometría y cinemática o PLCopen XML, otro estándar libre, para la lógica.

Comunicaciones

Después de toda esta parrafada y aun no he nombrado nada sobre comunicaciones. Dado su uso extendido me voy a centrar en protocolos sobre Ethernet o sobre IP. En este caso, lo recomendable es huir de los dos grandes estándares que dicen ser abiertos pero no lo son Ethernet/IP y Profinet. Y si buscamos lo más sencillo de implementar de forma libre nos iremos a Modbus TCP con la librería libmodbus enseguida tendremos un protocolo industrial sobre cualquier red TCP/IP. Si el protocolo se nos queda demasiado simple, siempre podemos añadirle funcionalidades, por ejemplo: archivos XML de descripción de las entradas y salidas, IPsec para la parte de seguridad o cualquier otra cosa que se necesite.

Si es necesario un protocolo de comunicación más rápido es posible usar algo más complejo pero que permita una respuesta más rápida, es posible usar POWERLINK, que utiliza una capa por bajo de IP para conseguir una menor latencia de red, la pila de protocolos libre en este caso es openPOWERLINK.

Frameworks

Luego vamos a encontrar frameworks libres para implementar automatización y de estos hay varios cada uno con su propia filosofía:

  • 4DIAC: Permite programar aplicaciones de automatización distribuida usando un lenguaje de programación mediante bloques, utiliza el estándar IEC 61499.
  • OpenAPC: Se podría definir como un sistema de control distribuido (DSC), para hoy en día lo veo un poco anticuado, la interfaz debería ser web, pero tiene muchos plugins y hardware soportado.
  • MBLogic: Como su propio nombre indica, se trata de lógica por encima del protocolo Modbus, de los tres me parece el mejor pensado, usa una interfaz web basada en gráficos vectoriales en svg que se modifican con los valores de las lecturas. Además está pensado para su uso de forma modular. La lástima es que lleva inactivo desde 2011 y no dan ninguna seña de contacto de nadie interesado en resucitar el proyecto que obviamente necesitaría un lavado de cara, con un rediseño de los componentes a nivel gráfico.

Me ha parecido que el proyecto ROS-Industrial merecía un nombramiento a parte, no se centra en automatización en general si no exclusivamente en la parte de robótica industrial, ROS (Robot Operating System) es un conjunto de librerías y herramientas para el desarrollo de robots muy conocido a nivel académico y de investigación y ROS-Industrial trata de adaptarlo a los requerimientos de la industria.

Automatización No Industrial

No sólo voy a centrarme en automatización industrial, fuera del mundo industrial hay otros tipos de automatizaciones que también vale la pena conocer, tienen requisitos distintos pero el funcionamiento suele ser parecido. Veamos unos tipos:

Domótica

Así es como se denomina la automatización del hogar, existen múltiples proyectos libres pero me gusta por su carácter modular especialmente Open Source Automation.

Automatización de edificios

Muy parecido al anterior es la automatización de edificios, suele ser lo mismo pero a gran escala, el siguiente artículo es el mejor que he encontrado explicando y defendiendo la automatización libre de edificios. Pero además las grandes instalaciones exigen otro tipo de automatizaciones y visualización de datos: mantenimiento, energía, logística, etc. Para todo esto podemos usar el software openMAINT.

Gestión de la energía

Ya he hablado en este blog de EmonCMS, me parece uno de los mejores proyectos de todos los que he nombrado, muy sencillo de usar. Se podría combinar con MBLogic para dar una solución total de automatización sencilla y a la vez totalmente personalizable. Lo mejor que le veo a EmonCMS es su forma de gestionar el código de la web en una base de datos, pero le falta la funcionalidad de colocar un componente más abajo o arriba según convenga.

Automatización por IoT

Por último y como es la última moda, no puede faltar la automatización mediante el Internet de las Cosas, para seguir una buena metodología en la automatización mediante estándares libres podemos seguir las recomendaciones de IoT Data models.

Conclusiones

Esta recopilación como todas se quedará corta, se basa en los proyectos que me he ido encontrando mientras estudiaba el tema de la automatización, pero espero que a alguien le sirva para replantearse como hacer las cosas, para hacer un poco más difusa la frontera entre la empresa integradora y la desarrolladora y finalmente para democratizar la automatización.

Robots, por fin en el hogar

A pesar de que en la industria se implantaron ya hace décadas los robots, sobre todo en la forma de brazos robots en la producción, en el hogar nunca han llegado a alcanzar un nivel más que testimonial. Los robots de limpieza encabezados por Roomba han sido el único intento con éxito de llevar un robot a cada casa y parece que se han estancado en esa funcionalidad. El principal obstáculo para la introducción de otros tipos de robots en los hogares es aunque parezca extraño, su dureza. Los robots tradicionales están pensados para las duras condiciones de la industria, son fuertes, pesados y resistentes, mucho más de lo que cualquier ser humano. Por esto la convivencia entre nosotros y los robots industriales es difícil, cualquier fallo en la programación puede resultar en una muerte y por eso siempre se delimitan zonas de seguridad donde los robots trabajan fuera del alcance de las personas que pueden pasar por ahí.

«Mi humano dice que esto es un robot. ¡Ya, claro!»

En el hogar esta situación no se puede dar, robots y personas deben convivir unos con otros y es necesario crear robots «blandos» para este entorno. Hay varias lineas de investigación para este tipo de robots, una es utilizar las mismas técnicas utilizadas en robots industriales pero con materiales mucho más ligeros y técnicas de control que garantices movimientos suaves y poca fuerza que permiten a los humanos guiar a los robots e incluso enseñarles manualmente tareas.

La que vengo a explicar aquí es una nueva forma de construir robots blandos que está siendo estudiada ampliamente por la Universidad de Harvard, podría explicarlo pero una imagen vale más que mil palabras y un vídeo son muchísimas imágenes, así que pegadle un vistazo a este:

[youtube http://www.youtube.com/watch?v=uvCDYvHVK4Y&w=560&h=315]

Vale, el vídeo y el prototipo dan  un poco de grima, pero es una tecnología en pañales, que puede hacer que empecemos a ver robots que puedan estar en nuestras casas, como habéis visto, con electrónica, aire comprimido y «musculos» de silicona.

Vale ¿Y esto va a ser otra innovación controlada por las empresas de electrodomésticos y con el código bien cerrado? Pues por ahora parece que no, ahora estamos a tiempo, antes de que llegue el hype, podemos empezar a desarrollar nuestros primeros robots muy al estilo de Arduino, la Universad de Harvard ha liberado un Soft Robotics Toolkit con el que podemos empezar a experimentar, con una impresora 3D, un pequeño laboratorio de electrónica y algo de material podemos empezar a crear nuestras manos robot blandas o lo que se nos ocurra.

El paradigma pasivo frente al activo

Fey Ilyas / Foter / CC BY-SA

Hace poco conocí en persona por fin a Ester y Alfonso de Arrsa, tuvimos una fructífera conversación sobre nuestros actuales proyectos y me hablaron sobre el paradigma de construcción pasiva que se está imponiendo en edificación y sus ideas sobre como enfrentar el problema del confort en edificios de una forma más «activa», estoy seguro de que ellos os lo pueden explicar mejor que yo, así que les cedo el testigo en esta parte, hoy voy a hablar de un caso distinto.

Una de las ideas que me vino a la mente días después cuando repensaba estos conceptos es que ya existía algo parecido en un campo más cercano al mío, pero en este caso no son ideas opuestas, sino que se complementan,
y lo encontramos en los auriculares, todo un ejemplo de ingeniería moderna.

Sí, podemos comprarnos unos auriculares baratos de baja tecnología, pero hay quién busca algo más  y ahí aparecen las tecnologías de reducción del ruido. Pues es aquí mismo donde encontramos esas dos formas de solucionar el problema, la reducción del ruido activa y la pasiva.

Reducción Pasiva

Esto es relativamente sencillo, consiste en añadir capas de material aislante sonoro para eliminar ruidos externos. Cuanto más aislante más reducción, pero encarecemos y hacemos más pesado el producto. Este tipo de aislamiento funciona como un filtro paso-bajo, es decir que elimina las altas frecuencias.

Reducción Activa

En este caso se utilizan las propiedades de las ondas para cancelar los sonidos externos de forma activa, es decir mediante electrónica. Se coloca uno o varios micrófonos y sabiendo su ubicación se calcula como cancelar la onda recibida en el interior del oído. Esto es importante saberlo, sólo se cancela el sonido en un punto, en este caso el oído, puesto que debido a las propiedades de las ondas, la cancelación en un punto provocará un aumento en otro punto.

Esta es una idea interesante, ya que no estamos aplicando la «fuera bruta» del aislamiento, no necesitamos una envolvente, sólo unos sensores, unos actuadores y un procesador de señal que realice el control y ésta es una idea que se puede aplicar a muchos problemas de este estilo, entre ellos el confort en viviendas.

Para acabar de rematar la jugada tengo que decir que la reducción activa funciona bien para ruidos de bajas frecuencias, normalmente se utilizan miden ruidos de frecuencias bajas para cancelarlos, es decir que actúa como un filtro paso-alto. Esto lo hace perfecto para complementar la reducción pasiva de ruido, eliminando el ruido en todas sus frecuencias. La mejor solución como en muchos otros casos es una síntesis de dos ideas diametralmente opuestas.

Control aplicado a la electrónica

Nuestro curso de control libre y distribuido sigue dando guerra. En este caso voy a hablar de un ejemplo aplicado control en electrónica que ha diseñado Pablo Trujillo y nos muestra en su blog (ahora con dominio propio).

El objetivo es sencillo, se trata de una sencilla fuente de alimentación lineal, dada una tensión de referencia se pretende obtener esa tensión en la salida sin que se vea afectada por la carga que le coloquemos. Para obtener esto es necesario aplicar el principio fundamental del control, cerrar el bucle, y después implementar un controlador.

Para ello Pablo utiliza una implementación del controlador basada en electrónica analógica pura. Para ello utiliza un operacional en configuración restador, lo que nos proporcionará la señal de error.

Resta de señales referencia y salida.
Resta de señales referencia y salida.

En este caso podemos decir que el controlador es un proporcional con ganancia (Kp) 1, es decir que la acción de control y el error son iguales.

Veámoslo en el circuito:

Restador con un operacional.
Restador con un operacional.

Como hemos visto en el curso, este controlador tan sencillo puede producir un error en régimen permanente que para una fuente de tensión no es tolerable, la solución ya la conocemos, implementar un control PI, y eso mismo ha hecho su diseñador.

Esto en electrónica queda de la siguiente forma:

Restador + Integrador con un operacional.
Restador + Integrador con un operacional.

Como vemos lo único que ha cambiado es que en lugar de una resistencia en la realimentación del operacional hay un condensador. Esta configuración responde a la siguiente ecuación:

$latex u(t)= \frac{1}{RC} \int (y(t)-r) \mathrm{d}t$

O en Transformada de Laplace y sabiendo que y-r=e:

$latex u(s)= \frac{1}{RCs} e(s)$

Si pasamos la señal de error al otro miembro de la ecuación y subimos arriba la constante nos queda algo más parecido a una Función de Transferencia:

$latex \frac{u(s)}{e(s)}= \frac{\frac{1}{RC}}{s} $

Y ahí tenemos nuestro PI, con una ganancia ajustable de 1/RC.

Este es un ejemplo de una implementación de controladores de forma analógica, se puede implementar un controlador de muchas formas: mecánico, redes neuronales artificiales, lógica borrosa o analógico como éste, pero definitivamente la forma mas extendida es la digital, la que veréis en la mayor parte de PIDs comerciales.

Aunque este curso aún no se ha metido en cosas tan complejas como el desarrollo matemático y la implementación, siempre es recomendable pegarle una ojeada a los resultados finales que es posible obtener aplicando control.

Imágenes cortesía de mips & chips.

Modelado de un edificio II

Hace ya tiempo que escribí la primera parte de esta serie, la que pretendía conseguir un modelado térmico de un edificio o al menos la estructura del modelo. La razón principalmente ha sido la complejidad que llega a tener el problema al tener tantas variables desconocidas, cuando empiezas a operara con ellas empiezan a aparecer unos «chorizos» importantes, pero estoy terminando temas pendientes y este es uno de ellos así que voy a intentar desentrañar los misterios de nuestro hipotético edificio haciendo uso de conceptos de control que si habéis seguido mi Curso de Control, ya tendréis alguna idea del tema.

Como ya dije el último día, el sistema que resulta es de 2º orden, puesto que aparecen derivadas den dos puntos del conjunto de las ecuaciones. Ya tenemos algo por donde empezar.

La otra deducción que podemos hacer no es tan obvia, tenemos que pensar como va a evolucionar el sistema ante un cambio brusco de temperatura en el exterior (respuesta a escalón). La temperatura en el interior como sabemos irá acercándose a la temperatura exterior mientras va escapando calor, hasta igualarse a esta. Sea cual sea el cambio de temperatura, la temperatura interior siempre llegará a igualarse a la exterior y además tardará siempre el mismo tiempo en hacerlo.

¿Que conclusión sacamos de aquí? Que el sistema no tiene error en régimen permanente, se trata de un sistema con un integrador en bucle cerrado. Por lo tanto ya tenemos algo más de información y podemos construir la estructura del sistema.

Si utilizamos una función de transferencia para representar el sistema en bucle abierto, queda de la siguiente forma:

$latex G_{ba}(s)= \frac{K}{s(s+\tau)}$

El siguiente paso es calcular la función de transferencia en bucle cerrado, os ahorro el desarrollo, el resultado es el siguiente:

$latex G(s)=\frac{T_i(s)}{T_e(s)}= \frac{K}{s^2 + \tau s + K}$

Podemos ver a continuación un ejemplo de la respuesta a escalón en un sistema de este tipo.

Respuesta obtenida en simulación.
Ejemplo de respuesta a escalón.

En el próximo capítulo veremos como hacer un pequeño análisis paramétrico para encontrar el mejor sistema posible según nuestros deseos.

Controlando nuevos sistemas

Una de las funcionalidades de nuestros archivos de Octave que he mantenido en secreto por ahora, en el curso, es que es posible definir nuestros propios sistemas y controlarlos con estos scripts. Todas las funciones aceptan un argumento en forma de sistema, este puede definirse de muchas formas y me remitiré sin más a la documentación de la Toolbox de Control de Octave, yo en este caso he optado por introducir los sistemas en Función de Transferencia, no es el objetivo de este curso introductorio explicar que quiere decir esto, sólo diré por si tenéis curiosidad que utiliza la Transformada de Laplace cuando estamos en tiempo continuo.

Por ejemplo para el control P usaríamos la siguiente sintaxis:controlP(kp , sistema)

Ahora vamos a ver distintos sistemas que podemos probar , sólo es necesario sustituir «sistema» en el anterior comando por lo que pongo a continuación:

Este es un sistema más fácil del que hemos visto, se trata de un sistema de 1º Orden y la teoría nos dice que es posible controlarlo completamente con tan sólo un PI, a ver si lo conseguís:
tf([1],[1, 1])

En siguiente sistema consta de un Integrador, es decir como la acción integral, por lo tanto no necesitaremos acción integral para garantizar que llegue al punto deseado ¡Llega solo!
tf([1],[1, 0.1, 0])
El último sistema que vamos a ver es un sistema de 2º Orden como el primero que vimos pero con una particularidad, tiene lo que en control llamamos un cero. ¿Me podéis decir que efectos provoca este cero?

tf([1 0.1],[1, -0.1, 0.1])

Con esto y algún apunte más terminamos la parte básica del curso, me surgen diferentes caminos que podría tomar a partir de ahora, así que lo meditaré y posiblemente el curso y las novedades que le rodean tengan un parón en la frecuencia de publicación. Eso espero que me permita retomar otros temas del blog que he dejado más apartados.

Los que habéis llegado hasta aquí: ¡Enhorabuena! Ya tenéis una idea de qué es el control y de como controlar alguna cosilla fácil, si completáis todas las actividades tendréis un premio.

Ajuste de un controlador PID

Llegamos al último tipo de controlador que vamos a ver, el que aúna los tres tipos de control que ya hemos visto. Como ya he explicado anteriormente el uso que le damos a los parámetros kp, Ti y Td, os recomiendo que volváis a esas explicaciones si tenéis dudas y os paso directamente el archivo de la semana, esta vez con la siguiente sintaxis:controlPID(kp, Ti, Td)

Ahora las combinaciones posibles son enormes y tenemos una gran libertad de elección, pero os dejo a vosotros que experimentéis y os paso una imagen de muestra, a ver si conseguís algo parecido.

Ejemplo de sistema controlado con un PID.
Ejemplo de sistema controlado con un PID.

Ajuste de un controlador PI

Uno de los problemas de los controladores que hemos visto hasta ahora es que no garantizan que lleguemos al punto de referencia después de todo el transitorio, la diferencia entre la referencia y la salida una vez se ha estabilizado se llama error en régimen permanente.

Para eliminar este error se utiliza la acción integral, vamos a ver un caso práctico con un controlador PI, como en capítulos anteriores tenéis a vuestra disposición un pequeño script donde probar los resultados, lo podéis descargar aquí.

El funcionamiento del script es similar a los anteriores:controlPI(kp, Ti)

En este caso la constante que afecta al término integral es Ti y nos da una idea de en cuanto tiempo va a actuar esta acción integral, vamos a ver un ejemplo:controlPI(1,100)

Esto nos va a dar una respuesta como la siguiente:

Control PI con kp 1 y Ti 100.
Control PI con kp 1 y Ti 100.

Como podemos observar la señal de salida que en un principio parece que se va a estabilizar en 0.9 poco a poco se va corrigiendo hasta llegar a 1 de una forma suave.

A partir de aquí podemos empezar a jugar con nuestras constantes para obtener una buena respuesta igual que en capítulos anteriores. En el próximo vamos a ver el controlador que mejor resultados nos va a dar, el que combina la acción derivada con la integral, el PID.

Ajuste de un controlador PD

La semana pasada estuvimos probando el control P, vimos que al tener solo un grado de libertad no obteníamos unas respuestas totalmente a nuestro gusto. Hoy vamos a mejorar esto añadiéndole al control una componente derivativa, lo que se conoce también como acción derivada.

El mecanismo de la acción derivada es sencillo, intenta corregir la pendiente del error, esto provoca que la salida se suavice, es decir, que no tenga grandes pendientes y con esto conseguimos reducir e incluso eliminar la sobreoscilación.

Igual que el último día podéis descargar la función controlPD, de aquí, el funcionamiento es muy parecido:controlPD(kp,Td)

El sistema a controlar no ha cambiado, pero ahora podemos modificar dos parámetros para mejorar el control: kp, que afecta a la parte proporcional y Td que afecta a la parte derivativa.

Vamos a probar algo sencillo:controlPD(1,1)

Y obtenemos la siguiente respuesta:

Control PD con kp 1 y Td 1.
Control PD con kp 1 y Td 1.

Vemos que el control es algo más rápido y se ha eliminado la sobreoscilación que teníamos con el control P.

Ahora toca jugar un poco. ¿Hasta donde podéis llegar con estos dos parámetros?

Ajuste de un controlador P

Vamos a empezar la primera actividad con el ajuste de uno de los controladores más sencillos que existe, el controlador proporcional o simplemente P. Este controlador lo hemos visto de pasada en capítulos anteriores, se trata del controlador estático, una simple constante multiplicando a la señal de error y su salida es la señal de control.

Esquema de Realimentación.
Esquema de Realimentación.

Este controlador debido a su sencillez, sólo nos ofrece un grado de libertad, modificar el valor de la constante (kp) y por lo tanto tendremos algunas limitaciones que veremos en la práctica.

Nuestro objetivo va a ser conseguir que la salida del sistema siga a la referencia, que va a ser una señal de escalón unitario, esto es que en el instante 0 pasa de 0 a 1 inmediatamente, por eso tiene una forma de escalón.

¿Cómo quedaría si no utilizáramos ningún control y no cerráramos el bucle? Directamente aplicando la referencia en escalón al bucle obtendríamos esto:

Sin control, sistema en bucle abierto
Sin control, sistema en bucle abierto

La línea azul nos muestra la evolución del sistema y la verde el valor al que tiende en el infinito. Como vemos el sistema llega a 10 en lugar de a 1 y es bastante lento, unos 50 segundos, así que vamos a mejorar todo esto con nuestro control P.

Para probar distintos valores de kp en el bucle de una forma sencilla podéis descargaros este script que he hecho para Octave, el funcionamiento es el siguiente: tenéis un sistema por defecto dentro del script y todo montado para simular. Nos situamos en Octave dentro de la carpeta donde hemos guardado el script y llamamos a la función del controlP:controlP(kp)

Donde kp es la constante proporcional que queramos utilizar. Podemos probar por ejemplo: controlP(1)

Y nos mostrará la siguiente imagen:

Control Proporcionas con ganancia 1.
Control Proporcional con ganancia 1.

Vemos que el control ha mejorado bastante, es como 5 veces más rápido y a pesar de que aún no llega a 1 exactamente ya se acerca bastante más y no se pasa demasiado en el trayecto (sobreoscilación). Ahora podemos ir buscando una kp que haga que el sistema funcione más a nuestro gusto.

El objetivo de la actividad es experimentar con el control proporcional y buscar una buena respuesta, podéis escribir un post con la experiencia en vuestro blog y si no dejarla en comentarios o mandármela por correo con vuestro nombre/alias y yo la publicaré en los comentarios.

Suerte.