有些小企業(yè)的工業(yè)作業(yè)需要同時(shí)滿(mǎn)足惡劣工作環(huán)境、高 I/O 能力和復(fù)雜功能要求,可編程邏輯控制器 (PLC) 正好可以勝任。盡管存在簡(jiǎn)化版 PLC,但設(shè)計(jì)師現(xiàn)在也可以選擇多種低成本的開(kāi)源硬件和軟件解決方案,以實(shí)現(xiàn)有效的工業(yè)監(jiān)視和控制。
Raspberry Pi Foundation 的微小型 Raspberry Pi 3 及其相關(guān)的擴(kuò)展板就是此類(lèi)解決方案的一個(gè)實(shí)例。本文將介紹 Raspberry Pi 3 的主要特征,然后討論如何使用它來(lái)監(jiān)視和控制應(yīng)用。
Raspberry Pi 為何適用于小企業(yè)工業(yè)控制
對(duì)于很多較小作業(yè)規(guī)模而言,Raspberry Pi 3 平臺(tái)提供了一種性能卓越的低成本解決方案。Raspberry Pi 3 開(kāi)發(fā)板結(jié)合了基于 Broadcom ARM? Cortex?-A53 的處理器、1 GB RAM、數(shù)字接口、Wi-Fi 和藍(lán)牙連接,完全能夠勝任專(zhuān)門(mén)的工業(yè)自動(dòng)化任務(wù)。處理器本身就是一個(gè)高性能的片上系統(tǒng) (SoC) 器件,集成了具有 512 KB L2 緩沖的四核 ARM Cortex-A53 CPU 以及 54 個(gè)排列成三組的 GPIO。
每個(gè) GPIO 分別支持最少兩種、最多六種替代性功能,包括脈寬調(diào)制器、時(shí)鐘和串行接口。開(kāi)發(fā)人員可以將任何未分配的 GPIO 用作可提供最多 16 毫安 (mA) 電流(每組 GPIO 總電流最多為 50 mA)的中斷線、輸入或輸出。
與 Raspberry Pi 系列中的其他產(chǎn)品一樣,Raspberry Pi 3 充分簡(jiǎn)化了嵌入式開(kāi)發(fā),初學(xué)者亦能輕松上手,同時(shí)仍不失足夠強(qiáng)大,可以滿(mǎn)足經(jīng)驗(yàn)豐富的開(kāi)發(fā)人員更復(fù)雜、更強(qiáng)大的處理要求。
開(kāi)始時(shí),開(kāi)發(fā)人員只需將開(kāi)發(fā)板的視頻端口連接到顯示器并將其 USB 端口連接到鍵盤(pán)和鼠標(biāo)。對(duì)于軟件設(shè)計(jì),開(kāi)發(fā)人員則有著廣泛的生態(tài)系統(tǒng)基礎(chǔ)支撐,受到 Raspberry Pi Foundation 的基于 Linux 的免費(fèi) Raspbian 操作系統(tǒng)支持,且該操作系統(tǒng)可通過(guò)該開(kāi)發(fā)板的微型 SD 接口從存儲(chǔ)卡加載。
增加工業(yè)處理能力
除了具有高性能和易開(kāi)發(fā)的優(yōu)勢(shì)以外,Raspberry Pi 用于擴(kuò)展其功能的簡(jiǎn)化方法也非常適合工業(yè)自動(dòng)化應(yīng)用的各種要求。需要增加硬件的能力時(shí),開(kāi)發(fā)人員只需將一塊被稱(chēng)為 HAT(頂部安裝硬件)的擴(kuò)展板插到 Raspberry Pi 3 開(kāi)發(fā)板上即可。與更復(fù)雜的工業(yè)系統(tǒng)一樣,HAT 提供了用于識(shí)別 HAT 以及根據(jù)需要自動(dòng)配置 GPIO 和驅(qū)動(dòng)程序的標(biāo)準(zhǔn)方法。因此,開(kāi)發(fā)人員只需插入 Pimoroni PIM213 Automation HAT(圖 1),即可針對(duì)工業(yè)應(yīng)用立即將自己的 Raspberry Pi 系統(tǒng)升級(jí)。
圖 1:開(kāi)發(fā)人員可以通過(guò)連接專(zhuān)用的擴(kuò)展板(例如 Pimoroni Automation HAT)來(lái)升級(jí)用于實(shí)現(xiàn)工業(yè)自動(dòng)化的基礎(chǔ) Raspberry Pi 3 開(kāi)發(fā)板。(圖片來(lái)源:Pimoroni)
專(zhuān)為監(jiān)測(cè)和控制自動(dòng)化系統(tǒng)而設(shè)計(jì)的 Pimoroni Automation HAT 組合了多個(gè) I/O 通道,包括模擬和數(shù)字輸入、供電型輸出以及繼電器控制。除了支持 24 伏 (V) 電壓以外,這些 I/O 通道還提供大容量的輸入和輸出緩存。例如,繼電器輸出支持最大 2 安 (A) 的電流,足以驅(qū)動(dòng)低功耗的 24 伏零件,如 Crouzet 81 546 001 電磁閥。
對(duì)于使用 Automation Hat 進(jìn)行的軟件開(kāi)發(fā),Pimoroni 提供了一個(gè)相關(guān)的 Python 模塊,只需要編寫(xiě)幾行代碼,就可使用 HAT 的硬件功能。當(dāng)導(dǎo)入到 Python 程序時(shí),Pimoroni 模塊會(huì)創(chuàng)建軟件對(duì)象,以控制模擬輸入、數(shù)字輸入、數(shù)字輸出、繼電器輸出和 LED 燈,所有這些功能都包含相應(yīng)的低級(jí)別讀/寫(xiě)功能(列表 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 模塊可通過(guò)處理詳細(xì)事務(wù)處理,如從板載模數(shù)轉(zhuǎn)換器 (ADC) 讀取讀數(shù),而簡(jiǎn)化開(kāi)發(fā)工作。(圖片來(lái)源:Pimoroni)
每個(gè)對(duì)象都可以識(shí)別相應(yīng)的通道和其他相關(guān)數(shù)據(jù)。例如,當(dāng)創(chuàng)建時(shí),模擬輸入對(duì)象包含關(guān)聯(lián)引腳的最大電壓(請(qǐng)參見(jiàn)列表 1 中的 init 函數(shù))。為了執(zhí)行模數(shù)轉(zhuǎn)換器 (ADC) 轉(zhuǎn)換,ADC 對(duì)象會(huì)調(diào)用底層的 ADC 模塊(列表 1 中的 ads1015.read)。隨后,ADC 模塊會(huì)執(zhí)行設(shè)置 ADC 和執(zhí)行轉(zhuǎn)換所需的低級(jí)別 I2C 事務(wù)處理,然后返回有用格式的值(列表 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 轉(zhuǎn)換的更高級(jí)別函數(shù)調(diào)用會(huì)調(diào)用一個(gè)讀取例程,此例程會(huì)執(zhí)行 I2C 總線寫(xiě)入以開(kāi)始進(jìn)行轉(zhuǎn)換,并休眠足夠長(zhǎng)的時(shí)間以便轉(zhuǎn)換完成,然后執(zhí)行 I2C 總線讀取以收集結(jié)果。(圖片來(lái)源:Pimoroni)
但對(duì)于開(kāi)發(fā)人員而言,當(dāng)讀取模擬值時(shí),只需對(duì)模擬對(duì)象的指定模擬輸入 (.one) 執(zhí)行高級(jí)別讀取功能 (.read()):
value = automationhat.analog.one.read()
資源庫(kù)允許使用這種簡(jiǎn)單模型實(shí)現(xiàn)其他的 HAT 功能,因此打開(kāi)或關(guān)閉繼電器也是一個(gè)簡(jiǎn)單的調(diào)用:
automationhat.relay.write(1) # 1 = ON, 0 = OFF
靈活的選擇
Pimoroni Automation HAT 提供了小型工業(yè)自動(dòng)化應(yīng)用所需的基本 IO 功能,但開(kāi)發(fā)人員可以選擇多種可用的 HAT,以實(shí)現(xiàn)工業(yè)自動(dòng)化等專(zhuān)業(yè)應(yīng)用所需的各種功能。例如,Adafruit 3013 RTC HAT 提供實(shí)時(shí)時(shí)鐘 (RTC) 功能,這并非開(kāi)發(fā)板本身的標(biāo)準(zhǔn)功能。Raspberry Pi 設(shè)計(jì)師希望開(kāi)發(fā)人員始終將開(kāi)發(fā)板連接到因特網(wǎng),以便能夠使用標(biāo)準(zhǔn)的網(wǎng)絡(luò)時(shí)間協(xié)議 (NTP) 保持時(shí)鐘時(shí)間。因此,對(duì)于因設(shè)計(jì)本意或意外與因特網(wǎng)斷開(kāi)連接的設(shè)計(jì),需要使用外部 RTC,例如 Adafruit RTC HAT。
當(dāng)增加 RTC 等功能時(shí),開(kāi)發(fā)人員在工業(yè)自動(dòng)化設(shè)計(jì)中無(wú)需只使用一個(gè) HAT。開(kāi)發(fā)人員可以在 Raspberry Pi 開(kāi)發(fā)板上疊接多個(gè) HAT。盡管大多數(shù) HAT 經(jīng)過(guò)專(zhuān)門(mén)設(shè)計(jì)可進(jìn)行疊接,但開(kāi)發(fā)人員可能需要增加疊接針座(例如 Adafruit 的 2223)以完成裝配,或者增加 M2.5 支座以防止 HAT 相互接觸或與基板接觸。
開(kāi)發(fā)人員可以使用疊接針座和支座輕松疊接 HAT,例如 Adafruit 2348 電機(jī) HAT,以增加很多工業(yè)自動(dòng)化應(yīng)用所需的電機(jī)驅(qū)動(dòng)器。每個(gè) 2348 電機(jī) HAT 都可以驅(qū)動(dòng)兩個(gè)步進(jìn)電機(jī)或四個(gè)直流電機(jī)。實(shí)際上,開(kāi)發(fā)人員可以疊接多達(dá) 32 塊這樣的擴(kuò)展板,以支持最多 64 個(gè)步進(jìn)電機(jī)或 128 個(gè)直流電機(jī)(圖 2)。
圖 2:開(kāi)發(fā)人員可以疊接多個(gè) Adafruit 2348 電機(jī) HAT,以便在設(shè)計(jì)中支持最多 64 個(gè)步進(jìn)電機(jī)或 128 個(gè)直流電機(jī)。(圖片來(lái)源:Adafruit)
與 Pimoroni Automation HAT 一樣,可以使用幾個(gè)簡(jiǎn)單的 Python 命令對(duì) Adafruit 2348 電機(jī) HAT 進(jìn)行編程。Adafruit 針對(duì)電機(jī) HAT 的采樣軟件甚至具有基本設(shè)計(jì)模式,能夠使用 Python 線程模塊并行運(yùn)行多個(gè)電機(jī)(列表 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 的電機(jī) HAT Python 模塊包含采樣軟件,例如此代碼片段就展示了如何使用簡(jiǎn)單控制命令和 Python 線程模塊來(lái)控制一對(duì)步進(jìn)電機(jī)。(圖片來(lái)源:Adafruit)
對(duì)于可用 HAT 中未提供的功能,開(kāi)發(fā)人員不需要限制自己只使用 HAT 格式。利用 DFRobot DFR0327 Arduino 盾板、Seeed Technology GrovePi+ 入門(mén)套件和 MikroElektronika MIKROE-2756 click 盾板,開(kāi)發(fā)人員能夠分別獲得大量的可用 Arduino 盾板、Grove 器件和 MikroBUS click 板。
使用這些開(kāi)發(fā)板時(shí),開(kāi)發(fā)人員可以通過(guò)連接 MikroElektronika MIKROE-988 CAN click 板,快速添加標(biāo)準(zhǔn) CAN 接口支持,或通過(guò)連接 MikroElektronika MIKROE-1296 4 至 20 mA 電流回路 Click 板,添加 4 至 20 mA 的電流回路。
完成小企業(yè)設(shè)計(jì)
即使為基于 Raspberry Pi 的設(shè)計(jì)快速配置了所需的擴(kuò)展功能后,開(kāi)發(fā)人員通常也需要花費(fèi)時(shí)間構(gòu)建相應(yīng)的用戶(hù)界面。而使用 Raspberry Pi 3 之后,開(kāi)發(fā)人員就可以將設(shè)計(jì)連接到 Adafruit 的 IO 云服務(wù),從而為用戶(hù)提供自動(dòng)化流程的圖形化反饋和控制。云服務(wù)允許開(kāi)發(fā)人員創(chuàng)建簡(jiǎn)單的數(shù)據(jù)和流程信息饋送(列表 4),并構(gòu)建儀表板以允許用戶(hù)從臺(tái)式機(jī)、智能手機(jī)或其他移動(dòng)設(shè)備上的任何 Web 瀏覽器監(jiān)視和控制項(xiàng)目(圖 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:開(kāi)發(fā)人員可以輕松地將數(shù)據(jù)從工業(yè)自動(dòng)化應(yīng)用傳輸?shù)?Adafruit IO 云服務(wù),進(jìn)行顯示和控制。(圖片來(lái)源:Adafruit)
圖 3:開(kāi)發(fā)人員可以顯示來(lái)自基于 Raspberry Pi 3 的工業(yè)自動(dòng)化應(yīng)用的信息,并使用 Adafruit IO 儀表板提供控制。(圖片來(lái)源:Adafruit)
簡(jiǎn)單的軟件開(kāi)發(fā)、豐富的擴(kuò)展板和高性能的 Raspberry Pi 組合提供了一個(gè)適合小型工業(yè)自動(dòng)化應(yīng)用的解決方案。但在某些這樣的應(yīng)用中,與使用 RTC 的配置(例如 Adafruit 3013 RTC HAT)相比,開(kāi)發(fā)人員可能需要更嚴(yán)格的定時(shí)控制。
3013 RTC HAT 基于 Maxim Integrated DS3231 RTC IC,提供了兩個(gè)可編程報(bào)警功能和一個(gè)方波輸出信號(hào)。開(kāi)發(fā)人員可以使用報(bào)警功能在指定日期、時(shí)、分、秒生成中斷,或者使用方波在 1 赫茲 (Hz) 頻率生成中斷。對(duì)于需要以快于 1 Hz 的定期中斷的應(yīng)用,開(kāi)發(fā)人員需要使用處理器的系統(tǒng)定時(shí)器開(kāi)發(fā)定制軟件功能,或者構(gòu)建能夠以所需的速率生成中斷的定制硬件計(jì)數(shù)器。
在需要更快的定時(shí)分辨率的應(yīng)用中,同樣重要的要求將變成確定性響應(yīng)延遲。在高速率下,標(biāo)準(zhǔn) Raspbian 操作系統(tǒng)中的響應(yīng)延遲變化可能會(huì)影響精度。盡管標(biāo)準(zhǔn)系統(tǒng)可能以微秒級(jí)分辨率提供具有足夠確定性的響應(yīng),但開(kāi)發(fā)人員可能需要借助使用 Linux PREEMPT_RT 補(bǔ)丁的方法來(lái)滿(mǎn)足更嚴(yán)格、更具確定性的分辨率要求。
總結(jié)
傳統(tǒng) PLC 提供的能力通常超出小規(guī)模制造業(yè)、加工業(yè)和原型開(kāi)發(fā)車(chē)間的大多數(shù)較小工業(yè)作業(yè)的要求和預(yù)算。對(duì)于這些應(yīng)用,操作員面臨的要求通常較低,Raspberry Pi 3 完全可以勝任。
開(kāi)發(fā)人員可以使用 Raspberry Pi 3 和相應(yīng)的擴(kuò)展板,快速實(shí)施能夠滿(mǎn)足廣泛小企業(yè)作業(yè)要求的專(zhuān)用工業(yè)自動(dòng)化系統(tǒng)。
-
控制器
+關(guān)注
關(guān)注
114文章
17113瀏覽量
184330 -
監(jiān)視
+關(guān)注
關(guān)注
0文章
73瀏覽量
19056
發(fā)布評(píng)論請(qǐng)先 登錄
GraspIO Cloudio:一款Raspberry Pi不簡(jiǎn)單的擴(kuò)展板
DIY一個(gè)樹(shù)莓派擴(kuò)展板
如何使用Raspberry Pi 3進(jìn)行快速開(kāi)發(fā)

【Embedded Pi申請(qǐng)】基于Raspberry Pi的智能家居遠(yuǎn)程控制系統(tǒng)
LN香蕉派擴(kuò)展板使用教程
一個(gè)Raspberry Pi擴(kuò)展板
采用Raspberry Pi 3和擴(kuò)展板對(duì)工業(yè)控制設(shè)計(jì)(附代碼)

微雪電子2.23寸OLED擴(kuò)展板介紹

微雪電子PoE以太網(wǎng)供電擴(kuò)展板介紹

微雪電子Raspberry Pi 3 Model擴(kuò)展板簡(jiǎn)介

dfrobot樹(shù)莓派UPS電源擴(kuò)展板(Zero版)簡(jiǎn)介

dfrobot樹(shù)莓派4B/3B+ IO擴(kuò)展板簡(jiǎn)介

Raspberry Pi Zero的擴(kuò)展板BassCrab uHAT

如何用Raspberry Pi制作動(dòng)作控制感應(yīng)燈

評(píng)論