pdf-icon

Module13.2 4In8Out

SKU:M122

Description

Module13.2 4In8Out is an 8-channel MOS driver output + 4-channel passive contact input IO expansion module. It uses STM32F030 as the I2C IO expansion chip, supports 9 ~ 24V power input, and has a built-in 5V DC-DC circuit.

Features

  • Compatible with Basic/Fire/Core2/CoreS3 and other hosts
  • Uses STM32F030 as the IO expansion chip, communicates with the host via I2C, and the I2C address can be modified by writing to the register
  • 8-channel common positive MOS driver circuit (A3400), capable of directly driving loads, with a maximum switching current of 1A per channel
  • 4-channel common ground passive contact input, cannot connect to active signals or signals greater than 5V
  • Built-in MP1584 9~24V -> 5V DC-DC circuit

Includes

  • 1 x Module13.2 4In8Out
  • 13 x 2P terminals

Applications

  • Multi-channel load driving (relays, solenoid valves, unidirectional motors, signal indicators, etc.)
  • Limit switch, button detection

Specifications

Specification Parameter
Supply Voltage 9~24V
Output Channels 8
Input Channels 4
Output Current 1A per channel, total current not exceeding 8A
Communication Interface I2C
I2C Address Default 0x45, can be modified by writing to register 0xF0
Net Weight 21.9g
Gross Weight 52.5g
Product Dimensions 54 x 54 x 13mm
Package Dimensions 95 x 65 x 25mm

Learn

Function of the onboard toggle switch
The red box in the image below shows the boot0 control toggle switch. Toggling to the 1 side pulls it high for firmware flashing mode. Toggling to the 0 side pulls it low for reading user programs from flash memory, i.e., normal operation mode.

Schematics

PinMap

M5Core GPIO22 GPIO21 5V GND
4IN8OUT MODULE 13.2 SCL SDA 5V GND

Softwares

Arduino

#include <M5Stack.h>
#include "MODULE_4IN8OUT.h"

MODULE_4IN8OUT module;

int _I2C_dev_scan();

void setup() {
    M5.begin(1,1,1,1);  // Init M5Stack.  Initialize M5Stack

    // while (1) {
    //     _I2C_dev_scan();
    //     delay(1000);
    // }


    while (!module.begin(&Wire, 21, 22, MODULE_4IN8OUT_ADDR)) {
        Serial.println("4IN8OUT INIT ERROR");
        M5.Lcd.println("4IN8OUT INIT ERROR");
        _I2C_dev_scan();
        delay(1000);
    };
    Serial.println("4IN8OUT INIT SUCCESS");
}

// void loop() {

// }

long interval = 0;
bool level    = false;

void loop() {
    for (uint8_t i = 0; i < 4; i++) {
        if (module.getInput(i) != 1) {
            // M5.Lcd.fillRect(60 + 60 * i, 0, 25, 25, TFT_BLACK);
            M5.Lcd.fillRect(60 + 60 * i, 0, 25, 25, TFT_GREEN);
        } else {
            // M5.Lcd.fillRect(60 + 60 * i, 0, 25, 25, TFT_BLACK);
            // M5.Lcd.drawRect(60 + 60 * i, 0, 25, 25, TFT_GREEN);
            M5.Lcd.fillRect(60 + 60 * i, 0, 25, 25, TFT_RED);
        }
        M5.Lcd.drawString("IN" + String(i), 40 + 60 * i, 5);
    }
    M5.Lcd.drawString("4IN8OUT MODULE", 60, 80, 4);
    // M5.Lcd.drawString("FW VERSION:" + String(module.getVersion()), 70, 120, 4);
    if (millis() - interval > 1000) {
        interval = millis();
        level    = !level;
        for (uint8_t i = 0; i < 8; i++) {
            module.setOutput(i, level);
            if (level) {
                M5.Lcd.fillRect(20 + 35 * i, 200, 25, 25, TFT_BLACK);
                M5.Lcd.fillRect(20 + 35 * i, 200, 25, 25, TFT_BLUE);
            } else {
                M5.Lcd.fillRect(20 + 35 * i, 200, 25, 25, TFT_BLACK);
                M5.Lcd.drawRect(20 + 35 * i, 200, 25, 25, TFT_BLUE);
            }
            M5.Lcd.drawString("OUT" + String(i), 18 + 35 * i, 180);
            // delay(50);
        }
    }
    // if (M5.BtnB.wasPressed()) {
    //     if (module.setDeviceAddr(0x66)) {
    //         Serial.println("Update Addr: 0x66");
    //     }
    // }
    // M5.update();

    delay(500);
}


int _I2C_dev_scan() {
    uint8_t error, address;
    int nDevices;

    Serial.println("[I2C_SCAN] device scanning...");

    nDevices = 0;
    for (address = 1; address < 127; address++ ) {
        // The i2c_scanner uses the return value of
        // the Write.endTransmisstion to see if
        // a device did acknowledge to the address.
        Wire.beginTransmission(address);
        error = Wire.endTransmission();

        if (error == 0) {
            Serial.print("[I2C_SCAN]: device found at address 0x");
            if (address < 16)
                Serial.print("0");
            Serial.print(address, HEX);
            Serial.println(" !");

            nDevices++;
        }
        else if (error == 4) {
            Serial.print("[I2C_SCAN]: unknown error at address 0x");
            if (address < 16)
                Serial.print("0");
            Serial.println(address, HEX);
        }
    }

    Serial.print("[I2C_SCAN]:");
    Serial.printf(" %d devices was foundrn", nDevices);
    return nDevices;
}

UiFlow1

Protocol

Video