OpenBCI-搭建你的第一个脑电采集系统

OpenBCI-搭建你的第一个脑电采集系统

一、引言:动手实践的时刻到了

在前两篇文章中,我们了解了脑机接口的基本概念和OpenBCI硬件选型。现在,让我们真正动手搭建第一个脑电采集系统。这将是你BCI之旅的重要里程碑。

本文将详细介绍从硬件准备到软件配置的完整流程,帮助你成功采集第一段脑电数据。

二、所需硬件清单

2.1 核心组件

组件 说明 推荐型号
采集板 EEG信号采集核心 Cyton或Ganglion
电极 信号采集传感器 Ag/AgCl湿电极
电极帽/头带 固定电极位置 Ultracortex或弹性头带
导电凝胶 降低电极阻抗 EEG导电膏
USB适配器 Cyton需要 OpenBCI USB Dongle
电池 设备供电 锂电池组

2.2 推荐工具

工具 用途
酒精棉片 清洁头皮
医用胶带 固定电极
镊子 连接电极线
万用表 检查电极连接

三、硬件连接步骤

3.1 准备工作

准备工作
清洁工作区
检查设备完整性
测试电池电量
准备电极材料

3.2 电极连接流程

用户头部 电极 OpenBCI板 用户 用户头部 电极 OpenBCI板 用户 用酒精棉片清洁头皮 涂抹导电凝胶 放置电极到目标位置 连接电极线到对应通道 连接参考电极(SRB) 连接驱动地(BIAS)

3.3 电极连接规范

通道 电极位置 用途
CH1 FP1 前额叶左
CH2 FP2 前额叶右
CH3 F3 额叶左
CH4 F4 额叶右
CH5 C3 中央区左
CH6 C4 中央区右
CH7 P3 顶叶左
CH8 P4 顶叶右
SRB 参考电极 信号参考点
BIAS 驱动地 共模抑制

3.4 Cyton连接示例

头部位置
Cyton主板接口
CH1
红色电极
CH2
黄色电极
CH3
绿色电极
CH4
蓝色电极
SRB
黑色参考电极
BIAS
白色驱动地
GND
地线
FP1
FP2
C3
C4
A1
A2

3.5 Ganglion连接示例

头部位置
Ganglion板接口
GND
地线
REF
参考电极
IN1
通道1电极
IN2
通道2电极
IN3
通道3电极
IN4
通道4电极
FP1
FP2
C3
C4
A1

四、软件安装与配置

4.1 安装OpenBCI GUI

Windows系统
bash 复制代码
# 下载最新版本
# 访问 https://openbci.com/downloads
# 解压并运行 OpenBCI_GUI.exe
macOS系统
bash 复制代码
# 下载dmg文件
# 拖放到Applications文件夹
# 首次运行需在系统设置中允许
Linux系统
bash 复制代码
# 克隆仓库
git clone https://github.com/OpenBCI/OpenBCI_GUI.git
cd OpenBCI_GUI
# 安装依赖(Processing)

4.2 安装BrainFlow SDK

bash 复制代码
# 使用pip安装
pip install brainflow

# 验证安装
python -c "import brainflow; print(brainflow.__version__)"

4.3 安装Python科学计算库

bash 复制代码
# 安装核心库
pip install numpy scipy matplotlib pandas

# 安装高级EEG分析库
pip install mne pyriemann

五、首次数据采集实战

5.1 使用OpenBCI GUI采集

Cyton
Ganglion
启动OpenBCI GUI
选择设备类型
选择Serial Port
选择Bluetooth
点击Connect
配置采样参数
启用滤波
点击Start
观察实时波形
点击Record
采集数据
点击Stop
保存数据文件

5.2 配置参数说明

参数 默认值 说明
采样率 250Hz 每秒采样点数
增益 24x 信号放大倍数
陷波滤波 50/60Hz 消除工频干扰
带通滤波 0.5-50Hz 保留脑电频段

5.3 信号质量检查







检查信号质量
各通道波形正常?
检查电极连接
重新清洁头皮
增加导电凝胶
存在50Hz干扰?
启用陷波滤波
波形饱和?
降低增益设置
信号质量良好

5.4 观察α波现象

这是一个经典的入门实验:
波形显示 OpenBCI系统 用户 波形显示 OpenBCI系统 用户 高频、低振幅 8-13Hz、高振幅 保持睁眼状态 显示β波为主的波形 闭上眼睛 显示α波为主的波形 再次睁开眼睛 恢复β波为主

六、Python代码采集示例

6.1 使用BrainFlow采集数据

python 复制代码
from brainflow.board_shim import BoardShim, BrainFlowInputParams, BoardIds
import time
import matplotlib.pyplot as plt
import numpy as np

# 配置参数
params = BrainFlowInputParams()
params.serial_port = "COM3"  # Windows
# params.serial_port = "/dev/ttyUSB0"  # Linux

# 初始化设备
board_id = BoardIds.CYTON_BOARD.value
board = BoardShim(board_id, params)

# 开始采集
board.prepare_session()
board.start_stream()

print("开始采集数据...")
time.sleep(10)  # 采集10秒

# 获取数据
data = board.get_board_data()

# 停止采集
board.stop_stream()
board.release_session()

# 处理数据
eeg_channels = BoardShim.get_eeg_channels(board_id)
sampling_rate = BoardShim.get_sampling_rate(board_id)

# 绘制波形
plt.figure(figsize=(12, 8))
for i, channel in enumerate(eeg_channels[:4]):
    plt.subplot(4, 1, i+1)
    plt.plot(data[channel][:500])
    plt.title(f"Channel {channel+1}")
    plt.ylabel("μV")

plt.xlabel("Samples")
plt.tight_layout()
plt.show()

6.2 实时数据可视化

python 复制代码
from brainflow.board_shim import BoardShim, BrainFlowInputParams, BoardIds
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np

params = BrainFlowInputParams()
params.serial_port = "COM3"
board_id = BoardIds.CYTON_BOARD.value
board = BoardShim(board_id, params)

# 初始化
board.prepare_session()
board.start_stream()

# 设置绘图
fig, ax = plt.subplots()
line, = ax.plot([], [], lw=2)
ax.set_ylim(-100, 100)
ax.set_xlim(0, 250)

# 数据缓冲区
buffer_size = 250
data_buffer = np.zeros(buffer_size)

def update(frame):
    global data_buffer
    # 获取最新数据
    data = board.get_current_board_data(10)
    eeg_data = data[1]  # 通道1
    
    # 更新缓冲区
    data_buffer = np.roll(data_buffer, -len(eeg_data))
    data_buffer[-len(eeg_data):] = eeg_data
    
    line.set_data(range(buffer_size), data_buffer)
    return line,

ani = animation.FuncAnimation(fig, update, interval=50, blit=True)
plt.show()

# 清理
board.stop_stream()
board.release_session()

七、数据格式与保存

7.1 OpenBCI GUI数据格式

GUI默认保存为TXT格式(CSV格式):

复制代码
Sample Index, EXG Channel 0, EXG Channel 1, EXG Channel 2, EXG Channel 3, EXG Channel 4, EXG Channel 5, EXG Channel 6, EXG Channel 7, Accel Channel 0, Accel Channel 1, Accel Channel 2, Other
0, 0.00123, -0.00045, 0.00089, ...
1, 0.00145, -0.00032, 0.00091, ...
...

7.2 BrainFlow数据格式

python 复制代码
# data是一个二维数组
# 行:通道(EEG通道 + 加速度计 + 其他)
# 列:采样点
eeg_channels = BoardShim.get_eeg_channels(board_id)
accel_channels = BoardShim.get_accel_channels(board_id)
timestamp_channel = BoardShim.get_timestamp_channel(board_id)

7.3 数据保存示例

python 复制代码
import numpy as np
import pandas as pd

# 使用numpy保存
np.save('eeg_data.npy', data)

# 使用pandas保存为CSV
df = pd.DataFrame(data.T, columns=[f'ch{i}' for i in range(data.shape[0])])
df.to_csv('eeg_data.csv', index=False)

# 加载数据
loaded_data = np.load('eeg_data.npy')

八、常见问题排查

8.1 设备连接问题

问题 原因 解决方案
设备未检测到 驱动未安装 安装FTDI驱动
COM端口不存在 设备未连接 检查USB连接
蓝牙配对失败 设备已配对 清除蓝牙配对记录
连接后立即断开 电池电量低 充电或更换电池

8.2 信号质量问题







信号问题排查
波形是否平坦?
检查电极是否连接
检查电极线是否断裂
是否有大幅噪声?
检查是否使用电池供电
远离干扰源
启用滤波
是否有50Hz尖峰?
启用50Hz陷波滤波
信号质量正常

8.3 数据采集问题

问题 原因 解决方案
数据丢包 通信距离过远 靠近接收器
采样率不稳定 USB供电不足 使用独立电源
文件保存失败 权限不足 更换保存路径

九、实验记录与分析

9.1 实验记录模板

日期 设备型号 电极配置 实验任务 数据文件 备注
2024-01-15 Cyton FP1, FP2, C3, C4 α波实验 eeg_20240115_001.txt 睁眼/闭眼对比
2024-01-16 Cyton C3, Cz, C4 运动想象 eeg_20240116_001.txt 左手/右手想象

9.2 基础数据分析

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import welch

# 加载数据
data = np.load('eeg_data.npy')
eeg_data = data[1]  # 通道1
fs = 250  # 采样率

# 计算功率谱密度
freqs, psd = welch(eeg_data, fs=fs, nperseg=256)

# 绘制频谱图
plt.figure(figsize=(10, 6))
plt.semilogy(freqs, psd)
plt.xlabel('Frequency (Hz)')
plt.ylabel('Power Spectral Density (μV²/Hz)')
plt.title('EEG Power Spectrum')
plt.xlim(0, 50)
plt.grid(True)
plt.show()

# 计算各频段功率
bands = {'delta': (1, 4), 'theta': (4, 8), 'alpha': (8, 13), 'beta': (13, 30)}
band_power = {}
for band, (low, high) in bands.items():
    mask = (freqs >= low) & (freqs <= high)
    band_power[band] = np.mean(psd[mask])
    print(f"{band}: {band_power[band]:.4e} μV²/Hz")

十、总结

恭喜你成功搭建了第一个脑电采集系统!这是BCI学习之旅的重要一步。

10.1 完成的任务

  1. ✅ 硬件连接与准备
  2. ✅ 软件安装与配置
  3. ✅ 首次数据采集
  4. ✅ 信号质量检查
  5. ✅ 观察α波现象
  6. ✅ Python编程采集

10.2 下一步计划

在下一篇文章中,我们将深入学习OpenBCI GUI的高级功能,包括实时信号处理、频谱分析和数据导出等。


**继续探索脑机接口的奇妙世界!**下一篇我们将学习OpenBCI GUI的高级使用技巧。

本文是《OpenBCI从入门到精通》系列的第3篇。

关键字:脑电采集、OpenBCI、硬件连接、数据采集、Python、BrainFlow


相关推荐
DreamLife☼13 小时前
OpenBCI-硬件选型:Cyton vs Ganglion对比分析
硬件·分析·选型·对比·openbci·cyton·ganglion
隔壁大炮2 天前
MNE-Python 第8天学习笔记:时频分析(ERD/ERS)
python·eeg·mne·脑电数据处理
隔壁大炮3 天前
MNE-Python 第9天学习笔记:源定位基础
python·eeg·mne·脑电数据处理
隔壁大炮3 天前
MNE-Python 第6天学习笔记:分段(Epoching)与基线校正
python·eeg·mne·脑电数据处理
隔壁大炮3 天前
MNE-Python 第7天学习笔记:事件相关电位(ERP)分析
python·eeg·mne·脑电数据处理
隔壁大炮4 天前
MNE-Python 第4天学习笔记:数据预处理(一)—— 滤波与重参考
python·eeg·mne·脑电数据处理
隔壁大炮5 天前
MNE-Python 第3天学习笔记:事件与标记处理
python·eeg·mne·脑电数据处理
隔壁大炮5 天前
MNE-Python 第5天学习笔记:数据预处理(二)—— 伪迹处理
python·eeg·mne·脑电数据处理
隔壁大炮5 天前
MNE-Python 第1天学习笔记:环境搭建与数据初探
python·eeg·bci·mne·脑电数据处理