M5StickC Plusを使ってRS485でModbus RTU通信してみる

M5StickC Plusを手に入れたので少し動かしてみました。

www.switch-science.com

はじめに

勢いで購入してみたは良いけど、とりあえず慣れる必要があるなと思って、題材を考えたのですが、以下の記事でも書いている通り、Modbus結構使っているので、RS485経由でのModbus通信をしてみました。

yomon.hatenablog.com

利用したのはこの温湿度計です。

こちらの記事でも使っています。

yomon.hatenablog.com

開発環境を整える

IDEの準備

ArduinoのIDEではなく、手になじんだVS Code使いたいなと思ったら、以下の記事見つけたのでVSCodeで開発しています。

www.mechatronahibi.com

M5StickC Plusの開発環境準備

以下のライブラリを使います。

https://docs.m5stack.com/#/en\uiflow\RS485

以下の公式手順にあるようにGitHubからZipでダウンロードしたものをインポートします。

https://docs.m5stack.com/#/en/arduino/arduino_development?id=for-m5stickc-plus-1

Modbus-RTU通信準備

RS485通信用のHatの購入

M5StickはHatで色々通信できるらしいということで、見てみたら可愛いHatが見つかったので、せっかくなのでこちらを購入してみました。

www.switch-science.com

Pin Map等は↑のSwitch Scienceのサイトにもありますが、以下の公式ドキュメントに記載があります。

https://docs.m5stack.com/#/en/hat/hat-rs485

Modbus通信に利用するライブラリを導入

以下のModbusMasterというライブラリを利用します。

www.arduino.cc

VSCodeからはArduino Library Managerで以下のように見えます。

f:id:yomon8:20201213160020p:plain

コード

以下が今回のコードです。

見た目は参考サイトに貼らせていただいた記事を参考に少し調整してみました。

#include "ModbusMaster.h"
#include "M5StickCPlus.h"

#define RX_PIN 26
#define TX_PIN 0
#define LCD_HEIGHT 160
#define LCD_WIDTH 160
#define BLACK 0

ModbusMaster node;

int count = 0;
int title_x = 0;
int title_y = 0;
int header_x = 0;
int header_y = 18;
int data_x = 0;
int data_y = 48;

void setup()
{
  M5.begin();

  // 見た目調整
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setRotation(3);
  M5.Lcd.setCursor(title_x, title_y, 2);
  M5.Lcd.println("Modbus Sensor Reader");

  // Initialize for Modbus
  // SERIAL_[8N1] ->  データビット幅(8)、パリティチェック(No)、ストップビット(1)
  Serial2.begin(9600, SERIAL_8N1, RX_PIN, TX_PIN); //Serial port 2 initialization
  node.begin(1, Serial2);
}

void loop()
{
  if (M5.BtnA.wasPressed())
  { //If button A is pressed

    // 前回実行分のテキストを黒で上書き
    M5.Lcd.fillRect(data_x, data_y, LCD_WIDTH - data_x, LCD_HEIGHT - data_y, BLACK);

    // 更新したかわかるように、ボタンを押した回数カウント
    M5.Lcd.setCursor(header_x, header_y, 2);
    count++;
    M5.Lcd.printf("Count :  %03d", count);

    // Modbus温湿度計からのデータ読み取り
    M5.Lcd.setCursor(data_x, data_y, 2);
    uint8_t result;
    result = node.readHoldingRegisters(0x0000, 2);
    if (result == 0)
    {
      uint16_t data[2];
      for (int j = 0; j < 2; j++)
        data[j] = node.getResponseBuffer(j);
      M5.Lcd.printf("Temperature :%5.1f\n", float(data[0] / 10));
      M5.Lcd.printf("Humidity :   %5.1f\n", float(data[1] / 10));
    }
    else
    {
      M5.Lcd.printf("Error Code : %x\n", result);
    }
  }
  M5.update(); //Button status refresh
  delay(100);
}

動かしてみる

以下のように配線して動かしてみます。

表示は以下のようにシンプルです。 M5ボタンを押す毎に温湿度計が青く光って情報が更新されます。

所感

まだまだM5StickC Plusの力を活かせて無いですが、まずはわかりやすいバッテリーとディスプレイを活かしてみるだけでも面白いことは色々できそうです。

参考URL

見た目の調整は以下のサイトが大変参考になりました。

lang-ship.com