很少有小型的工业操作需要复杂的操作环境、高的I/O容量和复杂的功能需求,而这些要求是可编程逻辑控制器(PLCs)的初衷。虽然缩小版的PLCs是可用的,但设计师现在也可以选择从一系列低成本的开源硬件和软件解决方案中选择有效的工业监控和控制。
这种解决方案的一个例子是树莓Pi基金会的小覆盆子Pi 3及其相关的插件板。本文将描述树莓Pi 3的主要特性,然后讨论如何使用它来监视和控制应用程序。
为什么要为小商店的工业控制树莓派?
对于许多较小的操作,Raspberry Pi 3平台提供了一种低成本的解决方案,具有强大的性能。完全有能力处理专用工业自动化任务,覆盆子π3板结合了Broadcom手臂®皮层®-A53-based处理器,1 gb的RAM,数字接口,wi - fi,蓝牙连接。处理器本身是一个高性能的系统芯片(SoC)设备,它集成了一个四核ARM Cortex-A53 CPU和512 Kbytes的L2缓存,以及54个GPIOs在三家银行中安排。
每个GPIO都支持至少两个和最多六个可选功能,包括脉冲宽度调制器、时钟和串行接口。开发人员可以使用任何未分配的GPIOs作为中断行、输入或输出,可以提供最多16毫安(mA)(最高为50 mA / GPIO银行)。
与树莓Pi家族的其他成员一样,Raspberry Pi 3的设计是为了使嵌入式开发简单到适合初学者,但是足够强大,可以满足有经验的开发人员的需求,他们需要更复杂和更强大的处理需求。
首先,开发人员只需将电路板的视频端口连接到显示器和USB接口,就可以连接到键盘和鼠标。对于软件设计,开发者可以建立一个广泛的生态系统,由树莓派基金会(Raspberry Pi Foundation)的基于linux的免费linux操作系统支持,该系统是通过董事会的micro SD接口从存储卡上加载的。
添加工业能力
除了性能和易于开发之外,树莓Pi简化了功能,使其更适合于工业自动化应用程序的各种需求。为了增加硬件功能,开发人员只需要在树莓Pi 3板上插入一个名为HAT(硬件附加在上面的硬件)的插件板即可。与更复杂的工业系统一样,HAT提供了一种标准方法来识别帽子,并根据需要自动配置GPIOs和驱动程序。因此,开发人员只需插入Pimoroni PIM213自动化帽(图1)即可立即升级他们的树莓Pi系统。
Pimoroni自动化帽插件板的图像。
图1:开发人员可以通过附加专门的插件板(如Pimoroni自动化帽)来升级基础树莓Pi 3的工业自动化。(图片来源:Pimoroni)
专门设计用于监视和控制自动化系统,Pimoroni自动化帽结合了多个I/O通道,包括模拟和数字输入、动力输出和继电器控制。与它们的24伏(V)能力一起,I/O通道提供了大量的输入和输出缓冲。例如,继电器输出支持多达2安培(A),足以驱动低功率24伏特部件,如Crouzet 81 546001电磁阀。
对于带有自动化帽的软件开发,Pimoroni提供了一个相关的Python模块,只需要几行代码就可以使用Hat的硬件特性。当导入到Python程序中时,Pimoroni模块为模拟输入、数字输入、数字输出、中继输出和LED光控制创建软件对象,其中包括适当的底层读/写函数(清单1)。
类AnalogInput(对象):
类型=“模拟输入”
def __init__(self, channel, max_voltage, led):
自我。_en_auto_lights = True
自我。通道=通道
自我。值= 0
自我。max_voltage =浮动(max_voltage)
自我。光= SNLight(led)
def auto_light(自我价值):
自我。_en_auto_lights =值
还真
def读(自我):
"返回模拟输入的读电压"""
返回圆(自我。*自我价值。max_voltage,2)
def _update(自我):
自我。值= ads1015.read(self.channel)
def _auto_lights(自我):
如果self._en_auto_lights:
adc = self.value
self.light.write(max(0.0分钟(1.0,adc)))
清单1:Pimoroni关于自动化帽的Python模块通过处理详细的事务来简化开发,比如从内置的模数转换器(ADC)读取数据。(图片来源:Pimoroni)
每个对象标识对应的通道和其他相关数据。例如,在创建时,模拟输入对象包括关联pin的最大电压(见清单1中的init函数)。如清单1所示,ADC模块依次执行设置ADC所需的低级别I2C事务,并执行转换,然后以有用的形式返回值(清单2)。
类ads1015:
def __init__(自我,i2c_bus = None,addr = addr):
自我。_over_voltage = [False] * 4。
自我。i2c_bus = i2c_bus
如果没有hasattr(i2c_bus,“write_i2c_block_data”)或没有hasattr(i2c_bus,“read_i2c_block_data”):
提高类型错误(“为i2c_bus提供的对象必须实现write_i2c_block_data和read_i2c_block_data”)
自我。addr = addr
def read(self, channel=0,可编程_gain=PGA _4_ 096V, samples_per_second=1600):
#理智的违约
配置= 0x0003 | 0x0100。
配置| = SAMPLES_PER_SECOND_MAP[samples_per_second]
配置| = CHANNEL_MAP(频道)
配置| = PROGRAMMABLE_GAIN_MAP[programmable_gain]
设置“单镜头”模式。
配置| = 0 x8000
#写入单个转换标志。
self.i2c_bus.write_i2c_block_data(自我。addr, REG_CFG, [(config >> 8) & 0xFF, config & 0xFF])
延迟= (1.0 / samples_per_second) + 0.0001。
time . sleep(延迟)
data = self.i2c_bus.read_i2c_block_data(自我。addr,REG_CONV)
值=(数据[0]<< 4)|(数据[1]>> 4)
如果值& 0 x800:
值-= 1 << 12。
值/= 2047.0 #除以FS的百分比。
值* =浮动(programmable_gain)
值/= 3300.0 #除以VCC。
返回值
…
清单2:ADC会话的高级函数调用调用一个read例程,该例程执行I2C总线写入启动转换,睡眠时间足够长以完成转换,并执行I2C总线读取来收集结果。(图片来源:Pimoroni)
然而,对于开发人员来说,读取模拟值只需要在指定的模拟输入(. 1)上执行模拟对象的高级读取函数(.read()):
值= automationhat.analog.one.read()
图书馆支持这个简单的模型,以其他帽子的特点,因此,开启或关闭继电器是一个简单的呼叫:
automationhat.relay.write(1)# 1 = 0 =
灵活的选项
Pimoroni自动化帽提供了小型工业自动化应用程序所需的基本IO功能,但是开发人员可以从一套丰富的可用HATs中进行选择,以满足特定应用程序(如工业自动化)所需的各种特性。例如,Adafruit 3013 RTC帽提供实时时钟(RTC)功能,这并不是板本身的标准特性。树莓派设计师期望开发人员能把板固定在互联网上,在那里它可以使用标准的网络时间协议(NTP)来保持时钟时间。因此,设计时需要一个外部的RTC,例如Adafruit RTC帽,它可能会因为设计或意外而失去与Internet的连接。
在添加诸如RTC这样的功能时,开发人员不需要在工业自动化设计中限制自己的一顶帽子。开发人员可以在树莓Pi板上叠加多个帽子。虽然大多数的帽子都是为堆放而设计的,但开发人员可能需要添加堆垛头,比如Adafruit的2223来完成组装,或者M2.5 standoffs来消除HATS可能互相碰触或底座的机会。
使用堆叠标头和standoffs,开发人员可以很容易地堆叠一顶帽子,例如Adafruit 2348运动帽,以增加许多工业自动化应用中需要的电机驱动。每个2348马达帽可以驱动两个步进电机或四个直流电机。事实上,开发人员可以堆叠多达32个插件板来支持64个步进电机或128个直流电机(图2)。
多重Adafruit 2348运动帽图像。
图2:开发者可以在设计中叠加多个Adafruit 2348运动帽来支持64个步进电机或128个直流电机。(图片来源:Adafruit)
与Pimoroni自动化帽一样,Adafruit 2348运动帽可以使用一些简单的Python命令来编程。Adafruit的运动帽示例软件甚至演示了使用Python线程模块并行运行多个电机的基本设计模式(清单3)。
从Adafruit_MotorHAT进口Adafruit_MotorHAT, Adafruit_DCMotor, Adafruit_StepperMotor。
进口线程
#创建一个默认对象,不改变I2C地址或频率。
mh = Adafruit_MotorHAT()
#创建空线程(这些线程将持有步进1和2线程)
相约= threading.Thread()
st2 = threading.Thread()
。
myStepper1 = mh.getStepper(200, 1) # 200 steps/rev, motor port #1。
myStepper2 = mh.getStepper(200, 2) # 200步/rev, motor port #1。
myStepper1.setSpeed(60)# 30 RPM
myStepper2.setSpeed(60)# 30 RPM
(Adafruit_MotorHAT stepstyles =。单身,Adafruit_MotorHAT。翻倍,Adafruit_MotorHAT。交错,Adafruit_MotorHAT.MICROSTEP]
def stepper_worker(stepper, numsteps, direction, style):
#打印(“Steppin !”)
步进。步骤(numsteps、方向、风格)
#打印(“做”)
而(真正的):
如果不是st1.isAlive():
randomdir =随机的。randint(0,1)
如果(randomdir = = 0):
dir = Adafruit_MotorHAT.FORWARD
其他:
dir = Adafruit_MotorHAT.BACKWARD
randomsteps = random.randint(50)
相约=线程。线程(target=stepper_worker, args=(myStepper1, randomsteps, dir, stepstyles[random.randint(0,3)])
st1.start()
如果不是st2.isAlive():
randomdir =随机的。randint(0,1)
如果(randomdir = = 0):
dir = Adafruit_MotorHAT.FORWARD
其他:
dir = Adafruit_MotorHAT.BACKWARD
randomsteps = random.randint(50)
打印(“% d步骤”% randomsteps)
st2 =线程。线程(target=stepper_worker, args=(myStepper2, randomsteps, dir, stepstyles[random.randint(0,3)])
st2.start()
清单3:Adafruit的motor HAT Python模块包括示例软件,例如这段代码演示了使用简单的控制命令和使用Python线程模块来控制一对步进电机。(图片来源:Adafruit)
对于没有提供的功能,开发人员不需要限制自己的帽子格式。DFRobot DFR0327 Arduino护盾,Seeed技术GrovePi+ starter kit,以及MikroElektronika MIKROE-2756点击盾牌,让开发者可以获得广泛的Arduino盾牌,格罗夫设备,和MikroBUS点击面板。
使用这些板子,开发者可以快速添加对标准接口的支持,通过添加MikroElektronika MIKROE-988可以点击棋盘,4-20 mA当前循环与MikroElektronika MIKROE-1296 4-20 mA电流环点击板。
小店铺的设计。
即使在快速配置了带有所需附加功能的树莓基于pi的设计之后,开发人员也常常在构建适当的用户界面时失去时间。使用Raspberry Pi 3,开发人员可以将设计与Adafruit的IO云服务连接起来,为用户提供图形反馈和自动化过程的控制。云服务允许开发人员创建简单的数据和流程信息提要(清单4),并构建指示板,允许用户从桌面、智能手机或其他移动设备上的任何web浏览器监视和控制项目(图3)。
#导入库并创建REST客户端实例。
从Adafruit_IO进口端
客户端(“你的ADAFRUIT IO KEY”)
#将值100发送给一个名为“Foo”的提要。
aio。发送(“Foo”,100年)
清单4:开发人员可以轻松地将数据从他们的工业自动化应用程序流到Adafruit IO云,以显示和控制。(图片来源:Adafruit)
Adafruit IO仪表板的图像。
图3:开发人员可以从树莓Pi 3的工业自动化应用程序中显示信息,并使用Adafruit IO仪表板提供控制。(图片来源:Adafruit)
简单的软件开发、多样化的插件板和高性能的树莓Pi的组合为小型工业自动化应用提供了一个合适的解决方案。然而,在某些应用程序中,开发人员可能需要更严格的时间控制,而不是使用RTC提供的配置,例如Adafruit 3013 RTC帽。
3013 RTC帽基于集成DS3231 RTC集成电路,它提供两个可编程报警和一个方波输出信号。开发人员可以使用警报在指定的天数、小时、分钟和秒内生成一个中断,或者使用方波以其1赫兹(Hz)速率生成中断。对于需要周期性中断超过1hz的应用程序,开发人员需要使用处理器的系统定时器来开发定制的软件功能,或者构建定制的硬件计数器,以按期望的速度生成中断。
在需要更快时间分辨率的应用程序中,同样重要的需求是确定性响应延迟。在高速率时,标准的Raspbian操作系统中响应延迟的变化可能会影响精度。尽管标准系统很可能会以毫秒级的分辨率提供足够的确定性响应,但是开发人员可能需要转向使用Linux PREEMPT_RT补丁来满足更严格和更确定的解决方案需求的方法。
结论
传统的PLCs提供的能力通常超出了小型制造、机加工和原型制造车间的需求和预算。对于这些应用程序,操作人员通常需要在树莓Pi 3的能力范围内较低的需求。
使用Raspberry Pi 3和适当的插件板,开发人员可以快速实现专门的工业自动化系统,能够满足各种小型商店操作的需求。