LoginSignup
0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-05-17

IIoT schema

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

目次

  • ハードウェアの設定
  • Raspberry Pi の設定
  • MQTT
  • Arduino の設定
  • GridDB とGridDB WebAPI の設定
  • Node.js, GridDB Node.js Client
  • Node-RED の設定
  • Grafana
  • ハードウェアの設定

ハードウェアの設定

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

筆者は、Raspberry Pi4をDINRplateにマウントし、DINレール上にきれいに実装するため、Amazonで購入した一般的なターミナルブロックを使用しています。DINレールにすべてのものを取り付ければ、すっきりと整理整頓された状態を保つことができます。
Arduino GridDB
温度センサーのアース線は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カードに書き込みます。
Rasperry Pi Imager

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 Setting
Arduino Screenshot
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リスナーを追加します。
Node Red screenshot
リスナーが動作するためには、MQTT ブローカーが設定されている必要がありますが、この例ではブローカはローカルホスト上で動作しているので、特別な認証は必要ありません。
Node Red screenshot
MQTTリスナーの出力は、文字列からJSONオブジェクトに変換された後、GridDB PUTノードが期待するフォーマットに変換されます。
Node Red screenshot
最後に、GridDB-Put ノードでは、入力されたデータのスキーマを設定します。ここでは入力されたコンテナが msg.topic で指定されているため、コンテナ名は不要です。これにより、複数のセンサのデータを複数のコンテナに書き込むことが可能となります
Node Red screenshot

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
データソースが動作している状態で、ダッシュボードにパネルを作成することができます。表示するコンテナと時系列を選択すると、データがプロットされます。Grafanaを使用すると、データ範囲を簡単に拡大・縮小して詳細を調べたり、長期的なトレンドを探ったりすることができます。
Grafana GridDB
このプロジェクトやGridDBに関する質問があれば、Stack Overflowで気軽に質問してください。
https://ja.stackoverflow.com/questions/ask?tags=griddb
https://stackoverflow.com/questions/ask?tags=griddb

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0