Skip to content

Roadmap

Ahmed Dabak edited this page Jul 25, 2026 · 5 revisions

Roadmap

What is planned, in plain language -- no versions, no dates, just the work ahead. Nothing already shipped depends on any of these; each is additive.

Non-blocking motion engine

Today every movement call blocks: Legs::walkForward(2) returns only when the walk is finished, so the robot is blind and deaf while moving. This is the single biggest thing raw OttoDIYLib cannot do.

Planned: movements that run in the background.

Legs::startWalkingForward();
if (Eyes::closerThanCm(15)) Legs::stop();   // react WHILE walking

with Legs::isMoving() to check state and OttoFlow::update() called from loop() to drive the motion step by step. The current API names were chosen specifically so this can be added without breaking any existing sketch. See Movement.

Event system

Instead of polling a sensor yourself every loop, register what should happen and let the framework watch for it.

Events::onObstacleCloserThanCm(15, onObstacle);   // runs when triggered
Events::everyMs(500, blinkMouth);                  // runs on a timer

This removes hand-written if/else state machines from reactive sketches. It depends on the non-blocking engine -- events must be able to fire mid-movement -- so it comes after it.

Bench mode in one call

OttoFlow::benchMode() -- shorthand for the desk-testing setup: all servos detached (Motion::disable()), sounds muted (Voice::mute()), and the serial console started, plus a clear indicator on the matrix that the robot is in test mode. Today that is three calls; see Bench Testing.

Custom icons and animations

The matrix currently offers the built-in OttoDIYLib mouth shapes plus single-pixel drawing. Planned: define your own 8x8 icons and multi-frame animations, and show them like built-ins.

OTTOFLOW_ICON(MyAlien,
  0b00111100,
  0b01111110,
  ...);
Mouth::showCustom(MyAlien);

Stored in flash (PROGMEM), so they cost no RAM. See Mouth.

Arm servo trims

The four leg servos have trims. The two arm servos have none -- they run on the plain Servo library, so a horn seated a few degrees off leaves one arm resting visibly lower than the other, and the only fixes today are reseating the horn or offsetting every angle by hand in your sketch.

Planned: the same treatment the legs already get.

cfg.arms.leftTrim  = 0;
cfg.arms.rightTrim = 5;    // applied to every arm move

Applied inside the ArmServos positioning calls, so that center(), up(), down() and the waves all inherit it -- plus an armtrim console command for the same adjust-and-look loop as trim. See Arms and Calibration.

Servo calibration wizard

The trim API exists (Legs::setTrimsDegrees(), saveTrimsToEeprom()), and the console already sets all four at once:

> trim -4 3 0 -2      (left leg, right leg, left foot, right foot)
> trim save           (stored in EEPROM, loaded on every start)

But you tune four numbers at a time while holding in your head which is which. Planned: one servo at a time, with guided prompts.

> trim wizard
left leg: +/- to adjust, enter to accept

Should cover the arms too, once they have trims of their own. See Calibration.

More add-on modules

Most kit extras already ship (touch, sound sensor, photoresistor, Bluetooth with the app protocol, MPU-6050). Still open, each following the extension guide -- a good way to contribute:

  • RGB LEDs -- mood colours.
  • APDS-9960 -- hand-gesture, colour, and proximity sensor found in some kits.
  • Tilt-reactive behaviours -- use the MPU-6050 to detect a fall and get up, or protest when picked up. The sensor module exists; the behaviours do not yet. See Balance.

Clone this wiki locally