Uses Python, BrainFlow, and pylsl to read data from Open BCI board and send it as Lab Streaming Layer (LSL) streams.
Install dependencies in your environment with:
pip install --upgrade numpy brainflow pylsl pyserial PyYAML
Steps:
- Set up your own settings file. An example of such file is included in this repo as
settings8.yml
. If you are not going to use Arduino as a source of triggers, just comment out lines 25-33. To see what channel commands (sent to Cyton board) mean, go to Cyton channels commands. A full description can be found in Open BCI docs. In this examplary file only channels 1-6 are powered up. Default commands are defined as a constant inobci_brainflow_lsl.py
- Set up your EEG (and Arduino if needed), check signal quality using OpenBCI GUI
- Run the script with a command including one required argument
--set
with the name of a YAML file containing settings:python obci_brainflow_lsl.py --set settings8.yml
and continue with the steps (initiating the session, sending commands, commencing the stream) until the LSL stream is established - Record all your LSL streams (continuous data and markers) using e.g. Lab Recorder to one *.XDF file
- View and analyze your data using free software e.g. EEGLab or Python MNE library
My Cyton setup:
Channel nr | Electrode(s) position | Cyton Board Pin | Board command |
---|---|---|---|
1 | -VEOG | Bottom N1P | x1040100X |
+VEOG | Top N1P | ||
2 | Fz | Bottom N2P | x2060110X |
3 | C3 | Bottom N3P | x3060110X |
4 | C4 | Bottom N4P | x4060110X |
5 | P3 | Bottom N5P | x5060110X |
6 | P4 | Bottom N6P | x6060110X |
7 | - | - | x7161000X |
8 | - | - | x8161000X |
REF | A1 | Bottom SRB (SRB2) | - |
BIAS | AFz | Bottom BIAS | - |
My Arduino circuit:
The script (written in Python 3.8) enables to stream in parallel several types of data via LSL:
- Open BCI board channels such as EXG/EEG and AUX (accelerometer; if you want to use it, just uncomment line 13 in the settings file)
- Triggers/markers from serial port connected to Arduino board, e.g. photosensors, switch etc. (an example of a simple sketch is included in
trigger_photo.ino
file)
The script has been tested only on Windows with Cyton + Dongle and Cyton + Daisy + Dongle, for now. Any feedback from tests performed on other platforms will be much appreciated.
This program is based on a script originally created by @retiutut. I was also inspired by a similar project OpenBCI_LSL
CHANNEL | POWER_DOWN | GAIN_SET | INPUT_TYPE_SET | BIAS_SET | SRB2_SET | SRB1_SET | ||
---|---|---|---|---|---|---|---|---|
x | 1-8* | 0-1 | 0-6 | 0-7 | 0-1 | 0-1 | 0-1 | X |
0 Gain 1 | 0 NORMAL | |||||||
1 Gain 2 | 1 SHORTED | |||||||
2 Gain 4 | 2 BIAS_MEAS | |||||||
3 Gain 6 | 3 MVDD | |||||||
4 Gain 8 | 4 TEMP | |||||||
5 Gain 12 | 5 TESTSIG | |||||||
6 Gain 24 | 6 BIAS_DRP | |||||||
7 BIAS_DRN | ||||||||
x | 1 | 0 | 4 | 0 | 0 | 0 | 0 | X |
x | 2 | 0 | 6 | 0 | 1 | 1 | 0 | X |
x | 7 | 1 | 6 | 1 | 0 | 0 | 0 | X |
*channels 9-16 are labeled Q,W,E,R,T,Y,U,I