Build Your First Configuration » History » Version 1
Adam Klama, 06/22/2026 12:28 PM
| 1 | 1 | Adam Klama | # Build Your First Configuration |
|---|---|---|---|
| 2 | |||
| 3 | This is a guided, start-to-finish walkthrough for your **first** IOcan configuration. |
||
| 4 | It sits between two other pages: [Getting Started with IOcan](Getting_Started_with_IOcan) |
||
| 5 | gets the device wired and powered, and [Configuration Concepts](Configuration_Concepts) |
||
| 6 | explains the model behind everything below. If you have read those two, you are ready. |
||
| 7 | |||
| 8 | The goal here is not to document every field — the reference pages do that. The goal |
||
| 9 | is to give you a **safe, sensible order** to work in, so your first config comes |
||
| 10 | together predictably instead of by trial and error. Take it one step at a time and |
||
| 11 | you will end up with a transmission that wakes, communicates, and shifts. |
||
| 12 | |||
| 13 | > **Off-road use only.** IOcan does exactly what your configuration tells it to. A |
||
| 14 | > first config is something you build *and validate* — never a finished tune. Keep the |
||
| 15 | > car on a bench or in a controlled setting until every check in Step 9 passes. |
||
| 16 | |||
| 17 | ## What you will build |
||
| 18 | |||
| 19 | To keep things concrete, this walkthrough follows one common setup: |
||
| 20 | |||
| 21 | - a **BMW ZF 8HP** transmission, |
||
| 22 | - driven by a **standalone aftermarket ECU** that publishes engine data on CAN, |
||
| 23 | - with **paddle / sequential** shift input. |
||
| 24 | |||
| 25 | Your build may differ — a different transmission, an OEM ECU, an OEM selector. That is |
||
| 26 | fine. The *order* of the steps is the same for every build; only the specific presets |
||
| 27 | and signals change. Where your setup differs, follow the linked reference page for that |
||
| 28 | piece and rejoin the sequence. |
||
| 29 | |||
| 30 | ## The shape of a configuration |
||
| 31 | |||
| 32 | Everything you are about to add fits into one loop (this is the model from |
||
| 33 | [Configuration Concepts](Configuration_Concepts)): |
||
| 34 | |||
| 35 | ``` |
||
| 36 | Inputs → Controller → CAN Presets → Transmission |
||
| 37 | Outputs ← Controller ← CAN Presets ← Transmission |
||
| 38 | ``` |
||
| 39 | |||
| 40 | We will build it roughly in that order: first the plumbing (CAN networks), then the |
||
| 41 | two ends that talk to the outside world (the transmission preset and your ECU), then |
||
| 42 | the brain in the middle (inputs and the controller), and finally what the system |
||
| 43 | reports back out (outputs). Then we validate. |
||
| 44 | |||
| 45 | --- |
||
| 46 | |||
| 47 | ## Step 1 — Start from a base configuration, not a blank one |
||
| 48 | |||
| 49 | Do not build from nothing. Flash a **base configuration / template** for your |
||
| 50 | transmission and use it as your starting point. A base config already has the |
||
| 51 | transmission controller and the OEM emulation wired up correctly, which removes most |
||
| 52 | of the ways a first attempt can go wrong. |
||
| 53 | |||
| 54 | - Connect IOcan to your PC over USB-C and let it come up in **USB safe mode** (no |
||
| 55 | transmission power — see [Getting Started](Getting_Started_with_IOcan#4-First-Power-Up-Using-USB-Safe-Mode)). |
||
| 56 | - Flash the firmware and load the base configuration for your transmission. |
||
| 57 | - Save a copy under your own name before you change anything, so you always have a |
||
| 58 | known-good fallback. |
||
| 59 | |||
| 60 | Everything from here is **editing** that base config to match your car. |
||
| 61 | |||
| 62 | ## Step 2 — Define your CAN networks |
||
| 63 | |||
| 64 | A CAN network is just transport — it carries frames, it does not interpret them. Before |
||
| 65 | you can add anything that talks on CAN, the bus it lives on has to exist. For a typical |
||
| 66 | build you will have two: |
||
| 67 | |||
| 68 | - the **transmission bus** (IOcan ↔ transmission), |
||
| 69 | - the **vehicle / ECU bus** (IOcan ↔ your standalone ECU and any dash, keypad, etc.). |
||
| 70 | |||
| 71 | For each network set the bitrate, CAN FD if used, and termination. IOcan has switchable |
||
| 72 | on-board 120 Ω termination — enable it only when IOcan is an **end node** on that |
||
| 73 | bus, and make sure the far end is terminated too. Details and the timeout behaviour you |
||
| 74 | will need later are on [Working with the CAN Bus](Working_with_the_CAN_Bus). |
||
| 75 | |||
| 76 | > A base config usually has the transmission bus defined already. You mainly need to add |
||
| 77 | > and check the vehicle/ECU bus. |
||
| 78 | |||
| 79 | ## Step 3 — Confirm the transmission preset |
||
| 80 | |||
| 81 | The transmission side is handled by an **OEM emulation preset** — for this example, the |
||
| 82 | BMW 8HP emulation. It reproduces the OEM communication the transmission expects and |
||
| 83 | automatically creates the matching CAN objects the controller drives. In a base config |
||
| 84 | this is already in place; your job is to confirm it is present and assigned to the |
||
| 85 | **transmission** network from Step 2, not to invent it. |
||
| 86 | |||
| 87 | You will not hand-decode any transmission frames. That is the whole point of the preset. |
||
| 88 | |||
| 89 | ## Step 4 — Bring in your engine signals |
||
| 90 | |||
| 91 | Now give the controller something to work with. The transmission controller needs to |
||
| 92 | know engine and driver state. Common required signals: |
||
| 93 | |||
| 94 | - engine RPM, |
||
| 95 | - throttle position, |
||
| 96 | - accelerator pedal position, |
||
| 97 | - fuelling information (fuel pressure / injection timing), |
||
| 98 | - brake pedal state, |
||
| 99 | - wheel speed (optional). |
||
| 100 | |||
| 101 | You have two ways to get them in, covered on |
||
| 102 | [Working with the CAN Bus](Working_with_the_CAN_Bus): |
||
| 103 | |||
| 104 | 1. **A CAN Preset for your ECU** (preferred, if one exists). Add the preset, assign it |
||
| 105 | to the vehicle bus, and it publishes named objects you simply reference — no byte |
||
| 106 | math. |
||
| 107 | 2. **Raw CAN signals** ([CAN Bus Input](CAN_Bus_Input)), |
||
| 108 | when you have a DBC or know the byte layout of your ECU's broadcast. |
||
| 109 | |||
| 110 | If a signal is not on the CAN bus at all, you can supply it from a hardware pin instead |
||
| 111 | — for example an [Analog Input](Analog_Input) |
||
| 112 | for a 0–5 V sensor, or a [Frequency Input](Frequency_Input) |
||
| 113 | for a pulse-based speed signal. The full menu of input types is on |
||
| 114 | [Configuring Inputs](Configuring_Inputs). |
||
| 115 | |||
| 116 | ## Step 5 — Map signals to the controller (and know what is mandatory) |
||
| 117 | |||
| 118 | Adding a signal makes it *available*; it does not yet make it the controller's source. |
||
| 119 | For each logical input the controller needs, choose the **one** signal that drives it. |
||
| 120 | You can read extra copies of a signal for logging, but only one can be the active |
||
| 121 | source — extra ones are logged and ignored. |
||
| 122 | |||
| 123 | This is the step where it pays to understand mandatory vs. optional: |
||
| 124 | |||
| 125 | - **Missing a mandatory signal** → the controller reports a configuration fault and |
||
| 126 | **halts transmission operation**. Logging still works, but the transmission will not |
||
| 127 | run. This is intentional, not a bug — it is the device refusing to operate blind. |
||
| 128 | - **Missing an optional signal** → a safe internal default is used, the device keeps |
||
| 129 | running, and the real signal is picked up automatically if it appears later. |
||
| 130 | |||
| 131 | For any safety-relevant CAN signal, set a **timeout** (`UsePrevious` / `UseDefault` / |
||
| 132 | `UseFault`) so a dropped frame is detected rather than silently held at its last value. |
||
| 133 | |||
| 134 | If a value needs scaling or a curve before the controller uses it, that is handled with |
||
| 135 | [Scaling & Maps](Scaling_and_Maps). |
||
| 136 | |||
| 137 | ## Step 6 — Set up shift input |
||
| 138 | |||
| 139 | Decide how the driver requests gears and wire that into the controller: |
||
| 140 | |||
| 141 | - **Paddles or a sequential shifter** via a shifter preset, or via |
||
| 142 | [Digital Inputs](Digital_Input) |
||
| 143 | for simple up/down buttons. |
||
| 144 | - **An OEM gear selector** (e.g. a BMW GWS) via its preset. |
||
| 145 | - **A CAN keypad** for mode and range selection. |
||
| 146 | |||
| 147 | Keep it minimal for the first config: up, down, and a way to select drive/neutral/reverse |
||
| 148 | is enough to validate. Add modes and refinements once the basics shift cleanly. |
||
| 149 | |||
| 150 | ## Step 7 — Configure the outputs you actually need |
||
| 151 | |||
| 152 | Outputs expose transmission and controller state back to the rest of the car. For a |
||
| 153 | first config, less is more — add only what you need to drive and to be safe: |
||
| 154 | |||
| 155 | - **reverse light** (so reversing is legal and visible), |
||
| 156 | - **gear display** (so you can see what gear is engaged while validating), |
||
| 157 | - **torque-management signal back to the ECU**, if your strategy uses one. |
||
| 158 | |||
| 159 | Two rules from [Configuring Outputs](Configuring_Outputs) |
||
| 160 | worth repeating, because breaking them is a classic first-config mistake: |
||
| 161 | |||
| 162 | - an output does nothing on its own — it must be **driven by a controller**; |
||
| 163 | - assign each output to **one** controller function only. The same output driven by two |
||
| 164 | sources gives undefined behaviour. |
||
| 165 | |||
| 166 | Mode indicators, dash gauges, and the rest can wait until the car drives. |
||
| 167 | |||
| 168 | ## Step 8 — Re-read your config before applying power |
||
| 169 | |||
| 170 | Before you leave USB safe mode, do a quick self-review. Most first-config problems are |
||
| 171 | one of these (the full list is under *Common conceptual errors* on |
||
| 172 | [Configuration Concepts](Configuration_Concepts)): |
||
| 173 | |||
| 174 | - two sources assigned to the same input; |
||
| 175 | - a CAN network defined but with no preset assigned to it; |
||
| 176 | - an output with no controller driving it; |
||
| 177 | - assuming a missing **mandatory** signal will be emulated (it will not — it faults); |
||
| 178 | - transmission and ECU presets on the wrong networks. |
||
| 179 | |||
| 180 | Save the config. |
||
| 181 | |||
| 182 | ## Step 9 — Validate on the bench |
||
| 183 | |||
| 184 | Now bring up bench or vehicle power and check, in order. These mirror the checks in |
||
| 185 | [Getting Started](Getting_Started_with_IOcan#5-First-Power-Up-with-Vehicle-or-Bench-Power): |
||
| 186 | |||
| 187 | 1. Connect BAT+, GND and KL15. Use a **current-limited supply** on a bench. |
||
| 188 | 2. Assert KL15. IOcan should become visible in the tool and CAN traffic should appear. |
||
| 189 | 3. Confirm **transmission parameters show up in the datalogger** and there are **no |
||
| 190 | communication fault codes**. |
||
| 191 | 4. **Current-draw sanity check:** with a full valve body installed and the engine off, |
||
| 192 | current through IOcan should not exceed roughly **2 A**. A much higher figure |
||
| 193 | means stop and investigate before going further. |
||
| 194 | 5. Exercise your shift inputs and watch the requested vs. actual gear in the datalogger. |
||
| 195 | 6. Check that your outputs behave — reverse light on in R, gear display tracking. |
||
| 196 | |||
| 197 | If any of these fail, the cause is almost always in wiring or in one of the steps above |
||
| 198 | — work back through them rather than pushing on. |
||
| 199 | |||
| 200 | ## Step 10 — First controlled drive |
||
| 201 | |||
| 202 | Only once the bench checks are clean: move to a controlled environment and verify |
||
| 203 | behaviour under load — clean engagements, sensible shift points, torque handling during |
||
| 204 | shifts. Keep validating in small increments. This is the point where your first config |
||
| 205 | stops being a setup exercise and becomes a tune you refine. |
||
| 206 | |||
| 207 | --- |
||
| 208 | |||
| 209 | ## Where to go next |
||
| 210 | |||
| 211 | - [Configuration Concepts](Configuration_Concepts) — the model behind every step here |
||
| 212 | - [Configuring Inputs](Configuring_Inputs) and [Configuring Outputs](Configuring_Outputs) — the full reference for every IO type |
||
| 213 | - [Working with the CAN Bus](Working_with_the_CAN_Bus) — networks, presets, raw frames, timeouts |
||
| 214 | - [Supported transmissions](Supported_transmissions) — what is supported and transmission-specific notes |
||
| 215 | - [CAN Gateway Pinout](CAN_Gateway_Pinout) — pinouts for the physical side |