Specification

Hardware
| Channels | 8 biosignal inputs |
| Extra inputs | Reference (shared by all channels) and bias |
| Analog front end | Texas Instruments ADS1299 |
| Resolution | 24-bit, delta-sigma, all channels sampled at the same moment |
| Sample rate | 250 SPS |
| Signals | EEG, EMG, ECG, EOG |
| Electrodes | Dry or wet Ag/AgCl, 2.54 mm header |
| Host | STMicroelectronics NUCLEO-WB55 (STM32WB55: Arm Cortex-M4 application core, Cortex-M0+ radio core) |
| Wireless | Bluetooth LE |
| Firmware | Micro_BCI.hex + STM32WB BLE stack, flashed with STM32CubeProgrammer |
| Power | 5 V via the Nucleo's Micro-USB, from a small power bank |
| Isolation | None. Battery operation is required. |
Software support
| Software | Setting |
|---|---|
| Python SDK (opens in a new tab) | bleak, by address or name EAREEG |
| Android app (opens in a new tab) | Settings → 8 ch |
| PiEEG Cloud | PiEEG Devices → IronBCI |
| PiEEG Server | --device ironbci8 |
Bluetooth data format
The same protocol as IronBCI:
| Advertised name | EAREEG |
| Data characteristic (notify) | 0000fe42-8e22-4541-9d4c-21edae82ed19 |
| Sample | 8 channels × 3 bytes = 24 bytes, 24-bit big-endian two's complement. A notification can carry one or more samples. |
Converting to microvolts
raw = (b[0] << 16) | (b[1] << 8) | b[2]
if raw & 0x800000:
raw -= 16777214
uV = raw * 4.5 / 16777215 * 1e6 # about 0.268 µV per countMinimal Python reader
import asyncio
from bleak import BleakClient
ADDRESS = "00:80:E1:XX:XX:XX" # your board
CHAR = "0000fe42-8e22-4541-9d4c-21edae82ed19"
def to_uv(b0, b1, b2):
raw = (b0 << 16) | (b1 << 8) | b2
if raw & 0x800000:
raw -= 16777214
return raw * 4.5 / 16777215 * 1e6
def on_data(_, data):
for s in range(len(data) // 24):
sample = data[s*24:(s+1)*24]
print([round(to_uv(*sample[3*i:3*i+3]), 1) for i in range(8)])
async def main():
async with BleakClient(ADDRESS) as client:
await client.start_notify(CHAR, on_data)
await asyncio.sleep(10)
asyncio.run(main())Raw values carry a large DC offset from the electrode contact. That is normal. Apply a band-pass filter (for example 1–40 Hz) before looking at EEG.