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.
You need:
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.
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.
rc-car-steering — two RC servos, one for steering and one for
a throttle ESC. steering_throttle lobe over
intent:ground-drive-2d. Maps directly onto a hobby RC-car
chassis.differential-2wheel (was rc-car) — two motors tagged
{wheel, left/right, motor}, differential_drive lobe
consuming intent: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 a
legCount parameter (default 6).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.controller_config row 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.
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 / relay |
| Name | 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.json file under <personality>/fixo/presets/.
The Fixo Studio reference has the full UI tour.
Once you have a preset:
Compiling → CompileSucceeded. Progress and any compiler diagnostics show inline.Flashing → FlashSucceeded, writing the AVR ELF to the connected board via stk500v2.Loading → Running, opening the numex serial link and (when wired) loading the matched native .so for node-side lobe execution.The state machine is documented in the FixoRuntime reference.
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:
intent:ground-drive-2d on the active stanza. The joystick maps to forward/yaw; the optional-port bank surfaces parking brake, horn, and any other absorbed switches. Drives the differential_drive lobe (wheels or tracks) and the legged_gait_2d face interchangeably — the activity doesn't care about robot morphology.CarSteeringWidget for ground-drive-shaped stanzas, SliderBankWidget for everything else).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 |
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 |
Fixo requires a rebuild after every preset change. Click Build and Inject again to compile and flash the updated firmware.
| 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 |