¡Construyamos un PLC de grado industrial basado en Arduino! 2da parte

Un controlador lógico programable (PLC por sus siglas en inglés) es dispositivo electrónico inteligente que se utiliza mucho en la automatización de procesos industriales. En esta oportunidad vamos a platicar al diseño al que llegué.

Marcas y modelos comerciales de PLCs se cuentan por decenas, pero todos tienen dos desventajas:

  • Son caros.
  • Su programación también es muy cara.

Es cierto que son robustos y están muy bien diseñados, pero a los costos de producción también hay que agregar los gastos de mantenimiento de grandes corporaciones. Por otro lado, en muchos casos el software de programación debe ser adquirido aparte, y por si eso no fuera poco, el cable de programación puede ser tan costoso como el PLC mismo.

Y qué decir del costo de programación. Los PLCs se pueden programar hasta en 5 lenguajes, siendo todos ellos especializados, y el conocido como «lenguaje de escalera (ladder)» el más común. Aunque la programación de PLCs es relativamente fácil, los programadores cobran mucho ya que es un mercado pequeño (a comparación del de programación de aplicaciones para computadora o teléfonos inteligentes). Ahora tome en cuenta que además de pagar los (altos) honorarios del programador, también en algunas ocasiones, deberá cubrir gastos de transporte y viáticos, porque al ser pocos, tendría Ud mucha suerte de encontrar uno en (o cerca de) su comunidad.

¿Qué oportunidades tienen los micro y pequeños empresarios que no pueden cubrir los altos costos que implica utilizar PLCs comerciales por las razones antes mencionadas?

¿Existirá una opción económica, de código abierto, que no dependa de los caprichos de una empresa ni de un puñado de programadores altamente especializados?


¿Porqué desarrollar un PLC de grado industrial en Arduino?

Porque podemos, porque es divertido, porque es una alternativa real a los productos comerciales, porque es más económico, y porque se puede programar en el lenguaje C/C++ con software de código abierto, como el de Arduino. Además, el número de programadores en esta plataforma se cuenta por miles.

Hay una cantidad de aplicaciones que no justifican los costos de un PLC comercial (y otra cantidad de aplicaciones que sí lo hacen). A continuación le presento una lista demostrativa, más no limitativa, de aplicaciones donde PLCs comerciales quedan sobrados:

  • Arrancadores e inversores de giro de motores eléctricos.
  • Refrigeradores industriales.
  • Lavadoras industriales.
  • Sistemas de riego agrícola.
  • Pequeños invernaderos.
  • Puertas de garage.
  • Plumas de estacionamientos.
  • Semáforos viales.
  • Taladros.
  • Iluminación residencial.
  • Mezcladoras.
  • Sistemas Cisterna-Tinaco.
  • Y un enorme et cétera.

El hardware de un PLC comercial, del tipo brick (de módulo único, o de los llamados micro-PLCs), no está alejado del hardware que diseñamos en nuestro trabajo cotidiano. Si Ud tuviera oportunidad de ver uno por dentro encontraría muchas similitudes con el hardware que diseñamos en el día a día.

¡Pongamos manos a la obra y empecemos con nuestro controlador industrial!

Diseño

Un controlador industrial consiste de 5 partes, principalmente:

  1. Entradas.
  2. Salidas.
  3. Cerebro.
  4. Fuente de alimentación
  5. Sistema operativo.

Entradas

Nuestro controlador tiene 6 entradas digitales ópticamente aisladas, con alimentación independiente, y 2 entradas analógicas. En ambos casos podemos jugar con los valores de algunos componentes para que un mismo circuito impreso nos sirva para

  • Entradas digitales de 5VDC, o 12 VDC, o 24VDC.
  • Entradas analógicas de 5VDC o 10VDC.

El optoacoplador PC817 requiere de una corriente mínima de 1.5 mA para funcionar en su zona segura. Eso nos permite calcular las resistencias en serie de manera que cambiando su valor podamos conseguir que funcione para uno u otro voltaje de entrada. Con el valor de 2K2 las entradas funcionan perfectamente para 5VDC y 12VDC. Para 24VDC su valor debería ser doblado a 3K9 o 4K7. El diodo zener es de 5V1 y está ahí para no estresar al foto-diodo.

A diferencia de otros diseños, los LEDs testigos los coloqué del lado de 5VDC. Con esto logramos que no se le exija más corriente de la necesaria a los sensores digitales y aumentamos su vida útil. El capacitor de 10nF funciona como un minifiltro y evitamos escribir rutinas anti-ruido por software.

Las entradas analógicas no están aisladas. Utilicé un divisor de tensión para reducir los 10VDC de los sensores analógicos comerciales a los 5VDC máximos que maneja el microcontrolador. Si el sensor entrega 5VDC, entonces podemos colocar una resistencia pequeña, de unos 33R (en R4 o R5), y dejamos el otro lado del divisor sin resistencia (abierto). Así mismo, en esta misma configuración, podríamos hacer que las entradas sirvan para un lazo de corriente de 4-20mA calculando solamente el valor adecuado para R4 o R5 (o ambos).

¡Ser dueños del diseño nos da un mundo de posibilidades!

¿Porqué entonces algunos fabricantes han conectado las entradas a través de resistencias en lugar de opto-acopladores? Existe una razón muy importante para hacerlo así. Si Ud lo sabe, póngalo en los comentarios; si no lo sabe y quiere saberlo, escriba su duda en los comentarios y cuando el número de éstos llegue a 25 dentro de los próximos 10 años, entonces les daré la respuesta =)

(Esta promoción termina en julio de 2030.)

Salidas

Nuestro controlador tiene 4 salidas a relevador y 2 salidas a transistor. Las salidas a relevador están galvánicamente aisladas y sirven para controlar directamente cargas de hasta 10A, tanto en corriente directa como alterna. Las salidas a transistor, que no están aisladas, se utilizan para controlar cargas ligeras (como contactores o LEDs), o cargas que requieran tiempos de conmutación muy rápidos, tal como PWM (modulación por ancho de pulso), o para llevar a cabo control de temperatura a través de un relevador de estado sólido (SSR).

La tensión de bobina de los relevadores puede ser de 5VDC, 12VDC, o 24VDC. Agregué un puente para que la tensión que llega a las bobinas sea la misma de la alimentación de la tarjeta (12VDC o 24VDC), o se tome de la salida de 5VDC del regulador 7805. Con esto último, y una correcta selección de las resistencias para las entradas digitales, ¡logramos un controlador que funcione a 12VDC o 24VDC!

La potencia para las bobinas de los relevadores, así como las salidas a transistor, se toman de un ULN2003. Los LEDs testigos de las salidas están conectados a la entrada de este circuito integrado, y no a su salida. Poner los LEDs del lado de los relevadores los estresaría mucho, tanto por la tensión de alimentación (por arriba de 5VDC) como por la tensión inversa creada al quitar la alimentación de las bobinas (aunque utilicemos el diodo free wheeling).

Además, los relevadores, cuya tensión y corriente nominales son 127VAC y 10A, deben estar aislados de la baja tensión y sus pistas deben muy anchas, y en la medida de lo posible, exponiendo el estaño. Es por eso que cada salida a relevador de nuestro controlador incluye una ranura de seguridad y tiene pistas gruesas y con el estaño expuesto:

Para terminar esta sección quiero comentar que Ud encontrará diseños en Internet que tienen opto-acopladores entre la salida del ULN2003 y los relevadores. Es mi obligación aclarar que si no utiliza una fuente separada para las salidas, entronces tanto aislamiento no sirve para nada. El doble aislamiento sirve como mercadotecnia, a menos que incluya una fuente de alimentación separada.

La única forma para que los opto-acopladores a la salida sirvan a su propósito es que las terminales comunes (COMx) sean diferentes. Cuando todas las salidas del controlador son a transistor, entonces el opto-acoplador es obligatorio; no así cuando se trata de relevadores.

Cerebro

Aquí no hay mucho que adivinar. El cerebro de nuestro controlador es el microcontrolador de 8 bits ATmega328 de Atmel (adquirida por Microchip). Tiene 32KB de memoria de programa y 2 KB de memoria para variables. Para un controlador de 8 entradas y 8 salidas programado en C/C++, ¡32KB es muchísima memoria de programa!

Este procesador es el mismo utilizado en las tarjetas Arduino UNO, se consigue con mucha facilidad, y su precio es decente. A mi parecer es el microcontrolador con más soporte en todo el mundo gracias a la plataforma Arduino.

Tarjeta minimalista (sistema mínimo) tipo Arduino UNO. Se utiliza para instalaciones definitivas ya que el usuario puede usar los conectores que mejor se adapten a su proyecto.

8 bits parecen poco para un controlador industrial, ¿cierto? FALSO. El procesador del PLC Zelio, cuya foto le mostré hace un momento, es el ATmega128, de la misma familia (mismo núcleo) que el ATmega328, pero con más memoria y más terminales. Así que por el momento no se preocupe por utilizar 8 bits.

Sin embargo, si sus procesos requiriesen una gran cantidad de cálculos numéricos, o necesita una velocidad de procesamiento más alta, entonces lo mejor sería migrar a un procesador de 32 bits con núcleo ARM Cortex, como el LPC1227, pero para los procesos industriales mencionados hace un momento, el ATmega328 es más que suficiente.

Fuente de alimentación

Finalmente llegamos al cuarto elemento de nuestro controlador, la fuente de alimentación.

Para diseñarla tuve dos opciones: una fuente lineal, o una fuente conmutada. La segunda es más eficiente, pero más complicada. La idea de nuestro controlador es que podamos construirlo con componentes thru-hole y que además sean de fácil consecución. Las fuentes conmutadas requieren de inductancias que no son fáciles de conseguir si no es a través de distribuidores internacionales como mouser.com. Yo compro seguido con ellos, y lo más probable es que ustedes no lo hagan. Esta fue la principal razón por la cual me decidí por una fuente lineal basada en el circuito integrado 7805.

La protección contra inversiones de polaridad en la alimentación es más complicado que un simple diodo. Éste nos daría muchos problemas si decidimos que los relevadores sean de 5VDC alimentados por el 7805.

Y hablando del 7805, en específico de la disipación de calor, Ud notará que no existe un disipador de calor. Más o menos. Cuando el 7805 sólo se dedica a alimentar la parte del cerebro y los relevadores son alimentados por la tensión de entrada (12VDC o 24 VDC), entonces el disipador no es necesario. Sin embargo, si los relevadores son alimentados por el 7805, ¡sí que necesitaremos un disipador!

Entre el cuerpo del 7805 y el borde de la tarjeta dejé una distancia de 2mm lo cual nos permitirá colocar una lámina de aluminio de ese grosor en caso de que el chip se sobre-caliente (cosa que sí sucederá en el escenario descrito).

Reloj de tiempo real

Existe un quinto elemento del cual vale la pena hablar debido al grado de flexibilidad que introduce en el diseño: el reloj de tiempo real (RTC por sus siglas en inglés).

Un RTC es un dispositivo que maneja y mantiene la hora/calendario. Los más simples sólo llevan la hora, por ejemplo el MCP7940, la cual se pierde si se le quita la alimentación; mientras que otros más sofisticados, como el MCP79410, incluyen soporte para batería de respaldo (más otras monerías: RAM, EEPROM, alarmas, pin multi función), con lo cual la hora/calendario se mantiene aún con cortes largos de la alimentación.

Nuestro controlador incluye un RTC: el que nosotros deseemos instalarle. Así es, afortunadamente el tamaño del chip y la distribución de terminales es estándar entre fabricantes y grado de sofisticación, por lo que podemos soldar un MCP7940, o un MCP79410, o un M41T11. Todos estos RTCs se comunican vía el protocolo serial IIC (ó I2C, ó Wire, como también se le conoce).

En la imagen anterior podemos observar varias cosas acerca del RTC:

  • Utilicé al MCP79410 porque tiene soporte de batería, unos cuantos bytes de RAM, y dos alarmas.
  • Usa un cristal de 32768 Hz. Aquí se puede notar una cama de estaño que conecta el encapsulado metálico con el plano de tierra de la tarjeta.
  • Los capacitores C5 y C6 no están instalados porque al momento de construir el prototipo no los tenía a la mano (15/julio/2020, en México estamos en medio de la pandemia del Covid-19 y no podemos salir de nuestras casas, así que no puedo ir a comprarlos), pero por fortuna, el reloj funciona y permite realizar su programación.
  • El puente MFP-DIR conecta una terminal del ATmega328 hacia la salida MFP (Multi-function pin) del RTC o hacia la salida RS485-DIR. Dado que ya no tenía pines disponibles en el chip principal, tuve que agregar el puente y que el usuario decidiera si quiere las alarmas del RTC o utilizar el canal de comunicación RS485.

Ventajas del RTC

En cualquier caso no sólo se trata de controlar la hora/calendario, sino tomar ventaja de ello. Con el RTC podremos programar eventos diarios o semanales basados en la hora del día, o el día de la semana. ¡Con un RTC se nos abre otro mundo de posibilidades!

¿No podríamos llevar la hora/calendario por software y ahorrarnos el RTC? Llevar la hora del día por software es muy fácil; llevar el calendario es una pesadilla.

Controlador industrial UB-PLR328A

Pues la hora de la verdad ha llegado y les presento a nuestro controlador industrial, casi terminado de ensamblar:

Controlador industrial UB-PLR328A.

Sus dimensiones son de 10x10cm, doble cara, componentes trhu-hole en su mayoría.

Si Ud quiere ver el proceso en el tiempo del desarrollo de este proyecto, lo invito a ver algunos videos que creé con ese propósito:

¿Qué sigue?

Me gustaría hablarles del sistema operativo del PLC (desde el punto de vista de Ingeniería de Software), de su programación (desde el punto de vista de programación de PLCs), y de la versión Open source de una variante de este diseño para que ustedes manden fabricar sus propios circuitos impresos. Pero cada uno de estos sub-temas requieren su propia entrada del blog (y eventualmente, un video). Si les interesa que escriba o haga videos sobre esos temas, háganmelo saber en los comentarios. ¡Ah! y no olviden suscribirse a este blog.


Si encuentras este blog interesante, entonces podrías considerar suscribirte a él y recibir información relevante sobre tecnología y sistemas embebidos, y de vez en cuando, uno que otro regalo.