

Robobouoy V4.0
This device sails autonome to a given location.
- Size
- 194 × 40 mm
- Copper layers
- 4
- Thickness
- 1.6 mm
- Parts
- 258
- Nets
- 177
- Pads
- 775
- Tracks, vias
- 1,709, 403
- Pours
- 5
- Routed
- Yes
- KiCad
- KiCad 10.0 (file 20260206)
- Created
- 1 May 2023
- Updated
- 27 Sep 2026
Overview
Robobouoy V4.0 is an open-source printed circuit board by pnn69, from the pnn69/NicE-Buoy repository on GitHub. It is a 4-layer board of 194 × 40 mm with 258 parts on 177 nets, routed with 1,709 tracks and 403 vias.
It is built around the SN74LV1T34DBV, LMR16020PDDA and INA181A1IDBVR(XBLW), with the LM1117S-3.3, ICM-20948 and LP5907MFX-1.8 among its other parts. Its parts include 80 resistors, 67 capacitors, 23 diodes, 18 transistors and 15 connectors. It belongs with the radio and wireless boards and the ESP32 boards of this library.
Main components
12SN74LV1T34DBV
SOT-23-5-40℃~+125℃ 1 1 1.6V~5.5V 10uA 5.5ns@5V,15pF 74LV 8mA 8mA Level shifting Push-pull Unidirectional SOT-23-5 Buffers, Drivers, Receivers, Transceivers ROHSTexas InstrumentsBuffers, Drivers, Receivers, TransceiversLMR16020PDDA
SOIC-8-EP-40℃~+125℃@(TJ) 1 2.5MHz 2A 4.3V~60V 40uA 800mV~50V Adjustable Buck Buck Built-in No SOIC-8-EP DC-DC Converters ROHSTexas InstrumentsDC-DC ConvertersINA181A1IDBVR(XBLW)
SOT-23-6-200mV~30V -40℃~+125℃ 1 100dB 175uA 1uV/℃ 2.7V~5.5V 20V/V 25uV 2V/us 350kHz 40nV/√Hz@1kHz 75uA 8mA Bidirectional detection、Zero drift / auto-zero ±30V SOT-23-6 Current Sense Amplifiers ROHSXBLWCurrent Sense AmplifiersLM1117S-3.3
SOT-223-3-40℃~+125℃@(Tj) 1 1.2V@(1A) 100uV 12V 1A 3.3V 5mA 75dB@(120Hz) Fixed Over Temperature Protection Positive SOT-223-3 Voltage Regulators - Linear, Low Drop Out (LDO) Regulators ROHSHTC Korea TAEJIN TechVoltage Regulators - Linear, Low Drop Out (LDO) RegulatorsICM-20948
QFN-24(3x3)-40℃~+85℃ 0.5KB 1.71V~3.6V 16bit 8uA Accelerometer Gyroscope SPI、I2C X,Y,Z X,Y,Z ±16g ±2000dps QFN-24(3x3) Accelerometers ROHSTDK InvenSenseAccelerometersLP5907MFX-1.8
SOT-23-5-40℃~+125℃@(Tj) 1 1.8V 120mV@(250mA) 12uA 250mA 5.5V 6.5uVrms 82dB@(1kHz) Fixed Positive Under Voltage Lockout、Over Temperature Protection、Enable、Short Circuit Protection SOT-23-5 Voltage Regulators - Linear, Low Drop Out (LDO) Regulators ROHSTexas InstrumentsVoltage Regulators - Linear, Low Drop Out (LDO) RegulatorsCRGH0603F10K
0603-55℃~+155℃ 10kΩ 200mW 50V Thick Film Resistor ±1% ±100ppm/℃ 0603 Chip Resistor - Surface Mount ROHSTE ConnectivityChip Resistor - Surface MountAO3400A
SOT-23-55℃~+150℃ 1 N-channel 1.45V 1.4W 30V 48mΩ@2.5V 5.7A 50pF 630pF 75pF 7nC@10V N-Channel SOT-23 MOSFETs ROHSAlpha & Omega SemiconductorMOSFETs1N4148WS
SOD-3231.25V@150mA 100V 150mA 1uA@75V 200mW 2A 4ns Independent SOD-323 Switching Diodes ROHSJiangsu Changjing Electronics Technology (CJ)Switching DiodesWS2812B
5mm X 5mm Surface Mount RGB LED with Intelligent ControlWorldsemiUncategorisedAO3401A
SOT-231 P-Channel 14nC@10V 30V 47mΩ@10V、60mΩ@4.5V、85mΩ@2.5V 4A 55pF 645pF 80pF 900mV SOT-23 MOSFETs ROHSAlpha & Omega SemiconductorMOSFETsAON6407-MS
DFN5x6-8LMOSFETsMSKSEMI
README
README.mdNicE-Buoy Autonomous Marine System Firmware
Welcome to the master repository for the NicE-Buoy Autonomous Marine System. This codebase powers a highly reliable, dual-processor autonomous marine buoy designed for GPS lock-to-position, remote configuration, automated sailing, and live telemetry tracking over LoRa and WiFi (UDP).
📌 Project Overview
NicE-Buoy is an industrial-grade marine robotic system consisting of multiple hardware and software components. Each buoy uses a dual-ESP32 architecture split into a Top Unit (RoboTop) and a Sub Unit (RoboSub), connected by a single-wire half-duplex serial link. This physical decoupling isolates high-frequency navigation, radio communication, and web server tasks (Top) from raw thruster driving, compass polling, and the PID motor loops (Sub).
Alongside the buoys sit two shore-side controllers: RoboCYD, a touchscreen unit that doubles as the field WiFi access point, and RoboLora, a USB/WiFi LoRa gateway.
🏗️ System Architecture
┌───────────────────────────┐ ┌───────────────────────────────┐
│ RoboPythonDisplay (PC) │ │ RoboCYD (touchscreen) │
│ Tkinter dashboard │ │ - IS the field AP Robo_WiFi │
└────────────┬──────────────┘ │ - LoRa RX task + web UI │
│ UDP / LoRa └───────────────┬───────────────┘
│ │
┌────────────▼──────────────┐ │
│ RoboLora (gateway) │ UDP 1001 (protocol) │
│ USB + WiFi <-> LoRa │ UDP 1002 (debug log) │
└────────────┬──────────────┘ │
└───────────────┬───────────────────────┘
│ LoRa 868 MHz + WiFi/UDP
┌────────────────────────────────────▼────────────────────────────────────────┐
│ RoboTop │
│ - GPS polling (TinyGPS++, 0,0 placeholder rejected) │
│ - LoraTask: RF telemetry, ACK retry table (10 slots) │
│ - WiFiTask: web dashboard, UDP broadcast, OTA, captive portal, mDNS │
│ - SercomTask: bridge to the Sub - Button, buzzer, RGB LEDs │
└────────────────────────────────────┬────────────────────────────────────────┘
│ single-wire half-duplex UART
│ Top TX 22 / RX 21 <-> Sub RX 5 / TX 18
┌────────────────────────────────────▼────────────────────────────────────────┐
│ RoboSub │
│ - Dual ESC thrusters (BB & SB) - ICM-20948 9-DoF compass + fusion │The codebase is structured into the following decoupled sub-projects:
RoboTop(Top Unit) — ESP32, FreeRTOS. Acquires GPS, hosts the HTML5 control dashboard, broadcasts telemetry over UDP and LoRa, and delegates motor execution to the Sub. Tasks:GpsTask,LoraTask,WiFiTask,SerialTask(SercomTask),buttonTask,LedTask,buzzTask.RoboSub(Sub Unit) — ESP32, FreeRTOS. Drives the thrusters, reads the compass, runs the PID loops, and is the authoritative owner of all tuning parameters (see below). Tasks:CompassTask,EscTask,SerialTask,WiFiTask,LedTask,buzzTask. The rudder and speed PIDs live inpidrudspeed.cpp.RoboCYD(Touchscreen Controller) — ESP32 + 320x240 TFT with resistive touch. Displays the fleet, sends commands, and raises the field access pointRobo_WiFiwhen no home network is present. Has a dedicated LoRa receive task and serves both a dashboard and a standalone fullscreen map.RoboDependency(RoboCompute+RoboTonelibraries) — shared code linked by Top and Sub. Navigation maths (RouteToPoint), the unifiedRoboStruct,formatFloat, and the telemetry encoder/decoder (rfCode/rfDeCode).RoboLora(LoRa Gateway) — USB-and-WiFi to LoRa gateway with its own web UI. Relays operator commands to the buoys; stamps its outgoing frames with sender ID0x99.RoboPythonDisplay(Python GUI Monitor) — Tkinter desktop dashboard (RoboControl.py) for up to 3 buoys: windroses, thruster indicators, battery voltages, PID menus.RoboChargingStation— solar monitoring and charging dock firmware.
Who owns what
Worth stating plainly, because it drives a lot of the design:
- The Sub owns the tuning. PID gains, compass offset,
holdRad, thruster inversion and swap all live in the Sub's NVS. The Top holds a RAM copy only, fetched viaSETUPDATAwhen the serial link comes up, and shown on the dashboards until the Sub reports again. compassOffset,revBB,revSBandswap_BB_SBare hull-specific — they describe the physical boat, not the electronics. Move a Sub to another hull and these travel with it and will be wrong until re-entered.- The Sub has no LoRa. Its only path to the outside world is the serial line to its Top.
🌐 Network Layout
Every node follows the same priority list:
NicE_WiFi -> Robo_WiFi -> its own AP- At home everything joins
NicE_WiFi. - In the field, when no
NicE_WiFiis in reach, the CYD becomesRobo_WiFi(passwordgeenanker,192.168.1.1/24, 8 client slots) and the Tops and RoboLora join it. - A node that finds neither raises its own AP —
TOP_<id>,SUB_<id>,LORA_<id>, passwordgeenanker, on192.168.4.1— and keeps hunting underneath it. Joining that AP opens the dashboard automatically via a captive portal. - The Sub deliberately skips
Robo_WiFi, to keep the CYD's client slots for the Tops and a phone. It costs nothing: the Sub never transmits on UDP anyway, and all of its telemetry reaches you folded into the Top'sTOPDATA.
mDNS gives every node a stable name that works in both modes — top-<id>.local, sub-<id>.local, robocyd.local, lora-<id>.local. ArduinoOTA registers the responder; nothing else may call MDNS.begin(), as a second responder has crashed this hardware before.
UDP ports: 1001 carries the protocol; 1002 carries a plain-text debug log (see the RoboTop README).
📡 Communication Protocol & Frame Format
The system communicates using a lightweight, proprietary, ASCII-based comma-separated protocol designed to optimize RF bandwidth while remaining human-readable.
Frame Anatomy
$TargetID,SenderID,AckType,CommandType,Status,Param1,Param2,...,ParamN*CRC\n$: Starting sentinel character.TargetID: Address of the recipient. All IDs are hexadecimal. A buoy's ID is the low four bytes of its MAC (e.g.b7a5b578).1(BUOYIDALL) is the broadcast address;0is treated as a legacy broadcast.SenderID: Address of the transmitting station.99(i.e.0x99) is the web UI / RoboLora and98is the CYD display. These two are the only senders whose broadcasts a buoy will act on — a broadcast command from a peer buoy is ignored, which is what stops one buoy commanding another.AckType: Packet type classification:1 (GET): Request parameter values.2 (SET): Modify parameter values.3 (GETACK): Request command execution with receipt verification.4 (ACK): Receipt confirmation.6 (INF): Telemetry status update, or an answer to a question.
CommandType: Integer mapping to system command (e.g.,51forTOPDATA,19forBUOYPOS,83forSETUPDATA,47forDIRDIST,21forLOCKPOS,23forDOCKPOS).Status: Current state machine status of the buoy (7 IDLE,13 LOCKED,16 DOCKED, …).Params: Dynamic floating-point or integer parameters depending on the command.*: End-of-payload delimiter.CRC: 2-character hexadecimal CRC calculated by XOR'ing all characters between$and*.
Broadcasts that expect an ACK are a trap. An ACK for
IDr = BUOYIDALLcan never match inremoveAckMsg(), so aSETorGETACKbroadcast sits in the LoRa retry table for all five retransmits and blocks a slot. Broadcast beacons must useINF.
🚀 Advanced Telemetry Optimizations
1. Bandwidth Compression
To maximize LoRa airtime efficiency and range, telemetry strings undergo two compression steps in RoboCompute.cpp:
- Float Trailing Stripping:
formatFloat()trims redundant trailing zeros and decimal points (e.g.12.5000becomes12.5). - Zero Compression:
RoboCode()compresses consecutive zero fields to empty strings (e.g.,0,0,0,0,becomes,,,,,).
2. The Top-to-Sub Link, and Why One-Way Failures Matter
The Top and Sub share one wire, half duplex, with hardware separating the two directions (opto-isolated; see Datasheets/). The firmware configures two GPIOs per board — Top TX 22 / RX 21, Sub RX 5 / TX 18 — but that is not two conductors.
- The diagnostic consequence: if the connector or the wire fails, traffic stops in both directions. A failure in one direction only therefore cannot be the plug — it is in the direction-separation circuitry, which is per board. Swapping a Sub between hulls localises such a fault to a specific board.
SercomTaskimplements echo filtering, discarding frames whose sender ID is its own, because a transmitter hears itself on a shared wire.- Implicit ACKs: any valid
INFresponse from the Sub signals that it processed the command, clearing the retry queue without extra traffic. - The Sub sleeps. After reconnection it sits in power-down and only wakes on an incoming command — send one, wait, then it communicates. Do not read a quiet Sub as a fault until it has been nudged.
3. Hardware Self-Healing Watchdogs
- LoRa transceiver watchdog: if transmission fails for 500 ms the SPI/state machine is assumed locked and
InitLora()forces a full re-init. - Compass watchdog: static I2C readings under thruster power trigger
COMPASS STUCK - REINIT. - Serial watchdog: the Top clears
isSerConnectedafter 2 s of silence and re-requestsSETUPDATAwhen the Sub returns. - Stack headroom is observable. The Top's
/datareportsStkLoop,StkLora,StkWifi,StkSerand heap figures. A LoRa task running on 100 bytes of stack was the cause of a hard-to-find panic; check these after any change that adds work to a task.
🧭 In-Field Navigation Calibration State Machines
-
In-Field Compass Spin Calibration — self-guided rotation while measuring magnetic min/max to derive hard-iron offsets.
-
In-Field Offset Alignment — sails a straight leg on compass heading, compares the GPS track, and writes the difference to the stored compass offset.
-
Guided 8-Point Compass Calibration — the hull is turned to the compass's own zero and then indexed round a mechanical fixture 45° at a time, one capture per mark. Produces the 8-point correction table, which is held on the Sub and reported through
SETUPDATA. The table describes the hull's magnetic deviation only; which way the sensor is bolted in is a separate setting (Set as North), applied after the table.A GPS-based version of this used to exist, sailing eight 100 m legs and inferring the table from the track. It was removed when the mounting offset moved out of the table's input — its residual arithmetic assumed the old ordering.
🛠️ Developer Guide
Prerequisites
- Firmware: VS Code + PlatformIO IDE.
- Python Monitor: Python 3.10+ with
pyserialandtkinter.
Compilation & Flash Commands
pio run # build
pio run -t upload # upload (OTA by default for Top and Sub)
pio device monitor # serial monitorOver-The-Air (OTA) Updates
RoboTop and RoboSub default to upload_protocol = espota, so a plain upload goes over the network:
pio run -t upload --upload-port 192.168.1.71 # by address
pio run -t upload --upload-port top-b7a5099c.local # or by mDNS nameRoboCYD and RoboLora have no espota configuration in their platformio.ini (their upload_port names a COM port that may not exist), so flash those directly:
python ~/.platformio/packages/framework-arduinoespressif32/tools/espota.py \
-i <ip> -p 3232 -f .pio/build/<env>/firmware.bin -rA RoboTop change that touches data/ also needs pio run -t uploadfs — the web page lives in SPIFFS.
Renaming an SSID or changing the WiFi policy must be rolled out to the whole fleet at home on
NicE_WiFi. A device left on the old scheme cannot be reached in the field.
Running the Python GUI Dashboard
pip install pyserial
python RoboPythonDisplay/RoboControl.py📜 License & Contributions
This project is proprietary and confidential. For contributions, pull requests, or feature requests, contact Peter de Nijs (pnn69pnn@gmail.com).
Parts
258| Qty | Value | Footprint | References |
|---|---|---|---|
| 32 | 100n | A_Device:C_0603 | C201, C202, C204, C207, C208, C210, C211, C212, C304, C305, C307, C309, C310, C313, C315, C316 +16 |
| 16 | 10K | A_Device:R_0603 | R201, R208, R209, R307, R321, R322, R335, R344, R345, R346, R501, R502, R503, R601, R610, R620 |
| 14 | 1K | A_Device:R_0603 | R308, R310, R313, R314, R327, R340, R342, R602, R605, R609, R613, R617, R619, R621 |
| 11 | 100 | A_Device:R_0603 | R203, R207, R301, R302, R331, R504, R505, R506, R507, R508, R612 |
| 11 | 100K | A_Device:R_0603 | R311, R312, R315, R316, R317, R318, R336, R603, R606, R607, R614 |
| 10 | 100u/6.3V | Capacitor_SMD:C_1206_3216Metric | C203, C209, C312, C502, C503, C511, C512, C607, C612, C615 |
| 10 | 1n | A_Device:C_0603 | C206, C303, C311, C319, C510, C514, C515, C516, C602, C614 |
| 10 | Hole | A_Mechanical:Hole_3.1mm | H101, H102, H103, H104, H105, H106, H107, H108, H109, H110 |
| 9 | AO3400A | Package_TO_SOT_SMD:SOT-23 | Q201, Q304, Q305, Q310, Q401, Q402, Q501, Q502, Q603 |
| 8 | 1N4148WS | A_Device:D_SOD-323_1.8x1.4x1.15 | D205, D306, D307, D311, D501, D601, D603, D606 |
| 6 | 10k | A_Device:R_0402 | R401, R402, R403, R404, R405, R406 |
| 6 | 2.2K | A_Device:R_0603 | R202, R205, R206, R306, R309, R604 |
| 6 | 47K | A_Device:R_0603 | R320, R326, R328, R608, R611, R615 |
| 6 | WS2812B | LED_SMD:LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm | D202, D203, D204, D502, D503, D504 |
| 5 | 10u/25V | A_Device:C_0805 | C405, C406, C603, C610, C611 |
| 5 | GREEN | LED_SMD:LED_0603_1608Metric | D201, D304, D305, D309, D605 |
| 4 | 10n | A_Device:C_0603 | C205, C213, C308, C606 |
| 4 | Mousebite_2_Sides_Bridged | A_Misc:MousebitConnectorDoubleSided | JP102, JP104, JP201, JP205 |
| 3 | AO3401A | Package_TO_SOT_SMD:SOT-23 | Q302, Q311, Q604 |
| 2 | 0.75V | A_Pads_Pins:Testpad_1 | TP306, TP604 |
| 2 | 100n | A_Device:C_0402 | C403, C404 |
| 2 | 10uH | A_Device:L_6.6x7.0mm | L301, L601 |
| 2 | 18k | A_Device:R_0603 | R323, R324 |
| 2 | 22uF/35V | Capacitor_SMD:C_1206_3216Metric | C301, C601 |
| 2 | 4.7k | A_Device:R_0603 | R304, R305 |
| 2 | 5mOhm | A_Device:R_1206 | R319, R325 |
| 2 | 6.2k | A_Device:R_0603 | R341, R618 |
| 2 | 8.2K | A_Device:R_0603 | R329, R616 |
| 2 | AON6407-MS | Package_DFN_QFN:AO_DFN-8-1EP_5.55x5.2mm_P1.27mm_EP4.12x4.6mm | Q307, Q308 |
| 2 | COM | A_Pads_Pins:Testpad_1 | TP311, TP601 |
| 2 | COMPASS | Connector_JST:JST_XH_B4B-XH-A_1x04_P2.50mm_Vertical | J202, J401 |
| 2 | CY-12085G-3016-P4 | EasyEDA:BUZ-TH_BD12.0-P6.50-D0.6-FD | BUZZER201, BUZZER501 |
| 2 | ESC_PWM | A_Pads_Pins:Testpad_1 | TP301, TP302 |
| 2 | ESP32-WROOM-32E_(visible_peripherals) | A_Module:ESP32-WROOM-32 | U202, U501 |
| 2 | GND | A_Pads_Pins:Testpoint_0.9x1.5 | TP313, TP606 |
| 2 | LM1117S-3.3 | A_IC_SOT:SOT223 | U201, U601 |
| 2 | LMR16020PDDA | Package_SO:SOIC-8-1EP_3.9x4.9mm_P1.27mm_EP2.41x3.81mm_ThermalVias | U303, U602 |
| 2 | MMBT3904 | PCM_JLCPCB:Q_SOT-23 | Q301, Q605 |
| 2 | MMBT5401 | PCM_JLCPCB:Q_SOT-23 | Q303, Q602 |
| 2 | On/Off | A_Connector:Header_1x03_P2.54_Male | SW301, SW601 |
| 2 | PWR_EN | A_Pads_Pins:Testpad_1 | TP305, TP602 |
| 2 | Prog | A_Connector:IDC_2x3_1.27mm | J201, J501 |
| 2 | SN74LV1T34DBV | Package_TO_SOT_SMD:SOT-23-5 | U301, U302 |
| 2 | SS54 | Diode_SMD:D_SMA | D308, D604 |
| 2 | Vbatt | A_Pads_Pins:Testpad_1 | TP307, TP603 |
| 1 | 10n | A_Device:C_0402 | C409 |
| 1 | 1n | A_Device:C_0402 | C407 |
| 1 | 5V | A_Pads_Pins:Testpad_1 | TP312 |
| 1 | 5V_ESC_BB | A_Pads_Pins:Testpad_1 | TP303 |
| 1 | 5V_ESC_SB | A_Pads_Pins:Testpad_1 | TP304 |
| 1 | Ai-Thinker-Ra-02 | A_Module:Ai-Thinker-Ra-02-LoRa | U502 |
| 1 | CHRG/DATA | Connector_JST:JST_XH_B3B-XH-A_1x03_P2.50mm_Vertical | J601 |
| 1 | CHRG/DATA | A_Connector:MR60PB-M | J301 |
| 1 | COM_TOP | A_Device:LED_0603 | D602 |
| 1 | Conn_01x08_Pin | Connector_PinHeader_2.54mm:PinHeader_1x08_P2.54mm_Vertical_SMD_Pin1Left | J506 |
| 1 | ESC_BB | Connector_JST:JST_XH_B3B-XH-A_1x03_P2.50mm_Vertical | J302 |
| 1 | ESC_PWR_BB | A_Connector:AMASS_XT60PB-F_1x02_P7.20mm_Vertical | J304 |
| 1 | ESC_PWR_SB | A_Connector:AMASS_XT60PB-F_1x02_P7.20mm_Vertical | J305 |
| 1 | ESC_SB | Connector_JST:JST_XH_B3B-XH-A_1x03_P2.50mm_Vertical | J303 |
| 1 | EXT LED | A_Pads_Pins:Testpoint_0.9x1.5 | TP505 |
| 1 | GPS | Connector_JST:JST_XH_B4B-XH-A_1x04_P2.50mm_Vertical | J503 |
| 1 | ICM-20948 | EasyEDA:QFN-24_L3.0-W3.0-P0.40-BL-EP | U402 |
| 1 | INA181A1IDBVR(XBLW) | Package_TO_SOT_SMD:SOT-23-6 | U305 |
| 1 | LEDSTRIP | Connector_JST:JST_XH_B3B-XH-A_1x03_P2.50mm_Vertical | J504 |
| 1 | LIGHT/BUTTON | Connector_JST:JST_XH_B3B-XH-A_1x03_P2.50mm_Vertical | J502 |
| 1 | LP5907MFX-1.8 | Package_TO_SOT_SMD:SOT-23-5 | U401 |
| 1 | LiPo S6 | A_Connector:AMASS_XT60PB-M_1x02_P7.20mm_Vertical | J306 |
| 1 | MODE | A_Connector:Header_1x02_P2.54_Jumper | SW201 |
| 1 | RED | LED_SMD:LED_0603_1608Metric | D302 |
| 1 | RX_SUB | A_Pads_Pins:Testpad_1 | TP309 |
| 1 | TX_SUB | A_Pads_Pins:Testpad_1 | TP310 |
| 1 | VSAMP | A_Pads_Pins:Testpad_1 | TP308 |
| 1 | VSamp | A_Pads_Pins:Testpad_1 | TP605 |
| 1 | ~ | PCM_JLCPCB:Part_Num_JLCPCB | PN101 |
| 1 | ~{BOOT} | A_Pads_Pins:Testpad_1 | TP201 |
Similar boards
- 4 layers103 × 36 mm

- 4 layers74.9 × 58.5 mm

- 2 layers87 × 115 mm

- 4 layers90 × 90 mm

- 2 layers41.7 × 73.2 mm

- 4 layers155 × 103 mm

- 4 layers65 × 56 mm

PI DMX hat
Skrooter/PI-DMX-hat
A DMX hat for Raspberry pi which can also be used to power a Pi from 12V
53 parts - 4 layers140 × 100 mm

Dc usv
TobleMiner/DC-UPS
A small DC UPS, designed to keep small appliances like consumer network equipment running during power outages
351 parts223CERN-OHL-P-2.0
Questions
How big is the Robobouoy V4.0 PCB?
It measures 194 × 40 mm and has 4 copper layers, 1.6 mm thick.
What parts does the Robobouoy V4.0 use?
258 parts, built around the SN74LV1T34DBV, LMR16020PDDA, INA181A1IDBVR(XBLW) and LM1117S-3.3. 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 Robobouoy V4.0 KiCad files?
From the pnn69/NicE-Buoy repository on GitHub, at the commit this page was made from: the board is PCBA_Robobouoy-V4.0/Robobouoy-V4.0.kicad_pcb and its schematic PCBA_Robobouoy-V4.0/Robobouoy-V4.0.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Can I use the Robobouoy V4.0 design in my own project?
Its repository states no licence, so its author keeps all rights: ask pnn69 before reusing the design.