Simplify the instruction on what to do with gen1 ft86 cars

This commit is contained in:
Timur Iskhodzhanov 2022-06-01 00:27:17 -07:00
parent 1b769e8067
commit a8a4291eae
2 changed files with 18 additions and 196 deletions

View File

@ -71,6 +71,10 @@ the board, and finish with a nice JST SM connector:
![MCP2515 board with mods](images/mcp_mods_closeup.jpg)
I suggest using a white cable for CAN L and a colored cable for CAN H.
If you use a consistent color scheme for these wires and for the harness you use
in your car, it will be easier to make sure you get the polarity right.
Finally, put the MCP on the breadboard.
![Assembled view](images/overall.jpg)

View File

@ -1,7 +1,18 @@
# FT86 cars (Subaru BRZ, Toyota 86, Scion FR-S)
# FT86 cars (2013-2020 Subaru BRZ, Toyota 86, Scion FR-S)
Here is information on some of the CAN IDs that you're most likely to use with
RaceChrono and equations to get the right scale, etc.
## Connections
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](https://github.com/timurrrr/ft86/blob/main/can_bus/gen1.md)
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.
## Recommended CAN IDs:
@ -43,196 +54,3 @@ Wheel speed FL | 212 | `bytesToIntLe(raw, 0, 2) * 0.015694` | Use same multiplie
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".
## Connections
Besides the CAN pins in the OBD-II port, there is a CAN bus male port hidden
behind the car multimedia head unit:
![Hidden CAN port](../images/ft86_hidden_can_connector.jpg)
It's very close to the glovebox, which makes it great for putting your CAN
reader in the glovebox. Such a placement makes sure it's out of the way and you
won't accidentally hit it with your leg while on the track, and also allows
quick access for troubleshooting and experimenting. There's also a second 12V
port inside the glovebox, which makes it easy to use a 12V-to-USB adapter
instead of adding a 12V-to-5V converter to your hardware design.
You can use the two middle pins of a
[Toyota radio harness](https://www.amazon.com/gp/product/B0002BEQJ8)
to connect to the CAN bus in a reliable way.
![CAN socket wiring](../images/ft86_socket_wiring.jpg)
It's recommended to use a ~6090 cm (23') twisted pair cable between that port
and your CAN reader. I would strongly discourage you from using the screw
terminals on the MCP2515 board, as if the cable comes loose it can cause a short
circuit in the CAN bus (ask me how I know), which will throw a MIL at best, and
who knows what at worst if it happens on the track. Instead, I attached a female
JST SM connector to the cable.
![Assembled device in the glovebox](../images/ft86_glovebox.jpg)
## Stuff for nerds like me
### CAN ID 0x18 (24)
Update frequency: 100 times per second.
`0x18` is a strange CAN ID. Judging by the low CAN ID number (which in CAN networks
implies higher priority) and the high update frequency, one would expect it to
have some important data, like data for ABS or ESC systems. But based on what is
currently known, it only has one the steering angle as a useful data channel.
The steering angle graphs are usually relatively smooth, and this data is also
available over `0xD0`, along with some much more important data, such as
accelerometers.
Channel name | Equation | Notes
------------ | -------- | -----
Steering angle | `bytesToIntLe(raw, 0, 2) * -0.1` | Also available in `0xD0`
??? | `C` or `bytesToIntLe(raw, 2, 1)` | The value is 112 most of the time for me
??? | `D` or `bytesToIntLe(raw, 3, 1)` | 014 sawtooth
??? | `E` or `bytesToIntLe(raw, 4, 1)` | The value is 0 most of the time for me
??? | `F` or `bytesToIntLe(raw, 5, 1)` | The value is 0 most of the time for me
??? | `G` or `bytesToIntLe(raw, 6, 1)` | The value is 0 most of the time for me
??? | `H` or `bytesToIntLe(raw, 7, 1)` | Strange data channel. It changes in a strange way when the car turns. It also has a 0-14 sawtooth over some otherwise smooth curve.
### CAN ID 0xD0 (208)
Update frequency: 50 times per second.
Channel name | Equation | Notes
------------ | -------- | -----
Steering angle | `bytesToIntLe(raw, 0, 2) * 0.1` | Also available in 0x18
Yaw rate | `bytesToIntLe(raw, 2, 2) * -0.286478897` | The multiplier for º/sec appears to be ((90 / pi) * 100).
??? | `E` | Some flags?
??? | `F` | Some flags?
Lateral acceleration | `bytesToIntLe(raw, 6, 1) * 0.2` | Not 100% sure about the multiplier, but looks about right
Longitudinal acceleration | `bytesToIntLe(raw, 7, 1) * -0.1` | Not 100% sure about the multiplier, but looks about right
Combined acceleration | `sqrt(pow2(bytesToIntLe(raw, 6, 1) * 0.2) + pow2(bytesToIntLe(raw, 7, 1) * 0.1))` |
### CAN ID 0xD1 (209)
Update frequency: 50 times per second.
Length: 4 bytes
Channel name | Equation | Notes
------------ | -------- | -----
Speed | `bytesToIntLe(raw, 0, 2) * 0.015694` | May want to check the multiplier against an external GPS device
Brake position | `min(C / 0.7, 100)` | The third byte is the pressure in the brake system, in Bars. 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.
??? | D | Always 0?
### CAN ID 0xD4 (212)
Update frequency: 50 times per second.
Channel name | Equation | Notes
------------ | -------- | -----
Wheel speed FL | `bytesToIntLe(raw, 0, 2) * 0.015694` | Use same multiplier as for speed in 0xD1
Wheel speed FR | `bytesToIntLe(raw, 2, 2) * 0.015694` | Use same multiplier as for speed in 0xD1
Wheel speed RL | `bytesToIntLe(raw, 4, 2) * 0.015694` | Use same multiplier as for speed in 0xD1
Wheel speed RR | `bytesToIntLe(raw, 6, 2) * 0.015694` | Use same multiplier as for speed in 0xD1
### CAN ID 0x140 (320)
Update frequency: 100 times per second.
Channel name | Equation | Notes
------------ | -------- | -----
Accelerator position | `A / 2.55`
Clutch position | `(B & 0x80) / 1.28` | On/off only
??? | B & 0x70 | Unused?
??? | B & 0x0f | 015 counter?
Engine RPM | `bitsToUIntLe(raw, 16, 14)`
??? | `D & 0x80` | Always 0?
??? | `D & 0x40` | 1 when accelerator pedal is released, 0 otherwise
Accelerator position | `E / 2.55` | Not clear what's the difference from the other two
Accelerator position | `F / 2.55` | Not clear what's the difference from the other two
Throttle position | `G / 2.55` | Not tested
??? | H | Some flags
### CAN ID 0x141 (321)
Update frequency: 100 times per second.
Channel name | Equation | Notes
------------ | -------- | -----
Accelerator pedal position? | `bytesToIntLe(raw, 0, 2)` | Follows `A` from `0x140` closely with ~9860 for 0% and ~11625 for 42%. Needs more testing.
Engine load? | `bytesToIntLe(raw, 2, 2)` | Follows the data from OBD-II PIDs 0x4 and 0x43 pretty well.
Engine RPM | `bitsToUIntLe(raw, 32, 14)`
??? | `F & 0x80` | 1 when accelerator pedal is released, 0 otherwise
??? | `F & 0x40` | Always 0?
Gear | `(G & 0xf) * (1 - (min(G & 0xf, 7)) / 7)` | It's basically just `G & 0xf` but neutral is reported as `7`, hence the complex math to turn it into a 0. The reverse gear is reported as `1`. The value can be wrong when the clutch pedal is depressed.
??? | `G & 0xF0` | I saw values of 128, 160, 192 here.
??? | `H` | Equals to 16 when I lift off the accelerator, then turns to 8, then 0.
### CAN ID 0x360 (864)
Update frequency: 20 times per second.
Channel name | Equation | Notes
------------ | -------- | -----
Engine oil temperature | `C - 40`
Coolant temperature | `D - 40`
Cruise control ON | `(F & 16) / 16` | Means the mode is "On", but not necessarily "Set". Not tested much.
Cruise control set | `(F & 32) / 32` | Not tested much.
Cruise control speed | `H` | In the same unit as the current speed display units? Not tested much.
### CAN ID 0x361 (865)
Update frequency: 20 times per second.
Channel name | Equation | Notes
------------ | -------- | -----
Gear | A & 0x7 | Not tested
### Would be nice to find CAN IDs for ...
TODO: would be great to find how to read the ambient temperature, and maybe the
intake temperature.
TODO: find how to log the fuel remaining.
### Typical histogram of CAN IDs
Here's what the distribution of CAN IDs looks like in the CAN bus while idling in a
parking lot:
CAN ID (hex) | CAN ID (decimal) | Number of packets received over a 10 second period
---- | --- | ---
0x18 | 24 | 1000
0xD0 | 208 | 500
0xD1 | 209 | 500
0xD2 | 210 | 500
0xD3 | 211 | 500
0xD4 | 212 | 500
0x140 | 320 | 1000
0x141 | 321 | 1000
0x142 | 322 | 1000
0x144 | 324 | 500
0x152 | 338 | 500
0x156 | 342 | 500
0x280 | 640 | 500
0x282 | 642 | 167
0x284 | 644 | 100
0x360 | 864 | 200
0x361 | 865 | 200
0x370 | 880 | 200
0x372 | 882 | 100
0x374 | 884 | 10
0x375 | 885 | 10
0x37A | 890 | 10
0x3D1 | 977 | 84
0x440 | 1088 | 25
0x442 | 1090 | 25
0x44D | 1101 | 25
0x46C | 1132 | 25
0x4C1 | 1217 | 10
0x4C3 | 1219 | 10
0x4C6 | 1222 | 10
0x4C8 | 1224 | 10
0x4DC | 1244 | 10
0x4DD | 1245 | 10
0x63B | 1595 | 20
0x6E1 | 1761 | 10
0x6E2 | 1762 | 10