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