Skip to the content
2 layers73 × 54 mmFishCoreBoard v3 3, the printed circuit board in 3D

FishCoreBoard v3 3

getriscvyy/divesync-heavy1

A syringe-actuated buoyancy control device developed at the Bio-Inspired Robotics and Controls Lab at University of Houston.

Size
73 × 54 mm
Copper layers
2
Thickness
1.6 mm
Parts
46
Nets
53
Pads
175
Tracks, vias
337, 39
Pours
1
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
26 Aug 2026
Updated
17 Sep 2026

Overview

FishCoreBoard v3 3 is an open-source printed circuit board by getriscvyy, from the getriscvyy/divesync-heavy repository on GitHub. It is a 2-layer board of 73 × 54 mm with 46 parts on 53 nets, routed with 337 tracks and 39 vias.

It is built around the LM2596S-ADJ, AMS1117-3.3 and AMS1117-5.0, with the BNO086 and BM04B-GHS-TBT among its other parts. Its parts include 14 capacitors, 10 resistors, 7 ICs, 6 connectors and 1 diode. It belongs with the robots and motor control boards and the ESP32 and RISC-V boards of this library.

Main components

5

README

README.md

DiveSync Heavy and Data Collection Infrastructure

An autonomous underwater depth-control vehicle built around an ESP32 and MS5837 depth sensor, using a linear actuator syringe mechanism (0–100mm stroke) for buoyancy-based depth control. This repo contains the firmware, hardware design files, and control software, including PID and reinforcement learning (TD3) controllers.

Hardware Overview

  • Depth sensing: MS5837 pressure/depth sensor
  • Actuation: Linear actuator-driven syringe mechanism, 0–100mm stroke, adjusts buoyancy by changing displaced volume
  • Compute: ESP32, communicating over USB serial (115200 baud) with a host machine running the Python control stack
  • Control loop: 20Hz telemetry/state/actuator loop, with an inner PID stabilizing actuator position and an outer controller (PID / BC / RL) setting the depth-tracking target

Full schematics, PCB layout, and BOM are under /eda.

Repository Structure

text
divesync-heavy/
├── data/                     # Raw experiment logs, grouped by hardware/software version -- see data/README.md
├── eda/                      # KiCad schematic, PCB, BOM, and exported schematic PDF
├── firmware/                 # ESP32 firmware (PlatformIO project)
├── python/
│   ├── controllers/
│   │   ├── inner.py           # Inner PID loop — actuator position control
│   │   ├── manual.py          # Gamepad/keyboard manual control
│   │   ├── pid.py             # Outer PID depth controller
│   │   └── rl.py              # TD3 (fully online) depth controller
│   ├── core/
│   │   ├── experiment.py      # Experiment setup, handshake, state machine
│   │   ├── logger.py          # CSV logging (raw/processed/state)
│   │   ├── merger.py          # Merges state + processed CSVs into training_data.csv
│   │   ├── processor.py       # Depth filtering, actuator unit conversion
│   │   ├── serial_manager.py  # Serial I/O with the ESP32
│   │   ├── state.py           # Computes depth error, filtered velocity
│   │   └── telemetry.py       # Raw serial line parsing
│   ├── ml/
│   │   ├── reward.py              # TD3 reward function
│   │   ├── td3_env_spec.py        # Gym shape-declaration env for SB3 (also defines the fixed obs-normalization bounds)
│   │   ├── td3_model.zip          # Actively-training TD3 model (updated after each RL dive)
│   │   └── td3_replay_buffer.pkl  # Persisted replay buffer across dives
│   └── visualization/

Control Strategies

Two outer-loop control strategies were implemented and compared:

  1. PID — classical outer-loop depth PID feeding actuator position setpoints to the inner PID. Cascaded/nested PID across both loops was tested and found unstable (~99% of trials); the current architecture uses a single outer PID plus a fixed inner actuator-position PID instead.
  2. Reinforcement Learning (TD3) — an off-policy, deterministic actor-critic algorithm (Twin Delayed DDPG), trained fully online on real hardware from a randomly-initialized actor and critics (no warm-start). Chosen over SAC/PPO/DDPG because its replay buffer suits the limited real-hardware sample budget, and its twin critics counter the Q-value overestimation that made vanilla DDPG unreliable.

TD3 Implementation Notes

  • Built on stable_baselines3 (Gymnasium 1.3.0 / SB3 2.9.0), with a shape-only DiveSyncEnvSpec env used purely to satisfy SB3's constructor — no vectorized-env training loop is used. main.py's own 20Hz loop is the environment loop; each dive is treated as one training episode.
  • State inputs to the actor are normalized using the fixed bounds declared in DiveSyncEnvSpec (OBS_LOW/OBS_HIGH), not a data-fitted scaler.
  • The reward function combines a depth-tracking error penalty, a velocity-damping penalty, and a smooth exponential barrier discouraging surfacing (and, in later iterations, an analogous barrier for the tank floor and an action-delta smoothness penalty).
  • Both online (small periodic updates during a dive) and end-of-dive (finalize(), larger update) training were implemented; see Known Issues below regarding online training stability.

Running an Experiment

bash
pip install -r requirements.txt
python main.py

You'll be prompted for:

  • Control mode: manual / pid / rl / sysid
  • Experiment duration (seconds)
  • Notes (optional, stored in metadata.json)
  • COM port for the ESP32

Each run creates a timestamped folder under data/ containing raw.csv, processed.csv, state.csv, boot.txt, and metadata.json. After the experiment ends, training_data.csv is generated (merging state.csv and processed.csv), and a results plot is shown automatically if processed.csv exists.

The first rl-mode run initializes a fresh TD3 model (random actor + critics) since there is no warm-start; python/ml/td3_model.zip and td3_replay_buffer.pkl are created after finalize() and reused/extended on subsequent RL dives.

Parts

46
QtyValueFootprintReferences
5100nFCapacitor_SMD:C_1206_3216MetricC1, C3, C8, C13, C14
410kΩResistor_SMD:R_1206_3216MetricR7, R8, R9, R10
410uFCapacitor_SMD:C_1206_3216MetricC2, C4, C5, C7
42K2Resistor_SMD:R_1206_3216MetricR1, R2, R4, R6
4MountingHoleMountingHole:MountingHole_2.2mm_M2H1, H2, H3, H4
3B2B_XHConnector_JST:JST_XH_B2B-XH-A_1x02_P2.50mm_VerticalJ1, J3, J4
247uFCapacitor_SMD:CP_Elec_6.3x4.5C10, C11
2DRV8251ADDARfootprints:SOIC8_DDA_TEXU1, U3
11K5Resistor_SMD:R_1206_3216MetricR5
1220uFCapacitor_SMD:CP_Elec_6.3x4.5C12
1220uFCapacitor_SMD:C_1206_3216MetricC6
1470uFCapacitor_SMD:CP_Elec_6.3x4.5C9
14K7Resistor_SMD:R_1206_3216MetricR3
168uHInductor_SMD:L_Coilcraft_MSS1048-XXXL1
1AMS1117-3.3Package_TO_SOT_SMD:SOT-223-3_TabPin2U5
1AMS1117-5.0Package_TO_SOT_SMD:SOT-223-3_TabPin2U7
1B340AE-13Diode_SMD:D_SMAD13
1BM04BGHSConnector_JST:JST_GH_BM04B-GHS-TBT_1x04-1MP_P1.25mm_VerticalJ6
1BNO086footprints:IC_BNO086U4
1Conn_01x03_PinConnector_JST:JST_XH_B3B-XH-A_1x03_P2.50mm_VerticalJ5
1Conn_01x05_PinConnector_JST:JST_XH_B5B-XH-A_1x05_P2.50mm_VerticalJ2
1FireBeetle 2 ESP32-P4footprints:MODULE_DFR0654U2
1LM2596S-ADJPackage_TO_SOT_SMD:TO-263-5_TabPin3U6
1LOGOfootprints:BRCLlogo_10G***
1LOGOfootprints:UH_LOGOG***
1R_PotentiometerPotentiometer_SMD:Potentiometer_Bourns_3214J_HorizontalRV1

Similar boards

  • 2 layers114.3 × 102.9 mmTruss PCB, the printed circuit board in 3D

    Truss PCB

    practable/truss

    The truss remote laboratory has been designed for use with Structural Engineering and Engineering Design courses at the University of Edinburgh.

    208 partsAGPL-3.0
  • 2 layers165 × 125 mmFALCON CARRIER, the printed circuit board in 3D

    FALCON CARRIER

    Ruzz-1010/Project-FALCON-01

    thesis proposal system

    55 parts1
  • 4 layers32 × 32.1 mmSen breakout, the printed circuit board in 3D

    Sen breakout

    Caped-Crussader/Gyro-Accel-Baro-Breakout-Board

    A compact multi-sensor breakout board combining three high-performance sensors on a single PCB with a shared SPI bus, onboard power regulation, and dual JST-GH connectors.

    33 parts
  • 4 layers56.3 × 68.4 mmTest Stand Power Monitor, the printed circuit board in 3D

    Test Stand Power Monitor

    ekatynski/Test-Stand-Power-Monitor

    A small board for cheaply and easily monitoring a motor test stand for a host of data types.

    70 parts
  • 4 layers100 × 60 mmGigaDFN56, the printed circuit board in 3D

    GigaDFN56

    kaminaris/GigaESC-DFN5x6

    Compact, modular three-phase ESC power board for the GigaESC project. Designed in KiCad 10 on a 100 × 60 mm, four-layer PCB, with separate plug-in control and power-supply boards.

    234 parts
  • 4 layers135.2 × 97.6 mmCM4IOv5, the printed circuit board in 3D

    CM4IOv5

    purduerov/X17-pi_cm_hat_-_-

    Raspberry pi compute module 4 R&D board.

    189 parts
  • 4 layers85 × 56 mmX17-Pi Shield, the printed circuit board in 3D

    X17-Pi Shield

    purduerov/X17-Pi-Shield

    Custom PCB for Purdue IEEE ROV X17. Board powers the and connects sensors to the Pi

    92 parts

Questions

How big is the FishCoreBoard v3 3 PCB?

It measures 73 × 54 mm and has 2 copper layers, 1.6 mm thick.

What parts does the FishCoreBoard v3 3 use?

46 parts, built around the LM2596S-ADJ, AMS1117-3.3, AMS1117-5.0 and BNO086. 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 FishCoreBoard v3 3 KiCad files?

From the getriscvyy/divesync-heavy repository on GitHub, at the commit this page was made from: the board is eda/FishCoreBoard_v3_3.kicad_pcb and its schematic eda/FishCoreBoard_v3_3.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the FishCoreBoard v3 3 design in my own project?

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