
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 完成的任务
- ✅ 硬件连接与准备
- ✅ 软件安装与配置
- ✅ 首次数据采集
- ✅ 信号质量检查
- ✅ 观察α波现象
- ✅ Python编程采集
10.2 下一步计划
在下一篇文章中,我们将深入学习OpenBCI GUI的高级功能,包括实时信号处理、频谱分析和数据导出等。
**继续探索脑机接口的奇妙世界!**下一篇我们将学习OpenBCI GUI的高级使用技巧。
本文是《OpenBCI从入门到精通》系列的第3篇。
关键字:脑电采集、OpenBCI、硬件连接、数据采集、Python、BrainFlow
