Skip to the content
PCBKitNew board
4 layers59.3 × 37.5 mmModule, the printed circuit board in 3D

A MultiFlexMeter (MFM) sensor module. The hardware is a generic carrier: RS-485 + 1-Wire, with a software-selectable sensor supply rail (3.6 V / 5 V / 12 V).

Size
59.3 × 37.5 mm
Copper layers
4
Thickness
1.58 mm
Parts
56
Nets
78
Pads
252
Tracks, vias
342, 94
Pours
9
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
26 Jun 2026
Updated
26 Jun 2026

Overview

Module is an open-source printed circuit board by Pollex, from the Pollex/MFM-Module-RS485 repository on GitHub. It is a 4-layer board of 59.3 × 37.5 mm with 56 parts on 78 nets, routed with 342 tracks and 94 vias.

It is built around the SP3485CN-L, TLV61048DBV and TPS22810DBV, with the RBE01VYM6AFHTR and PTS810SJG250SMTRLFS among its other parts. Its parts include 23 resistors, 11 capacitors, 7 diodes, 6 ICs and 3 connectors. It belongs with the STM32 boards of this library.

Main components

5

README

README.md

MFM RS-485 Sensor Module

A MultiFlexMeter (MFM) sensor module. The hardware is a generic carrier: RS-485 + 1-Wire, with a software-selectable sensor supply rail (3.6 V / 5 V / 12 V). The firmware (RIOT-OS, STM32L010) is likewise mostly generic — it powers the rail, talks to the host over I2C, and runs a measurement FSM. The current application reads a LinkBlue dissolved-oxygen (DO) sensor over Modbus RTU.

The module is a slave to the MFM host: the host powers it, triggers a measurement over I2C, then reads back the result.

Hardware

FeatureNotes
Sensor busRS-485 (Modbus RTU) and 1-Wire
Sensor supplyBoost rail, selectable 3.6 V / 5 V / 12 V (FB divider)
Host linkI2C slave (MFM register protocol)
MCUSTM32L010 (mfm-module board)

The rail voltage is a compile-time choice (boost_voltage in main.c), currently 12 V for the DO sensor. KiCad sources live in hardware/; fab outputs are generated separately and shipped as release assets.

Build

Prerequisites: the arm-none-eabi GCC toolchain, plus the RIOT submodule and an out-of-tree I2C-slave patch.

sh
git submodule update --init --recursive
git apply --directory=RIOT 0001-i2c-slave.patch   # I2C slave mode, not yet upstream
make                                               # build
make flash                                         # build + flash via SWD

FW_VERSION is stamped from git describe --tags, so build from a tagged commit for a meaningful version string.

Build flags

Pass as make VAR=1. Defaults are production values.

FlagDefaultEffect
FAT01 = factory-acceptance loop: power rails, init Modbus + DO, read forever. Bench bring-up only.
LOW_POWER10 = block all PM modes so the CPU busy-waits in idle, keeping the SWD link and breakpoints reliable for debugging.
DEBUG_LED01 = blink LED1 with the FSM state and LED2 with the last error code.

Firmware overview

The host drives the module through the MFM I2C register protocol — firmware version, init, measurement start/status/data, and error. Register map and semantics: see the MultiFlexMeter host protocol spec.

A measurement cycle: host writes MEAS_START → firmware powers the rail, validates VSensor, brings up Modbus, reads the DO sensor, publishes the payload → host reads MEAS_DATA. On a measurement failure the firmware returns to IDLE and exposes an app error code (also blinked on LED2) in the error register for the host to read. An invalid FSM state instead halts in ERROR; the host recovers by power-cycling.

mermaid
stateDiagram-v2
    [*] --> SYSTEM_INIT: power on
    SYSTEM_INIT --> IDLE: GPIO, I2C, ADC up
    IDLE --> MFR_INIT: host: manufacturer init
    MFR_INIT --> IDLE
    IDLE --> MEASURING: host: measure
    MEASURING --> IDLE: done or failure
    ERROR --> ERROR: halt on invalid state (host power-cycles)

    state MEASURING {
        [*] --> SENSORS_INIT
        SENSORS_INIT --> DO_CONF: rail OK, sensor probed
        DO_CONF --> DO_READ: no-op (no DO config)
        DO_READ --> MEASURE_FINISH
        MEASURE_FINISH --> [*]
    }

FAT=1 replaces this flow with a standalone read loop (APP_STATE_FAT) that doesn't wait for an I2C command.

Power consumption

One measurement cycle, measured at the main board input

Measured at the MultiFlexMeter main board's supply, so the figures include the main board's own consumption, not just this module. Captured on a dev build (less power-efficient than production) with LoRa at SF7.

A measurement cycle's active phase lasts about 30 s and draws roughly 360 mC (11.7 mA average, 247 mA peak).

DO payload format

MEAS_DATA returns an 8-byte, packed, little-endian struct. Fields are copied verbatim from the sensor's Modbus input registers — the firmware does no scaling or validation, so each value is a raw fixed-point integer the consumer must scale (and range-check) itself.

OffsetFieldTypeRangeScaleUnit
0DO valueuint160–2000×0.01mg/L
2DO saturationuint160–200×0.1%
4Electrode signaluint160–1000raw—
6Temperatureint16-100–1300×0.1°C

Apply the scale to recover the physical value — e.g. a DO field of 742 is 7.42 mg/L.

Parts

56
QtyValueFootprintReferences
7100nCapacitor_SMD:C_0603_1608MetricC1, C2, C3, C4, C5, C6, C16
710kResistor_SMD:R_0603_1608MetricR4, R6, R7, R8, R9, R10, R25
50EResistor_SMD:R_0603_1608MetricR1, R11, R12, R16, R26
34k7Resistor_SMD:R_0603_1608MetricR22, R24, R28
210nCapacitor_SMD:C_0603_1608MetricC7, C8
210uCapacitor_SMD:C_0805_2012MetricC9, C11
2180EResistor_SMD:R_0603_1608MetricR2, R3
2LED_SmallLED_SMD:LED_0603_1608MetricD1, D2
2TPS22810DBVPackage_TO_SOT_SMD:SOT-23-6U4, U6
2TVS Vr=5VDiode_SMD:D_SOD-323FD5, D6
110uInductor_SMD:L_Sunlord_SWPA5040SL1
1120Resistor_SMD:R_0603_1608MetricR23
113k3Resistor_SMD:R_0603_1608MetricR15
1140kResistor_SMD:R_0603_1608MetricR14
130kResistor_SMD:R_0603_1608MetricR5
140k2Resistor_SMD:R_0603_1608MetricR18
180k6Resistor_SMD:R_0603_1608MetricR13
1Conn_01x04Connector_Phoenix_MC:PhoenixContact_MC_1,5_4-G-3.81_1x04_P3.81mm_HorizontalJ3
1D_Small_FilledSOD323-HE:SOD323-HED7
1FerriteBead_SmallInductor_SMD:L_0603_1608MetricFB1
1LOGOfootprints:logo-pollex-15mmG***
1OnewireConnector_Phoenix_MC:PhoenixContact_MC_1,5_3-G-3.81_1x03_P3.81mm_HorizontalJ4
1PCIEx4Connector_PCBEdge:BUS_PCIexpress_x4U1
1PTS810SJG250SMTRLFSButton_Switch_SMD:SW_SPST_PTS810SW1
1SM712_SOT23Package_TO_SOT_SMD:SOT-23D4
1SP3485CNPackage_SO:SOIC-8_3.9x4.9mm_P1.27mmU5
1STM32L010C6TxPackage_QFP:LQFP-48_7x7mm_P0.5mmU2
1SWD ConnectorConnector_PinHeader_1.27mm:PinHeader_2x05_P1.27mm_Vertical_SMDJ1
1TLV61048Package_TO_SOT_SMD:SOT-23-6U3
1TVS Vr=14VDiode_SMD:D_SMFD3
1~Package_TO_SOT_SMD:SOT-363_SC-70-6Q1

The 55 most common of 56 parts.

Questions

How big is the Module PCB?

It measures 59.3 × 37.5 mm and has 4 copper layers, 1.58 mm thick.

What parts does the Module use?

56 parts, built around the SP3485CN-L, TLV61048DBV, TPS22810DBV and RBE01VYM6AFHTR. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Module KiCad files?

From the Pollex/MFM-Module-RS485 repository on GitHub, at the commit this page was made from: the board is hardware/module.kicad_pcb and its schematic hardware/BuckBooster.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Module design in my own project?

Its repository states no licence, so its author keeps all rights: ask Pollex before reusing the design.

Similar boards

  • 2 layers52.8 × 55 mmILDAWaveX16, the printed circuit board in 3D

    ILDAWaveX16

    stanleyondrus/ILDAWaveX16

    ILDAWaveX16 is an open-source, high-resolution, wireless laser DAC with SD-card playback, network control, and ILDA output.

    95 parts42
  • 4 layers75 × 100 mmFrequency counter, the printed circuit board in 3D

    Frequency counter

    vladaviedov/frequency-counter

    [CAD] Handheld RF frequency counter

    104 parts
  • 4 layers64 × 77 mmOBSPro, the printed circuit board in 3D

    OBSPro

    FabianSchwartau/OBSPro

    Version of the OpenBikeSensor hardware optimized for PCBA

    131 parts3LGPL-2.1
  • 4 layers36 × 60 mmSignal generator, the printed circuit board in 3D

    Signal generator

    NidasioAlberto/signal-generator

    Signal Generator with an STM32

    70 parts3
  • 4 layers45 × 53 mmOpenTRV ESP, the printed circuit board in 3D

    OpenTRV ESP

    mpiraux/OpenTRV-ESP

    An open-source and open-hardware thermostatic radiator valve based on the ESP32C6 and the 28BYJ-48 stepper motor.

    64 parts2CERN-OHL-P-2.0
  • 2 layers32 × 46 mmGeneral purpose step up, the printed circuit board in 3D

    General purpose step up

    marcusmueller/12V_step_up

    General purpose Step-Up converter

    26 partsCERN-OHL-S-2.0
  • 2 layers36.4 × 14.9 mmBOOST CONVERTER, the printed circuit board in 3D

    BOOST CONVERTER

    tsokomalusi/TLV61048_BOOST_CONVERTER

    12 parts
  • 2 layers20 × 10 mmDrone bms, the printed circuit board in 3D

    Drone bms

    AMLing2/MAS500_Drone_Arena

    4 partsMIT