| Option | Cost | Connection | CAN buses | WiFi | Best for |
|---|---|---|---|---|---|
| Any ESP32 + MCP2515 → X179 | ~$5-7 | X179 4-wire | 1 (bus 6 = mixed) | Yes | Cheapest full-feature setup |
| M5Stack ATOM Lite + ATOMIC CAN → X179 | ~$13-15 | X179 4-wire | 1 (bus 6) | Yes | Plug & play, no soldering |
| LILYGO T-2CAN ESP32-S3 → X179 | ~$24 | X179 4-wire (+ spare CAN2) | 2 independent | Yes | Future-proof, dual-CAN ready |
| LILYGO T-CAN485 → X179 | ~$15 | X179 4-wire | 1 (SN65HVD230) | Yes | SD card CAN dump, tested on Model X/S |
| LILYGO TTGO T-Display + MCP2515 → X179 | ~$20 | X179 4-wire (+12 V→5 V buck or USB-C) | 1 (MCP2515) | Yes | On-board 1.14" ST7789 status display |
| Waveshare ESP32-S3-RS485-CAN → X179 | ~$18 | X179 4-wire | 1 (TWAI) | Yes | All-in-one board |
| Flipper Zero + Electronic Cats CAN Add-On → OBD-II | ~$234 | OBD-II plug | 1 (Party CAN) | No | If you already own a Flipper |
| Flipper Zero + generic MCP2515 → OBD-II | ~$202-205 | OBD-II wire | 1 (Party CAN) | No | Budget Flipper option |
There are two places to tap the CAN bus. The X179 connector is recommended — it provides more signals and built-in 12V power.
The standard automotive diagnostic port. On Tesla the location and behavior differ by model and year:
- 2017–2018 Model 3: no OBD-II port. Use X052 instead (see below).
- 2019+ Model 3 / 2020–April 2024 Model Y: OBD-II J1962 port exists, but it is not under the steering column — it sits in the rear center console area and requires a Tesla-specific adapter cable (e.g., OHP, EVTV, Cybertool) to expose a standard 16-pin socket.
- April 2024+ Juniper Model Y / refreshed Model 3 Highland (later builds): Tesla switched to DoIP (Diagnostic over IP) — the diagnostic port now carries 100 Mbps Ethernet, not CAN.
Caution
Do not connect a CAN-based OBD-II adapter or scan tool to a DoIP port. The signal levels are incompatible and connecting a J1962-on- CAN device into a DoIP-only port can damage the vehicle's diagnostic module. If you have a 2024+ Juniper, tap X179 directly — see below.
┌──────────────────────────────┐
│ 1 2 3 4 5 6 7 8 │
│ 9 10 11 12 13 14 15 16 │
└─────────────────────────────┘
| Pin | Signal | Notes |
|---|---|---|
| 4 | Chassis GND | |
| 5 | Signal GND | |
| 6 | CAN-H | Party CAN |
| 14 | CAN-L | Party CAN |
| 16 | +12V always-on | Constant power even when car is locked |
Bus: Party CAN only. This carries DAS, ESP, BMS, FSD gate, nag (EPAS), ISA chime, precondition — everything our v1.0–v2.3 used.
Limitation: Party CAN does not carry stalk signals (SCCM_rightStalk), lighting commands (VCFRONT_lighting), or steering wheel button inputs (STW_ACTN_RQ). Those are on Vehicle CAN.
The 2019 Model 3 does not have the X179 connector or a standard OBD-II port under the steering column. Instead, it uses the X052 connector, located behind the center console / passenger footwell area.
Confirmed by community tester @THER4iN (issue #21):
| X052 Pin | Signal | Notes |
|---|---|---|
| 44 | CAN-H | CAN bus |
| 45 | CAN-L | CAN bus |
| 20 | 12V | Power (no service mode errors confirmed) |
| 22 | GND | Ground |
Same 4-wire pattern as X179 — CAN + power. Compatible with all the same ESP32/MCP2515 setups described below.
The 2019 Model 3 also has an X930m connector near the A-pillar. Pinout not yet confirmed — if you test it, please report in an issue.
Tesla's own service/diagnostic connector. Requires removing a trim panel behind the rear armrest. Two versions exist:
Important
The X179 pin→bus map is NOT fixed across builds — verify it on your own car. At least four distinct electrical configurations now exist (20-pin; pre-Apr-2024 26-pin; the post-SOP10 layout in #114; and a Party/Vehicle/Chassis-on-the-right layout). Model-year inference is unreliable.
The deterministic check is the car's Service Mode → CAN Port page, which lists
each pin's bus by name, keyed to the harness part number. On harness 1933903-XX
(Model Y Juniper RWD, 2025, 2026.14.3), @jewelrylin pulled it from Service Mode
(#100):
| X179 pin | Bus |
|---|---|
| 2 / 3 | Party CAN |
| 9 / 10 | Vehicle CAN |
| 13 / 14 | Chassis CAN (green wire) — not "Bus 6" |
| 20 | GND |
This relabels much of the "Bus 6 on pin 13/14" framing below: on this harness
13/14 is Chassis CAN, which is why 0x370 EPAS3P shows there at 100 Hz with full
counter continuity (EPAS lives on Chassis) — it was never a gateway-forwarded
subset. 0x370 is on Chassis CAN, not Vehicle CAN — if you tap Vehicle CAN
(9/10) you will not see 0x370. Aftermarket 3-CAN commanders are wired
to X179's three pairs (CAN1/2/3).
For the nag killer, tap Party CAN (pins 2/3). @SkyRaax runs the nag killer on 2/3 on an M3 HW4 2026.20 with all other features on 13/14 (via a dual-CAN LilyGO T-2CAN), and it works (#100). A single-CAN board tapped on the wrong pair (Chassis or Vehicle) gives the nag killer nothing to act on — the common cause of "nag killer does nothing on HW4." Confirm which pin is Party on your harness via Service Mode → CAN Port.
+---------------------------------+
| 1 2 3 4 5 6 7 |
| 8 9 10 11 12 13 14 |
| 15 16 17 18 19 20 |
+---------------------------------+
| Pin | Signal | CAN bus |
|---|---|---|
| 1 | +12V | Power |
| 2 | CAN-H | Bus 4 (diagnostic/forwarded) |
| 3 | CAN-L | Bus 4 |
| 9 | CAN-H | Bus 2 (Vehicle CAN) |
| 10 | CAN-L | Bus 2 |
| 13 | CAN-H | Bus 6 (Body/Left — Gateway mixed forwarding) |
| 14 | CAN-L | Bus 6 |
| 15 | +12V | Power (2mm² wire, alternate to pin 1) |
| 18 | CAN-H | Bus 3 (Chassis CAN — EPAS/brake) |
| 19 | CAN-L | Bus 3 |
| 20 | GND | Ground |
4 separate CAN bus pairs on one connector. Pin 13/14 (bus 6) is what aftermarket products connect to.
The 26-pin rear connector ships in two electrical configurations depending on production date. They are not interchangeable.
Note
The connector name is unsettled. The 20-pin variant is documented as X179 in community sources, but Tesla service documentation may use a different identifier for the 26-pin. If you find the official name in a Tesla service doc, please open an issue with the reference and we will update.
Confirmed on community testing of 2021–2023 Model 3/Y and early 2024 Highland / Juniper builds.
| Pin | Signal | Notes |
|---|---|---|
| 13 | CAN-H | Bus 6 (Gateway-forwarded) |
| 14 | CAN-L | Bus 6 |
| 15 | +12V | Power (red wire, 2mm²) |
| 18 | CAN-H | Vehicle CAN (blue wire) |
| 19 | CAN-L | Vehicle CAN (yellow wire) |
| 26 | GND | Ground (black wire, 2mm²) |
Caution
Tesla migrated several pin pairs from CAN to DoIP (100 Mbps Ethernet) in April 2024 — coinciding with the EU's OBD compliance deadline. This migration appears to apply at least to EU-region builds and likely beyond, but the exact scope is not yet pinned down (see SOP variants below). Do not assume your 26-pin follows the pre-April 2024 layout — oscilloscope-verify before powering up a transceiver.
The classification axis is April 2024 production date and region, not Juniper-or-not. A pre-Juniper EU-build Model Y from the same window shows the same DoIP migration as Juniper builds.
Confirmed by @0n3-70uch via oscilloscope measurements on a Berlin-built EU Model Y (pre-Juniper, post-April-2024 production) running 2026.14.3 (issue #52):
| Pin | Signal on this car |
|---|---|
| 9 / 10 | DoIP (Ethernet) — not CAN |
| 12 / 13 | DoIP (Ethernet) — not CAN |
| 18 / 19 | Vehicle CAN — only working CAN pair |
| 15 | +12V (unchanged) |
| 26 | GND (unchanged) |
This is a single empirical data point and may not generalise to every post-April-2024 build. @TianzeWang notes (issue #52) that Tesla's Model Y Electrical Reference distinguishes between Berlin Juniper (SOP8) and Shanghai Juniper (SOP9) — pin maps may differ further by SOP variant. Until a broader sweep is published, the safe recommendation on any 2024+ build is:
- Oscilloscope-verify every pair before connecting a transceiver.
- If the 120 Ω differential-signal check fails on pin 13/14, the pair is likely DoIP — try pin 18/19 instead.
- The +12V (pin 15) and GND (pin 26) appear stable across SOPs.
Caution
On newer Model Y, the diagnostic connector part is unchanged (same 20 cavities, an old cable physically fits), but the bus-to-pin mapping changed and one bus left this port entirely. Verified against Tesla's official electrical reference across SOP6–SOP11 and reported by @mamixsystem in discussion #114:
- The third CAN pair moved from pins 13–14 to pins 4–5, and that pair is now Body CAN, not Chassis CAN.
- Chassis CAN was relocated to a new left-side port (X177) — pins 13–14, green wires, off the Body Controller Left.
- The right port now carries Party + Body + Vehicle CAN; everyday functions on Party/Vehicle CAN (PRND, regen, climate, lighting) are unaffected, which is why an old kit still "mostly works" on a new car.
Rollout (Tesla SOP dates): Berlin 2026-04-01 (SOP10), Austin 2025-12-04, Fremont 2025-12-09, Shanghai 2026-03-25 (SOP11). Physical check: on a new car pins 4–5 are populated (violet) and 13–14 empty; on an old car it's the reverse (13–14 populated, green).
Implication for EPAS / nag work: the planned Chassis-CAN Listen-Only capture (see #100) is not on X179 pin 18/19 on post-SOP10 cars — Chassis now lives on the left port X177. Tap there, not the right port, on these builds.
The Gateway forwards signals from multiple internal CAN buses onto bus 6 (pin 13/14). Community testing confirms that the following "Party CAN" signals are visible on X179 pin 13/14:
0x3FDUI_autopilotControl (FSD gate)0x370EPAS3S_sysStatus (nag killer)0x132BMS_hvBusStatus (battery voltage/current)0x292BMS_socStatus (state of charge)0x312BMS_thermalStatus (battery temp)0x399ISA speed limit0x39BDAS_status (AP state, blind spot)0x2B9DAS_control (ACC state)
And these "Vehicle CAN" signals are also writable on bus 6:
0x229SCCM_rightStalk (gear shift, park)0x3F5VCFRONT_lighting (hazard, wiper)0x249SCCM_leftStalk (high beam, turn signal)
Important
Bus 6 is a selectively forwarded subset of Vehicle CAN, not the full bus. The gateway picks which Vehicle CAN signals to forward onto Bus 6 — the list above is what's confirmed on Highland Model 3/Y firmware. Vehicle CAN signals that are NOT in the forwarded list are invisible on pin 13/14.
Notably 0x3C2 VCLEFT_switchStatus is NOT forwarded onto Bus 6 —
this is the frame carrying the steering scroll-wheel inputs that the v2.15
"ScrollPress AP Engage" feature (#82)
targets. If you tap X179 pin 13/14 you will not see 0x3C2 at all and
Scroll-Press injection will appear to do nothing.
To inject 0x3C2, tap either X179 pin 9/10 (Vehicle CAN Bus 2 direct, full
Vehicle CAN traffic) or OBD-II pins 6/14 (also Vehicle CAN). @JakNo
verified 0x3C2 is visible on X179 pin 9/10 on Highland HW4, and
@jewelrylin confirmed the negative case on pin 13/14 in
#73.
A dual-CAN board (e.g. LILYGO T-2CAN) gives the full attack surface in
one device: Bus 6 for 0x3FD / 0x370 / 0x3F8 / TLSSC, and Vehicle CAN
direct for 0x3C2. Slated as a v2.16 platformio variant.
Important
On HW4-modern, 0x370 EPAS3P_sysStatus is the mirror case of 0x3C2: it is
absent from Vehicle CAN (X179 pin 9/10/11). Dual-CAN captures on two cars —
@jewelrylin's Juniper RWD (0 / 20,760 frames over 60 s on pin 9/10) and
@DrStrangeglovebox's MYP Giga Berlin (0 / 2,653 on pin 10/11) — confirm 0x370
only appears on Bus 6 (pin 13/14) as the gateway-forwarded copy. The EPAS
module does not receive 0x370 on Vehicle CAN on these trims, so relocating
the nag echo from Bus 6 to Vehicle CAN does not reach EPAS — it is not a
viable nag-killer pivot for HW4-modern. The only remaining X179 location that
could carry the EPAS-side frame is Chassis Bus 3 (pin 18/19); until a
Listen-Only capture there confirms it, the 14.x HW4 nag path stays open. See
#100.
One bus, one connection, reads and writes almost everything.
This is how a single-bus commander reaches its full feature set with just 4 wires:
X179 Pin 13 → CAN-H ──┐
X179 Pin 14 → CAN-L ──┤── CAN module (MCP2515 / TWAI)
X179 Pin 15 → 12V ────┤── buck converter → 3.3V/5V
X179 Pin 20 → GND ────┘ (26-pin: use Pin 26 for GND)
Pre-Plaid HW3 Model S and Model X cars (MCU2 generation) expose their own X179 connector behind the rear centre console. It is a 20-position shell but with a different physical layout and a different bus assignment than the Model 3/Y X179 above — top row is 11 cavities numbered right-to-left from 1 to 11, bottom row is 9 cavities numbered right-to-left from 12 to 20.
View: female connector looking in from the rear (i.e. from the wire side / pin-entry side, not the mating face). If you flip the connector around to look at the mating face the layout mirrors left/right, so always confirm cavity numbers against the moulded numbers on the housing before crimping anything.
╭───────────────────────────────────────────────╮
│ 11 10 9 8 7 6 5 4 3 2 1 │
│ 20 19 18 17 16 15 14 13 12 │
╰───────────────────────────────────────────────╯
Full pinout (the four pins this firmware uses are bolded):
| PIN | Signal | Notes |
|---|---|---|
| 1 | +12 V | Supply for the ESP32 / buck converter |
| 2 | CAN+ BFT | Ultrasonics, falcon-wing doors, liftgate |
| 3 | CAN- BFT | " |
| 4 | CAN+ TH | Cabin HVAC, pack heat-pump, powertrain cooling — separated from safety-critical traffic |
| 5 | CAN- TH | " |
| 6 | — | — |
| 7 | CNF+ | Falcon sensors (ultrasonic, pinch, etc.) |
| 8 | CNF- | " |
| 9 | CAN+ BD | Seat / door control |
| 10 | CAN- BD | " |
| 11 | — | — |
| 12 | — | — |
| 13 | CAN+ CH | ABS, EPAS, ESP, electric park brake — carries the 0x370 EPAS frame the nag-killer modifies |
| 14 | CAN- CH | " |
| 15 | — | — |
| 16 | — | — |
| 17 | — | — |
| 18 | CAN+ PT | DI front, THC, APE (Autopilot ECU), charge-port logic — backbone for motor control, HV battery management, charging, regen braking |
| 19 | CAN- PT | " |
| 20 | GND | Chassis ground |
| For Tesla FSD Unlock the four pins you need are 1, 13, 14, 20: |
X179 Pin 1 → +12 V ─┐
X179 Pin 13 → CAN-H ──┤── CAN module (MCP2515 / TWAI)
X179 Pin 14 → CAN-L ──┤── buck converter → 5 V (or USB-C as in Setup D Option 2)
X179 Pin 20 → GND ──┘
Pins 13/14 land on Chassis CAN, which is where EPAS3P_sysStatus (0x370 — the nag-killer target) lives on this generation. The Power Train bus on pins 18/19 carries APE / autopilot traffic but is not required for the nag-killer-only use case — most Model S/X HW3 owners tap pins 13/14 only.
Any ESP32 dev board + any MCP2515 CAN module from Aliexpress.
| Component | Price |
|---|---|
| ESP32-C3-SuperMini or ESP32-DevKitC | ~$3-4 |
| MCP2515 CAN module (TJA1050 transceiver) | ~$1.50-3 |
| X179 pigtail cable (4-wire, or DIY from connector) | ~$3-5 |
| Total | ~$8-12 |
Wire: X179 CAN-H/CAN-L → MCP2515 module CAN-H/CAN-L. X179 12V → buck converter → ESP32 VIN. X179 GND → common GND.
Build with pio run -e esp32-mcp2515, adjust pin config in
esp32/.firmware/config.h.
| Component | Price |
|---|---|
| M5Stack ATOM Lite | ~$7.50 |
| ATOMIC CAN Base (CA-IS3050G) | ~$5-7 |
| X179 pigtail cable (4-wire) | ~$3-5 |
| Total | ~$16-20 |
ATOMIC CAN Base snaps onto the ATOM Lite. Solder X179 CAN-H/CAN-L to
the screw terminals, 12V to VIN, GND to GND. Build: pio run -e esp32-twai.
| Component | Price |
|---|---|
| LILYGO T-2CAN ESP32-S3 | ~$24 |
| X179 pigtail cable (4-wire) | ~$3-5 |
| Total | ~$27-29 |
The T-2CAN has dual isolated MCP2515 controllers, dual screw terminals, 12–24V input, WiFi, BLE, QWIIC, and USB-C. Connect X179 to CAN1 screw terminal. CAN2 stays free for future use (e.g., OBD-II Party CAN for redundancy, or a second X179 bus pair).
This is the recommended board for anyone who wants headroom for dual-bus features in a future firmware update.
A multi-board build (T-Display + MCP2515 module + optional XY-3606 buck converter) that runs the same firmware as every other variant and adds a 1.14" colour ST7789 LCD on the T-Display itself so you can see RX/TX/FPS/NAG status without opening a phone. In its current bare-board form there are several wires running between the boards — putting them in a 3D-printed case is left as an exercise.
| Component | Price |
|---|---|
| LILYGO TTGO T-Display ESP32 (1.14" ST7789, USB-C) | ~$10-12 |
| Generic MCP2515 + TJA1050 module (8 MHz crystal, 5 V) | ~$2-4 |
| 2× ¼ W resistors for MISO divider (1× 2.2 kΩ + 1× 3.3 kΩ, see below) | <$0.10 |
| X179 pigtail cable (4-wire) | ~$3-5 |
| Power: either an XY-3606 12 V → 5 V buck converter or a USB-C cable to the centre-console USB port | ~$2 / ~$3 |
| Total | ~$17-26 |
The T-Display LCD owns the board's default VSPI (TFT_CS=5, TFT_SCLK=18, TFT_MOSI=19, TFT_DC=16, TFT_RST=23, TFT_BL=4), so the MCP2515 lives on HSPI on the right-hand pin header:
| MCP2515 pin | T-Display GPIO | Notes |
|---|---|---|
| CS | 26 | |
| SCK | 33 | |
| SO (MISO) | 32 | Through 5 V → 3.3 V divider — see below |
| SI (MOSI) | 25 | 3.3 V out from the ESP32 — MCP2515 input is 5 V tolerant, no divider |
| INT | not connected | Polled, no interrupt wire needed |
| VCC | T-Display 5V pin | Required for TJA1050 transceiver to drive the differential CAN pair correctly |
| GND | T-Display GND | Common ground with the X179/buck/USB-C supply |
Build with pio run -e ttgo-tdisplay -t upload. On first boot the LCD
prints Tesla FSD Unlock then a live status page (HW version, mode,
RX/TX counters, FPS, NAG indicator).
The T-Display has two tactile push-buttons on the front face, one on each side of the USB-C connector (between the LCD and the USB port):
| Button | GPIO | Default action | Extra |
|---|---|---|---|
| Left (GPIO35) | PIN_BUTTON2 |
Single press: toggle display on/off (sleep/wake the LCD; CAN processing keeps running) | — |
| Right (GPIO0, also the Boot button) | PIN_BUTTON |
Single press: toggle Listen-Only ↔ Active (i.e. enable/disable bus TX) | Double-press: toggle BMS serial output. Long-press 3 s: toggle NAG killer. Hold 5 s during the 20 s post-boot window: factory-reset NVS. |
The on-screen Mode: text (cyan LISTEN ↔ green ACTIVE) and the
NAG indicator next to it follow the right button immediately.
Pick one of the two options below — never wire both at the same time, the T-Display has no power-path arbitration between the USB-C and the 5 V pin.
Option 1 — XY-3606 buck converter from X179 12 V
Permanent install, fully integrated into the X179 harness. The XY-3606 is a tiny adjustable buck regulator that accepts 5 – 36 V in and is set once with the on-board trim pot to output 5.0 V at up to ~2 A.
┌──────────── 5V → T-Display "5V" pin
X179 Pin 1 (+12 V) ─── IN+ ────┤ XY-3606
│ buck
X179 Pin 20 (GND) ─── IN- ────┤ (set
│ Vout
│ = 5.0 V)
└──────────── GND → T-Display GND
+ MCP2515 GND
X179 Pin 13 (CAN-H) ──────────────────────── MCP2515 CAN-H
X179 Pin 14 (CAN-L) ──────────────────────── MCP2515 CAN-L
Set the buck output to 5.0 V before wiring it to the T-Display (turn the multi-turn pot while measuring the OUT terminals with a multimeter). The factory default is often 12 V → instant magic smoke on the ESP32 if you skip this step.
Option 2 — USB-C cable from the centre console USB port
Easiest temporary install — no soldering on the power rail at all. Run a USB-C cable from a centre console USB port to the T-Display's USB-C connector. The T-Display's CH340 USB-serial chip handles 5 V input and powers both the ESP32 and (via the 5V pin) the MCP2515 module. The USB cable also carries ground, so no separate GND wire to X179 is needed.
Centre console USB-C ────────── T-Display USB-C
│
└── 5V pin ── MCP2515 VCC
└── GND ── MCP2515 GND
X179 Pin 13 (CAN-H) ─────────────────────────────── MCP2515 CAN-H
X179 Pin 14 (CAN-L) ─────────────────────────────── MCP2515 CAN-L
Note: the centre console USB ports power down when the car sleeps, so the T-Display will power-cycle on every wake — this is fine for daily driving but loses the in-RAM RX/TX counters between trips.
The original reference platform. Connect to OBD-II (not X179) using the Electronic Cats CAN Bus Add-On or a generic MCP2515 module.
| Component | Price |
|---|---|
| Flipper Zero | $199 |
| Electronic Cats CAN Bus Add-On | $35 |
| OBD-II pigtail cable | ~$5-10 |
| Total | ~$239-244 |
OBD-II wiring (Party CAN only):
| OBD-II pin | Wire | Add-On terminal |
|---|---|---|
| Pin 6 | CAN-H | CAN-H |
| Pin 14 | CAN-L | CAN-L |
| Pin 4/5 | GND | GND |
The Flipper can also be wired to X179 instead of OBD-II for bus 6 access, but the cable run from the rear console to the Flipper is long.
Almost every commodity MCP2515 module sold on AliExpress / Amazon (MCP2515 + TJA1050 daughterboard, 8 MHz crystal) is hard-wired for 5 V VCC because the TJA1050 transceiver needs 5 V to swing the differential CAN pair. The MCP2515 controller therefore runs from 5 V too, and its MISO output drives a 5 V high level.
ESP32 GPIOs are 3.3 V tolerant only. Feeding a 5 V signal into a 3.3 V GPIO clamps it through the SoC's ESD diodes — best case it shortens the ESP32's life, worst case it latches up and bricks the chip. Three options, in order of how strongly we recommend them:
- Resistor divider (~$0.05, recommended) — works on any module.
- Bidirectional level shifter board (e.g. TXS0108E, ~$1) — useful if you also want to wire the INT pin or want a tidier build.
- 3.3 V-only MCP2515 module (e.g. NiRen, JOY-iT SBC-CAN01 with TJA1051T/3) — no divider needed but harder to source.
Only MISO needs the divider. MOSI, SCK and CS are driven by the ESP32 at 3.3 V and the MCP2515 reads them just fine (its input threshold is well below 3.3 V).
Use any two resistors whose ratio is roughly 0.65 — i.e. R2 / (R1+R2) ≈ 3.3 / 5.0. Common values that work:
| R1 (top) | R2 (bottom) | Output (5 V in) | Notes |
|---|---|---|---|
| 2.2 kΩ | 3.3 kΩ | 3.00 V | Recommended — canonical "Arduino → 3.3 V" pair, in every starter kit |
| 2 kΩ | 3.3 kΩ | 3.11 V | Equivalent — use if you have 2 kΩ but not 2.2 kΩ |
| 1 kΩ | 2 kΩ | 3.33 V | Equivalent, draws ~1.7 mA — both values in nearly every assortment kit |
| 10 kΩ | 22 kΩ | 3.44 V | Avoid — too high impedance for 8 MHz SPI, edges round off |
Wire it like this between the MCP2515 SO pin and the ESP32 MISO GPIO:
R1 = 2.2 kΩ
MCP2515 SO ─────/\/\/\─────┬──── ESP32 MISO (3.3 V max)
│
/
\ R2 = 3.3 kΩ
/
\
│
GND
Build it on a tiny scrap of perfboard inline with the SO wire, or solder it directly across the MCP2515 module's SO header pin. Heat- shrink the joint and you're done.
Before powering the ESP32 with the MCP2515 connected, with only the MCP2515 module powered from 5 V, idle the SPI bus and probe the divider's output with a multimeter:
- MCP2515 SO pin (before divider): should idle high at ~4.7–5.0 V
- ESP32 MISO pin (after divider): should be 3.0–3.4 V
If the divider output is below 2.5 V or above 3.6 V, double-check the resistor values and the wiring direction (R1 on the MCP2515 side, R2 to GND).
Tesla's CAN buses are already terminated. Do not add a second 120 Ω terminator. Most aftermarket CAN modules ship with the termination resistor enabled — disable it before connecting to the car.
- Electronic Cats Add-On v0.1: open the
J1 / TERMsolder jumper - Electronic Cats Add-On v0.2+: ships disabled, no action needed
- Generic MCP2515 modules: find and remove
R4orJ1 - M5Stack ATOMIC CAN Base: no termination by default
- LILYGO T-2CAN: check documentation
Verify: measure resistance between CAN-H and CAN-L with the module disconnected from the car. ~120 Ω = good (terminator off, car provides its own). ~60 Ω = your module's terminator is on, disable it.
OBD-II Pin 16 supplies +12V even when the car is locked and sleeping. If your module draws 50 mA at 12V (typical ESP32 idle), that's 0.6W continuous → will drain the 12V battery over days.
On some Model 3/Y builds, X179 12V is gated by the car's wake state. On others it's always-on like OBD-II. Test with a multimeter before relying on it.
For any module that stays plugged in:
- Monitor CAN bus traffic. If no frames seen for 5 minutes → the car is asleep.
- Enter ESP32 deep sleep (~10 µA draw, negligible battery impact).
- Wake on MCP2515 INT pin (frame received = car woke up) or on a timer (check every 60 seconds).
This is how commercial products handle permanent installation without draining the 12V battery.
Anything with an MCP2515-over-SPI interface or an ESP32 TWAI peripheral works with a config change. Community-confirmed boards:
- Joy-IT SBC-CAN01 (MCP2515) — Europe source
- Waveshare RS485-CAN-HAT (MCP2515) — re-wire jumpers for Flipper
- Waveshare ESP32-S3-RS485-CAN — TWAI driver, all-in-one
- Adafruit RP2040 / Feather M4 CAN — see upstream Karolynaz/waymo-fsd-can-mod
If you get a non-listed board working, open a PR with the pin map.
