【Neurosky】:MATLAB读取专注度数据

2019-04-14 17:27发布

   “脑机接口”技术这两年逐渐得到世界关注。
   特斯拉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专注度数据】
  是以为记!