月別アーカイブ: 2022年12月

EMG等 保管庫

Arduinoで生理指標を測る」プログラムを圧縮ファイルに落とし込んだ。

最近、ブログ側の問題でプログラムをコピペすると勝手に全角スペースが入るみたいで、一つずつ手作業で直さないといけないらしい(理由はこれ?)。

今回も同様に全角スペース問題が発生したため、「ECG~SCL (無線はまだ)」までのプログラムを圧縮して下記に添付しておいた。

プログラム
・ECG:心電図
・EMG:筋電図
・EMG2:筋電図の積分値
・SCL:皮膚コンダクタンス水準
・SCC:皮膚コンダクタンス変化

筋電図 (EMG) 測定Ⅰ

長野先生方が執筆された論文「Arduinoで生理指標を測る」で、筋電図(EMG), 心電図(ECG), 計測の動画を作成しようとのことでプロジェクトが動き出した。

今回は計測器作成に用いた資料を基に、「EMG計測器の組み立て」及び「腕・顔の筋電図の計測」をした。回路図・必要パーツは下記の通り。

【回路図】

完成図をもとに順次作成。資料では、ワイヤー (ブラックS)が「f24」に差込と書かれているが、「G24」でもなんら問題はないらしい。

資料通りに各種パーツをブレッドボードに差し込んだら電極を装着。それぞれ、手首の下, 白・赤クリップは近くに配置などなど。

【プログラム(EMG2)】

#include <Wire.h>
#include <Adafruit_ADS1X15.h>
Adafruit_ADS1015 ads;

void setup(void)
{
  Serial.begin(115200);
  // ADS1015 gain 16x  input +/- 0.256V
  ads.setGain(GAIN_SIXTEEN); //ゲインを16倍に設定
  ads.begin();
}

void loop(void)
{
  int16_t results;
  results = ads.readADC_Differential_0_1();  //差動入力   
  
  float multiplier = 0.125F; //ゲイン16倍時の係数
  Serial.print(results * multiplier); 
  Serial.print(",100,-100"); 
  Serial.println();
  delay(0);
}

*プログラム参考:リンク

【注意点】

装着し終えたら計測をするのだが、その前にいくつか注意点がある。

① 計測中はPCの充電をしない
 →体に凄い量の電流が流れ込んでくる恐れがある

②机の上は必要最小限にとどめる
 →ノイズを検出してしまうため、PC充電器は悪影響

充電中のノイズ関連はアースを繋げば多少は抑えられる。

といっても屋外にはかなわないが…

(左:〇  右:×)

てなことで、ノイズが乗らなければ左画像のようにきれいに計測できる。

反対に充電器や3Dプリンタなど稼働中の物があると右画像のようにぶれるようで。以前計測した心電図と言い、どれほど繊細なものなのか実感した。

【計測中】

とりあえず腕の方を計測した。

EMGプログラムでは、力の入れ始めしか検知できていないのでは?との意見もあり、このプログラムをベースに積分した値を算出するEMG2を作成した。

(積分理由は、縦軸:電位の変位を見やすくするため)

(左:EMG 右:EMG2)

赤のライン (100)を超えたり、持続させることは難しかったが、瞬発的になら100超えの値を出すのは簡単だったな。とのことで、今回はここまで。

顔面筋電図の計測は別のブログに投稿したのでそちらを参照していただければ。

Facial EMG

【Facial EMG】

筋電位の延長線上で、顔面筋電位を計測してきた。

腕に装着したみのむしクリップをそのまま顔面に移行した。

装着位置
・黒=眉間
・白=眉近く
・赤=白の隣

しかし、みのむしクリップが重たいせいか計測中に外れることがあり、ヘッドバンド・カチューシャが必須なのかもしれない。重量以外にも顔の油なども事前に拭き取らなければならず、女性の場合化粧を落とすなど不便さが残る。

ネットで調べてみると黒電極は眉間近くではなく、画像の通りおでこ近くらしい。本格的に、顔面の筋電位を計測するのであれば貼る位置も考えねば…と思いきや

先生が約10年前から既にやっていた

電極作成:サイト
EMGアンプ:サイト

もろもろの詳細は上記リンクから確認。これならクリップの重さ等を気にしなくていいし、テープやヘッドバンドで止めればいいからね。

とまあこんな感じで、BF装置で培った基盤作成スキルを考慮して、Facial EMG基盤も作成してみようかと思った次第。できたら投稿しておく。

【途中経過】

たぶん間違ってるけどとりあえず形にできた!

詰めれば、もう少し縦幅を狭められそう。

基板カット時の注意点

今日は、基盤カット・下板の張替えをしてきた。

3Dプリンタ同じく、またやらかしたので順を追って紹介。

【下板】

下板が長期間使用しているとガタガタになって、基盤の完成度が落ちるため、新しい下板と張り替えた。普段、切断している基板より少し分厚いらしい。

【今日のやらかし】

画像の通り、針の長さを出しすぎた状態で基盤カットをしてしまったため、せっかく貼り換えた下板に傷をつけたうえに4,000円の針を壊すとこだった。

同じミスをしないよう詳細を下画像に載せた。

先生に伺ったところ高さ調節は指一本らしい。これを超える・足りないと切れ味が悪くなるうえに、今回のようにミスを起こしてしまう。

念のためマジックペンで印をつけたが、憶えておくと間違えはおこらなくて済む。また、切断時に「ガガガガー」と音が聞こえたらUSB CNCから即座に中止で。

*針付近の黒いのは「プレッシャーフット」と言い、機械が高さを自動調節してくれるらしいから針の高さ調節のみ念頭に置く。

【反応無し】

切断マシーンのUSBをPCに差し込み動かしてみようと思ったものの…動かない。何故??おそらく、あれよね。

Reset (F2)を押していない」「USB接続前にソフトを立ち上げた??」が挙げられる(2つ目は微妙)。

とりあえずReset選択しろみたいなダイアログ表示されるから、その通りに進めれば問題なし。USB CNSの使用方法は以前投稿したブログを参考にしてください。

【グリス】

3Dプリンタと同様に、定期的にグリスを塗って滑りを良くしないと脱調や精度が悪くなるらしい。そのため、定期的にゴミ掃除とグリス塗りを欠かさずに。

塗る位置は、画像で見えている部分と裏の基盤台が動くところ。

【余談】
近々、基盤カット手順の動画をアップする予定。これから始める方・復習したい方はそちらも参考にしていただけると幸いです。何かご要望があれば本ブログのコメントに書き込みor直で気軽にお申し付けください。

12月安全管理委員会

※本記事は公開を想定して書かれています。

先月

11月は重田が安全管理委員長でした。

今月

今月,12月の安全管理委員長になりました大栗です。

東京都ではありますが,感染者数推移は以下のようになっています。

東京都 新型コロナウイルス感染対策サイトより

徐々に感染者数が増加しているように見れます。さらに,私たちは実験室の使用状況を公開しなければならない可能性があります。

よって,これまで以上に感染対策を意識する必要があります。

例えば,「調理者は2名まで」などです。再確認ではありますが,自身の食事は自身で用意するようにしましょう。これによって,学生食堂と同様であると言えます。仮に調理者が2名であっても,「調理器具の受け渡しの際には手指消毒を必ず行う」ようにおねがいします。許容人数的に洗面台付近に3名以上滞在するのは厳しいと思われるためです。

当然ながら「原則マスク着用」は変わらずです。

時間帯によっては,調理場が混雑する可能性があります。その際には,「マスクの着用」をしつつ「速やかに移動する」ように願いします。

2022/12/19M追記

張り紙を出しました。また,入り口側にもQRコードを追加しました。

Fitbit/Python Instructions

※本記事は公開を想定して書かれています。

前回のあらすじ

データを取得した。

今回

Pythonを用いて,Fitbitに蓄積されたデータを取り出していく方法をして残しておきます。

まず,大まかな流れは以下の通りです。

  1. Fitbitを装着して,データを取得。
  2. FitbitをAppと同期。(サーバーにデータが記録)
  3. Fitbit Developerにて,APP Registration
  4. Anaconda install
  5. Anaconda作業フォルダ変更
  6. (Notepad++ install)
  7. コードをpyファイル化
  8. Anacondaでpyファイルを実行
  9. Excel閲覧

というような感じです。

解説すべきところを詳細に説明していきます。

3.Fitbit Developerにて,APP Registration

これは,Fitbitに「APP作って,データ取得するよ~」と言うものです。

  1. Fitbit Developerサイトにlogin
  2. 右上から,Manage > Register An APP
  3. Application Name : 任意。
    Description : APPの内容説明。
    Application Website URL : Website URLを持っているなら記載。私は,先生のリンクを借りました。
    Organization : このAPPが所属している組織。先生と同じにしました。
    Organization Website URL : OrganizerのURL。先生はApplication Website URLと同じ。
    Terms of Service URL : APPの利用規約。先生は同上。
    OAuth 2.0 Application Type : Personal
    Redirect URL : デフォルトhttp://127.0.0.1:8080/ 先生http://127.0.0.1:8088/

先生はPort8088。私はPort8080でできました。ピリオドとコロンを間違えたのかなと思ったり

元記事はこちら

4.Anaconda install

5.Anaconda作業フォルダ変更

Pythonファイルを扱うAnacondaをinstall.

元記事からインストールして,作業フォルダを変更してください。

見れない方はこちら

6.(Notepad++ install)

[Notepad++]で検索してインストールしてください。

おおよそ窓の社からになると思います。

7.コードをpyファイル化

Notepad++で元記事のコードをコピペ。pyファイルとして保存。

見れない方はページ下部↓211104のコードとなっています。

APP Registrationしたときに発行されたUSER_IDCLIENT_SECRETを,
Line9(以下L9)の””間に入力
1度目のAPP Registrationから時間が空いた場合は,CLIENT_SECRETが変わっている可能性があります。

保存したファイルは,変更した作業フォルダに入れることを忘れずに

心拍数のデータ取得なら211104のコードをおススメします。

8.Anacondaでpyファイルを実行

Anacondaでと入力, Enter.

私は,211104.pyと保存しています。任意のファイル名で保存してください。

9.Excelで閲覧

作業フォルダ内に,ALL.csvが作成されています。

実行完了後にcsvファイルを開いた方がいいかもしれません。

あとは,xlsxファイルにするなり好きにしてください。

何のグラフかは言わないけど,試しに出してみました。

そのままのコードだと,ALL.csvと出力されます。

L18とL43のファイル名を変更することによって,ALL以外のファイル名で出力することができます。

211104コード

import sys
import fitbit
import gather_keys_oauth2 as Oauth2
from datetime import datetime, date, timedelta
  
print('Hello FitbitAPP4') 
 
#nagano
USER_ID     = ""; CLIENT_SECRET = ""
  
def requestFitbit(DATE):
    rval=""
    global auth2_client
 
    fitbit_stats = auth2_client.intraday_time_series('activities/heart', DATE, detail_level='1min')
    HRstats = fitbit_stats['activities-heart-intraday']['dataset']
    
    OUTPUT_FILE = "ALL.csv"
    csv_file = open(OUTPUT_FILE, 'a')
   
    csv_file.write(DATE+",")
    for num1 in range(24):
        for num2 in range(60):
            key='{:02}'.format(num1)+':{:02}'.format(num2)+':00'
            #print(key+"/")
            hr=""
            for var in range(0, len(HRstats)):
                #csv_file.write(str(HRstats[var]['time']))
                #csv_file.write(",")            
                if str(HRstats[var]['time']) == key:
                    hr=str(HRstats[var]['value'])
                    #print("hit")
                    break
            csv_file.write(hr)
            csv_file.write(",")              
             
    csv_file.write("\n")
    csv_file.close()
    return rval
##################################################
 
def writeindex():   
    OUTPUT_FILE = "ALL.csv"
    csv_file = open(OUTPUT_FILE, 'a')
     
    csv_file.write(",")
    for num1 in range(24):
        for num2 in range(60):
            key='{:02}'.format(num1)+':{:02}'.format(num2)+':00'
            csv_file.write(key)
            csv_file.write(",")              
             
    csv_file.write("\n")
    csv_file.close()
##################################################
 
 
 
"""Get tokens"""
server = Oauth2.OAuth2Server(USER_ID, CLIENT_SECRET)
server.browser_authorize()
ACCESS_TOKEN = str(server.fitbit.client.session.token['access_token'])
REFRESH_TOKEN = str(server.fitbit.client.session.token['refresh_token'])
  
#print(ACCESS_TOKEN)  
#print(REFRESH_TOKEN)
 
"""Authorization"""
auth2_client = fitbit.Fitbit(USER_ID, CLIENT_SECRET, oauth2=True, access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN)
  
"""request"""
#DATE = "2021-06-19"
#today = datetime.today()
#requestFitbit(datetime.strftime(today, '%Y-%m-%d'))
#requestFitbit("2021-06-19")
 
writeindex()
today = datetime.today()
for var in range(0, 150):
    #day=today + timedelta(days=1)
    #print(var+":" + datetime.strftime(yesterday, '%Y-%m-%d'))
    stamp=datetime.strftime(today - timedelta(days=var), '%Y-%m-%d')
    print("target: " + stamp)
    requestFitbit(stamp)