BBR Digital Expander Documentation

Choose your platform#

The Expander is an I2C target. That is the whole interface: one 7-bit address, a register map behind it, 100 or 400 kHz, no vendor runtime and no special host. Anything that can be an I2C master can drive the whole board.

Three ready-made drivers ship today, and they are deliberately the same shape — the same two tiers, the same helper names, the same refusals. Learning one teaches you the others.

Platform Driver Language Start at
REV Control Hub / Expansion Hub (FTC) BBRDigitalExpander for the FTC SDK Java Install the driver
Arduino, ESP32, RP2040, SAMD, STM32, Teensy BBRDigitalExpander Arduino library C++ Install the library
Raspberry Pi, and anything else running Linux bbr_digital_expander Python package Python Install the driver

Every page under Guides applies to all three. Where a guide shows code, it shows it for each platform — pick a tab once and the rest of the site follows your choice.

Something else entirely#

Nothing above is a requirement. If your host can write a register pointer and read bytes back, it can use the Expander — the drivers exist to save you work, not to gate access to the hardware.

What you would be implementing is small: read register 0x00 (DEVICE_ID) to confirm what you are talking to, read the 96-byte telemetry block from register 0x10, and write three bytes at register 0x0A to run a command. The three drivers are the reference implementation of that, and they are all MIT licensed, so porting one is a reading exercise rather than a research project.

There is no packaged driver for FRC yet. The board works there — it is the same I2C — but you would be writing the driver, so budget for that rather than assuming a library is waiting. The Python driver is the closest starting point: it is the same two tiers over a bus abstraction small enough to re-point at something else.

Which one do I pick?#

If you are on a Control Hub, the answer is FTC. The driver registers as a hardware device, so the board appears in the robot configuration alongside everything else.

If you are on a Raspberry Pi — or a Jetson, or any other Linux board with an I2C bus — the answer is Python. Install the driver and you are reading sensors in five lines.

If you are on a microcontroller, the Arduino library is the one to start from even when the board is not an Arduino — it is plain C++ over Wire and depends on nothing else.

What differs between them#

Only the things the languages force apart:

FTC (Java) Arduino (C++) Raspberry Pi (Python)
Getting the device hardwareMap.get(...) expander.begin() after Wire.begin() with BBRDigitalExpander() as expander:
A call that fails Throws BBRException Returns false; lastErrorText() says why Raises a BBRError
A heading it cannot trust Throws Returns NAN Raises
A distance out of range Double.POSITIVE_INFINITY INFINITY math.inf
Method naming getEncoderCount(0) encoderCount(0) encoder_count(0)

The board behaves identically whichever you use. Everything else on this site — what the values mean, what the board does with them, what the tuning knobs are for — is the same on both.