1. 程式人生 > >【Neurosky】:MATLAB讀取專注度資料

【Neurosky】:MATLAB讀取專注度資料

   “腦機介面”技術這兩年逐漸得到世界關注。
   特斯拉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);