Skip to the content
4 layers50.8 × 22.9 mmEps tap wing, the printed circuit board in 3D

STM32F411CE Throttle ECU — PID position control with AS5048A encoder, H-bridge motor, safety module

Size
50.8 × 22.9 mm
Copper layers
4
Thickness
1.6 mm
Parts
77
Nets
58
Pads
231
Tracks, vias
572, 69
Pours
4
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
20 Mar 2026
Updated
6 Nov 2026

Overview

Eps tap wing is an open-source printed circuit board by ThatguyCplus, from the ThatguyCplus/throttleECU repository on GitHub. It is a 4-layer board of 50.8 × 22.9 mm with 77 parts on 58 nets, routed with 572 tracks and 69 vias.

It is built around the MCP6004-I/ST, ADS1115IDGSR and 0402B102K500NT, with the 1N4148WS and NCD0805R1 among its other parts. Its parts include 32 resistors, 19 capacitors, 6 diodes, 3 ICs and 3 connectors.

Main components

5

README

steering_control_unit/bench_stim_wing/README.md

Bench stimulus FeatherWing

A FeatherWing for the EPS logger stack that does four jobs:

  1. Powers the whole stack from 12 V (bench supply or the car battery), so the logger needs no USB power bank.
  2. Powers the Toyota steering-angle sensor (12 V, ~30 mA, switched and fused) and passes its CAN on to the Feather M4 CAN.
  3. Drives the EPS signals NEP (rpm) and VSP (speed) and, with the wheels off the ground, VT3/VT6 (fake driver torque).
  4. Switches IG1 for an EPS that's out of the car, on a bench.

It sits between the Adalogger and the OLED FeatherWing, on stacking headers, and every cable connector is right-angle and exits a board edge. The brief is HANDOFF.md.

Status: routed and checked in KiCad 10.0.8, nothing ordered. The board is fully routed, and the Gerbers, BOM and CPL are in fab/. Read Before ordering first: several part numbers, the relay pinout and the JLC rotations still need a human check.

KiCad 10.0.8 check (with JLCPCB's rules, bench_stim_wing.kicad_dru)Result
ERC0 errors. 20 warnings: symbols drawn from KiCad 7's library differ from KiCad 10's copies, and KiCad 10 renamed G6K-2
DRC0 copper errors, 0 unconnected, 0 schematic-parity issues, including JLCPCB's 0.2 mm track-to-through-hole-pad rule and 1.0 mm / 0.15 mm text. Warnings left: stock footprint outlines touching their own pads (JLC clips those), footprints differ from KiCad 10's library copies, and J2's outline at the board edge (deliberate, edge connector)
Top (3D)Back (3D)
top renderback render

3D view

Every part has a 3D model, and the models ship with the project in bench_stim_wing.3dshapes/. They're STEP files from KiCad's official library, referenced as ${KIPRJMOD}/bench_stim_wing.3dshapes/..., so the 3D viewer and STEP export work on any machine with KiCad 7 to 10, whatever 3D libraries are installed. J1 shows the Feather stacking headers' female sockets (1×16 + 1×12). Only the test pads and the JP1 solder jumper have no model, because they're bare copper.

Top layersBack layers (seen from below)
topback

Safety model

The user asked for this to be overbuilt. Faking VT3/VT6 makes the EPS motor steer by itself: front wheels off the ground (or the rack on a bench rig), hands clear of the wheel.

LayerWhat it does
Relays, fail to the carEvery EPS line (VT3, VT6, NEP, VSP) goes through an Omron G6K relay. The NC contact connects the EPS to the car's own wire, and the NO contact connects it to this board. No power, a reset, a crash or a blown fuse all leave the EPS wired exactly as the car wires it.
ARM loop (hard kill)Both relay coils and the IG1 output are powered only through the ARM loop on J5 pins 7–8. Wire a normally-closed e-stop or a key switch there. Loop open = car wiring, whatever the firmware does. The red ARM LED shows the loop is closed.
Enable bitsEach output also needs its own bit from the TCA9534 I2C expander. The expander powers up with every pin as an input, and 100 kΩ pull-downs hold every driver off until firmware sets the bit.
Clamped torque rangeThe DAC uses its 2.048 V internal reference and the op-amp gain is 2.2, so the torque outputs top out at 4.5 V even at full scale. They're also clamped to 0–5 V, with a 470 Ω series resistor each.
Inject on the EPS side onlyNEP and VSP also feed the gauges, ECM, MCM, TCM and climate control. Only ever break them at the EPS with a breakout harness: the relay then isolates the EPS from the car wire, and the car side never sees the stimulus.

Latching DTCs. The torque-sensor and sensor-supply codes (11/15/16/17/18/67) latch until erased with the SCS procedure, so a bad VT3/VT6 fake bricks assist until you clear them. The relay swaps only VT3/VT6: the real sensor stays connected to Vcc1/Vcc2 and stays powered, so the supply checks still see a real load.

Plausibility rules (from the manual, also in EPS_PINOUT.md):

  • Never send speed without rpm. At ≥ 6.2 mph with ≤ 280 rpm for 3 s, the lamp comes on with DTC 22.
  • Ramp speed changes, because VSS jumps also set DTC 22.
  • Don't hold ≥ 2,000 rpm at ≤ 1 mph for more than 6 minutes.

Key ON, engine off: the 12 V battery isn't being charged. The DC-DC converter doesn't charge it in that state (LiBCM FAQ), so all assist current comes from the battery. Keep bench sessions short, or put a charger on the battery.

Stack and mechanics

text
  OLED FeatherWing
  ─ female side of this wing's stacking headers ─
  BENCH STIM WING        top: relays, inductor, J2/J3/J4, LEDs   (tallest part: relays, 5.2 mm)
                         back: logic, test pads, J5              (back parts <= 1.25 mm, J5 4.25 mm)
  ─ long male tails into the Adalogger's female headers ─
  Adalogger FeatherWing  (CR1220 holder and microSD socket on its top: ~2-4 mm)
  Feather M4 CAN         (USB-C at the left end, CAN terminal block at the right end)
  EPS tap wing           (bottom wing, connectors facing down)

Why this slot:

  • Feather ↔ Adalogger was ruled out. The Feather M4 CAN's 3.5 mm CAN terminal block (right end) and USB-C (left end) sit right where this board's back and its edge connectors would be.
  • The Adalogger's top is low. The tallest parts there are the CR1220 holder (x ≈ 3–17 mm) and the microSD socket (x ≈ 27–40 mm). That's why every back-side part on this wing is ≤ 1.25 mm tall, and J5 sits at the right end, where the Adalogger is bare.
  • The OLED's underside is bare, so the relays (5.2 mm), the inductor (3 mm) and the 4.25 mm GH connectors fit under it, inside the ~8.5 mm stacking-header gap.

Use Feather stacking headers (female on top, long male tails) on this wing. Check the gap with the real parts before soldering the headers.

Grounding, and running with the logger

This wing and the EPS tap wing logger run alone or together, in the car or on a bench EPS. STACK_MODES.md covers every combination: power, ground, which pins to wire, and the timers and I2C addresses they share.

The one rule: J2's ground (the stack's ground) goes to the ECU end of A4 (PG, BLK), spliced within ~10 cm of the EPS connector. On a bench, it goes to the EPS's A4 terminal. It must not go to a chassis bolt or the battery. A4 carries the 40 A motor return, so anywhere else puts an offset between the stack and the EPS's sensor ground (B9).

  • Logger accuracy: that offset would shift every logger reading.
  • Faked torque: it would also shift the VT3/VT6 values this board produces.

Leave J4.3 and J5.4 (GND) unwired in the car, so there's only one ground path. Fitted but unpowered (J2 unplugged), this board is passive: the relays rest on the car's wiring, and the logger keeps floating on its power bank.

Feather specification check

Spec itemThis wing
0.9" × 2.0", 0.1" holes at each corner22.86 × 50.8 mm, four 2.5 mm holes 2.54 mm in from the edges
16-pin and 12-pin header positionsSame footprint as the EPS tap wing; make_pcb.py asserts the pad positions every build
Power: take 3.3 V from the FeatherThe expander and DAC run on the Feather's 3V3 (about 1 mA)
Powering the Feather from a wing5 V goes into the USB pin through a Schottky (D6). On the Feather M4 CAN the USB pin is VBUS straight off the USB-C connector, and the Feather's own MBR540 then feeds its regulator, so this is the normal path (checked against Adafruit's schematic)
Avoid AREF, RX/TX, SPI and its CSAREF, RX and SPI are untouched. TX is used (VSP output): only D4 and RX/TX are left free in this stack, and NEP and VSP each need their own timer
I2C pull-ups on WingsNot fitted: the Adalogger already has them

USB and 12 V at the same time

  • Our side: the buck makes 5.05 V. After D6's drop the Feather's USB pin sees about 4.7 V.
  • With a PC plugged in: the PC's 5 V is higher, so the PC carries the stack and D6 stays off. This board never back-feeds the PC.
  • With 12 V gone: D6 also stops the USB cable from powering this board's 5 V rail. The relays and op-amp go dead, and so the EPS is on the car wiring.

A LiPo on the Feather. If one is plugged into the Feather's JST, its charger draws up to ~200 mA from this 5 V rail. The buck is rated 0.6 A, so that still fits, but leave the LiPo off unless you want it charging.

The current clamp's supply. The HSTS016L on the tap wing takes its 5 V from the USB pin, so on 12 V alone it gets ~4.7 V. Its output is read as Vout − Vref, which cancels most of that offset, but check its zero at key-on the first time.

Connectors

All connectors are right-angle and exit a board edge. JLC assembles the three GH connectors (J3, J4, J5: SMD, 1.25 mm pitch, awkward by hand). J2 (through-hole PH) and the Feather stacking headers are hand-soldered. The GH parts have locking latches: use JST GH housings (GHR-0xV-S) with SSHL-002T-P0.2 contacts, or buy pre-crimped GH leads.

J2, 12 V IN (top edge, JST PH S2B-PH-K, 2 mm). Pin 1 (marked +) is +12 V and pin 2 is GND. 2 A fuse.

J3, SAS / CAN (left end, JST GH 6-way). This is a pass-through: build one cable to the SAS, plus one pair from pins 5/6 to the Feather's CAN terminal.

PinNetGoes to
1SAS 12VSAS power (switched, 0.1 A PTC)
2GNDSAS ground
3CANHSAS CAN-H
4CANLSAS CAN-L
5CANHFeather M4 CAN terminal pin 3 (H)
6CANLFeather M4 CAN terminal pin 1 (L)

The Feather's terminal has a 120 Ω terminator behind a solder jumper (SJ2). The SAS bus here is two nodes, so close SJ2 unless the SAS end already terminates the bus.

Second microcontroller: J3 is also the stack's port for another board. Splice its CAN-H/CAN-L into the pin 5/6 lead (no ground or power wire), keep exactly two terminators on the bus (about 60 Ω across H/L, powered off), and use IDs 0x6C0–0x6CF. See AUX_LINK.md.

J4, TORQUE (right end, top, JST GH 5-way). Break the torque sensor's VT3 and VT6 wires in a breakout harness: the CAR side goes to the sensor, the EPS side to the EPS.

PinNet
1VT3 EPS side (gearbox 7-pin 3 / ECU B10)
2VT3 sensor side
3GND (leave unwired in the car: the reference comes through J2's ground, see below)
4VT6 EPS side (gearbox 7-pin 1 / ECU B8)
5VT6 sensor side

J5, ECM / IG1 / ARM (right end, back, JST GH 8-way). The back silk marks "J5" with pins "1" and "8"; the pin names are below.

PinNetNotes
1IG1 OUTSwitched 12 V, 0.5 A PTC. Bench EPS only (ECU B6)
2NEP CARCar-side NEP wire (ECM)
3NEP EPSEPS B14
4GNDSeparates the 12 V-level pins from the 5 V-level pins. Leave unwired in the car
5VSP EPSEPS B4
6VSP CARCar-side VSP wire (VSS)
7ARM+5 V out to the ARM loop (0.1 A PTC)
8ARMBack from the loop: powers the relay coils, enables IG1

Loopback for free. The tap wing's J2 reads NEP (D6), VSP (D5), VT3 (A2) and VT6 (A3). Tap the EPS side of the breakout harness and the logger records exactly what the EPS receives, including whether the relay switched.

Circuit summary

BlockPartsNotes
12 V inputF1 2 A fast fuse → D1 SS34 (reverse polarity) → D2 SMBJ24CA TVS → C1 10 µF/50 VEverything on +12 V is rated ≥ 40 V; the TVS clamps a load dump to ~39 V
5 VU1 LMR16006 (40 V, 65 V transient, 0.6 A, 0.7 MHz), L1 22 µH, D4 catch diode, 56k/10k → 5.05 V~250 mA load: stack ~150 mA, relays 2 × 28 mA, LEDs
Feather feedD6 PMEG6010 → Feather USB pinSee USB and 12 V at the same time
SAS powerQ1 Si2319 high side, Q2 2N7002, F2 0.1 A PTCExpander P0. JP1 (open as shipped): bridge for "SAS always on", for use with the unmodified logger firmware
IG1 outQ3 Si2319, Q4 + Q5 in series (IG1_EN and ARM), F4 0.5 A PTCExpander P1
RelaysK1 (VT3/VT6), K2 (NEP/VSP): G6K-2F-Y 5 V, Q6/Q7 drivers, 1N4148WS flybackExpander P2, P3. Coils fed from ARM
NEPD4 (PA14) → Q8 → open drain, 4.7 kΩ to 12 V, 100 Ω seriesLike the ECM's open-collector output
VSPTX (PB16) → Q9 → open drain, 4.7 kΩ to 5 V, 100 Ω seriesLike the VSS
TorqueU2 MCP4728 (I2C 0x60, 2.048 V ref, gain ×1) → U3 MCP6004 on 5 V, gain 2.2 → 470 Ω → BAT54S clampDAC A = VT3, B = VT6. DAC C and D go straight to test pads 10/11 as spare 0–2.048 V outputs (unbuffered, ~mA); op-amp sections C/D are parked as grounded followers
ExpanderU4 TCA9534 (I2C 0x20)P0 SAS, P1 IG1, P2 K1, P3 K2 (outputs); P4 ARM sense, P5 12 V sense (inputs); P6/P7 on test pads

Pulse output polarity. GPIO high pulls the output low (open drain), and the idle level is high. Both D4 and TX sit on independent timers: PA14 on TCC1/WO2 or TCC2/WO0, PB16 on TC6/WO0 or TCC0/WO4. Don't use TC3: the logger (eps_logger) uses it for its 1 kHz sample tick. The rates are low (NEP 1.5 pulses/rev: 22.5 Hz at 900 rpm; VSP ~1.24 Hz per mph, unverified), so plain micros() timing also works.

I2C addresses on the shared bus: RTC 0x68, OLED 0x3C, ADS1115 0x48, MCP4728 0x60, TCA9534 0x20. There are no clashes.

LEDs

Top side, in one row above the relays. Left to right: 5V, SAS, IG1, ARM, TQ, SIG, NEP, VSP; the legend is also on the back silk. The 12 V LED is in the top-left corner. TQ and SIG light when their relay is energised. NEP and VSP blink with the pulse outputs.

Test pads (back)

The pads are numbered 1–15 on the back silk; names don't fit at JLC's 1 mm minimum text height.

TPNetTPNetTPNet
1GND6NEP out11DAC D (raw, 0–2.048 V)
2+12 V7VSP out12ARM
3+5 V8VT3 out13Expander P6
4+3V39VT6 out14Expander P7
5USB pin10DAC C (raw, 0–2.048 V)15GND

Design rules

ItemValue
Layers4: F.Cu parts + signals + GND pour, In1.Cu solid GND, In2.Cu signals + GND pour, B.Cu parts + signals + GND pour
Signal tracks0.15 mm (mA and below)
Power tracks+12 V path and IG1 0.5 mm; +5 V, USB, buck SW, SAS and ARM 0.4 mm; 3V3 0.3 mm
Clearance0.127 mm; 0.21 mm from tracks to plated through-hole pads (JLCPCB's 0.2 mm pad-to-trace rule)
GND planeIn1 is a solid GND pour; a few low-speed signals cross it where routing needed the room
SilkscreenAll text >= 1.0 mm high with a 0.15 mm stroke (JLCPCB minimum)
JLCPCB rulesbench_stim_wing.kicad_dru, the 4-layer 1 oz set from Cimos/kicad-druid (MIT). KiCad loads it as the project's custom rules
Vias0.45/0.2 mm signal, 0.6/0.3 mm power
AssemblyBoth sides (SMD top and back). The back carries only parts ≤ 1.25 mm tall

Files

FileWhat it is
bench_stim_wing.kicad_sch / schematic PDFSchematic (generated)
bench_stim_wing.kicad_pcbBoard, 50.8 × 22.86 mm (FeatherWing), 4 layers
doc/3D renders (KiCad 10) and layer renders of the top and back
bench_stim_wing.3dshapes/The 3D models every footprint points to (KiCad library STEP files, CC-BY-SA 4.0 with the KiCad library exception)
fab/Gerbers + drill (zipped), JLC BOM and CPL. All SMD parts including the GH connectors; J1 (stacking headers), J2, JP1 and the test pads are excluded
gen/Generators. Everything comes from gen/design.py (parts and nets) and gen/placement.py (positions, silk, hand stubs). gen/bench_stim_wing.ses is the accepted Freerouting result

Rebuilding

The board was generated in a Linux cloud session. The generators ran on KiCad 7.0.11, the version Ubuntu ships. Sign-off ran on KiCad 10.0.8, which gen/setup_kicad10.sh installs from the official kicad/kicad Docker image. That image comes through Google's Docker Hub mirror, because KiCad's Launchpad PPA is blocked there and Docker Hub rate-limits anonymous pulls. The script runs KiCad 10 through chroot, which needs root. Routing used Freerouting 1.9.0 on Java 21, under xvfb-run. The files are written in KiCad 7's format. KiCad 10 opens them and asks to upgrade on save. Upgrading is fine, but then the generators would overwrite your edits, so pick one way of working.

bash
cd gen
sh route.sh --keep-routing   # rebuild everything from the committed routing (bench_stim_wing.ses)
sh route.sh                  # full re-route with Freerouting (a different result every run)

route.sh expects kicad-cli and a Python that can import pcbnew (PY=...). A full re-route also needs the Freerouting 1.9 jar (JAR=...). On Windows with KiCad 10, point PY at KiCad's bundled python.exe, and set KICAD_SYMBOL_DIR / KICAD_FOOTPRINT_DIR if the libraries aren't found.

How it got to 0 unconnected (and JLCPCB-clean):

  • Freerouting version. 2.0.1 ignored its pass limit and never finished, so routing uses 1.9.0 with -oit 100. Without that flag the post-route optimiser runs for hours.
  • Rules. Signal tracks are 0.15 mm with 0.127 mm clearance, but tracks stay 0.21 mm from plated through-hole pads, per JLCPCB's 0.2 mm pad-to-trace rule. KiCad 7 doesn't export per-pad clearances to Freerouting, so make_pcb.py grows the through-hole pads in the router's copy of the board instead (dsn_router_tweaks).
  • Spare DAC channels simplified. DAC C/D used to have their own op-amp stages. Routing those with the wider through-hole clearance left nets unroutable, so they now go straight to test pads 10/11.
  • Hand fixes (placement.py MANUAL_ROUTES, which belongs to the committed bench_stim_wing.ses). KiCad 7 exports some back-side pads to Freerouting on the wrong layer, which leaves a few connections "connected" in its eyes but open on the board. maze_route.py (a small 4-layer grid router that keeps every clearance) and find_via.py close them:
    • Q5 gate: routed to the ARM net, 0.15 mm (gate drive only).
    • R2's +12V pad: gets a via up to the +12V track. That via is in the pad. It's fine for a 100 k pull-up, but ask JLC to plug/tent vias. To make room, an In2 +5V run moves down.
    • A NEP_DRV detour that Freerouting threaded through R27's pad gap is replaced with a direct drop.
  • Net classes live in bench_stim_wing.kicad_pro, so KiCad 10 opens the board with the same rules.
  • In1 (the GND plane) carries a few signal tracks. A signal-free In1 was tried, but with the wider through-hole clearances it left ~35 connections unroutable. The slots this cuts in the plane are harmless at these speeds.

check_netlist.py checks every pin in the exported netlist against design.py. When kicad10-cli is installed, route.sh also runs KiCad 10's ERC, its DRC with schematic parity, and the 3D renders.

Before ordering

  1. ERC and DRC already pass in KiCad 10.0.8 (see Status). Open the board in your own KiCad 10 once anyway. If you save it there, KiCad upgrades the file and the generators would overwrite your edits.
  2. Check the relay pinout against Omron's G6K datasheet: coil 1/8, COM 3/6, NC 2/7, NO 4/5. That pinout came from KiCad's G6K-2 symbol. If NC and NO are swapped, the board fails the wrong way.
  3. Check stock on the LCSC numbers. Every part in the BOM now has an LCSC number, each matched to its listing in November 2026 (see JLCPCB parts). Stock moves, so re-check at upload. Use the listed alternatives if a part has run out.
  4. Check every CPL rotation in JLC's preview, on both sides. The CPL already applies the community rotation corrections (see Ordering at JLCPCB), but JLC's preview is the final word. Watch especially the diodes, LEDs, SOT-23s, the relays and the GH connectors, since a polarity error there matters.
  5. Check the stack gap with the real stacking headers, relays and the OLED.
  6. Confirm LMR16006's FB voltage (0.765 V) against the datasheet. The output is 5.05 V with 56k/10k.

Ordering at JLCPCB

  1. PCB: upload fab/bench_stim_wing_gerbers.zip. 4 layers, 1.6 mm, 50.8 × 22.86 mm; the defaults are fine (the board follows JLC's 4-layer 1 oz rules in bench_stim_wing.kicad_dru).
  2. Assembly: turn on PCB Assembly, both sides (parts sit on top and back), Standard PCBA.
  3. Upload fab/bench_stim_wing_bom_jlc.csv and fab/bench_stim_wing_cpl_jlc.csv. The column names match JLC's templates, so no remapping is needed.
  4. Check stock and the placement preview, part by part (see Before ordering).
  5. Hand-solder J1 (Feather stacking headers, Adafruit PID 2830) and J2 (JST PH S2B-PH-K) afterwards.

How the CPL is made (gen/export_fab.py), the same way Bouni's kicad-jlcpcb-tools plugin does it:

  • Position: the centre of each footprint's copper pads, measured from the board's bottom-left corner (the drill/aux origin), Y up.
  • Rotation: bottom-side angles are mirrored (180° − angle), then JLC's library offset is added per footprint, from the community database the plugin uses (JLCKicadTools cpl_rotations_db.csv):
FootprintCorrection
SOT-23, SOT-23-6−90°
TSSOP-14/16, MSOP-10270° (MSOP-10 isn't listed; it's the same package as VSSOP-10)
Omron G6K-2F-Y relay270°
JST GH (and PH)180°

Other tools: the schematic symbols carry MPN and LCSC fields, which is what the kicad-jlcpcb-tools plugin and JLC's own KiCad workflow read. Opening the project with that plugin should therefore pick up every part number. All footprints and symbols use KiCad's standard library names (Resistor_SMD:R_0402_1005Metric and so on), plus the project's own bench_stim_wing libraries for the Feather headers and JP1, through ${KIPRJMOD} library tables.

JLCPCB parts

All 38 line items have LCSC numbers in fab/bench_stim_wing_bom_jlc.csv.

PartLCSCNotes
LMR16006YQDDCRQ1 buckC544521Extended. TI rates it 40 V, 65 V transient. The TVS clamps at ~39 V
MCP4728-E/UN DACC108207Extended
MCP6004T-I/ST op-ampC50282Extended. Microchip, tape & reel. Replaced C185811 (tube version: only 3 in stock at JLC). Fallback: UMW MCP6004T-I/ST, C32713110
TCA9534PWR expanderC783615Extended
Si2319CDS-T1-GE3 P-FETC146287Vishay. Avoid the "-JSM" copy, C18191323, which has a different rating
G6K-2F-Y DC5 relayC231389In stock. C1560486 is the same MPN but listed unavailable
SWPA4030S220MT 22 µHC83472Isat 1.3 A
SMBJ24CA TVSC1973089Bourns. Every SMBJ24CA listing found is Extended
PMEG6010CEH-QX SchottkyC5311567Extended. AEC-Q101 version of PMEG6010CEH, same SOD-123F part. Replaced C110797 (no stock at JLC)
SS34 SchottkyC8678Basic, but marked "not recommended for new designs"; alternative is FOSAN C5119706
BAT54SC171786
JST GH headers, SM05B / SM06B / SM08B-GHS-TB(LF)(SN)C189896 / C133065 / C265111Extended. J4 / J3 / J5. C133065 showed 0 stock on one LCSC page
2 A fuse, 1206C3105Littelfuse 0466002.NRHF, the halogen-free version of 0466002.NR
0.1 A PTC, 60 VC2153714Littelfuse 1206L010/60WR
0.5 A PTC, 30 VC7542947LUTE 1206L050/30NR. No LCSC listing found for the Littelfuse 1206L050/30WR
10 µF 50 V 1206C13585
4.7 µF 50 V 1206C51205
10 µF 25 V 0805C15850Basic
100 nF 50 V 0603C14663Basic. Showed out of stock on one LCSC page
0402 resistors (100R, 470R, 1k, 10k, 12k, 22k, 33k, 100k)C25076, C25117, C11702, C25744, C25752, C25768, C25779, C25741UNI-ROYAL, Basic
56k 0402C25796UNI-ROYAL. Extended, not Basic
4.7k 0603C23162Basic
2N7002C8545Basic
1N4148WSC2128Basic
LEDs 0603, Hubei KENTO: red KT-0603R, yellow KT-0603Y, blue KT-0603B, green KT-0603GC2286, C2287, C2288, C12624Red is Basic; the others are Extended. Replaced the Everlight C72038/C72041/C72043, which JLC had no stock of

About 19 Extended part types, at about $3 each in setup fees. Swapping R3 56k for a Basic value would mean recomputing the 5 V divider. Not worth it.

Firmware (next)

Nothing is written yet. A bench sketch (or a bench mode in eps_logger) needs:

  • Serial commands for rpm and mph. The OLED buttons share D5/D6/D9 with the tap wing inputs, so they can't be used.
  • Ramp limits and the plausibility guards: rpm ≥ ~800 whenever speed > 0, and a time limit on high rpm at zero speed.
  • The expander set up as P0–P3 outputs (low), then P4/P5 read as inputs.
  • Refuse to energise K1 unless ARM reads closed, and drop K1 on any serial timeout.
  • Logging of what was commanded, next to what the tap wing measured.

eps_logger/config.h says D4 is the CAN boost enable. Adafruit's Feather M4 CAN schematic shows boost enable and CAN standby are internal pins PB13 and PB12, and D4 (PA14) only goes to the header. Fix that comment when the firmware is touched.

Parts

77
QtyValueFootprintReferences
14BYPASSeps_tap_wing:SolderJumper_BypassJP1, JP2, JP3, JP4, JP5, JP6, JP7, JP8, JP9, JP10, JP11, JP12, JP13, JP14
131nFCapacitor_SMD:C_0402_1005MetricC1, C2, C3, C4, C8, C9, C10, C11, C12, C14, C15, C16, C17
11100kResistor_SMD:R_0402_1005MetricR8, R12, R13, R14, R16, R18, R20, R25, R27, R29, R31
111MResistor_SMD:R_0402_1005MetricR1, R2, R3, R4, R5, R6, R7, R24, R26, R28, R30
6100nFCapacitor_SMD:C_0402_1005MetricC5, C6, C7, C13, C18, C19
51N4148WSDiode_SMD:D_SOD-323D1, D2, D3, D4, D5
433kResistor_SMD:R_0402_1005MetricR15, R17, R19, R21
210kResistor_SMD:R_0402_1005MetricR9, R22
247kResistor_SMD:R_0402_1005MetricR10, R23
2MCP6004Package_SO:TSSOP-14_4.4x5mm_P0.65mmU1, U2
1100RResistor_SMD:R_0402_1005MetricR11
11kResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR32
1ADS1115Package_SO:TSSOP-10_3x3mm_P0.5mmU3
1Current clampTerminalBlock_Phoenix:TerminalBlock_Phoenix_MPT-0,5-4-2.54_1x04_P2.54mm_HorizontalJ3
1EPS tapsConnector_JST:JST_XA_B15B-XASK-1_1x15_P2.50mm_VerticalJ2
1Feather M4 CANeps_tap_wing:Feather_Wing_HeadersJ1
1REDLED_SMD:LED_0805_2012Metric_Pad1.15x1.40mm_HandSolderD6

More from ThatguyCplus/throttleECU

3
  • 4 layers100 × 100 mmA SGSS cskpin routed, the printed circuit board in 3D

    A SGSS cskpin routed

    ThatguyCplus/throttleECU

    STM32F411CE Throttle ECU — PID position control with AS5048A encoder, H-bridge motor, safety module

    571 parts1
  • 4 layers93 × 85 mmTasaruV0.0.1, the printed circuit board in 3D

    TasaruV0.0.1

    ThatguyCplus/throttleECU

    STM32F411CE Throttle ECU — PID position control with AS5048A encoder, H-bridge motor, safety module

    158 parts1
  • 4 layers50.8 × 22.9 mmBench stim wing, the printed circuit board in 3D

    Bench stim wing

    ThatguyCplus/throttleECU

    STM32F411CE Throttle ECU — PID position control with AS5048A encoder, H-bridge motor, safety module

    114 parts1

Similar boards

  • 4 layers118 × 117 mmCm4-robot, the printed circuit board in 3D

    Cm4-robot

    Twisted-Fields/acorn-robot-electronics

    PCB hardware designs in KICAD for Acorn, the precision farming rover from Twisted Fields.

    268 parts81
  • 4 layers27.9 × 108 mmCheep3a, the printed circuit board in 3D

    Cheep3a

    emeb/cheep3a

    An inexpensive Eurorack audio generator

    85 parts9MIT
  • 4 layers38.1 × 100 mmCheep4, the printed circuit board in 3D

    Cheep4

    emeb/Cheep4

    Yet another Eurorack digital oscillator

    120 parts3MIT
  • 4 layers100 × 100 mmPhmod, the printed circuit board in 3D

    Phmod

    gallicchio/AMOD-and-RFMOD

    The tutorial's 2x12 adapter (/mudd/133electronics/icepi-zero-dac-adc/adapterboard/) with a 2 x 6 right-angle Pmod socket on a 15 mm extension of its right-hand end, so an Icepi Zero can drive AMOD-A's and RF-MOD's Pmod…

    234 parts
  • 4 layers297 × 210 mmBatteryPack 16S A4 Breakout, the printed circuit board in 3D

    BatteryPack 16S A4 Breakout

    P-Shreyas543/BatteryPack_16S_A4_Breakout

    KiCad 10 project for a 14S (58.8 V max, 50.4 V nominal) 18650 battery pack on a 297 × 210 mm (A4) 4-layer PCB, built as a BMS breakout and training board.

    144 parts
  • 4 layers88 × 58 mmECG V-0.2, the printed circuit board in 3D

    ECG V-0.2

    Doenec/ecg-esp32

    open source project ecg with esp32 and ad8232

    115 parts8
  • 4 layers47 × 59.7 mmTackle sensor hardware, the printed circuit board in 3D

    Tackle sensor hardware

    Celnardur/rfc_tackle_sensor

    Open a git bash terminal in the directory of your choosing and call the following command:

    79 parts3MIT
  • 4 layers33.5 × 66.8 mmNet bmp, the printed circuit board in 3D

    Net bmp

    elagil/net-bmp

    An Ethernet-connected SWD/JTAG debug adapter (blackmagic probe)

    97 parts3GPL-3.0

Questions

How big is the Eps tap wing PCB?

It measures 50.8 × 22.9 mm and has 4 copper layers, 1.6 mm thick.

What parts does the Eps tap wing use?

77 parts, built around the MCP6004-I/ST, ADS1115IDGSR, 0402B102K500NT and 1N4148WS. 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 Eps tap wing KiCad files?

From the ThatguyCplus/throttleECU repository on GitHub, at the commit this page was made from: the board is steering_control_unit/data_capture/hardware/eps_tap_wing/eps_tap_wing.kicad_pcb and its schematic f411testingreliablitymotor/c2000_f280049_throttle/throttleecupcb/TasaruV0.0.1/TasaruV0.0.1.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Eps tap wing design in my own project?

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