pdf-icon

Arduino入門

2. デバイス&サンプル

6. アプリケーション

Unit ACSSR/DCSSR Arduino 使用チュートリアル

1. 準備作業

2. 動作モード

動作モード設定
使用前に以下の説明フローチャートに従って動作モードを設定してください
  • 1. デバイスの電源を切った状態で、中央のボタンを長押しします。
  • 2. デバイスに電源を入れると、RGB LED が高速点滅し、モード設定状態に入ります。
  • 3. ボタンを 1 回押してモードを切り替えます:
    • 緑:ボタン手動モード。動作中は中央ボタンでスイッチを制御。
    • 赤:I2C 通信モード。動作中は HY2.0-4P Grove 端子から I2C バス接続で制御。
    • 黄:Modbus 通信モード。動作中は両端の VH3.96-4P 端子から Modbus バス接続で制御。
  • 4. 長押しで現在のモードを選択保存します。

  • 負荷接続例

3. I2C モード制御

デバイスを I2C 動作モードに設定後、HY2.0-4P Grove 端子から I2C バスに接続して制御します。本例では CoreS3 の PORT.A 端子で通信を行っています。他のコントローラを使用する場合は、接続ピンに応じてプログラムを修正してください。

cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
#include "M5Unified.h"
#include "M5_ACSSR.h"

M5_ACSSR SSR;
void printStatus();

void setup()
{
    M5.begin();
    Serial.begin(115200);
    while (!SSR.begin(&Wire, 2, 1, ACSSR_DEFAULT_ADDR)) {
        M5.Display.println("ACSSR I2C INIT ERROR");
        Serial.println("ACSSR I2C INIT ERROR");
        delay(1000);
    }
    M5.Display.setFont(&fonts::FreeMonoBold12pt7b);
}

void loop()
{
    SSR.on();
    SSR.setLEDColor(0xff0000);
    printStatus();

    delay(1000);

    SSR.off();
    SSR.setLEDColor(0x00ff00);
    printStatus();

    delay(1000);
}

void printStatus()
{
    int relay   = SSR.status();
    int color   = SSR.getLEDColor();
    int version = SSR.getVersion();

    M5.Display.clear();
    M5.Display.setCursor(0, 0);
    M5.Display.println("I2C Mode Control");
    if (relay != -1) {
        Serial.printf("Relay: %s\n", relay ? "ON" : "OFF");
        M5.Display.printf("Relay: %s\n", relay ? "ON" : "OFF");
    }

    if (color != -1) {
        Serial.printf("LED Color: 0x%04X\n", color);
        M5.Display.printf("LED Color: 0x%04X\n", color);
    }

    if (version != -1) {
        Serial.printf("FW Version: 0x%04X\n", version);
        M5.Display.printf("FW Version: 0x%04X\n", version);
    }
}

4. Modbus モード制御

デバイスを Modbus 動作モードに設定後、両端の VH3.96-4P 端子から Modbus バスに接続して制御します。本例では CoreS3 PORT.A と Unit RS485-ISO を使用し、RS485 通信を行っています。

cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
 #include "M5Unified.h"
#include "M5_ACSSR.h"
#include <ArduinoModbus.h>
#include <ArduinoRS485.h>

RS485Class RS485(Serial2, 1, 2, -1, -1);
uint8_t slave_id = 0;

void relayOn();
void relayOff();
void setLedColor(uint16_t color);
int getRelayStatus();
int getLedColor();
int getFirmwareVersion();
void printStatus();

void setup()
{
    M5.begin();
    Serial.begin(115200);
    delay(2000);

    Wire.end();
    ModbusRTUClient.begin(115200, SERIAL_8N1);

    slave_id = ACSSR_DEFAULT_SLAVE_ID;
    M5.Display.setFont(&fonts::FreeMonoBold12pt7b);
}

void loop()
{
    relayOn();
    setLedColor(0xF800);  // RED
    printStatus();

    delay(1000);

    relayOff();
    setLedColor(0x07E0);  // GREEN
    printStatus();

    delay(1000);
}

void relayOn()
{
    ModbusRTUClient.coilWrite(slave_id, ACSSR_RELAY_COIL_ADDR, 0xFF);
}

void relayOff()
{
    ModbusRTUClient.coilWrite(slave_id, ACSSR_RELAY_COIL_ADDR, 0x00);
}

void setLedColor(uint16_t color)
{
    ModbusRTUClient.holdingRegisterWrite(slave_id, ACSSR_LED_HOLDING_ADDR, color);
}

int getRelayStatus()
{
    if (ModbusRTUClient.requestFrom(slave_id, COILS, ACSSR_RELAY_COIL_ADDR, 1)) {
        while (ModbusRTUClient.available()) {
            return ModbusRTUClient.read();
        }
    }
    return -1;
}

int getLedColor()
{
    if (ModbusRTUClient.requestFrom(slave_id, HOLDING_REGISTERS, ACSSR_LED_HOLDING_ADDR, 1)) {
        while (ModbusRTUClient.available()) {
            return ModbusRTUClient.read();
        }
    }
    return -1;
}

int getFirmwareVersion()
{
    if (ModbusRTUClient.requestFrom(slave_id, HOLDING_REGISTERS, ACSSR_VERSION_HOLDING_ADDR, 1)) {
        while (ModbusRTUClient.available()) {
            return ModbusRTUClient.read();
        }
    }
    return -1;
}

void printStatus()
{
    int relay   = getRelayStatus();
    int color   = getLedColor();
    int version = getFirmwareVersion();

    M5.Display.clear();
    M5.Display.setCursor(0, 0);
    M5.Display.println("Modbus Mode Control");
    if (relay != -1) {
        Serial.printf("Relay: %s\n", relay ? "ON" : "OFF");
        M5.Display.printf("Relay: %s\n", relay ? "ON" : "OFF");
    }

    if (color != -1) {
        Serial.printf("LED Color: 0x%04X\n", color);
        M5.Display.printf("LED Color: 0x%04X\n", color);
    }

    if (version != -1) {
        Serial.printf("FW Version: 0x%04X\n", version);
        M5.Display.printf("FW Version: 0x%04X\n", version);
    }
}
On This Page