【Neurosky】:MATLAB讀取專注度數據

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/u011389706/article/details/81433171

   “腦機接口”技術這兩年逐漸得到世界關注。
   特斯拉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專注度數據】
  是以爲記!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章