
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.

A syringe-actuated buoyancy control device developed at the Bio-Inspired Robotics and Controls Lab at University of Houston.
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.
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.
Full schematics, PCB layout, and BOM are under /eda.
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/Two outer-loop control strategies were implemented and compared:
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.DiveSyncEnvSpec (OBS_LOW/OBS_HIGH), not a data-fitted scaler.finalize(), larger update) training were implemented; see Known Issues below regarding online training stability.pip install -r requirements.txt
python main.pyYou'll be prompted for:
manual / pid / rl / sysidmetadata.json)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.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 5 | 100nF | Capacitor_SMD:C_1206_3216Metric | C1, C3, C8, C13, C14 |
| 4 | 10kΩ | Resistor_SMD:R_1206_3216Metric | R7, R8, R9, R10 |
| 4 | 10uF | Capacitor_SMD:C_1206_3216Metric | C2, C4, C5, C7 |
| 4 | 2K2 | Resistor_SMD:R_1206_3216Metric | R1, R2, R4, R6 |
| 4 | MountingHole | MountingHole:MountingHole_2.2mm_M2 | H1, H2, H3, H4 |
| 3 | B2B_XH | Connector_JST:JST_XH_B2B-XH-A_1x02_P2.50mm_Vertical | J1, J3, J4 |
| 2 | 47uF | Capacitor_SMD:CP_Elec_6.3x4.5 | C10, C11 |
| 2 | DRV8251ADDAR | footprints:SOIC8_DDA_TEX | U1, U3 |
| 1 | 1K5 | Resistor_SMD:R_1206_3216Metric | R5 |
| 1 | 220uF | Capacitor_SMD:CP_Elec_6.3x4.5 | C12 |
| 1 | 220uF | Capacitor_SMD:C_1206_3216Metric | C6 |
| 1 | 470uF | Capacitor_SMD:CP_Elec_6.3x4.5 | C9 |
| 1 | 4K7 | Resistor_SMD:R_1206_3216Metric | R3 |
| 1 | 68uH | Inductor_SMD:L_Coilcraft_MSS1048-XXX | L1 |
| 1 | AMS1117-3.3 | Package_TO_SOT_SMD:SOT-223-3_TabPin2 | U5 |
| 1 | AMS1117-5.0 | Package_TO_SOT_SMD:SOT-223-3_TabPin2 | U7 |
| 1 | B340AE-13 | Diode_SMD:D_SMA | D13 |
| 1 | BM04BGHS | Connector_JST:JST_GH_BM04B-GHS-TBT_1x04-1MP_P1.25mm_Vertical | J6 |
| 1 | BNO086 | footprints:IC_BNO086 | U4 |
| 1 | Conn_01x03_Pin | Connector_JST:JST_XH_B3B-XH-A_1x03_P2.50mm_Vertical | J5 |
| 1 | Conn_01x05_Pin | Connector_JST:JST_XH_B5B-XH-A_1x05_P2.50mm_Vertical | J2 |
| 1 | FireBeetle 2 ESP32-P4 | footprints:MODULE_DFR0654 | U2 |
| 1 | LM2596S-ADJ | Package_TO_SOT_SMD:TO-263-5_TabPin3 | U6 |
| 1 | LOGO | footprints:BRCLlogo_10 | G*** |
| 1 | LOGO | footprints:UH_LOGO | G*** |
| 1 | R_Potentiometer | Potentiometer_SMD:Potentiometer_Bourns_3214J_Horizontal | RV1 |

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



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.

ekatynski/Test-Stand-Power-Monitor
A small board for cheaply and easily monitoring a motor test stand for a host of data types.

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.


purduerov/X17-Pi-Shield
Custom PCB for Purdue IEEE ROV X17. Board powers the and connects sensors to the Pi
It measures 73 × 54 mm and has 2 copper layers, 1.6 mm thick.
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.
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.
Its repository states no licence, so its author keeps all rights: ask getriscvyy before reusing the design.