使用 Raspberry Pi 3 打造低成本工業控制器
資料提供者:DigiKey 北美編輯群
2018-01-31
一些小型工廠的工業運作要求在嚴苛的操作環境下,實現高容量 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) 裝置,內建四核心 ARM Cortex-A53 CPU 和 512 KB 的 L2 快取記憶體,以及 54 個排列為三組的 GPIO。
各個 GPIO 各自支援 2 至 6 種替選功能,包括脈寬調變器、時脈和序列介面。開發人員可以使用任何尚未分配的 GPIO,以作為中斷線路、輸入或輸出,電流最高可達 16 mA (每個 GPIO 組最高 50 mA)。
與 Raspberry Pi 系列的其他產品一樣,Raspberry Pi 3 旨在使初學者輕鬆著手嵌入式開發,同時又能提供完善的功能,足以滿足經驗豐富的開發人員更複雜、更強大的處理要求。
開始時,開發人員只需將開發板的影像連接埠接至顯示器,且將 USB 連接埠接至鍵盤和滑鼠即可。針對軟體設計部分,開發人員能夠基於 Raspberry Pi Foundation 的免費 Linux Raspbian 作業系統所支援的廣泛生態系統進行設計。該作業系統是透過開發板的 micro SD 介面從記憶卡載入。
增加工業功能
除了效能優勢和易於開發以外,Raspberry Pi 採用簡化方法實現功能擴展,使其非常適合工業自動化應用的多樣化需求。如欲增加硬體功能,開發人員只需要在 Raspberry Pi 3 開發板上插上一個稱為「加裝硬體 (HAT)」的附加電路板。與更為複雜的工業系統一樣,HAT 提供了一種標準方法,可識別 HAT 並依據需求自動配置 GPIO 和驅動程式。因此,開發人員只需插入 Pimoroni PIM213 Automation HAT (圖 1),即可立即升級 Raspberry Pi 系統以用於工業應用。
圖 1:開發人員可以透過連接專門的附加電路板 (如 Pimoroni Automation HAT),使基礎 Raspberry Pi 3 開發板升級以用於工業自動化。(圖片來源:Pimoroni)
Pimoroni Automation HAT 專為自動化系統之監測與控制所設計,結合多個 I/O 通道,包括類比和數位輸入、帶電輸出及繼電器控制。I/O 通道除了支援 24 V 電壓外,還提供相當大的輸入和輸出緩衝。例如,繼電器輸出可支持高達 2 A 的電流,足以驅動 Crouzet 81 546 001 螺線管閥之類的低功率 24 V 零件。
對於使用 Automation Hat 進行軟體開發,Pimoroni 提供了一個相關聯的 Python 模組,只需編寫幾行程式碼即可使用 HAT 的硬體功能。當 Pimoroni 模組匯入 Python 程式時,會分別為類比輸入、數位輸入、數位輸出、繼電器輸出和 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:藉由處理詳細交易 (例如從板載類比數位轉換器 (ADC) 進行讀取),Pimoroni 用於 Automation HAT 的 Python 模組可簡化開發作業。(圖片來源: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)。
圖 2:開發人員可以堆疊多個 Adafruit 2348 馬達 HAT,以便在設計中支援多達 64 個步進馬達或 128 個直流馬達。(圖片來源:Adafruit)
與 Pimoroni Automation HAT 一樣,Adafruit 2348 馬達 HAT 可使用一些簡單的 Python 命令進行編程。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 開發板。
透過這些開發板,開發人員可快速增加標準 CAN 介面支援,只需連接 MikroElektronika MIKROE-988 CAN click 開發板即可;對於 4 至 20 mA 電流迴路支援,搭配 MikroElektronika MIKROE-1296 4 至 20 mA 電流迴路 click 開發板即可。
完善小型工廠的設計
即使為基於 Raspberry Pi 的設計快速配置了所需的附加功能,開發人員在建構適當的使用者介面時通常也會浪費不少時間。搭配 Raspberry Pi 3,開發人員可以將設計與 Adafruit 的 IO 雲端服務連接起來,為使用者提供自動化流程的圖形化回饋和控制。雲端服務允許開發人員建立簡單的資料和流程資訊饋送 (清單 4),並建立儀表板,便於使用者透過桌上型電腦、智慧型手機或其他行動裝置上的任何網頁瀏覽器來監控專案 (圖 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)
圖 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 OS 的回應延遲變化可能會降低準確性。雖然標準系統可能以毫秒級解析度提供具充分確定性的回應,但開發人員可能需要藉助採用了 Linux PREEMPT_RT 修補程式的方案,以滿足更嚴格和更具確定性的解析度要求。
結論
傳統 PLC 所提供的功能,通常會超出小規模製造、機械加工和原型製作工廠等多數小型工業運作的要求和預算。對於這些應用,操作員面臨的要求通常不太高,Raspberry Pi 3 完全可以勝任。
使用 Raspberry Pi 3 和適當的附加電路板,開發人員可以快速實施專用工業自動化系統,滿足各種小型工廠運作的不同要求。

聲明:各作者及/或論壇參與者於本網站所發表之意見、理念和觀點,概不反映 DigiKey 的意見、理念和觀點,亦非 DigiKey 的正式原則。