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にOpenCVを導入して画像を読込み&表示&拡大縮小してみる

(0)目次&概説 (1) OpenCVとは (2) OpenCVのインストール  (2-1) インストール資源の入手  (2-2) インストール時の注意事項  (2-3) インストールの実行 (3) …

Pythonのコンストラクタの基礎と「self」や「__init__」について

<目次> (1) Pythonのコンストラクタの基礎と「self」や「__init__」について  (1-1) 「__init__」やコンストラクタについて  (1-2) コンストラクタで使われる「s …

Slack AppのWorkflow Stepsの使い方

  <目次> (1) Slack AppのWorkflow Stepsの使い方  (1-0) やりたいこと  (1-1) STEP1:Slackボットの開発(所要時間:60分)  (1-2) …

no image

Azure Cognitive Searchを行うPythonプログラム(ドキュメント検索)

  <目次> Azure Cognitive Searchを行うPythonプログラム(ドキュメント検索)  STEP0:前提条件  STEP1:キーとURLの取得  STEP2:セマンティ …

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

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

  • English (United States)
  • 日本語
Top