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でSQLAlchemyを使ってOracleDBに接続する際に遭遇したエラーとその対処方法

本記事は次の記事の続編です。 (下記記事の手順を実行する際に遭遇したエラーについての備忘録) PythonでSQLAlchemyを使ってOracleDBに接続する方法 (0) 目次 (4) エラー対応 …

Pythonのdatapackage学習中に遭遇したエラー「StopIteration」と「AttributeError」の対応

(0)目次&概説 (1) 記事の目的 (2) エラー1:AttributeError: ‘generator’ object has no attribute ‘n …

no image

FlaskアプリをAzure App Serviceにデプロイする手順

  <目次> (1) FlaskアプリをAzure App Serviceにデプロイする手順  やりたいこと  (1-0) 前提事項  (1-1) STEP1:Flaskアプリの準備  (1 …

Pythonでcsvを読み込んでデータベース化する方法~pandasのto_sqlを用いたテーブルへのINSERT~

<目次> (1) Pythonでcsvを読み込んでデータベース化する方法  (1-1) 構文(to_sql)  (1-2) 構文(to_sql)の引数  (1-3) サンプルプログラム (1) Pyt …

no image

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

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

  • English (United States)
  • 日本語
Top