ArduinoベースのPLC、MQTT、Node-RED、GridDB、Grafanaで温度センサーデータをモニターする

このブログでは、Raspberry Pi 4上でGridDBを使用して低コストのIndustrial Internet of Things (IIoT)ソリューションを構築し、MQTTを使用してIndustrial Shields M-DUINO 21+ Arduino PLCから温度センサーデータを読み取り、Grafanaを使用してそのデータを可視化する方法を紹介します。

ハードウェアの設定

ハードウェアを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 を使用する利点の一つです。

Raspberry Pi の設定

最初に、Raspberry Piを立ち上げます。次にUbuntuをインストールし、GridDBサーバ、Node.js、GridDB Node.jsクライアント、Node-RED、そして使用するノードをビルド・インストールします。GridDBは64ビットOS上で動作する必要があるので、Pi Imagerを使って64ビットのUbuntu 18.04サーバイメージをマイクロSDカードに書き込みます。

MQTT

Raspberry Pi上でMosquitto MQTTブローカーを使用します。M-DUINO はブローカ上のトピックにメッセージを公開し、Node-RED はそのトピックをサブスクライブします。今回の簡単なデモでは設定は必要ありませんので、単純にインストールして起動します。

sudo apt-get -y install mosquitto
sudo systemctl enable mosquitto
sudo systemctl start mosquitto

Arduino の設定

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

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

次に、Raspberry Pi上で動作するMQTTブローカーのアドレスを設定します。スタートアップルーチンでは、イーサネット、シリアルポートを起動し、MQTTブローカーに接続します。

#include <SPI.h>
#include <Ethernet.h>
#include <ArduinoRS485.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <ArduinoMqttClient.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;
MqttClient mqttClient(etherClient);

const char broker[] = "192.168.1.69";
int        port     = 1883;
const char topic[]  = "temp";

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

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

  if (!mqttClient.connect(broker, port)) {
    Serial.print("MQTT connection failed! Error code = ");
    Serial.println(mqttClient.connectError());

    while (1);
  }

  Serial.println("Connected to the MQTT broker!");

}

Arduinoのループ機能は1秒おきに動作し、温度情報を集めてMQTTブローカーに公開します。

void loop() {
  
    sensors.requestTemperatures();
    float temp = sensors.getTempCByIndex(0);
    Serial.print("Temperature is: ");
    Serial.println(temp);

    mqttClient.beginMessage(topic);
    mqttClient.print("{ \"sensor\" : 1, \"temperature\" : ");
    mqttClient.print(temp);
    mqttClient.print(" }");
    mqttClient.endMessage();

    delay(1000);
  
}

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

GridDB とGridDB WebAPI の設定

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

GridDBが起動したら、WebAPIをダウンロードしてインストールします。

$ wget https://github.com/griddb/webapi/releases/download/2.2.0/griddb_webapi-2.2.0-bin.tar.gz
$ tar zxvf griddb_webapi-2.2.0-bin.tar.gz
$ cd webapi/
$ export GS_WEBAPI_HOME=/home/ubuntu/webapi
$ nohup java -jar ./lib/griddb-webapi-ce-2.2.0.jar &

Node.js, GridDB Node.js Client

Node-REDにNode.jsクライアントを構築するために必要なNode.jsとその開発用ヘッダ、NAN (Native Abstractions for 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-4.0.0.tar.gz
$ tar xvfz swig-4.0.0.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のインストール

次に、これから使用するNode-REDとノードをインストールします。

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

$ npm install node-red
$ git clone https://github.com/griddbnet/node-red-contrib-griddb.git
$ mkdir ~/.node-red
$ 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 フロー

Node-REDにtempトピックをサブスクライブするMQTTリスナーを追加します。

リスナーが動作するためには、MQTT ブローカーが設定されている必要がありますが、この例ではブローカはローカルホスト上で動作しているので、特別な認証は必要ありません。

MQTTリスナーの出力は、文字列からJSONオブジェクトに変換された後、GridDB PUTノードが期待するフォーマットに変換されます。

最後に、GridDB-Put ノードでは、入力されたデータのスキーマを設定します。ここでは入力されたコンテナが msg.topic で指定されているため、コンテナ名は不要です。これにより、複数のセンサのデータを複数のコンテナに書き込むことが可能となります。

Grafana

Grafanaのインストラクションに従って、Grafanaをインストールして起動します。

wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
sudo apt-get update
sudo apt-get install grafana
sudo systemctl enable grafana-server
sudo systemctl start grafana-server

次に、Grafana GridDBデータソースをダウンロードしてインストールします。

wget https://github.com/griddb/griddb-datasource/archive/1.1.0.tar.gz
tar zxvf 1.1.0.tar.gz
sudo cp -a griddb-datasource-1.1.0/dist /var/lib/grafana/plugins
sudo systemctl restart grafana-server

これでGrafanaが起動し、Webブラウザでログインすることができるようになりました。

次に、GridDBのデータソースを作成し、ホスト名、ポート、クラスタ名、ユーザ名、パスワードを入力して動作確認を行います。

データソースが動作している状態で、ダッシュボードにパネルを作成することができます。表示するコンテナと時系列を選択すると、データがプロットされます。Grafanaを使用すると、データ範囲を簡単に拡大・縮小して詳細を調べたり、長期的なトレンドを探ったりすることができます。

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

Leave a Reply

Your email address will not be published.