“脑机接口”技术这两年逐渐得到世界关注。
特斯拉CEO
埃隆马斯克(Elon Musk) 创办Neuralink公司致力于实现“人机融合”;
Facebook公布了building8部分,其一个直接目标是“开发一个能让人每分钟输入100个单词的脑机系统”;
科大讯飞在其发布会上展示脑控家居等交互技术……行业巨头的入局,极大推动了整个脑机接口行业的发展。国内外脑机接口的公司较多,其中比较有代表性的是“Neurosky”,其开发的TGAM平台可以检测人大脑的“专注度”从而来实现对一些设备的“意念控制”。
本文利用MATLAB串口读取Neurosky的“专注度”数据,可用于
所有使用Neurosky脑电采集方案的设备,例如Mindwave、Brainlink、TGAM模块等,源代码可以从这里下载
【MATLAB获取neurosky专注度数据】
1.数据格式
利用串口助手,获取到Neurosky的串口数据,可以看到,其
1秒发送513个数据包,其中包括
512个小包+1个大包。而我们所需要的专注度就在最后这一个大包里,所以专注度数据的采样频率仅为
1Hz。
大包数据有36个字节,每个字节的意义如下,其中专注度数据在倒数第四个字节:
AA 同步
AA 同步
20 是十进制的32,即有32个字节的payload,除掉20本身+两个AA同步+最后校验和
02 代表信号值Signal
C8 信号的值
83 代表EEG Power开始了
18 是十进制的24,说明EEG Power是由24个字节组成的,以下每三个字节为一组
18 Delta 1/3
D4 Delta 2/3
8B Delta 3/3
13 Theta 1/3
D1 Theta 2/3
69 Theta 3/3
02 LowAlpha 1/3
58 LowAlpha 2/3
C1 LowAlpha 3/3
17 HighAlpha 1/3
3B HighAlpha 2/3
DC HighAlpha 3/3
02 LowBeta 1/3
50 LowBeta 2/3
00 LowBeta 3/3
03 HighBeta 1/3
CB HighBeta 2/3
9D HighBeta 3/3
03 LowGamma 1/3
6D LowGamma 2/3
3B LowGamma 3/3
03 MiddleGamma 1/3
7E MiddleGamma 2/3
89 MiddleGamma 3/3
04 代表专注度Attention
00 专注度Attention的值(0到100之间)
05 代表放松度Meditation
00 Meditation的值(0到100之间)
D5 校验和
2.串口配置(主程序)
串口号: COM6(根据自己的设备连接的串口号进行更改),
BaudRate: 波特率57600
Parity:无校验位
BytesAvailableFcnCount:获取288字节数触发回调函数
BytesAvailableFcnMode: 触发事件为‘bytes-aviliable Event’
BytesAvailableFcn :设置回调函数CallBackNeuroskyCom
Terminator: 终止符为 CR(回车) LF(换行) ‘Terminator’,’CR/LF’,…
timeout :设置一次读写操作最大完成时间
global neurosky_scom
neurosky_Port = 'COM6'; %Neurosky连接到的串口
neurosky_scom = serial(char(neurosky_Port));
set(neurosky_scom, 'BaudRate', 57600,...
'Parity', 'none',...
'BytesAvailableFcnCount', 288,...
'BytesAvailableFcnMode', 'byte',...
'BytesAvailableFcn', @CallBackNeuroskyCom,...
'timeout',1);
try
fopen(neurosky_scom);
catch
msgbox('串口不可获得!');
return;
end
3.串口回调函数(CallBackNeuroskyCom)
根据上面串口配置,当串口中有
288个字节时,触发执行串口回调函数CallBackNeuroskyCom。我们在回调函数里执行数据解码,读出专注度数据。
function CallBackCom(obj,event)
global neurosky_scom
global buffer_attention_data
global attention_data
neurosky_data = fread(neurosky_scom,288,'uint8');
for i = 1:length(neurosky_data)-32
if neurosky_data(i) == hex2dec('AA')
if neurosky_data(i+1) == hex2dec('AA')
if neurosky_data(i+2) == hex2dec('20')
if neurosky_data(i+3) == hex2dec('02')
if neurosky_data(i+5) == hex2dec('83')
if neurosky_data(i+6) == hex2dec('18')
if neurosky_data(i+31) == hex2dec('04')
attention_data = neurosky_data(i+32);
buffer_attention_data = [buffer_attention_data(2:end); attention_data];
disp(attention_data);
break;
end
end
end
end
end
end
end
end
end
4.实验结果
将Neurosky头带正确佩戴,连接电脑蓝牙串口(我的连接到COM6)。MATLAB运行主程序,可以看到窗口中实时输出专注度数据。
随着注意力的集中,该数值逐渐变大,其范围为(0-100),采样频率1Hz。
后面为了更直观,我们将实时采集到的专注度数据输入到GUI里,如下图所示,可以看到实时滚动的波形:
5.关闭串口
编写串口关闭函数,运行即可关闭串口。
global neurosky_scom
try
fclose(neurosky_scom);
catch err
msgbox(
return
end
delete(neurosky_scom);
源代码可以从这里下载
【MATLAB获取neurosky专注度数据】
是以为记!