Construya un controlador industrial de bajo costo con la Raspberry Pi 3

Colaboración de Editores de Digi-Key de América del Norte

Pocas de las operaciones industriales de pequeñas tiendas requieren de la combinación de entornos operativos hostiles, alta capacidad de E/S y complejos requisitos de funcionalidad para los que originalmente fueron diseñados los controladores lógicos programables (PLC). Si bien están disponibles versiones reducidas de los PLC, los diseñadores ahora también tienen la opción de elegir entre una variedad de soluciones de hardware y software de código abierto de bajo costo para un control y una supervisión industriales eficaces.

Un ejemplo de tal solución es la pequeña Raspberry Pi 3 de la Fundación Raspberry Pi y sus placas adicionales asociadas. Este artículo describirá las principales características de la Raspberry Pi 3 antes de discutir cómo usarla para monitorear y controlar aplicaciones.

Por qué utilizar Raspberry Pi para el control industrial de pequeñas tiendas

Para muchas operaciones más pequeñas, la plataforma Raspberry Pi 3 ofrece una solución de bajo costo con capacidades de rendimiento sustanciales. Plenamente capaz de manejar tareas de automatización industriales dedicadas, la placa Raspberry Pi 3 combina un procesador Broadcom ARM® Cortex®basado en A53, 1 GB de RAM, interfaces digitales, Wi-Fi y conectividad Bluetooth. El procesador en sí es un dispositivo de sistemas en chip (SoC) de alto rendimiento que integra una unidad central de procesamiento ARM Cortex-A53 de cuatro núcleos con 512 KB de caché L2 y 54 GPIO (entradas y salidas de uso general) organizadas en tres bancos.

Cada GPIO individual admite de forma variada al menos dos y hasta seis funciones alternativas, incluidos moduladores de ancho de pulso, relojes e interfaces en serie. Los desarrolladores pueden usar cualquier GPIO no asignada como líneas de interrupción, entradas o salidas capaces de suministrar hasta 16 miliamperios (mA) (hasta un total de 50 mA por banco de GPIO).

Al igual que con otros miembros de la familia Raspberry Pi, la Raspberry Pi 3 está diseñada para hacer que el desarrollo incorporado sea lo suficientemente simple para principiantes, pero lo suficientemente potente como para satisfacer las necesidades de desarrolladores experimentados con requisitos de procesamiento más complejos y potentes.

Para empezar, los desarrolladores simplemente conectan los puertos de video de la placa a sus pantallas y sus puertos USB a su teclado y mouse. Para el diseño de software, los desarrolladores pueden construir en un ecosistema amplio compatible con el sistema operativo Raspbian basado en Linux de la Fundación Raspberry Pi cargado desde una tarjeta de memoria a través de la interfaz micro SD de la placa.

Agregar capacidades industriales

Más allá de su rendimiento y facilidad de desarrollo, el enfoque simplificado de Raspberry Pi para ampliar su funcionalidad la hace adecuada para los diversos requisitos de las aplicaciones de automatización industrial. Para agregar capacidades de hardware, los desarrolladores solo necesitan enchufar una placa adicional llamada HAT (hardware conectado en la parte superior) en la placa Raspberry Pi 3. Al igual que con los sistemas industriales más complejos, la HAT proporciona un enfoque estándar para identificar la HAT y configurar automáticamente las GPIO y los controladores según sea necesario. Como resultado, los desarrolladores pueden actualizar instantáneamente su sistema Raspberry Pi para aplicaciones industriales simplemente conectando la HAT de automatizaciónPIM213de Pimoroni(Figura 1).

Imagen de la placa adicional HAT de automatización de Pimoroni

Figura 1: Los desarrolladores pueden actualizar una placa base Raspberry Pi 3 para la automatización industrial al conectar placas adicionales especializadas como la HAT de automatización de Pimoroni. (Fuente de la imagen: Pimoroni)

Específicamente diseñada para monitorear y controlar los sistemas de automatización, la HAT de automatización de Pimoroni combina múltiples canales de E/S, incluidas entradas analógicas y digitales, salidas alimentadas y controles de relé. Junto con su capacidad de 24 voltios (V), los canales de E/S proporcionan un búfer de entrada y salida sustancial. Por ejemplo, las salidas de relé soportan hasta 2 amperios (A), suficientes para conducir partes de baja potencia de 24 voltios, como la válvula solenoide Crouzet 81 546 001.

Para el desarrollo de software con la HAT de automatización, Pimoroni proporciona un módulo de Python asociado que requiere solo unas pocas líneas de código para usar las características de hardware de HAT. Cuando se importa a un programa de Python, el módulo Pimoroni crea objetos de software para entrada analógica, entrada digital, salida digital, salida de relé y control de luz LED, cada uno de los cuales incluye las funciones de lectura o escritura de nivel inferior adecuadas (Listado 1).

class AnalogInput(object):

    type = 'Analog Input'

 

    def __init __ (self, channel, max_voltage, led):

        self._en_auto_lights = True

        self.channel = channel

        self.value = 0

        self.max_voltage = float (max_voltage)

        self.light = SNLight (led)

 

    def auto_light (self, value):

        self._en_auto_lights = value

        return True

 

    def leer (self):

        """Return the read voltage of the analog input"""

        return round(self.value * self.max_voltage, 2)

 

    def _update (self):

        self.value = ads1015.read(self.channel)

 

def _auto_lights (self):

        si self._en_auto_lights:

            adc = self.value

            self.light.write (max (0.0, min (1.0, adc)))

Listado 1: El módulo Python de Pimoroni para HAT de automatización simplifica el desarrollo mediante el manejo de transacciones detalladas, como la lectura desde el convertidor de analógico a digital (ADC) integrado. (Fuente de la imagen: Pimoroni)

Cada objeto identifica el canal correspondiente y otros datos relacionados. Por ejemplo, en la creación, el objeto de entrada analógica incluye el voltaje máximo para la clavija asociada (vea la función init en el Listado 1). Para realizar una conversión de convertidor analógico a digital (ADC), el objeto ADC llama al módulo ADC subyacente (ads1015.read en el Listado 1). El módulo ADC, a su vez, realiza las transacciones de bajo nivel 2C requeridas para configurar el ADC y realizar una conversión antes de devolver el valor en una forma útil (Listado 2).

class ads1015:

    def __init__(self, i2c_bus=None, addr=ADDR):

        self._over_voltage = [False] * 4

 

        self.i2c_bus = i2c_bus

        si no es hasattr (i2c_bus, "write_i2c_block_data") ni hasattr (i2c_bus, "read_i2c_block_data"):

            raise TypeError("El objeto dado para i2c_bus debe implementar write_i2c_block_data y read_i2c_block_data")

 

        self.addr = addr

 

    def read(self, channel=0, programmable_gain=PGA_4_096V, samples_per_second=1600):

        # sane defaults

        config = 0x0003 | 0x0100

 

        config |= SAMPLES_PER_SECOND_MAP[samples_per_second]

        config |= CHANNEL_MAP[channel]

        config |= PROGRAMMABLE_GAIN_MAP[programmable_gain]

 

        # set "single shot" mode

        config |= 0x8000

 

        # write single conversion flag

        self.i2c_bus.write_i2c_block_data(self.addr, REG_CFG, [(config >> 8) & 0xFF, config & 0xFF])

 

        delay = (1.0 / samples_per_second) + 0.0001

        time.sleep(delay)

 

        data = self.i2c_bus.read_i2c_block_data(self.addr, REG_CONV)

 

        value = ((data[0] << 4) | (data[1] >> 4))

 

        if value & 0x800:

            value -= 1 << 12

 

        value /= 2047.0 # Divide down to percentage of FS

        value *= float(programmable_gain)

        value /= 3300.0 # Divide by VCC

 

        return value

...

Listado 2: Una llamada de función de mayor nivel para una conversación ADC invoca una rutina de lectura, que realiza una escritura de bus I2C para iniciar la conversión, se inactiva el tiempo suficiente para completar la conversión y realiza una lectura de bus I2C para recopilar el resultado. (Fuente de la imagen: Pimoroni)

Para el desarrollador, sin embargo, leer un valor analógico simplemente requiere ejecutar la función de lectura de alto nivel (.read()) en la entrada analógica especificada (.one) para el objeto analógico:

          value = automationhat.analog.one.read()

La biblioteca soporta este modelo simple para otras características de HAT, por lo que activar o desactivar un relé es una decisión simple:

          automationhat.relay.write(1) # 1 = ON, 0 = OFF

Opciones flexibles

La HAT de automatización de Pimoroni ofrece la funcionalidad de E/S básica requerida para una pequeña aplicación de automatización industrial, pero los desarrolladores pueden elegir entre un amplio conjunto de HAT disponibles para todo tipo de características requeridas para aplicaciones especializadas como la automatización industrial. Por ejemplo, la HAT de Adafruit 3013 RTC proporciona funcionalidad de reloj en tiempo real (RTC), que no es una característica estándar de la placa en sí. Los diseñadores de Raspberry Pi esperan que los desarrolladores mantengan la placa adherida a Internet, donde puede usar el protocolo de tiempo de red (NTP) estándar para mantener el tiempo real. En consecuencia, se requiere un RTC externo como la HAT RTC de Adafruit para diseños que pueden perder conexión a Internet por diseño o por accidente.

Al agregar funcionalidades tales como un RTC, los desarrolladores no necesitan limitarse a una única HAT en un diseño de automatización industrial. Los desarrolladores pueden apilar varias HAT en una placa Raspberry Pi. Aunque la mayoría de las HAT están diseñadas para el apilado, los desarrolladores pueden necesitar agregar cabeceras de apilamiento como el 2223 de Adafruit para completar el ensamblaje o separadores M2.5 para eliminar la posibilidad de que las HAT se toquen entre sí o toquen el tablero base.

Mediante el uso de cabeceras y separadores de apilamiento, los desarrolladores podrían apilar fácilmente una HAT, como la HAT 2348de motor de Adafruit, para agregar los impulsores de motor necesarios en muchas aplicaciones de automatización industrial. Cada HAT 2348 de motor puede impulsar dos motores paso a paso o cuatro motores de CC. De hecho, los desarrolladores pueden apilar hasta 32 de estas placas adicionales para admitir hasta 64 motores paso a paso o 128 motores de CC (Figura 2).

Imagen de múltiples HAT 2348 de motor de Adafruit

Figura 2: Los desarrolladores pueden apilar múltiples HAT 2348 de motor de Adafruit para admitir hasta 64 motores paso a paso o 128 motores de CC en un diseño. (Fuente de la imagen: Adafruit)

Al igual que con la HAT de automatización de Pimoroni, la HAT 2348 de motor de Adafruit se puede programar usando unos pocos comandos simples de Python. El software de muestra de Adafruit para la HAT de motor incluso demuestra patrones de diseño básicos para usar el módulo de ejecución Python para ejecutar múltiples motores en paralelo (Listado 3).

from Adafruit_MotorHAT import Adafruit_MotorHAT, Adafruit_DCMotor, Adafruit_StepperMotor

import threading

 

# create a default object, no changes to I2C address or frequency

mh = Adafruit_MotorHAT()

 

# create empty threads (these will hold the stepper 1 and 2 threads)

st1 = threading.Thread()

st2 = threading.Thread()

 

. . .

 

myStepper1 = mh.getStepper(200, 1)      # 200 steps/rev, motor port #1

myStepper2 = mh.getStepper(200, 2)      # 200 steps/rev, motor port #1

myStepper1.setSpeed(60)          # 30 RPM

myStepper2.setSpeed(60)          # 30 RPM

 

stepstyles = [Adafruit_MotorHAT.SINGLE, Adafruit_MotorHAT.DOUBLE, Adafruit_MotorHAT.INTERLEAVE, Adafruit_MotorHAT.MICROSTEP]

 

def stepper_worker(stepper, numsteps, direction, style):

    #print ("Steppin!")

    stepper.step(numsteps, direction, style)

    #print("Done")

 

while (True):

    if not st1.isAlive():

        randomdir = random.randint(0, 1)

        if (randomdir == 0):

            dir = Adafruit_MotorHAT.FORWARD

        else:

            dir = Adafruit_MotorHAT.BACKWARD

        randomsteps = random.randint(10,50)

        st1 = threading.Thread(target=stepper_worker, args=(myStepper1, randomsteps, dir, stepstyles[random.randint(0,3)],))

        st1.start()

 

    if not st2.isAlive():

        randomdir = random.randint(0, 1)

        if (randomdir == 0):

            dir = Adafruit_MotorHAT.FORWARD

        else:

            dir = Adafruit_MotorHAT.BACKWARD

 

        randomsteps = random.randint(10,50)

        print("%d steps" % randomsteps)

 

        st2 = threading.Thread(target=stepper_worker, args=(myStepper2, randomsteps, dir, stepstyles[random.randint(0,3)],))

        st2.start()

Listado 3: El módulo de Python de la HAT de motor de Adafruit incluye un software de muestra como este fragmento que demuestra el uso de comandos de control simples y el uso del módulo de ejecución de Python para controlar un par de motores paso a paso. (Fuente de la imagen: Adafruit)

Para funcionalidades que no se ofrecen en las HAT disponibles, los desarrolladores no necesitan limitarse al formato HAT. El protector DFRobot DFR0327 de Arduino, el kit inicial de Seeed Technology GrovePi+ y el protector de clic MIKROE-2756 de MikroElektronika brindan a los desarrolladores acceso a la amplia variedad de protectores Arduino disponibles, dispositivos Grove y placas de clic MikroBUS, respectivamente.

Utilizando estas placas, los desarrolladores pueden agregar rápidamente soporte para interfaces CAN estándares conectando la placa de clic CAN MIKROE-988  de MikroElektronika, y para bucles de corriente de 4 a 20 mA con la placa de clic de bucle de corriente MIKROE-1296 de MikroElektronika.

Completar el diseño de la pequeña tienda

Incluso después de configurar rápidamente el diseño basado en Raspberry Pi con la funcionalidad adicional requerida, los desarrolladores a menudo pierden tiempo en construir una interfaz de usuario adecuada. Con Raspberry Pi 3, los desarrolladores pueden conectar el diseño al servicio en la nube de E/S de Adafruit para proporcionar a los usuarios retroalimentación gráfica y control de los procesos de automatización. El servicio en la nube permite a los desarrolladores crear sistemas de alimentación simples de datos e información de proceso (Listado 4) y crear tableros que permitan a los usuarios monitorear y controlar proyectos desde cualquier navegador web en el escritorio, el teléfono inteligente u otro dispositivo móvil (Figura 3).

# Import library and create instance of REST client.

from Adafruit_IO import Client

aio = Client('YOUR ADAFRUIT IO KEY')

 

# Send the value 100 to a feed called 'Foo'.

aio.send('Foo', 100)

Listado 4: Los desarrolladores pueden transmitir fácilmente los datos de su aplicación de automatización industrial a la nube de E/S de Adafruit para su visualización y control. (Fuente de la imagen: Adafruit)

Imagen del tablero de E/S de Adafruit

Figura 3: Los desarrolladores pueden mostrar información de sus aplicaciones de automatización industrial basadas en Raspberry Pi 3 y proporcionar control utilizando el tablero de E/S de Adafruit. (Fuente de la imagen: Adafruit)

La combinación del desarrollo de software simple, diversos tableros adicionales y la Raspberry Pi de alto rendimiento ofrece una solución adecuada para aplicaciones de automatización industrial a pequeña escala. Sin embargo, en algunas de estas aplicaciones, los desarrolladores pueden necesitar un control de temporización más estricto que el proporcionado en configuraciones que usan RTC, como la HAT RTC 3013 de Adafruit.

La HAT RTC 3013 se basa en el circuito integrado con RTC Maxim Integrated DS3231, que proporciona dos alarmas programables y una señal de salida de onda cuadrada. Los desarrolladores pueden usar las alarmas para generar una interrupción en un número específico de días, horas, minutos y segundos, o usar la onda cuadrada para generar una interrupción a la velocidad de 1 Hertz (Hz). Para las aplicaciones que requieren interrupciones periódicas más rápidas que 1 Hz, los desarrolladores deberán desarrollar funciones de software personalizadas utilizando el temporizador del sistema del procesador o crear contadores de hardware personalizados capaces de generar una interrupción a la velocidad deseada.

En aplicaciones que requieren una resolución de temporización más rápida, la latencia de respuesta determinista se convierte en un requisito igualmente importante. A altas velocidades, la variabilidad en la latencia de respuesta en el SO Raspbian estándar podría comprometer la precisión. Aunque es probable que el sistema estándar proporcione una respuesta lo suficientemente determinista con una resolución de milisegundos, los desarrolladores podrían necesitar recurrir a enfoques que utilicen el parche Linux PREEMPT_RT para cumplir con los requisitos de resolución más estrictos y más deterministas.

Conclusión

Los PLC convencionales ofrecen capacidades que generalmente van más allá de los requisitos y presupuestos de las operaciones industriales más pequeñas en las tiendas de fabricación, mecanizado y creación de prototipos de pequeña escala. Para estas aplicaciones, los operadores normalmente enfrentan requisitos más modestos que se encuentran dentro de la capacidad de la Raspberry Pi 3.

Al utilizar Raspberry Pi 3 y las placas adicionales adecuadas, los desarrolladores pueden implementar rápidamente sistemas de automatización industrial dedicados, capaces de cumplir con los requisitos para una amplia gama de operaciones de tiendas pequeñas.

Descargo de responsabilidad: Las opiniones, creencias y puntos de vista expresados por los autores o participantes del foro de este sitio web no reflejan necesariamente las opiniones, las creencias y los puntos de vista de Digi-Key Electronics o de las políticas oficiales de Digi-Key Electronics.

Información sobre la editorial

Editores de Digi-Key de América del Norte