Raspberry Pi 3を使用した低コストの産業用コントローラの構築

DigiKeyの北米担当編集者の提供

小規模作業場の生産工程で、過酷な動作環境、高いI/O容量、およびPLC(プログラム可能ロジックコントローラ)が当初意図していた複雑な機能要件の組み合わせを必要とするのは少数です。PLCのスケールダウンしたバージョンも利用できますが、設計者は、効果的な生産の監視と制御を実現する一連の低コストオープンソースハードウェアおよびソフトウェアソリューションの中から選択することもできます。

このようなソリューションには、Raspberry Pi Foundationの小型版であるRaspberry Pi 3とその関連のアドオンボードなどがあります。この記事では、Raspberry Pi 3の主要な特性を説明した後に、Raspberry Pi 3を監視および制御アプリケーションに使用する方法を説明します。

小規模作業場の生産制御にRaspberry Piが選ばれる理由

多くの小規模な運営に対して、Raspberry Pi 3プラットフォームは持続可能なパフォーマンス機能を備えた低コストのソリューションを提供します。専用の産業オートメーションタスクに十分対応できるRaspberry Pi 3ボードには、Broadcom ARM® Cortex®-A53ベースのプロセッサ、1GBのRAM、デジタルインターフェース、Wi-Fi、およびBluetooth接続が組み合わされています。プロセッサそのものは、512KBのL2キャッシュを備えたクアッドコアARM Cortex-A53 CPUと、3つのバンクに配置される54のGPIOが統合された高性能SoC(システムオンチップ)デバイスです。

それぞれのGPIOは、パルス幅変調、クロック、シリアルインターフェースを含む2つ以上最大6つの代替機能をさまざまな方法でサポートします。開発者は未割り当てのGPIOを、最大16mA(GPIOバンクごとに最大50mA)まで提供できる割り込み回線、入力または出力として使用できます。

Raspberry Piファミリの他のメンバーと同様に、Raspberry Pi 3は初心者のための組み込み開発を簡単に行えるように設計されていますが、複雑で強力な処理要件を持つ経験豊富な開発者のニーズを満たすのに十分強力です。

開始するために開発者が行うのは、ボードのビデオポートをディスプレイに接続し、そのUSBポートをキーボードやマウスに接続することだけです。ソフトウェア設計では、開発者は、ボードのマイクロSDインターフェースを介してメモリカードからロードしたRaspberry Pi Foundationの無料のLinuxベースのRaspbianオペレーティングシステムでサポートされる幅広いエコシステムに基づいて構築できます。

産業用機能の追加

性能と開発のしやすさに加え、Raspberry Piでは簡単に機能を拡張できるため、産業オートメーションアプリケーションの多様な要件に十分対応できます。開発者は、HAT(Hardware Attached on Top)と呼ばれるアドオンボードをRaspberry Pi 3ボードにプラグインするだけでハードウェア機能を追加できます。より複雑な産業システムと同様に、HATはHATを識別し、必要に応じてGPIOとドライバを自動で構成するための標準的なアプローチを提供します。その結果、開発者はPimoroniPIM213 Automation HAT(図1)にプラグインするだけで、Raspberry Piシステムを産業アプリケーション向けにすぐにアップグレードできます。

PimoroniのAutomation HATアドオンボードの図

図1:開発者は、PimoroniのAutomation HATなどの特殊なアドオンボードを取り付けて、基本のRaspberry Pi 3ボードを産業オートメーション向けにアップグレードできます。(画像提供:Pimoroni)

オートメーションシステムの監視と制御専用に設計されたPimoroniのAutomation HATには、アナログ入力とデジタル入力、電力出力、リレー制御など複数のI/Oチャンネルが結合されています。24Vの能力と併せて、I/Oチャンネルは相当量の入出力バッファリングを提供します。たとえば、リレー出力は、最大2Aをサポートしますが、これはCrouzet 81 546 001電磁弁などの低電力24ボルトパーツを駆動するのに十分です。

Automation Hatによるソフトウェア開発について、Pimoroniは、数行のコードだけでHATのハードウェア機能を使用できる関連のPythonモジュールを提供しています。Pythonプログラムにインポートすると、Pimoroniモジュールは、アナログ入力、デジタル出力、リレー出力、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:PimoroniのAutomation HAT向けPythonモジュールは、オンボードADC(アナログ〜デジタル変換回路)からの読み取りなどの詳細なトランザクションを処理して開発を簡素化します。(画像提供: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のセット中から選択することができます。たとえば、Adafruit3013 RTC HATはRTC(リアルタイムクロック)を提供しますが、この機能はボードの標準機能ではありません。Raspberry Piの設計者は、開発者がボードをインターネットに常時接続することを求めています。インターネットに接続すると、標準のNTP(Network Time Protocol)を使用してクロック時間を維持できます。そのため、設計上または誤ってインターネット接続を失う可能性のある設計では、AdafruitのRTC HATなどの外部RTCが必要になります。

RTCなどの機能を追加する際、開発者は産業オートメーション設計で単一のHATに制限する必要はありません。開発者は複数のHATをRaspberry Piボードにスタックできます。ほとんどのHATはスタック用の設計になっていますが、開発者はアセンブリを完成させるためのAdafruitの2223、またはHATが互いにまたはベースボードに触れないようにするためのM2.5スタンドオフなどのスタッキングヘッダを追加する必要がある場合があります。

スタッキングヘッダとスタンドオフを使用すると、開発者はAdafruitの2348モータHATなどのHATを簡単にスタックして、多くの産業オートメーションアプリケーションに必要なモータドライバを追加できます。各2348モータHATは、2つのステッピングモータまたは4つのDCモータを駆動できます。実際、開発者はこれらのアドオンボードを32個スタックして、最大64個のステッピングモータまたは最大128個のDCモータをサポートできます(図2)。

複数のAdafruitの2348モータHATの図

図2:開発者は複数のAdafruitの2348モータHATをスタックし、設計で最大64個のステッピングモータまたは128個のDCモータをサポートできます。(画像提供: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クリックシールドにより、開発者は幅広い使用可能なArduinoシールドGroveデバイスおよびMikroBUSクリックボードにそれぞれアクセスできます。

開発者はこれらのボードを使用して、標準のCANインターフェースの場合はMikroElektronika MIKROE-988 CANクリックボード、4-20mAの電流ループの場合はMikroElektronika MIKROE-1296 4〜20mAクリックボードを取り付けてそれらのサポートをすばやく追加できます。

小規模作業場設計の仕上げ

必要なアドオン機能を使ってRaspberry Piベースの設計を迅速に構成したとしても、開発者は適切なユーザーインターフェースを構築する時間が足りなくなることがよくあります。Raspberry Pi 3を使用すると、開発者は設計をAdafruitのIOクラウドサービスに接続して、ユーザーにオートメーションプロセスのグラフィカルなフィードバックと制御を提供できます。クラウドサービスを使って開発者はデータとプロセス情報のシンプルなフィードを作成し(リスト4)、ユーザーがデスクトップ上のWebブラウザ、スマートフォン、または他のモバイルデバイスからプロジェクトを監視および制御できるダッシュボードを構築できます(図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)

AdafruitのIOダッシュボードの画像

図3:開発者は、Raspberry Pi 3ベースの産業オートメーションアプリケーションからの情報を表示し、AdafruitのIOダッシュボードを使用して制御することができます。(画像提供:Adafruit)

簡易なソフトウェア開発、多様なアドオンボード、および高性能なRaspberry Piを組み合わせることで、小規模産業オートメーションアプリケーションに最適なソリューションを提供します。これらのアプリケーションの中には、開発者が、Adafruitの3013 RTC HATなどのRTCを使用した構成で提供されるよりも厳しいタイミング制御を必要とする場合があります。

3013 RTC HATはMaxim IntegratedのDS3231 RTC ICに基づいています。これは、2つのプログラム可能なアラームと方形波出力信号を提供します。開発者はアラームを使用して指定された日数、時間、分、および秒に割り込みを生成するか、方形波を使用して1Hzのレートで割り込みを生成できます。1Hzよりも高速の定期的な割り込みが必要なアプリケーションでは、開発者はプロセッサのシステムタイマを使用してカスタムのソフトウェア機能を開発するか、目的のレートで割り込みを生成できるカスタムのハードウェアカウンタを開発する必要があります。

より高速の時間分解能を必要とするアプリケーションでは、同様に重要な要件が決定論的応答遅延になります。高いレートでは、標準Raspbian OSの応答遅延の変動により精度が下がる可能性があります。標準システムはミリ秒の分解能で十分に決定論的な応答を提供する可能性がありますが、開発者はより厳格でさらに多くの決定論的分解能要件を満たすためにLinux PREEMPT_RTパッチを使用する方法に切り替える必要がある場合があります。

まとめ

従来のPLCは、小規模の製造、機械加工、プロトタイプの作業場におけるほとんどの小規模生産工程の要件と予算を超える典型的な機能を提供します。これらのアプリケーションの場合、オペレータが通常対処するのは、Raspberry Pi 3の機能内で対応できるもっと控えめな要件です。

Raspberry Pi 3と適切なアドオンボードを使用して、開発者は幅広い小型作業場の運用要件に対応できる専用の産業オートメーションシステムを迅速に実装できます。

DigiKey logo

免責条項:このウェブサイト上で、さまざまな著者および/またはフォーラム参加者によって表明された意見、信念や視点は、DigiKeyの意見、信念および視点またはDigiKeyの公式な方針を必ずしも反映するものではありません。

出版者について

DigiKeyの北米担当編集者