Skip to the content
2 layers32.8 × 23.5 mmInsole, the printed circuit board in 3D

[SUTD 30.001+30.002+30.100] Adaptive orthopedic insole with FSR pressure sensing, ESP32-C6 control, BLE telemetry via custom Kotlin app, and micro linear stepper actuation for plantar pressure redistribution.

Size
32.8 × 23.5 mm
Copper layers
2
Thickness
1.6 mm
Parts
4
Nets
19
Pads
42
Tracks, vias
56, 0
Pours
1
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
1 Apr 2026
Updated
3 May 2026

Overview

Insole is an open-source printed circuit board by markantosa, from the markantosa/orthomate repository on GitHub, published under the MIT licence. It is a 2-layer board of 32.8 × 23.5 mm with 4 parts on 19 nets, routed with 56 tracks and 0 vias.

It belongs with the robots and motor control and radio and wireless boards of this library.

README

README.md

EPD 3D G6 — Orthomate

Battery-powered adaptive orthopedic insole controller. Redistributes plantar pressure in real-time using three micro linear stepper actuators driven by force sensor feedback. Includes a BLE companion Android app for live monitoring.

🏆 Winner — Top Course Project, EPD 3D Exhibition April 2026

Hardware at a glance

ComponentDetail
MCUESP32-C6 SuperMini
Stepper drivers3× TMC2209 (STEP/DIR mode, ENN hardwired LOW on PCB)
Actuators3× micro linear bipolar stepper
Pressure sensors4× FSR (R1 1kΩ + C 100nF RC filter per channel, R2 10kΩ pull-down)
Display0.91" OLED (SSD1306, I2C)
ChargerTP4056 Type-C
Boost converterXL6009 → 5 V system rail
Battery1S LiPo 2000–3000 mAh
User input1× momentary mode button
BLENimBLE-Arduino 2.5.0 — advertises as EPD3DG6

PCB placement

Orthomate uses two custom PCBs that work together inside a modified shoe:

Controller PCB — mounts in a controller module. Houses the ESP32-C6, three TMC2209 stepper drivers, TP4056 charger, XL6009 boost converter, and the 20-pin connector (J9) to the insole. The LiPo battery sits alongside it.

Insole PCB — sits directly underfoot inside the shoe. Hosts the three FSR pressure-sensing zones (metatarsal, arch, calcaneus) and the three micro linear stepper actuator assemblies. The actuators extend upward to redistribute localised plantar pressure. Connects back to the controller PCB via a 20-pin ribbon/wire harness.

Controller PCB Insole 3D Model

Exhibition highlights

Final product

Final Product Shot

ANSYS stress analysis

Stress Analysis

Exhibition day

Exhibition Booth Team at Exhibition

Group Shot

Poster

Orthomate Poster

Downloadable resources

Repository structure

text
orthomate/
├── Electronics Reference.txt           # Hardware design spec (v6.0)
├── BOM.txt                             # Bill of materials
├── firmware/
│   ├── main/                           # Full operational firmware (PlatformIO)
│   │   ├── platformio.ini
│   │   └── src/main.cpp
│   ├── ARDUINO IDE MAIN/               # Arduino IDE version of the full firmware
│   │   └── EPD3DG6_Main/EPD3DG6_Main.ino
│   ├── ARDUINO IDE APP TEST/           # Minimal Arduino IDE sketch for BLE app testing
│   │   └── sketch_apr14a/sketch_apr14a.ino
│   ├── stepper_test/                   # Single-axis stepper back-and-forth smoke test
│   ├── homing_test/                    # Blind homing: retract to min, extend to 12 mm
│   ├── button_test/                    # Button + OLED input test
│   └── oled_test/                      # OLED display test
├── android_app/                        # Kotlin/Compose BLE companion app
│   └── app/src/main/AndroidManifest.xml
├── Controller PCB KiCad Files/         # KiCad schematic + layout for controller PCB
├── Controller PCB Iterations/          # Gerber files from each revision (V2–V5)
├── Insole PCB KiCad Files/             # KiCad schematic + layout for insole PCB
├── Insole PCB Iterations/              # Gerber files from each revision
├── Exhibition Files and Photos/        # Exhibition media, poster, and slides
└── docs/
    ├── FIRMWARE_MAIN.md                # Detailed firmware walkthrough

Firmware — operational logic

The main firmware (firmware/main/) implements a full fitting cycle driven by one button:

text
DISCONNECTED ──[plug in]──► CONNECTED ──[btn]──► MEASURING
                                                      │ (auto)
                                                  MEASURED ──[btn]──► ACTUATING
                                                                           │ (auto)
                                                                         DONE ──[unplug]──► DISCONNECTED
                                                                         (insole retains shape)

On next plug-in with actuators extended:  DISCONNECTED ──► HOMING ──► CONNECTED
ModeBehaviour
CONNECTEDIdle; shows battery %, BLE status on OLED
MEASURINGReads all 4 FSR channels, 7-sample median filter, computes relative load fractions
ACTUATINGDrives each actuator inversely proportional to region load — lowest load = largest extension
DONEHolds position; unplug to use insole as-is
HOMINGAuto-triggered on reconnect when actuators are extended; retracts all to home

Extension formula: $ext_i \propto (1 - r_i)$ where $r_i = F_i / \sum F$

BLE — Android companion app

The ESP32 advertises a GATT service and notifies a JSON payload at ~4 Hz:

json
{"fsr1": 42, "fsr2": 18, "fsr3": 75, "mode": "MEASURING", "batt": 67}
BLE fieldValue
Device nameEPD3DG6
Service UUID4fa0c560-78a3-11ee-b962-0242ac120002
Characteristic UUID4fa0c561-78a3-11ee-b962-0242ac120002 (NOTIFY + READ)
Notify rate~4 Hz (every 250 ms)
MTU185 bytes

The Android app (android_app/) displays real-time FSR forces as animated colour circles, current mode, battery %, and BLE status. See docs/ANDROID_APP_GUIDE.md for build and install instructions.

GPIO assignment (ESP32-C6 SuperMini, Hardware Ref v6.0)

GPIOFunction
0FSR1 METATARSAL (ADC, 11 dB attenuation)
1FSR2 ARCH (ADC, 11 dB attenuation)
2FSR3 CALCANEUS (ADC, 11 dB attenuation)
3FSR4 AUX (ADC, 11 dB attenuation)
4MODE_BUTTON (INPUT_PULLUP) — boot-safe
5VBAT_SENSE (ADC1 ch5, 11 dB attenuation, 1:2 divider)
6OLED SCL (I2C)
7OLED SDA (I2C)
14ACT3_DIR ⚠ dead channel (stepper motor pad detached)
15CONN_DETECT (INPUT_PULLDOWN)
16ACT2_STEP (arch actuator)
17ACT2_DIR (arch actuator)
18ACT3_STEP ⚠ dead channel (stepper motor pad detached)
19ACT1_DIR
20ACT1_STEP

Quick start

Design rules

  • Charging and actuator operation are mutually exclusive — never simultaneous.
  • Never start all 3 motors simultaneously — stagger motor starts by 75 ms.
  • Sample FSRs only when motors are idle; use 7-sample median filtering with 4 ms settling per sample.
  • ADC attenuation must be set to 11 dB (ADC_11db) on all analog pins for correct readings at the operating voltage range.
  • VBAT < 3.35 V → disable actuators; VBAT < 3.5 V → show low battery warning.
  • OLED updates are content-cached — only redraws when text changes (prevents I2C writes during motor current spikes).

License

MIT — see LICENSE

Parts

4
QtyValueFootprintReferences
120 PIN TO INSOLEConnector_PinSocket_2.54mm:PinSocket_2x10_P2.54mm_VerticalJ9

The 1 most common of 4 parts.

Similar boards

  • 2 layers18.5 × 26 mm24g2usb rp2350zero, the printed circuit board in 3D

    24g2usb rp2350zero

    joypad-ai/joypad-os

    Universal controller firmware for building adapters, dongles, and custom controllers.

    4 parts1.7kApache-2.0
  • 2 layers116 × 33 mm966595-1 and 963356-1, the printed circuit board in 3D

    966595-1 and 963356-1

    rusefi/rusefi

    rusefi - GPL internal combustion engine control unit

    4 parts1.2k
  • 2 layers19 × 18 mmDaughter board, the printed circuit board in 3D

    Daughter board

    hackclub/OnBoard

    💡 Join 1,000 teenagers and make your first PCB with a $100 grant!

    4 parts915
  • 2 layers24.8 × 24.8 mmNrf24 breakout, the printed circuit board in 3D

    Nrf24 breakout

    tardate/LittleArduinoProjects

    a collection of "Little Electronic & Arduino Projects", most involving electronics or an Arduino in one way or another!

    4 parts803MIT
  • 2 layers26 × 20 mmCap chain, the printed circuit board in 3D

    Cap chain

    drandyhaas/KiCadRoutingTools

    A set of Python/Rust tools to aid routing in KiCad

    4 parts744MIT
  • 2 layers34.7 × 20 mmXG Station Power MSI, the printed circuit board in 3D

    XG Station Power MSI

    osy/XG_Mobile_Station

    Open source eGPU dock for ROG Ally and ROG Flow

    4 parts712CC-BY-4.0
  • 2 layers20.3 × 24.5 mmJack power input, the printed circuit board in 3D

    Jack power input

    Luos-io/luos_engine

    Open-source and real-time orchestrator for cyber-physical-systems, to easily design, test and deploy embedded applications and digital twins.

    4 parts546MIT

Questions

How big is the Insole PCB?

It measures 32.8 × 23.5 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Insole use?

4 parts. 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 Insole KiCad files?

From the markantosa/orthomate repository on GitHub, at the commit this page was made from: the board is Insole PCB KiCad Files/insole/insole.kicad_pcb and its schematic Controller PCB KiCad Files/EPD 3D G6/EPD 3D G6.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Insole design in my own project?

Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).