Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

Python ブレインテック

脳波をPythonプログラムで取得して、解析できるようにしたい

投稿日:2023年9月19日 更新日:

 

<目次>

脳波をPythonプログラムで取得して、解析できるようにしたい
 やりたいこと
 STEP1:前提条件(事前準備)
 STEP2:デバイス(MindWave Mobile 2)のCOMポート確認
 STEP3:環境の準備(Python3使用の方)
 STEP4:脳波の取得(プログラム実行)
 エラー対処

脳波をPythonプログラムで取得して、解析できるようにしたい

やりたいこと

・デバイスを使って「脳波」を記録する
・記録した脳波の情報をPythonで取得して、解析できるようにしたい

STEP1:前提条件(事前準備)

以下の手順に従い、脳波取得デバイス「MindWave Mobile 2」の初期設定と疎通をします。

STEP2:デバイス(MindWave Mobile 2)のCOMポート確認

・①デバイスマネージャー」を開きます。
・②「ポート(COM & LPT)」を展開。
・③以下に該当するエントリを探します(Bluetooth接続を示すエントリ)。
∟「Standard Serial over Bluetooth link」
∟「Bluetooth Serial Port」
・④後ろに「(COMxx)」形式でCOMポートの番号が表示されています。
→この番号がMindWave Mobileが接続されているCOMポートの番号です。
(図211)

STEP3:環境の準備(Python3使用の方)

こちらの記事を参考に、thinkgear.pyをPython3に対応させます。
 
・①ご自身のthinkgear.pyを以下のPython3対応版のthinkgear.pyに差し替える 
 
(図311)

 

STEP4:脳波の取得(プログラム実行)

(サンプル)

import thinkgear
import datetime

def main():
    # 出力するCSVファイルのパスを指定
    file_path = "brain_wave_data.csv"

    # フラグを初期化(このフラグは信号品質が良好かどうかを示す)
    wflag = False

    # データを保存するバッファを初期化
    data_buffer = {}

    # CSVファイルを書き込みモードで開く
    with open(file_path, mode="w") as f:
        # CSVファイルのヘッダー行を書き込む
        f.write("datetime, raw_wave, delta, theta, lowalpha, highalpha, lowbeta, highbeta, lowgamma, midgamma, attention, meditation\n")

        # MindWaveからデータパケットを取得
        for pkt in thinkgear.ThinkGearProtocol('COM4').get_packets():
            # データパケット内の各データを処理
            for d in pkt:
                # 信号品質データの場合
                if isinstance(d, thinkgear.ThinkGearPoorSignalData):
                    # 信号品質が良好(値が10未満)であればフラグを立てる
                    if d.value < 10:
                        wflag = True
                    else:
                        wflag = False

                # 生の脳波データの場合
                if wflag and isinstance(d, thinkgear.ThinkGearRawWaveData):
                    # バッファに生の脳波データを保存
                    data_buffer["raw_wave"] = d.value

                # EEGパワーデータの場合
                if wflag and isinstance(d, thinkgear.ThinkGearEEGPowerData):
                    # バッファに各波長のパワーデータを保存
                    data_buffer["delta"] = d.value.delta
                    data_buffer["theta"] = d.value.theta
                    data_buffer["lowalpha"] = d.value.lowalpha
                    data_buffer["highalpha"] = d.value.highalpha
                    data_buffer["lowbeta"] = d.value.lowbeta
                    data_buffer["highbeta"] = d.value.highbeta
                    data_buffer["lowgamma"] = d.value.lowgamma
                    data_buffer["midgamma"] = d.value.midgamma

                # Attentionデータの場合
                if wflag and isinstance(d, thinkgear.ThinkGearAttentionData):
                    # バッファにAttentionデータを保存
                    data_buffer["attention"] = d.value

                # Meditationデータの場合
                if wflag and isinstance(d, thinkgear.ThinkGearMeditationData):
                    # バッファにMeditationデータを保存
                    data_buffer["meditation"] = d.value

            # バッファにすべてのデータが揃ったらCSVファイルに出力
            if "raw_wave" in data_buffer and "delta" in data_buffer and "attention" in data_buffer and "meditation" in data_buffer:
                # CSVファイルに出力
                f.write("{},{},{},{},{},{},{},{},{},{},{},{}\n".format(datetime.datetime.now(), data_buffer["raw_wave"], data_buffer["delta"], data_buffer["theta"], data_buffer["lowalpha"], data_buffer["highalpha"], data_buffer["lowbeta"], data_buffer["highbeta"], data_buffer["lowgamma"], data_buffer["midgamma"], data_buffer["attention"], data_buffer["meditation"]))
                # コンソールに出力
                print("datetime: {}, raw_wave: {}, delta: {}, theta: {}, lowalpha: {}, highalpha: {}, lowbeta: {}, highbeta: {}, lowgamma: {}, midgamma: {}, attention: {}, meditation: {}".format(datetime.datetime.now(), data_buffer["raw_wave"], data_buffer["delta"], data_buffer["theta"], data_buffer["lowalpha"], data_buffer["highalpha"], data_buffer["lowbeta"], data_buffer["highbeta"], data_buffer["lowgamma"], data_buffer["midgamma"], data_buffer["attention"], data_buffer["meditation"]))
                # バッファをクリア
                data_buffer.clear()

if __name__ == '__main__':
    main()

エラー対処

●エラー①:
serial.serialutil.SerialException: could not open port ‘COM3’: OSError(22, ‘セマフォがタイムアウトしました。’, None, 121)
 
●原因/対処①
デバイス(MindWave Mobile2)の電源がONになっていない。
 
(図511)

Adsense審査用広告コード


Adsense審査用広告コード


-Python, ブレインテック
-

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

Pythonでcsvのカラム名を変更する方法(Pandasのread_csvで読み込んだcsvのカラム名変更)

<目次> (1) Pythonでcsvのカラム名を変更する方法  (1-1) 構文①  (1-2) サンプルプログラム①  (1-3) 構文②  (1-4) サンプルプログラム② PythonのPan …

PythonのSQLAlchemyで「ArgumentError : Could not parse rfc1738 URL」エラーや「InvalidRequestError: Could not reflect: requested tables(s)」エラーが出た時の対処について

(0)目次&概説 (1) エラー対応1:sqlalchemy.exc.ArgumentError  (1-1) 発生状況・エラーメッセージ   (1-1-1) エラーメッセージ   (1-1-2) エ …

no image

OpenAIでPDFファイルを要約する方法(サンプルプログラムをご紹介)

  <目次> OpenAIでPDFファイルを要約する方法(サンプルプログラムをご紹介)  やりたいこと/概要  サンプルプログラム  動かし方 OpenAIでPDFファイルを要約する方法(サ …

Azure Machine Learningで「OSError: Could not find kaggle.json」が出た時の原因と対処方法について

  <目次> (1) Azure Machine Learningで「OSError: Could not find kaggle.json」が出た時の原因と対処方法について  (1-1) …

Azure FunctionsでPythonのライブラリを追加する方法(依存関係解決)

  <目次> (1) Azure FunctionsでPythonのライブラリを追加する方法(依存関係解決)  (1-1) requirement.txtの設定手順  (1-2) 補足事項 …

  • English (United States)
  • 日本語
Top