【Neurosky】:MATLAB讀取專注度資料
“腦機介面”技術這兩年逐漸得到世界關注。
特斯拉CEO埃隆馬斯克(Elon Musk) 創辦Neuralink公司致力於實現“人機融合”;Facebook公佈了building8部分,其一個直接目標是“開發一個能讓人每分鐘輸入100個單詞的腦機系統”;科大訊飛在其釋出會上展示腦控家居等互動技術……行業巨頭的入局,極大推動了整個腦機介面行業的發展。國內外腦機介面的公司較多,其中比較有代表性的是“Neurosky”,其開發的TGAM平臺可以檢測人大腦的“專注度”從而來實現對一些裝置的“意念控制”。
本文利用MATLAB串列埠讀取Neurosky的“專注度”資料,可用於所有使用Neurosky腦電採集方案的裝置
1.資料格式
利用串列埠助手,獲取到Neurosky的串列埠資料,可以看到,其1秒傳送513個數據包,其中包括512個小包+1個大包。而我們所需要的專注度就在最後這一個大包裡,所以專注度資料的取樣頻率僅為1Hz。
大包資料有36個位元組,每個位元組的意義如下,其中專注度資料在倒數第四個位元組:
AA 同步
AA 同步
20 是十進位制的32,即有32個位元組的payload,除掉20本身+兩個AA同步+最後校驗和
02 代表訊號值Signal
C8 訊號的值
83
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
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);