Raspberry Pi上のGridDB、Node-Red、Arduino PLCを使用したIIoTプロジェクトの紹介

このブログでは、Modbus経由でIndustrial Shields M-DUINO 21+ Arduino PLCから温度センサーデータを読み取るNode-REDフローを作成し、Raspberry Pi 4上のGridDBでIndustrial Internet of Things (IIoT)ソリューションを低コストで構築する方法を紹介します。

目次

  1. Raspberry Pi の設定
    • Raspberry Pi OS
    • GridDB on Raspberry Pi
    • NodeJS, GridDB Node client
    • Install Node Red
  2. PLC の設定
    • Hardware Setup
    • Arduino Setup
  3. Node-Redフローの作成

Raspberry Pi の設定

最初に、Raspberry PIを立ち上げます。次にUbuntuをインストールしてください。さらにNode-REDとノードに加えてGridDBサーバ、Node.js、GridDB Node.jsクライアントをビルドしてインストールします。

Raspberry Pi OS

GridDBは64ビットOSで動作させる必要があるため、Pi Imagerを使って64ビットのUbuntu 18.04サーバイメージをマイクロSDカードに書き込みます。

Raspberry Pi上でのGridDB

これでRaspberry Piにログインすることができるようになりました。ARM64ベースのRaspberry Pi上でGridDBをコンパイルして実行する方法については、このこちらのブログを参照して設定を行ってください。

NodeJS, NodeJS GridDB クライアント

Node-REDにNode.jsクライアントを構築するために必要なNode.jsとその開発用ヘッダ、Node.js用のノードネイティブ抽象化をインストールします。

# sudo apt-get install nodejs nodejs-dev node-nan

次に、GridDB Node.jsクライアント、PCRE、SWIGの依存関係を構築します。

$ export LD_LIBRARY_PATH=/usr/local/lib
$ wget https://sourceforge.net/projects/pcre/files/pcre/8.39/pcre-8.39.tar.gz
$ tar xvfz pcre-8.39.tar.gz
$ cd pcre-8.39
$ ./configure
$ make
$ make install

$ wget https://prdownloads.sourceforge.net/swig/swig-3.0.12.tar.gz
$ tar xvfz swig-3.0.12.tar.gz
$ cd swig-3.0.12
$ ./configure
$ make
$ make install

これで必要な前提条件が構築されたので、次にGridDB Node.jsクライアントをGitHubからクローンして構築します。

$ git clone https://github.com/griddb/nodejs_client.git
$ cd nodejs_client && make

Node-REDのインストール

これから使用するNode-REDをインストールします。

# npm install node-red
# mkdir ~/.node-red
# cd ~/.node-red 
# npm install node-red-contrib-modbus@3.6.1 node-red-dashboard

GridDB Node-REDは npm からはまだ利用できません。

# cd ~
# git clone https://github.com/griddbnet/node-red-contrib-griddb.git
# cd ~/.node-red
# npm install ~/node-red-contrib-griddb 

次に、GridDBクライアントをNODE_PATHに追加し、Node-REDを起動します。

# export NODE_PATH=:/home/ubuntu/nodejs_client
# ~/node_modules/node-red/bin/node-red-pi

これで、Node-REDのWebページ(http://your_pi_ip:1880/)にアクセスできるようになりました。次にModbusサーバを追加して、mduinoアプリケーションが正常に起動するようにします。

PLC の設定

ハードウェアの設定

ハードウェアの設定のため、ハードウェアをDINレールにマウントし、温度センサーを配線し、Arduino IDEを設定し、ArduinoスケッチをPLCに展開します。

筆者は、Raspberry Pi4をDINRplateにマウントし、DINレール上にきれいに実装するため、Amazonで購入した一般的なターミナルブロックを使用しています。DINレールにすべてのものを取り付ければ、すっきりと整理整頓された状態を保つことができます。

温度センサーのアース線はM-DUINOのアース端子に接続されています。5 ボルトのワイヤーも M-DUINO の +5 VDC ピンに接続されています。センサーワイヤーは Pin2 に接続され、4.7k オームの抵抗が +5 VDC バスとセンサーバスの間に配置されています。十分な大きさのターミナルブロックがあれば、複数の DS18B20 センサーを同じ M-DUINO のピンに接続することができますが、これはアナログセンサーと比較した場合に DS18B20 を使用する利点の一つです。

Arduinoの設定

Arduino IDEをお使いのOSにインストールして起動した後(Raspberry Piでも構いませんが、筆者は開発用のワークステーションに直接接続することをおすすめします)、Arduino IDEにArduino ModbusとDallasTemperatrureのライブラリをインストールします。

Arduino の設定には、必要なヘッダが含まれており、M-Duino の MACアドレス と IP アドレスが設定されています。DS18B20からの信号を受信するためにPIN2を使用しているので、OneWireライブラリを適切に設定します。

次にRaspberry Pi上で動作するModBusサーバのアドレスを設定します。起動手順は簡単で、イーサネットとシリアルを起動するだけです。

#include <SPI.h>
#include <Ethernet.h>
#include <ArduinoRS485.h>
#include <ArduinoModbus.h>
#include <OneWire.h>
#include <DallasTemperature.h>

byte mac[] = { 0xBE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 100 };

#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

EthernetClient etherClient;
ModbusTCPClient modbusTCPClient(etherClient);

IPAddress server(192, 168, 1, 80); // Modbus server
void setup() {

  Ethernet.begin(mac, ip);
  Serial.begin(9600);

}

Arduinoのループ機能は毎秒実行され、Modbusサーバ接続を確保し、温度情報を収集します。同ループ内で、温度情報を100倍にして精度の維持と16ビット整数型のModbusレジスタに収まるようにします。最後に16ビット整数型のデータとして温度情報を送信します。

void loop() {
  
  if (!modbusTCPClient.connected()) {
    Serial.println("Attempting to connect to Modbus TCP server");

    if (!modbusTCPClient.begin(server, 10502)) {
      Serial.println("Modbus TCP Client failed to connect!");
    } else {
      Serial.println("Modbus TCP Client connected");
    }
  } else {
    
    sensors.requestTemperatures();
    float temp = sensors.getTempCByIndex(0);
    Serial.print("Temperature is: ");
    // convert the temperature to int and multiply by 100 to not loose precision
    unsigned int tempbin = (int)(temp*100); 
    Serial.println(tempbin);
    
    if (!modbusTCPClient.holdingRegisterWrite(0, 0x00, tempbin)) {
      Serial.print("Failed to write register! ");
      Serial.println(modbusTCPClient.lastError());
    }

    delay(1000);
  }
}

これでArduinoのコードが完成し、コンパイル、アップロード、動作確認を行うことができるようになりました。

Node-RED フローの作成

既にフローにModbus Serverノードを追加していますが、ここではさらに2つの接続ノードを作成します。最初のセットはModbusから読み込み、データをGridDB-PUTノードが求める構造に変換し、GridDBに挿入します。

まず、Modbus リードノードが Modbus サーバに接続するように設定します。

そして、温度値を書き込んでいるレジスタを読み込むように設定します。

GridDB-Putノードへの入力に適したデータになるように変換します。温度は精度を落とさないように100を掛けているため、ここでは100で割りModbusレジスタに収まるように整数に変換されています。

GridDB Put Node は、コンテナにスキーマを書き込むように設定されます。

接続されたノードの第2セットは、GridDBから読み込み、Dashboard Nodesを使用して値を表示します。

上記の書き込み先のGridDBコンテナから最新のデータを取得します。

クエリノードが出力するデータは、ゲージダッシュボードで使用できるように変換する必要があります。ゲージノード自体は実際の設定は必要ありません。

上記のように、データをChartで使用できるように変換する必要があります。Chartノード自体には設定は必要ありません。

これで、接続されたノードの両方のセットが配備され、ダッシュボードページを開くとPLC から収集したデータから簡単な可視化情報を見ることができるようになりました。 http://your_pi_ip:1880/ui/

これで、デジタル温度センサー、Arduino PLC、Raspberry PIがModbus、GridDB、Node-REDフローに接続され、より多くの温度センサーや他のセンサータイプで簡単に拡張できるシンプルなIIoTソリューションが作成できるようになりました。

このプロジェクトやGridDBに関する質問があれば、Stack Overflowで気軽に質問してください。https://stackoverflow.com/questions/ask?tags=griddb

Leave a Reply

Your email address will not be published.