The CAN bus is readily available on pins 6 and 14 of the OBD-II port, which means you can just use an OBDLink MX+ with RaceChrono to read data from the CAN bus :-)
If you still want to use a DIY device, I applaud you. You can use the OBD-II port, or you can make use of a hidden connector behind the infotainment head unit for a completely hidden setup. See this page for more pointers on how to make a harness with CAN H/L pins for that connector. Then all you need to do is to put another JST connector on the other end of that harness, and plug it into the DIY CAN bus reader documented in this project.
Here are CAN IDs and RaceChrono equations for data channels that should be enough for most people:
Channel name | CAN ID | Equation | Notes |
---|---|---|---|
Accelerator position (%) | 320 | A/2.55 |
|
Brake position (%) | 209 | min(C / 0.7, 100) |
The 0.7 divider seems to be a good value to get 100% at pressure slightly higher than those you're likely to use on the track for cars with no aero. You can use 0.8 or 0.9 if you see 100% too often. |
Brake pressure | 209 | C * 128 |
|
Coolant temperature | 864 | D - 40 |
|
Engine RPM | 320 | bitsToUIntLe(raw, 16, 14) |
|
Engine oil temperature | 864 | C - 40 |
|
Speed | 209 | bytesToIntLe(raw, 0, 2) * 0.015694 |
May want to check the multiplier against an external GPS aevice |
Steering angle | 208 | bytesToIntLe(raw, 0, 2) * -0.1 |
Positive value = turning left. You can remove the - if you prefer it the other way around. |
Below is a table with a few more data channels that might be useful for more detailed analysis. When adding more channels, be aware that it will increase the file size of your RaceChrono sessions, and might negatively affect the update rate of the more essential channels, due to limited Bluetooth bandwidth. However, the communication protocol in RaceChrono is smart enough to optimize Bluetooth usage if multiple channels share the same CAN ID. As a general rule, if a new channel has the same CAN ID as an existing channel (such as "Throttle position" using the same CAN ID 320 as "Accelerator position"), then adding it should not affect the update rates. Adding a channel based on a new CAN ID (such as "Wheel speed FL") will likely negatively affect the update rates of all other channels.
Channel name | CAN ID | Equation | Notes |
---|---|---|---|
Clutch position | 320 | B & 0x80 / 1.28 |
Only 0% and "not 0%", unfortunately. |
Gear | 321 | (G & 0xf) * (1 - (min(G & 0xf, 7)) / 7) |
Car calculates it based on speed, RPM and clutch position. It's pretty slow. I really doubt it's worth wasting one CAN ID for this channel. It's not that hard to see which gear you're in based on speed and RPM in data. |
Lateral acceleration | 208 | bytesToIntLe(raw, 6, 1) * 0.2 |
Data is noisy. |
Longitudinal acceleration | 208 | bytesToIntLe(raw, 7, 1) * -0.1 |
Data is noisy. |
Combined acceleration | 208 | sqrt(pow2(bytesToIntLe(raw, 6, 1) * 0.2) + pow2(bytesToIntLe(raw, 7, 1) * 0.1)) |
|
Throttle position | 320 | G / 2.55 |
This is the throttle valve, not pedal. |
Wheel speed FL | 212 | bytesToIntLe(raw, 0, 2) * 0.015694 |
Use same multiplier as for "Speed". |
Wheel speed FR | 212 | bytesToIntLe(raw, 2, 2) * 0.015694 |
Use same multiplier as for "Speed". |
Wheel speed RL | 212 | bytesToIntLe(raw, 4, 2) * 0.015694 |
Use same multiplier as for "Speed". |
Wheel speed RR | 212 | bytesToIntLe(raw, 6, 2) * 0.015694 |
Use same multiplier as for "Speed". |
Yaw rate | 208 | bytesToIntLe(raw, 2, 2) * -0.286478897 |
If you found this page useful, consider donating so I can buy beer/boba: