Hardware
Devices
IronBCI
Specification

Specification

Everything you need to know about the hardware, plus the BLE data format for writing your own software.

IronBCI-8 boards: ADC, BLE and power

Hardware

Channels8 biosignal inputs
Extra inputsReference and bias
Analog front endTexas Instruments ADS1299
Resolution24-bit, delta-sigma, all channels sampled at the same moment
Sample rate250 SPS
Internal noiseBelow 1 µV (from the IronBCI paper)
SignalsEEG, EMG, ECG, EOG
ElectrodesDry or wet Ag/AgCl
Electrode connector2.54 mm pin header
MicrocontrollerSTM32
WirelessBluetooth Low Energy
ConstructionThree stacked round boards: ADC board, BLE board, power board

Power

BatterySingle-cell LiPo, 200 mAh recommended
Battery connector2.0 mm JST, underside of the stack. Check polarity.
ChargingMicro USB, 5 V
Switch 1Battery on / off
Switch 2Data flow on / off (OFF while charging)
LEDsLED 1: charging · LED 2: charged · BLE LED: connected
IsolationBattery powered. Never connected to a person while charging.

Software support

SoftwareSetting
PiEEG CloudPiEEG Devices → IronBCI
PiEEG Server--device ironbci8 (needs pieeg-server[ironbci])
JavaScript SDKdevice: 'ironbci-8' (default)
Python SDK (opens in a new tab)bleak, device name EAREEG
Android app (opens in a new tab)Settings → 8 ch

BLE data format

Advertised nameEAREEG (some units: IronBCI or IRONBCI)
Service UUID0000fe42-8e22-4541-9d4c-21edae82ed19
Data characteristic0000fe42-8e22-4541-9d4c-21edae82ed19 (notify)
PairingNot needed. Connect directly and subscribe to notifications.

Each sample is 24 bytes: 8 channels × 3 bytes.

BytesContent
1–3Channel 1
4–6Channel 2
……
22–24Channel 8

Each channel is a 24-bit, big-endian, two's-complement value. A notification can carry one or more samples back to back, so read it in 24-byte steps.

Converting to microvolts

This is the conversion used by the IronBCI SDK and PiEEG Server:

raw = (b[0] << 16) | (b[1] << 8) | b[2]   # 3 bytes of one channel
if raw & 0x800000:                       # negative value
    raw -= 16777214
uV = raw * 4.5 / 16777215 * 1_000_000    # about 0.268 µV per count

Reading notifications

def on_data(sender, data):
    for s in range(len(data) // 24):              # one or more samples
        sample = data[s*24:(s+1)*24]
        uv = [to_uv(*sample[3*i:3*i+3]) for i in range(8)]
        print(uv)

Full scripts: SDK/BLE_General (opens in a new tab).

Raw values carry a large DC offset (thousands of µV) from the electrode contact. That is normal. Apply a high-pass or band-pass filter (for example 1–40 Hz) before looking at EEG.