Notebook: Apr 2026
🤖 ECU Piggyback / Copilot Controller [SSM2]
Another day, another bug, but it’s getting somewhere. Finally reading parameters from the ECU using L9637D.
[NOTE] SSM2 protocol :
K-Line physical layer :
10400 baud, 8N1, half-duplex via L9637D transceiver
TX and RX share the same wire — everything transmitted echoes back on RX
Echo byte count = exact number of bytes sent, must be drained before reading ECU response
Wakeup sequence (ISO 9141 slow init) :
GPIO low pulse ~20ms on K-Line TX pin
Switch UART to 4800 baud
Send ECU address byte 0x81
Drain echo of 0x81
ECU responds with KB1 and KB2 key bytes
Send ~KB2 (bitwise NOT of KB2) as confirmation
Drain echo of confirmation byte
Switch back to 10400 baud
No 5-baud init, no W1/W2/W3/W4 timing delays required
Packet structure :
80 [DST] [SRC] [SIZE] [CMD] [data...] [checksum]
0x80 = header, always
DST/SRC: 0x10 = ECU, 0xF0 = diagnostic tool
SIZE = number of bytes from CMD through last data byte
Checksum = sum of all bytes except checksum, lowest 8 bits only
ECU init command (optional) :
Send: 80 10 F0 01 BF 40
ECU responds with 136-byte packet containing ECU ID, ROM ID, supported parameter list
Read parameter command :
80 10 F0 [SIZE] A8 [PP] [ADDR1_b2] [ADDR1_b1] [ADDR1_b0] ... [checksum]
SIZE = 2 + (num_addresses * 3)
PP = 0x00 single response, 0x01 continuous stream until interrupted
Each address is 3 bytes, supports multiple addresses in one request
ECU replies with one data byte per address in request order
ECU response :
80 F0 10 [SIZE] E8 [data...] [checksum]
0xE8 at byte 4 = success code
Data bytes follow in same order as requested addresses
🤖 ECU Piggyback / Copilot Controller [CAN]
[NOTE] AEM CAN protocol
Message name: AEMnet (raw)
ID Range (HEX): 0x00000180
[NOTE] SN65HVD230 CAN MCU-230 Module
120Ω resistor pre-soldered on each board, remove if needed
🤖 Exhaust Control Valve [ECV] ESP32
[DONE] ESP32 C3mini firmware
Actuator control (step, full open/close, fixed positions)
Failsafe (current + voltage monitoring via INA226)
ESP-NOW receive
CAN receive (ready for Android app)
Auto mode (closed loop via map/sensor data)
Mode toggle
NVS persistence for limits and servo config
Self-calibration
[WIP] change of plan
ditching the servo for the org DC motor (better heat resistant)
using MPQ6612A DC motor driver
🚘 GC8 WRX
MY08 steering wheels switch (cruise control) repurposed for other use.
[DONE] Make all switches usable, wired up to ESP32-C3mini
remove R24 so SW1/2 can be use
cut trace near SW3 and add resistor from R24 (or any value)
replace R22 to a higher resistor to increase separation for SW3/4 and SW5
SW1/2 use as digital switch
SW3/4, SW5, SW6 use resistor ladder
long/short press, hold. total 12 programmable functions via Android App


