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

ブログの内容について疑問や質問がある場合は Q&A サイトである Stack Overflow に質問を投稿しましょう。 GridDB 開発者やエンジニアから速やかな回答が得られるようにするためにも "griddb" タグをつけることをお忘れなく。 https://stackoverflow.com/questions/ask?tags=griddb

Leave a Reply

Your email address will not be published. Required fields are marked *