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.