Skip to the content
PCBKitNew board
2 layers82.5 × 49 mmObd2dash, the printed circuit board in 3D

An ESP32-S3 CAN-to-BLE bridge for an iPad vehicle dashboard. The firmware discovers each ECU's supported current-data PIDs and forwards complete raw responses through a versioned BLE GATT stream.

Size
82.5 × 49 mm
Copper layers
2
Thickness
1.6 mm
Parts
22
Nets
57
Pads
148
Tracks, vias
188, 28
Pours
2
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
8 Sep 2026
Updated
5 Oct 2026

Overview

Obd2dash is an open-source printed circuit board by EthanPope07, from the EthanPope07/obd2dash repository on GitHub. It is a 2-layer board of 82.5 × 49 mm with 22 parts on 57 nets, routed with 188 tracks and 28 vias.

It is built around the ESP32-S3-WROOM-1-N8, TCAN337D and TSR 1-2433, with the AP2112K-3.3 and MAX40200AUK among its other parts. Its parts include 7 resistors, 5 ICs, 3 capacitors, 2 diodes and 2 connectors. It belongs with the ESP32 boards of this library.

Main components

5

README

README.md

OBD2Dash

An ESP32-S3 CAN-to-BLE bridge for an iPad vehicle dashboard. The firmware discovers each ECU's supported current-data PIDs and forwards complete raw responses through a versioned BLE GATT stream.

Compact board preview

Status

The original reader was a breadboard diagnostic sketch. This revision replaces its receive path and adds supported-PID discovery, ISO-TP reassembly and BLE. The new firmware has host regression tests; vehicle and iPad integration testing are still required. Do not represent the new implementation as vehicle-validated yet.

The PCB is a compact prototype, not a fabrication-qualified automotive module. See hardware/Review.md for the supplied review and its unresolved decoupling, component-selection and power-protection findings. That report is preserved as source evidence, not a new electrical signoff.

Scope of "all PIDs"

  • Service 01 (current powertrain data), PID 00 through FF.
  • Every advertised support page, not a fixed shortlist of dashboard sensors.
  • Separate support maps and responses for eight physical ECU addresses.
  • Classical CAN with 11-bit IDs: requests 7E0–7E7, responses 7E8–7EF.
  • 500 kbit/s by default; configurable 250 kbit/s.
  • Raw response preservation, including multi-frame PIDs. The dashboard applies PID-specific formulas.
  • Not manufacturer-specific services, all OBD diagnostic modes, 29-bit CAN, CAN FD, or legacy K-line/J1850.

A vehicle cannot return a PID it does not implement. A discovery timeout is reported as incomplete, not silently interpreted as no support.

Data flow

CAN request -> ECU response -> ISO-TP reassembly -> timestamped raw PID record -> 20-byte BLE fragments -> iPad reassembly and decoding.

There is one outstanding physical request at a time. All supported data PIDs are polled round-robin; support pages are refreshed between sweeps after at least 60 seconds. Requests have a 50 ms minimum gap, 300 ms inactivity timeout and 5-second absolute deadline. Discovery retries transient failures up to three times. Sample failures produce status records and are retried on later sweeps.

This prioritizes coverage rather than high-rate gauges: polling many PIDs or offline ECUs makes a sweep longer. No fixed update-rate guarantee is claimed.

Hardware and build

The supplied PCB identifies ESP32-S3-WROOM-1 and TI TCAN337:

  • GPIO4 -> TCAN337 TXD
  • GPIO5 <- TCAN337 RXD

Confirm the external connector cable pinout and power design before connecting hardware. The firmware sends only Mode 01 requests and ISO-TP flow control; BLE provides no arbitrary CAN-write interface.

Open firmware/obd2dash/obd2dash.ino in Arduino IDE. Select ESP32S3 Dev Module using the Espressif ESP32 package. BLE and TWAI ship with that package. Configure pins and bitrate in Config.h. No WiFi credentials or cloud services are required.

text
arduino-cli compile --fqbn esp32:esp32:esp32s3 firmware/obd2dash

Repository

  • firmware/obd2dash: request engine, protocol core and BLE stream
  • docs/BLE.md: exact wire format and app integration
  • tools/decode_ble.py: reference decoder for notification hex lines
  • tests: host protocol and decoder regression tests
  • hardware: supplied KiCad source, local footprints, DRC reports and previews

Tests

text
g++ -std=c++17 -Wall -Wextra -Werror tests/protocol_test.cpp -o protocol_test
./protocol_test
python -m unittest discover -s tests -p "test_*.py"

The C++ tests exercise support-map boundaries, independent ECU maps, all 4,088 ISO-TP multi-frame lengths from 8 to 4,095 bytes, sequence rollover/errors, negative responses and maximum-length BLE serialization. Tests do not replace CAN simulator, vehicle or radio testing.

References

Verified build

Compiled successfully with Espressif Arduino-ESP32 3.3.11 (bundled BLE 3.3.11), target esp32:esp32:esp32s3, board defaults.

  • Program storage: 576,620 / 1,310,720 bytes (43%).
  • Static global RAM: 31,744 / 327,680 bytes (9%).
  • Host C++ protocol regression suite: passed.
  • Python BLE decoder suite: 4 tests passed.

No device was flashed. These compile figures do not measure peak runtime RAM. Vehicle/CAN simulator tests and iPad integration remain outstanding; follow docs/VALIDATION.md.

iPad dashboard

The native SwiftUI receiving app is in ipad. Open ipad/OBD2Dash.xcodeproj on a Mac, select your signing team and run on an iPad with iPadOS 17+. It automatically connects while foregrounded and displays RPM, speed and coolant gauges alongside a searchable list of supported/observed PIDs.

Unknown PIDs are shown as raw bytes, not guessed numbers. The app has an explicitly labeled --demo mode for UI previews. See the app README for build and physical-device validation instructions.

Parts

22
QtyValueFootprintReferences
510kResistor_SMD:R_0603_1608MetricR1, R4, R5, R6, R7
25.1kResistor_SMD:R_0603_1608MetricR2, R3
2SW_PushButton_Switch_THT:SW_PUSH_6mm_H4.3mmSW1, SW2
10.75A1812L075_33DR:FUSE_1812L200_12DRF1
110µFCapacitor_SMD:C_1210_3225Metric_Pad1.33x2.70mm_HandSolderC1
11µFCapacitor_SMD:C_0603_1608MetricC3
122µFCapacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC2
1AP2112K-3.3Package_TO_SOT_SMD:SOT-23-5U4
1DE9_Pins_MountingHolesConnector_Dsub:DSUB-9_Pins_Vertical_P2.77x2.84mm_MountingHolesJ1
1D_SchottkyDiode_SMD:D_SMA_HandsolderingD2
1D_ZenerDiode_SMD:D_SMB_HandsolderingD1
1ESP32-S3-WROOM-1RF_Module:ESP32-S3-WROOM-1U1
1MAX40200AUKPackage_TO_SOT_SMD:SOT-23-5U5
1TCAN337Package_SO:SOIC-8_3.9x4.9mm_P1.27mmU3
1TSR_1-2433Converter_DCDC:Converter_DCDC_TRACO_TSR-1_THTU2
1USB_C_Receptacle_USB2.0_16PConnector_USB:USB_C_Receptacle_GCT_USB4085J2

Questions

How big is the Obd2dash PCB?

It measures 82.5 × 49 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Obd2dash use?

22 parts, built around the ESP32-S3-WROOM-1-N8, TCAN337D, TSR 1-2433 and AP2112K-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 Obd2dash KiCad files?

From the EthanPope07/obd2dash repository on GitHub, at the commit this page was made from: the board is hardware/obd2Dash.kicad_pcb and its schematic hardware/obd2Dash.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Obd2dash design in my own project?

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

Similar boards

  • 4 layers58.9 × 48.4 mmApppd, the printed circuit board in 3D

    Apppd

    chithigun23/ANUFS-APPPD

    An update to the Accelerator Pedal Position Plausibility Device to remain compliant with the use of a paddle shift system.

    103 parts
  • 4 layers80 × 80 mmTelemetry, the printed circuit board in 3D

    Telemetry

    chithigun23/ANUFS-Telemetry

    To use custom hardware to measure parameters and dynamics of an ICE Formula SAE car.

    159 parts
  • 4 layers102.5 × 62 mmSensor Cell with Comms, the printed circuit board in 3D

    Sensor Cell with Comms

    Molly-M-Laugh/Senior-Final

    A collection of documentation and files for our group's final senior design project

    93 parts
  • 2 layersMacropad, the printed circuit board in 3D

    Macropad

    moonbeeper/moonpad

    109 partsMIT
  • 4 layers40 × 40 mmMoco pg4, the printed circuit board in 3D

    Moco pg4

    ziteh/moco

    PMSM/BLDC motor controller/driver PCBs

    101 parts24CERN-OHL-P-2.0
  • 4 layers40 × 40 mmZiteh moco moco sc1, the printed circuit board in 3D

    Ziteh moco moco sc1

    punkfab/pcb-corpus

    235 real KiCad boards from open-source hardware repositories, prepared as a placement and routing benchmark

    118 parts1
  • 4 layers35.6 × 17.8 mmWaffle Mini v0, the printed circuit board in 3D

    Waffle Mini v0

    4n3m4i1/Industrial_Control_Dev_Boards

    MCU Development Boards for Deeply Embedded Industrial Control Applications

    48 partsBSD-3-Clause
  • 4 layers58 × 35 mmESP HI PLUS, the printed circuit board in 3D

    ESP HI PLUS

    dyu134/ESP-HI-PLUS

    The Robot sub-module is a high-performance actuator and sensing expansion board for the ESP-HI-PLUS, designed to transform the device into a mobile or interactive robotic platform.

    88 parts