Jste zde

Konstrukce levného průmyslového kontroléru s Raspberry Pi3

Některé průmyslové provozy nejsou tak náročné na provozní prostředí a nemají tak vysoké nároky na počet vstupů/výstupu, aby bylo nutné použít řešení s PLC. Existuje možnost využít levnější řešení v podobě Raspberry Pi 3. Velkou výhodou je otevřený zdrojový kód, takže si lze kontrolér přizpůsobit přímo pro naši aplikaci. V článku si ukážeme jednoduchá řešení pro monitoring a řízení pomocí Raspberry Pi 3.

Proč Raspberry Pi 3

Pro mnoho menších operací nabízí platforma Raspberry Pi 3 od Raspberry Pi Foundation levné řešení s dostatečným výkonem. Je plně schopný zvládnout úkoly průmyslové automatizace. Deska Raspberry Pi 3 obsahuje procesor Broadcom ARM Cortex-A53, 1 GB RAM, má digitální rozhraní, Wi-Fi a připojení Bluetooth. Mozkem celého systému je čip (SoC), ve kterém je integrován čtyřjádrový procesor ARM Cortex-A53 s pamětí C2 512 Kbytes a 54 GPIO uspořádaných do tří částí (tří bank). 

Každý jednotlivý GPIO podporuje dvě až šest funkcí, včetně PWM, hodin a sériových rozhraní. Všechny piny GPIO lze využít také jako linky pro přerušení, vstupy nebo výstupy schopné dodávat až 16 mA (až 50 mA na jednu banku GPIO). Stejně jako u ostatních členů rodiny Raspberry Pi, je Raspberry Pi 3 navržen tak, aby byl vývoj jednoduchý i pro začátečníky, a zároveň byl dostatečně výkonný, aby splňoval potřeby zkušených vývojářů pro komplexní aplikace.

Ze začátku se připojí klávesnice a myš do USB portu, displej (monitor) do video portu a může se začít s instalací software. Software může být postaven na volně dostupném operačním sytému Linux Raspbian, který je uložen na micro SD kartě, ze které „bootuje“. Široká komunita pomůže řešit případné problémy a na internetu je mnoho zdrojových kódů, které nám pomohou se začátky.

Rozšíření pro průmyslovou automatizaci

Dostatečný výkon, velká podpora při vývoj a možnost hardwareového rozšíření pomocí přídavných modulů. Pro průmyslové aplikace je vhodné svůj systém rozšířit pomocí Pimoroni PIM213 Automation HAT, který vidíte na obrázku. HAT znamená Hardware Attachen on Top. Po zasunutí modulu do Raspberry Pi 3 proběhne identifikace a automaticky se nakonfigurují GPIO. Systém je okamžitě připraven k použití.  

Vývojáři mohou rozšířit základní desku Raspberry Pi 3 pro průmyslovou automatizaci připojením speciálních modulů jako je Pimoroni Automation HAT. (Zdroj obrázku: Pimoroni)

Rozšiřující modul Pimoroni Automation HAT byl speciálně navržen pro monitorování a řízení automatizačních systémů. Obsahuje mnoho analogových a digitálních I/O kanálů, 5V výstupy a tři relé. Vstupy a výstupy pracují v rozsahu 0 až 24V. Na relé lze připojit zátěž o velikosti 2A. Tato hodnota je dostatečná například pro spolehlivé řízení 24V elektromagnetického ventilu Crouzet 81 546 001.

Pro vývoj softwaru k modulu Auatomation Hat nabízí společnost Pimoroni přidružený modul v jazyce Python. Pomocí několika řádků kódu obsloužíme všechny hardwarové funkce přidavného modulu. Při importu Python knihoven modul Pimoroni vytvoří softwarové objekty pro analogový vstup, digitální vstup, digitální výstup, reléový výstup a řízení LED diod. Každý objekt obsahuje příslušné funkce pro čtení a zápis.

Ukázka z Python modulu Pimoroni, kde jsou vidět základní objekty pro zápis a čtení z analogového převodníku (ADC).

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)))

 

Každý objekt identifikuje příslušný kanál a další potřebné údaje. Například objekt analogového vstupu obsahuje definici hodnoty maximálního napětí pro příslušný pin (viz funkce init ve výše uvedeným příkladu). Pro vyčtení analogové hodnoty z ADC (analog – digital converter) použijeme třídu ads1015.read. Tato třída nám provede čtení přes sběrnici I2C. Obsahuje všechny potřebné nastavení ADC převodníku a vrátí nám hodnotu v definovaném tvaru. Níže je zobrazena třída ads1015.

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

 

Pro čtení analogové hodnoty použijeme jednoduchou formulaci, která se dá interpretovat následovně. Přečti (read) hodnotu z analogového vstupu jedna (analog.one) na modulu automationhat a ulož ji do proměnné value.  

          value = automationhat.analog.one.read ()

Knihovna podporuje tento jednoduchý model i pro další funkce HAT modulů. Pro sepnutí nebo rozepnutí relé použijeme analogickou formulaci:

          automationhat.relay.one.write (1) # 1 = ZAPNUTO, 0 = VYPNUTO

Flexibilita

Pimoroni Automation HAT nabízí základní IO funkcionalitu potřebnou pro malou průmyslovou automatizaci. Jak již bylo řečeno k dispozici je více rozšiřujících modulů HAT, které mohou vývojáři použít. Například Adafruit 3013 RTC HAT poskytuje funkci reálného času (RTC), která není součástí Raspberry Pi 3. Designéři očekávali, že deska bude připojená k internetu, kde se používá standartní síťový protokol NTP, ze kterého se čas získá v potřebném formátu. V některých aplikacích je vyžadován externí RTC pro případ, kdy dojde ke ztrátě připojení internetu.

Často si nevystačíme jen s jedním přidaným modulem. Konstrukce je navržena tak, že lze jednotlivé moduly skládat na sebe. K propojení je potřeba použít „hřebínkové“ konektory Adafruit 2223 a pro lepší stabilitu a bezpečnost jednotlivých modulů existují distanční sloupky M2.5. Tím se eliminuje možnost nežádoucího dotyku mezi jednotlivými moduly.

V průmyslových aplikacích je běžné řídit krokové motory. I s tím si Raspberry Pi 3 hravě poradí. Stačí použít modul Adafruit 2348, který dokáže řídit dva krokové nebo čtyři stejnosměrné motory. Maximální počet přídavných modulů k jedné systémové desce Raspberry Pi 3 je 32. Čili můžete jednoduše řídit až 64 krokových nebo 128 stejnosměrných motorů.

Přídavný modul Adafruit 2348 pro řízení motorů (Zdroj obrázku: Adafruit)
 

Kód pro řízení motoru 

Desku HAT Adafruit 2348 lze naprogramovat pomocí několika jednoduchých příkazů Pythonu podobně jako u Automation HAT. Vzorový Python software Adafruit motor HATobsahuje základní funkce pro řízení motorů, dokonce i paralelní řízení více motorů. Následující kód zobrazuje paralelní řízení dvou motorů.

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()

 

Pokud si nevyberete z dostupných modulů skupiny HAT, můžete sáhnout po následujících modulech, které jsou kompatibilní s Raspberry Pi 3. Od společnosti DFRobot je k dispozici speciální deska DFR0327, která obsahuje všechny potřebné vstupy/výstupy pro robotiku. Seeed Technology nabízí starter kit GrovePi+, který mimo jiné obsahuje teplotní a vlhkostní čidlo, ultrasonické čidlo buzzer a další senzory. MikroElektronika nabízí speciální mezi-desku MIKROE-2756, která umožňuje připojit rozšíření Arduino shieldsGrove devices, a MikroBUS click boards.V průmyslové automatizaci se často vyskytuje sběrnice CAN. Pro tyto účely je vhodné použít MIKROE-988. Senzory používají sběrnici 4-20mA, pro kterou existuje rozšíření MIKROE-1296. Oba rozšiřující moduly jsou od společnosti MikroElektronika.

Přehledné uživatelské rozhraní

Vývoj samotné aplikace je jen jedna část úkolu pro vývojáře. Druhou částí bývá připravit uživatelsky přívětivý interface, kde budou přehledně znázorněna naměřená data a prvky pro ovládání. Tento úkol spolyká nemalý čas. Vybudování uživatelského rozhraní pro Raspberry Pi je jednoduché. Stačí ho propojit s cloudovou službou Adafruit IO, která poskytuje uživatelům grafickou zpětnou vazbu a kontrolu jejich automatizačních procesů z jakéhokoli webového prohlížeče na počítači, smartphonu nebo jiném mobilním zařízení. (viz. Obrázek níže) Vývojáři mohou snadno přenášet data z aplikace do cloudu Adafruit IO importováním knihovny přímo do našeho kódu.

# 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)

 

Uživatelské rozhraní vytvořené pomocí cloudové služby Adafruit IO. (Zdroj obrázku: Adafruit)

Kombinace jednoduchého vývoje softwaru, rozmanitých doplňkových desek a vysoce výkonného Raspberry Pi 3 poskytuje vhodné řešení pro malé aplikace průmyslové automatizace. V některých aplikacích je však potřeba přesnější časování, než je časování pomocí Adafruit 3013 RTC HAT, o kterém jsme se již zmínili. Model 3013 RTC HAT je založen na integrovaném obvodu  DS3231 RTC od společnosti Maxim Integrated. Poskytuje dva programovatelné alarmy a výstupní obdélníkový signál.

Pomocí nastavených alarmů lze generovat přerušení v zadaném počtu dní, hodinách, minutách, sekundách nebo použít obdélníkový signál a generovat přerušení s frekvencí 1Hz.  U aplikací, které vyžadují periodické přerušení rychlejší než 1 Hz, si vývojáři musí vyvinout vlastní softwarovou funkci pomocí časovače procesoru nebo vytvořit vlastní čítače. Latence odezvy může u operačního systému Raspbian ohrozit přesnost. Standartní doba odezvy je cca 1 milisekunda. Pokud je potřeba ještě přesnější časování lze použít patch Linux PREEMPT_RT.

Závěr

Konvenční automaty PLC nabízejí schopnosti, které většinou přesahují požadavky a rozpočty většiny menších průmyslových provozů v drobném průmyslu. Pomocí nástroje Raspberry Pi 3 a vhodných doplňkových desek mohou vývojáři rychle realizovat systémy průmyslové automatizace schopné splnit požadavky malých provozoven. 

Hodnocení článku: