使用Raspberry Pi 3实现工业控制

投稿人:DigiKey 北美编辑

有些小企业的工业作业需要同时满足恶劣工作环境、高 I/O 能力和复杂功能要求,可编程逻辑控制器 (PLC) 正好可以胜任。尽管存在简化版 PLC,但设计师现在也可以选择多种低成本的开源硬件和软件解决方案,以实现有效的工业监视和控制。

Raspberry Pi Foundation 的微小型 Raspberry Pi 3 及其相关的扩展板就是此类解决方案的一个实例。本文将介绍 Raspberry Pi 3 的主要特征,然后讨论如何使用它来监视和控制应用。

Raspberry Pi 为何适用于小企业工业控制

对于很多较小作业规模而言,Raspberry Pi 3 平台提供了一种性能卓越的低成本解决方案。Raspberry Pi 3 开发板结合了基于 Broadcom ARM® Cortex®-A53 的处理器、1 GB RAM、数字接口、Wi-Fi 和蓝牙连接,完全能够胜任专门的工业自动化任务。处理器本身就是一个高性能的片上系统 (SoC) 器件,集成了具有 512 KB L2 缓冲的四核 ARM Cortex-A53 CPU 以及 54 个排列成三组的 GPIO。

每个 GPIO 分别支持最少两种、最多六种替代性功能,包括脉宽调制器、时钟和串行接口。开发人员可以将任何未分配的 GPIO 用作可提供最多 16 毫安 (mA) 电流(每组 GPIO 总电流最多为 50 mA)的中断线、输入或输出。

与 Raspberry Pi 系列中的其他产品一样,Raspberry Pi 3 充分简化了嵌入式开发,初学者亦能轻松上手,同时仍不失足够强大,可以满足经验丰富的开发人员更复杂、更强大的处理要求。

开始时,开发人员只需将开发板的视频端口连接到显示器并将其 USB 端口连接到键盘和鼠标。对于软件设计,开发人员则有着广泛的生态系统基础支撑,受到 Raspberry Pi Foundation 的基于 Linux 的免费 Raspbian 操作系统支持,且该操作系统可通过该开发板的微型 SD 接口从存储卡加载。

增加工业处理能力

除了具有高性能和易开发的优势以外,Raspberry Pi 用于扩展其功能的简化方法也非常适合工业自动化应用的各种要求。需要增加硬件的能力时,开发人员只需将一块被称为 HAT(顶部安装硬件)的扩展板插到 Raspberry Pi 3 开发板上即可。与更复杂的工业系统一样,HAT 提供了用于识别 HAT 以及根据需要自动配置 GPIO 和驱动程序的标准方法。因此,开发人员只需插入 Pimoroni PIM213 Automation HAT(图 1),即可针对工业应用立即将自己的 Raspberry Pi 系统升级。

Pimoroni Automation HAT 扩展板图片

图 1:开发人员可以通过连接专用的扩展板(例如 Pimoroni Automation HAT)来升级用于实现工业自动化的基础 Raspberry Pi 3 开发板。(图片来源:Pimoroni)

专为监测和控制自动化系统而设计的 Pimoroni Automation HAT 组合了多个 I/O 通道,包括模拟和数字输入、供电型输出以及继电器控制。除了支持 24 伏 (V) 电压以外,这些 I/O 通道还提供大容量的输入和输出缓存。例如,继电器输出支持最大 2 安 (A) 的电流,足以驱动低功耗的 24 伏零件,如 Crouzet 81 546 001 电磁阀。

对于使用 Automation Hat 进行的软件开发,Pimoroni 提供了一个相关的 Python 模块,只需要编写几行代码,就可使用 HAT 的硬件功能。当导入到 Python 程序时,Pimoroni 模块会创建软件对象,以控制模拟输入、数字输入、数字输出、继电器输出和 LED 灯,所有这些功能都包含相应的低级别读/写功能(列表 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 read(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):

        if self._en_auto_lights:

            adc = self.value

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

列表 1:Pimoroni 用于 Automation HAT 的 Python 模块可通过处理详细事务处理,如从板载模数转换器 (ADC) 读取读数,而简化开发工作。(图片来源:Pimoroni)

每个对象都可以识别相应的通道和其他相关数据。例如,当创建时,模拟输入对象包含关联引脚的最大电压(请参见列表 1 中的 init 函数)。为了执行模数转换器 (ADC) 转换,ADC 对象会调用底层的 ADC 模块(列表 1 中的 ads1015.read)。随后,ADC 模块会执行设置 ADC 和执行转换所需的低级别 I2C 事务处理,然后返回有用格式的值(列表 2)。

class ads1015:

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

        self._over_voltage = [False] * 4

 

        self.i2c_bus = i2c_bus

        if not hasattr(i2c_bus, "write_i2c_block_data") or not hasattr(i2c_bus, "read_i2c_block_data"):

            raise TypeError("Object given for i2c_bus must implement write_i2c_block_data and 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

...

列表 2:用于 ADC 转换的更高级别函数调用会调用一个读取例程,此例程会执行 I2C 总线写入以开始进行转换,并休眠足够长的时间以便转换完成,然后执行 I2C 总线读取以收集结果。(图片来源:Pimoroni)

但对于开发人员而言,当读取模拟值时,只需对模拟对象的指定模拟输入 (.one) 执行高级别读取功能 (.read()):

          value = automationhat.analog.one.read()

资源库允许使用这种简单模型实现其他的 HAT 功能,因此打开或关闭继电器也是一个简单的调用:

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

灵活的选择

Pimoroni Automation HAT 提供了小型工业自动化应用所需的基本 IO 功能,但开发人员可以选择多种可用的 HAT,以实现工业自动化等专业应用所需的各种功能。例如,Adafruit 3013 RTC HAT 提供实时时钟 (RTC) 功能,这并非开发板本身的标准功能。Raspberry Pi 设计师希望开发人员始终将开发板连接到因特网,以便能够使用标准的网络时间协议 (NTP) 保持时钟时间。因此,对于因设计本意或意外与因特网断开连接的设计,需要使用外部 RTC,例如 Adafruit RTC HAT。

当增加 RTC 等功能时,开发人员在工业自动化设计中无需只使用一个 HAT。开发人员可以在 Raspberry Pi 开发板上叠接多个 HAT。尽管大多数 HAT 经过专门设计可进行叠接,但开发人员可能需要增加叠接针座(例如 Adafruit 的 2223)以完成装配,或者增加 M2.5 支座以防止 HAT 相互接触或与基板接触。

开发人员可以使用叠接针座和支座轻松叠接 HAT,例如 Adafruit 2348 电机 HAT,以增加很多工业自动化应用所需的电机驱动器。每个 2348 电机 HAT 都可以驱动两个步进电机或四个直流电机。实际上,开发人员可以叠接多达 32 块这样的扩展板,以支持最多 64 个步进电机或 128 个直流电机(图 2)。

多个 Adafruit 2348 电机 HAT 图片

图 2:开发人员可以叠接多个 Adafruit 2348 电机 HAT,以便在设计中支持最多 64 个步进电机或 128 个直流电机。(图片来源:Adafruit)

与 Pimoroni Automation HAT 一样,可以使用几个简单的 Python 命令对 Adafruit 2348 电机 HAT 进行编程。Adafruit 针对电机 HAT 的采样软件甚至具有基本设计模式,能够使用 Python 线程模块并行运行多个电机(列表 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()

列表 3:Adafruit 的电机 HAT Python 模块包含采样软件,例如此代码片段就展示了如何使用简单控制命令和 Python 线程模块来控制一对步进电机。(图片来源:Adafruit)

对于可用 HAT 中未提供的功能,开发人员不需要限制自己只使用 HAT 格式。利用 DFRobot DFR0327 Arduino 盾板、Seeed Technology GrovePi+ 入门套件和 MikroElektronika MIKROE-2756 click 盾板,开发人员能够分别获得大量的可用 Arduino 盾板Grove 器件MikroBUS click 板

使用这些开发板时,开发人员可以通过连接 MikroElektronika MIKROE-988 CAN click 板,快速添加标准 CAN 接口支持,或通过连接 MikroElektronika MIKROE-1296 4 至 20 mA 电流回路 Click 板,添加 4 至 20 mA 的电流回路。

完成小企业设计

即使为基于 Raspberry Pi 的设计快速配置了所需的扩展功能后,开发人员通常也需要花费时间构建相应的用户界面。而使用 Raspberry Pi 3 之后,开发人员就可以将设计连接到 Adafruit 的 IO 云服务,从而为用户提供自动化流程的图形化反馈和控制。云服务允许开发人员创建简单的数据和流程信息馈送(列表 4),并构建仪表板以允许用户从台式机、智能手机或其他移动设备上的任何 Web 浏览器监视和控制项目(图 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)

列表 4:开发人员可以轻松地将数据从工业自动化应用传输到 Adafruit IO 云服务,进行显示和控制。(图片来源:Adafruit)

Adafruit IO 仪表板图片

图 3:开发人员可以显示来自基于 Raspberry Pi 3 的工业自动化应用的信息,并使用 Adafruit IO 仪表板提供控制。(图片来源:Adafruit)

简单的软件开发、丰富的扩展板和高性能的 Raspberry Pi 组合提供了一个适合小型工业自动化应用的解决方案。但在某些这样的应用中,与使用 RTC 的配置(例如 Adafruit 3013 RTC HAT)相比,开发人员可能需要更严格的定时控制。

3013 RTC HAT 基于 Maxim Integrated DS3231 RTC IC,提供了两个可编程报警功能和一个方波输出信号。开发人员可以使用报警功能在指定日期、时、分、秒生成中断,或者使用方波在 1 赫兹 (Hz) 频率生成中断。对于需要以快于 1 Hz 的定期中断的应用,开发人员需要使用处理器的系统定时器开发定制软件功能,或者构建能够以所需的速率生成中断的定制硬件计数器。

在需要更快的定时分辨率的应用中,同样重要的要求将变成确定性响应延迟。在高速率下,标准 Raspbian 操作系统中的响应延迟变化可能会影响精度。尽管标准系统可能以微秒级分辨率提供具有足够确定性的响应,但开发人员可能需要借助使用 Linux PREEMPT_RT 补丁的方法来满足更严格、更具确定性的分辨率要求。

总结

传统 PLC 提供的能力通常超出小规模制造业、加工业和原型开发车间的大多数较小工业作业的要求和预算。对于这些应用,操作员面临的要求通常较低,Raspberry Pi 3 完全可以胜任。

开发人员可以使用 Raspberry Pi 3 和相应的扩展板,快速实施能够满足广泛小企业作业要求的专用工业自动化系统。

免责声明:各个作者和/或论坛参与者在本网站发表的观点、看法和意见不代表 DigiKey 的观点、看法和意见,也不代表 DigiKey 官方政策。

关于此出版商

DigiKey 北美编辑