Configure Fixo Controller
Set up a Fixo controller with compiled firmware
Set up a Fixo controller to compile your robot's hardware configuration into purpose-built firmware.
Pro Tip
Fixo compiles your configuration directly into the firmware binary. This means zero runtime overhead on the microcontroller, but any configuration change requires a rebuild. The build process is automatic and takes only a few seconds because LLVM/Clang is embedded in the Agent.
Before you start
You need:
- An OctoMY™ Agent running on your computer
- An Arduino board (Uno or Mega 2560) connected via USB
- The Agent must have LLVM/Clang support enabled (included by default)
Two ways to get a preset
Fastest: start from a built-in template (RC car, tracked vehicle, hexapod). The wizard fills in actuators, lobes, and stanza wiring; you just answer "which board?" and a couple of parameters.
Most control: open the Fixo Studio and build a preset by hand from scratch.
The next sections cover both. If you're new to OctoMY™, start with the template flow.
Path A — From a built-in preset template (the Fixo wizard)
The Fixo wizard is the gentle path: a four-page walkthrough that goes from "fresh agent" to "firmware running on the board" with no source reading.
- Launch the wizard from the agent's Set up Fixo entry — it pushes automatically when the controller-config step of the agent unboxing flow is reached. You can also re-enter any time via the agent main menu's Controller row.
- Page 1 — Introduction. A one-sentence overview of what Fixo does. Click Continue; click Learn more for the Fixo overview doc.
- Page 2 — Pick template. A filterable list of templates. The
four default filter toggles are Official / Vetted / Popular /
Unbadged; Official and Vetted are on by default. Templates:
rc-car-steering— two RC servos, one for steering and one for a throttle ESC. steering_throttle lobe overintent:ground-drive-2d. Maps directly onto a hobby RC-car chassis.differential-2wheel(wasrc-car) — two motors tagged{wheel, left/right, motor}, differential_drive lobe consumingintent:ground-drive-2d. Drives any side-by-side differential chassis.tracked-vehicle— two tracks tagged{track, left/right, motor}. Same differential_drive lobe; the wheel-vs-track distinction lives in the actuator semantic tags.hexapod— six legs × three joints, legged_gait lobe with alegCountparameter (default 6).- Manual setup (expert only) at the bottom bails out of the wizard's framing and drops you into the Fixo Studio.
- Page 3 — Configure template. A reactive form built from the
template's declared parameters. Every edit re-runs
PresetTemplate::instantiate()and writes through to the live preset; the Build & Inject band at the bottom reflects the state in real time. There are no Save buttons — the preset is always the latest snapshot of what you've typed. Continue is enabled only when the live instantiate result is complete enough to build. - Page 4 — Build & inject. The centred BuildInjectWidget drives
the compile → flash → handshake pipeline. Click Build to
compile the AVR firmware via the embedded LLVM/Clang, Flash
when a serial port is detected to push the .elf, and watch the
band transition to Running when the firmware responds. Click
Done to exit the wizard with Green completion on the
controller_configrow of the agent unboxing wizard.
The wizard's skip semantics are spelled out in the wizard reference. The headline: you're always free to leave — a Skip — set up Fixo later button is reachable from every page.
For the longer template walkthrough see the Use a preset template how-to.
Path B — From scratch in the Preset Editor
-
Open the Fixo Studio from the Agent main menu.
-
Navigate to Preset Manager and click New to create an empty preset.
-
The Preset Editor opens with empty actuator/sensor/stanza tables.
-
Set the board from the dropdown — populated from the
FixoBoardTypeBook. -
Add actuators — one row per actuator. Columns:
Column Description Type rc_servo/dc_motor/stepper_motor/relayName Free-text label Pin Physical pin number; leave blank to auto-assign Trim Symmetric trim around centre Min / Max Range bounds in actuator-native units Reverse Flip the output sign -
Add sensors — one row per sensor (digital, analog, encoder, limit-switch, tachometer).
-
Add stanzas — each stanza pairs a lobe with an actuator mapping. The stanza-set view at the bottom shows which stanzas share actuators (mutually exclusive sets are derived automatically).
-
Save. The preset persists as a
fixo.jsonfile under<personality>/fixo/presets/.
The Fixo Studio reference has the full UI tour.
Build and inject
Once you have a preset:
- Open the FixoRuntime view (or the Build & Inject screen, if your build still ships the legacy controller activity).
- Click Build. The runtime transitions through
Compiling→CompileSucceeded. Progress and any compiler diagnostics show inline. - Click Inject. The runtime transitions through
Flashing→FlashSucceeded, writing the AVR ELF to the connected board via stk500v2. - Click Start. The runtime transitions through
Loading→Running, opening the numex serial link and (when wired) loading the matched native.sofor node-side lobe execution.
The state machine is documented in the FixoRuntime reference.
Drive the robot from Remote
With a Running runtime, the fixo-runtime ConfigSync section publishes everything Remote needs: channels, per-stanza inputs, scenes, sensor list. The Remote-side activity you pick depends on what control surface fits your robot:
- Ground Drive — the canonical activity for any robot exposing
intent:ground-drive-2don the active stanza. The joystick maps to forward/yaw; the optional-port bank surfaces parking brake, horn, and any other absorbed switches. Drives thedifferential_drivelobe (wheels or tracks) and thelegged_gait_2dface interchangeably — the activity doesn't care about robot morphology. - Scenes — apply a pre-authored multi-channel snapshot with one click. See Author scenes to compose them in Studio first.
- Stanzas — generic per-channel stanza picker for any stanza, with auto-rendered controls (
CarSteeringWidgetfor ground-drive-shaped stanzas,SliderBankWidgetfor everything else). - The Sensor readback row at the bottom updates live as the firmware sends sensor values.
Troubleshooting
Build fails with "firmware too large"
Your firmware exceeds the board's available flash memory.
| Solution | Description |
|---|---|
| Remove unused actuators | Each actuator adds code |
| Switch to Arduino Mega 2560 | 256 KB flash vs 32 KB on Uno |
| Reduce sensors with interrupts | Each interrupt-driven sensor adds ISR code |
Build fails with compilation errors
Check the build log for the specific error. Common causes:
| Cause | Solution |
|---|---|
| Pin conflicts | Two actuators or sensors assigned to the same pin |
| Invalid pin number | Pin number exceeds the board's available pins |
| LLVM not available | The Agent was built without LLVM support — rebuild with OC_USE_FEATURE_LLVM |
Changes don't take effect
Fixo requires a rebuild after every preset change. Click Build and Inject again to compile and flash the updated firmware.
Serial monitor shows garbled data
| Cause | Solution |
|---|---|
| Baud rate mismatch | The numex protocol runs at 115 200 baud; older sketches at 38 400 will look garbled |
| Wrong board selected | Verify the board in your preset matches the connected hardware |