obd_reader.py: - Mode 22 plumbing: ELM.mode22() sends a 16-bit PID request, parses both positive (62 ..) and negative (7F 22 NRC) responses. - --ford runs a small TENTATIVE table of community-sourced Ford 6.0 PIDs (ICP/IPR/FICM/EBP/EOT). All printed with raw bytes for verification. - --pid XXXX probes a single PID and prints multiple candidate decodings (u8, u16, mV, temp, duty) so we can eyeball the right scaling. - --watch [N] streams ATRV + module voltage (PID 0142) for N seconds. Designed for capturing voltage sag during cranking. - --scan AAAA-BBBB brute-force scans Mode-22 PIDs with --scan-log PATH for output. Uses fast ELM timing (ATAT2, ATST19) for ~3.5 PIDs/sec. diagnostics/2026-06-29-no-start/: - Captured cranking voltage trace, full Mode-22 scan (1000-14FF -> 46 hits), and a session writeup. Working hypothesis: not batteries, not fuel -- ICP / FICM / CMP. FICM meter test still owed. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
ford-obd
Minimal ELM327 OBD-II code reader with a Ford 6.0L Power Stroke no-start triage, built for a cheap CH340 ELM327 USB adapter. Works on any OBD-II vehicle for generic codes/PIDs; the triage notes are 6.0-specific.
Created as a stopgap while forscan.org was offline — it covers reading/clearing codes and the basics, not Ford-enhanced diesel PIDs (see Scope below).
Features
- Read stored (mode 03), pending (mode 07), permanent (mode 0A) DTCs
- Decode P/C/B/U codes, with common 6.0 codes described and no-start suspects flagged
- Clear codes (mode 04) — guarded behind
--clear+ a typedCLEARconfirmation, then re-reads to show any code that returns immediately (active fault) - Key live values (coolant, IAT, MAP, module voltage, RPM, load, throttle) + battery voltage
- 6.0 Power Stroke no-start triage checklist (FICM, ICP, cam/crank, batteries, fuel)
Setup (Windows)
- Install the CH340 driver (WCH
CH341SER) so the adapter appears asUSB-SERIAL CH340 (COMx)in Device Manager → Ports. - Install Python from https://www.python.org/downloads/ — tick Add Python to PATH.
Usage
python obd_reader.py # auto-detect the COM port
python obd_reader.py COM5 # force a port
python obd_reader.py COM5 9600 # force port + baud (default 38400)
python obd_reader.py COM5 --clear # read, then optionally clear (asks to confirm)
python obd_reader.py COM5 -v # verbose: show raw ELM327 traffic
Or just double-click RUN_OBD.bat on Windows (auto-installs pyserial).
On the truck: plug into the OBD port under the dash, key to RUN (engine off is fine for codes), then run the tool.
Scope / honesty
A generic ELM327 reads standard OBD-II only: codes, generic PIDs, port voltage. It does not read Ford-enhanced diesel PIDs (ICP, FICM main/sync voltage, IPR%) — those need FORScan. For FICM/ICP numbers, measure at the FICM with a meter, or use FORScan when it's available. Default baud is 38400 (measured on the CH340 adapter); try 9600 if you get garbage.
Requirements
pyserial (pip install pyserial). Tested against a QinHeng CH340 ELM327 v1.5 clone.