Costruire un controller industriale a basso costo con Raspberry Pi 3

Contributo di Editori nordamericani di DigiKey

Alcune operazioni industriali di piccole officine richiedono la combinazione di ambienti operativi difficili, elevata capacità I/O e requisiti di funzionalità complessi per i quali in origine venivano impiegati i controller logici programmabili (PLC). Sebbene siano disponibili versioni ridotte dei PLC, i progettisti hanno ora la possibilità di scegliere tra una serie di soluzioni hardware e software open-source a basso costo per un monitoraggio e un controllo industriali efficaci.

Un esempio di tale soluzione è il piccolo Raspberry Pi 3 di Raspberry Pi Foundation e le sue schede aggiuntive. Questo articolo descriverà le principali caratteristiche del Raspberry Pi 3 prima di illustrare come usarlo per applicazioni di monitoraggio e controllo.

Perché usare un Raspberry Pi per il controllo industriale di piccole officine

Per molte realtà produttive di piccole dimensioni, la piattaforma Raspberry Pi 3 offre una soluzione a basso costo con notevoli capacità prestazionali. Perfettamente in grado di gestire compiti dedicati di automazione industriale, la scheda Raspberry Pi 3 combina un processore basato su ARM® Cortex®-A53 di Broadcom, 1 Gbyte di RAM, interfacce digitali, connettività Wi-Fi e Bluetooth. Il processore stesso è un dispositivo SoC ad alte prestazioni che integra una CPU quad-core ARM Cortex-A53 con 512 kbyte di cache L2 e 54 GPIO disposti in tre banchi.

Ogni singolo GPIO supporta in modo diverso da due a sei funzioni alternative, tra cui modulatori di larghezza di impulso, clock e interfacce seriali. Gli sviluppatori possono utilizzare qualsiasi GPIO non assegnato come linee di interrupt, ingressi o uscite in grado di fornire fino a 16 mA (fino a 50 mA complessivi per ogni banco di GPIO).

Come per altri membri della famiglia Raspberry Pi, Raspberry Pi 3 è progettato per rendere abbastanza semplice lo sviluppo embedded per i principianti, ma abbastanza potente da soddisfare le esigenze di sviluppatori esperti con requisiti di elaborazione più complessi e potenti.

Per iniziare, gli sviluppatori collegano la porta video della scheda al loro display e le porte USB alla tastiera e al mouse. Per la progettazione software, possono fare affidamento su un ampio ecosistema supportato dal sistema operativo gratuito Raspbian basato su Linus, di Raspberry Pi Foundation, caricato da una scheda di memoria tramite l'interfaccia micro SD della scheda.

Aggiunta di capacità industriali

Al di là delle sue prestazioni e della sua facilità di sviluppo, l'approccio semplificato di Raspberry Pi per espanderne le funzionalità lo rende particolarmente idoneo per i diversi requisiti delle applicazioni di automazione industriale. Per aggiungere funzionalità hardware, è sufficiente collegare una scheda aggiuntiva chiamata HAT (Hardware Attached on Top) sulla scheda Raspberry Pi 3. Come nel caso di sistemi industriali più complessi, la HAT offre un approccio standard per la sua identificazione e per configurare automaticamente i GPIO e i driver in base alle necessità. Di conseguenza, gli sviluppatori possono aggiornare immediatamente il loro sistema Raspberry Pi per applicazioni industriali semplicemente collegando, ad esempio, l'Automation HAT PIM213 di Pimoroni (Figura 1).

Immagine della scheda aggiuntiva Automation HAT di Pimoroni

Figura 1: Gli sviluppatori possono espandere una scheda base Raspberry Pi 3 per l'automazione industriale collegando schede aggiuntive speciali come l'Automation HAT di Pimoroni. (Immagine per gentile concessione di Pimoroni)

Progettata appositamente per il monitoraggio e il controllo di sistemi di automazione, l'Automation HAT combina diversi canali I/O, compresi ingressi analogici e digitali, uscite alimentate e comandi a relè. Oltre alla loro capacità di 24 V, i canali I/O offrono un notevole buffering di ingresso/uscita. Ad esempio, le uscite relè supportano fino a 2 A, sufficienti a pilotare parti a bassa potenza a 24 V quali la valvola solenoide 81 546 001 di Crouzet.

Per lo sviluppo di software con l'Automation HAT, Pimoroni fornisce un modulo Python associato che richiede solo poche righe di codice per poter utilizzare le funzionalità hardware della HAT. Quando viene importato in un programma Python, il modulo Pimoroni crea oggetti software per l'ingresso analogico, l'ingresso digitale, l'uscita digitale, l'uscita relè e il controllo del LED, ciascuno dei quali include le funzioni appropriate di lettura/scrittura di livello inferiore (Listato 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)))

Listato 1: Il modulo Python di Pimoroni per Automation HAT semplifica lo sviluppo gestendo transazioni dettagliate come la lettura dal convertitore analogico/digitale (ADC) integrato. (Immagine per gentile concessione di Pimoroni)

Ogni oggetto identifica il canale corrispondente e altri dati correlati. Ad esempio, al momento della creazione, l'oggetto dell'ingresso analogico include la tensione massima per il pin associato (vedere la funzione init nel Listato 1). Per eseguire una conversione con il convertitore analogico/digitale (ADC), l'oggetto ADC chiama il modulo ADC sottostante (ads1015.read nel Listato 1). Il modulo ADC, a sua volta, esegue le trasnsazioni I2C di basso livello necessarie per impostare l'ADC ed eseguire una conversione prima di restituire il valore in una forma utile (Listato 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

...

Listato 2: Una chiamata di funzione di livello superiore per una conversione ADC richiama una routine di lettura che esegue una scrittura nel bus I2C per avviare la conversione, si ferma abbastanza a lungo per permettere il completamento della conversione ed esegue una lettura del bus I2C per raccogliere il risultato. (Immagine per gentile concessione di Pimoroni)

Per lo sviluppatore, la lettura di un valore analogico richiede semplicemente l'esecuzione della funzione di lettura ad alto livello (.read()) sull'ingresso analogico specificato (.one) per l'oggetto analogico:

          value = automationhat.analog.one.read()

La libreria supporta questo semplice modello per altre funzioni HAT, quindi per attivare o disattivare un relè è sufficiente una semplice chiamata:

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

Opzioni flessibili

L'Automation HAT di Pimoroni offre le funzionalità IO di base richieste per una piccola applicazione di automazione industriale, ma gli sviluppatori possono scegliere tra una ricca serie di HAT disponibili per tutti i tipi di caratteristiche richieste per applicazioni di automazione specializzate. Ad esempio, la HAT RTC 3013 di Adafruit fornisce la funzionalità di clock in tempo reale (RTC), che non è una caratteristica standard della scheda stessa. I progettisti di Raspberry Pi prevedono che la scheda sia collegata a Internet, dove può utilizzare il protocollo NTP (Network Time Protocol) standard per mantenere l'ora del clock. Di conseguenza, serve un RTC esterno come la HAT RTC di Adafruit per progetti che possono perdere la connessione a Internet accidentalmente o se previsto dal progetto stesso.

Per l'aggiunta di funzionalità come un RTC, gli sviluppatori non hanno bisogno di limitarsi a una singola HAT in un progetto di automazione industriale. Possono impilare più HAT su una scheda Raspberry Pi. Sebbene la maggior parte delle HAT siano progettate per essere impilate, potrebbero essere necessario aggiungere basette di impilamento come la 2223 di Adafruit per completare il montaggio, oppure distanziatori M2.5 per eliminare la possibilità che le HAT si tocchino tra loro o con la scheda base.

Utilizzando basette e distanziatori di impilamento, gli sviluppatori potrebbero facilmente impilare una HAT come quella dedicata ai motori, la 2348, per aggiungere i driver per motori necessari in molte applicazioni di automazione industriale. Ogni HAT per motori 2348 può pilotare due motori passo-passo o quattro motori c.c. Gli sviluppatori possono impilare fino a 32 di queste schede aggiuntive per supportare fino a 64 motori passo-passo o 128 motori c.c. (Figura 2).

Immagine di HAT multiple per motori 2348 di Adafruit

Figura 2: Gli sviluppatori possono impilare più HAT 2348 di Adafruit per supportare fino a 64 motori passo-passo o 128 motori c.c. in un unico progetto. (Immagine per gentile concessione di Adafruit)

Come per l'Automation HAT di Pimoroni, la HAT per motori 2348 di Adafruit può essere programmata utilizzando alcuni semplici comandi Python. Il software di esempio di Adafruit per la HAT per motori offre persino schemi di progettazione di base per l'utilizzo del modulo di threading Python per l'azionamento in parallelo di più motori (Listato 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()

Listato 3: Il modulo Python HAT per motori di Adafruit include un software di esempio come questo frammento che dimostra l'uso di semplici comandi di controllo e del modulo di threading Python per controllare una coppia di motori passo-passo. (Immagine per gentile concessione di Adafruit)

Per le funzionalità non offerte dalle HAT disponibili, gli sviluppatori non sono costretti a limitarsi al formato HAT. Lo shield Arduino DFRobot DFR0327, lo starter kit GrovePi+ di Seeed Technology e il click shield MIKROE-2756 di MikroElektronika permettono agli sviluppatori di accedere, rispettivamente, a un'ampia gamma di shield Arduino disponibili, dispositivi Grove e click board MikroBUS.

Utilizzando queste schede, è possibile aggiungere rapidamente il supporto per interfacce CAN standard collegando la click board CAN MIKROE-988 di MikroElektronika e per circuiti di corrente a 4-20 mA la click board MIKROE-1296 di MikroElektronika.

Completamento del progetto per piccole officine

Anche dopo la rapida configurazione di un progetto basato su Raspberry Pi con le funzionalità aggiuntive necessarie, gli sviluppatori spesso devono perdere tempo nella realizzazione di un'interfaccia utente appropriata. Con Raspberry Pi 3, possono collegare il progetto al servizio cloud IO di Adafruit per dare agli utenti feedback grafico e controllo dei processi di automazione. Il servizio cloud consente di creare semplici feed di dati e informazioni di processo (Listato 4) e creare dashboard che consentono agli utenti di monitorare e controllare i progetti da qualsiasi browser Web su desktop, smartphone o altri dispositivi mobili (Figura 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)

Listato 4: Gli sviluppatori possono facilmente trasmettere i dati dalla loro applicazione di automazione industriale al cloud IO di Adafruit a fini di visualizzazione e controllo. (Immagine per gentile concessione di Adafruit)

Immagine del dashboard IO di Adafruit

Figura 3: Gli sviluppatori possono visualizzare le informazioni dalle loro applicazioni di automazione industriale basate su Raspberry Pi 3 e offrire il controllo utilizzando il dashboard IO di Adafruit. (Immagine per gentile concessione di Adafruit)

La combinazione di sviluppo software semplificato, schede aggiuntive diverse e alte prestazioni di Raspberry Pi rende questa soluzione idonea per applicazioni di automazione industriale su piccola scala. In alcune di queste applicazioni, tuttavia, gli sviluppatori potrebbero aver bisogno di un controllo della temporizzazione più rigoroso rispetto a quello fornito nelle configurazioni che utilizzano un RTC, ad esempio la HAT RTC 3013 di Adafruit.

La HAT RTC 3013 si basa sul CI RTC di DS3231 di Maxim Integrated, che fornisce due allarmi programmabili e un segnale di uscita a onda quadra. Gli sviluppatori possono utilizzare gli allarmi per generare un interrupt in un numero specificato di giorni, ore, minuti e secondi, oppure utilizzare l'onda quadra per generare un interrupt alla frequenza di 1 Hz. Per applicazioni che richiedono interrupt periodici più veloci di 1 Hz, gli sviluppatori dovranno sviluppare funzioni software personalizzate utilizzando il timer di sistema del processore, oppure costruire contatori hardware personalizzati in grado di generare un interrupt alla velocità desiderata.

Nelle applicazioni che richiedono una risoluzione di temporizzazione più elevata, un requisito altrettanto importante è quello della latenza di risposta deterministica. A velocità elevate, la variabilità nella latenza di risposta nel sistema operativo Raspbian standard potrebbe compromettere la precisione. Sebbene il sistema standard possa fornire una risposta sufficientemente deterministica con una risoluzione di millisecondi, gli sviluppatori potrebbero dover utilizzare la patch Linux PREEMPT_RT per soddisfare requisiti di risoluzione più rigorosi e deterministici.

Conclusione

I PLC convenzionali offrono capacità che vanno oltre i requisiti e i budget della maggior parte delle operazioni industriali più piccole in officine di produzione, lavorazione e prototipazione su piccola scala. Per queste applicazioni, gli operatori si trovano di solito ad affrontare requisiti più modesti che invece si collocano bene nella capacità della Raspberry Pi 3.

Utilizzando la Raspberry Pi 3 e schede aggiuntive appropriate, gli sviluppatori possono implementare rapidamente sistemi di automazione industriale dedicati in grado di soddisfare i requisiti di un'ampia gamma di operazioni in piccole officine.

DigiKey logo

Esonero della responsabilità: le opinioni, le convinzioni e i punti di vista espressi dai vari autori e/o dai partecipanti al forum su questo sito Web non riflettono necessariamente le opinioni, le convinzioni e i punti di vista di DigiKey o le sue politiche.

Informazioni su questo editore

Editori nordamericani di DigiKey