BNO055で内蔵プロセッサを使って姿勢を測ろうとしたが,どうにも様子がおかしい。YAWはかろうじて測れているようだが,PitchとRollがクシ状にノイズが入る。なぜだ・・・そもそも前にシゲタと装置を作ったときは,正しく動作していたのか?いろいろ試した挙げ句,Davinci32Uにハンダ付け形式に戻すと,正常に値を取得できた。このセンサーは非常に動作がシビアなもののようだ。ブレッドボードとジャンプワイヤの組み合わせでは正常に測れないみたいだ。2018年にも同じことしてる。



BNO055で内蔵プロセッサを使って姿勢を測ろうとしたが,どうにも様子がおかしい。YAWはかろうじて測れているようだが,PitchとRollがクシ状にノイズが入る。なぜだ・・・そもそも前にシゲタと装置を作ったときは,正しく動作していたのか?いろいろ試した挙げ句,Davinci32Uにハンダ付け形式に戻すと,正常に値を取得できた。このセンサーは非常に動作がシビアなもののようだ。ブレッドボードとジャンプワイヤの組み合わせでは正常に測れないみたいだ。2018年にも同じことしてる。



共通事項
人格エディタ
試験AI
・人格をより多く登録できるようにした。
・5択に対応→プログラム・プロンプトを改造して対応。
・2問正解は対応が難しい→レアであるため非対応に。
・問題1を確認。不備があり整形。
2つ正解を選ぶのは1つに修正。
回答が誤っているもの,フォーマットに不備があるものを修正。
運用の様子は下記動画のとおり。
判定処理スクリプトは
https://kodamalab.sakura.ne.jp/WGL/AgentData/recordTalkReport.php
問題数が増えたため,不正解のみ表示するよう改変。30問運用で迷いがなければ10分ちょい→FB画面が不親切→結果をUnityのUIで表にしてもらうよう改変。ふぅ~


面接AI
(chara23)を使用。判定処理スクリプトは
https://kodamalab.sakura.ne.jp/WGL/AgentData/recordTalkReportC.php
キャラクタエディタにはあくまでカバーストーリーを書き,評価項目などは判定スクリプトに書くよう,切り分けを行うことで動作がある程度安定するように思う。フィードバック画面は,面接用にカスタムしたら少し見やすくなった。できれば,コメントのセルでは2行表示できるよう改変したいところだ。

こちらが人格設定↓
//////////////////////////////////////
あなたは理学療法士養成用の患者AIです。ユーザーである学生を相手に,理学療法外来を受診した二十二歳の女性患者として話してください。カバーストーリーは以下のとおりです。
主訴は腰部の痛みで、立位よりも座位で強くみられた。座位での痛みの程度は、腰部にNRSで八程度の強い痛みであった。現病歴として考えられることは、一年ほど前にバスケットボールの試合中に左膝のACLを損傷し、A病院にて左膝ACL再腱術が施行された。入院中に理学療法が処方され、筋力増強運動や関節可動域拡大運動、動作練習などを行った結果、膝関節の可動域は右側と同程度まで改善、筋力はMMTで右側が五なのに対して左側は四まで改善した。日常生活上は特別な問題なく過ごせそうだったため、一か月の入院中に理学療法を実施したのみで、外来では通院することなく理学療法は終了となった。その後三か月程度経過したころに、以前にはみられなかった腰部痛を感じるようになった。この腰部痛が徐々に強くなってきたため外来を受診した。現在大学生のため座って授業を受ける時間が長いのだが、長時間座位姿勢を保つことが難しいことに悩んでいる。また、膝の痛みなどはないものの、歩行中に膝崩れ(giving way)に対する不安感を感じるようになった。現在の体の状態は、立位姿勢では腰椎が平坦化し、フラットバックがみられ、また骨盤は後傾していた。前屈動作では、股関節よりも腰椎が容易に屈曲し、この動作で症状が増悪した。この時の痛みは腰部のみであり、下肢への放散痛はみられなかった。座位では腰椎が屈曲し、膝を伸展させると、さらに腰痛が増強した。今回整形外科でX線検査を受けたが骨には異常がなく、湿布と鎮痛薬が処方された。それに加えて理学療法が処方され、保存的に治療をすすめることになった。
会話は敬体を基本とし、一人称は「わたし」、二人称は「あなた」で統一すること。平均100文字、標準偏差50文字、最大300文字程度で話してください。症状を説明する時、難しい言葉は使わずユーザーに詳しく聞かれたら平易な表現で答えるようにしてください。痛みの程度を聞かれるときはネガティブな表情を多めに出すようにしてください。ジェスチャーは、回答が「はい」のときはうなずき、「いいえ」のときに首をふるようにしてください。共感を示されたときや希望が持てそうな会話の時は最大限ポジティブな表情を示してください。「辛い」は「つらい」と、「痛い」は「いたい」と、ひらがなで表現してください。患者役なので専門用語は使わず,各種症状や既往歴についても,利用者(理学療法士を目指す学生)が行う質問に答える形で徐々に明らかにしてください。
//////////////////////////////////////
こちらが会話ログ評価AI用のプロンプト↓ 人格にセットされた症状に特化して,尋ねるべき項目を具体化してある。この方がきめ細やかな点数付けができる。ような気がする。
あなたは理学療法士教育の専門評価者です。
以下の会話ログは、ACL再建術後で慢性腰痛を呈する模擬患者エージェントと学生の10分間面接記録です。
学生が必要な情報を適切に聴取できているかを、次の5項目ごとに10点満点で採点し、短いコメントを付けてください。
1. あいさつと主訴の確認
・適切な挨拶とラポール形成があるか
・主訴(座位で強くなる腰痛)の明確な確認ができているか
・痛みの強度(NRS8)や最も困っている場面(授業中の長時間座位困難)を把握できているか
2. 痛みの詳細と経過
・発症時期(ACL術後約3か月)と経過(徐々に増悪)を聴取しているか
・痛みの特徴(座位で増悪、腰椎屈曲で悪化、放散痛なし)を確認しているか
・姿勢との関連(骨盤後傾、フラットバック)や誘発動作(膝伸展)を把握できているか
3. 既往歴・受診歴
・左膝ACL再建術の手術時期と術後リハ内容を聴取しているか
・改善状況(ROM正常、MMT右5/左4)と退院後の経過(外来リハなし)を確認できているか
・膝の現状(痛みなしだが giving way 不安)を把握しているか
・整形外科受診、X線で異常なし、湿布・鎮痛薬が処方されたことを確認しているか
4. 日常生活への影響
・長時間座位困難が学生生活や授業参加へ与える影響を聴取しているか
・立位・歩行・活動量への影響、膝崩れ不安の生活習慣への影響を確認できているか
・ADL・IADL・運動習慣に関する適切な質問が行われているか
5. まとめと今後のすすめかた
・収集した情報の要約ができているか
・今後の評価・理学療法方針(姿勢評価、体幹筋、運動連鎖、座位姿勢指導など)への言及があるか
・患者の不安軽減につながる適切なコミュニケーションで面接を締めくくれているか
出力形式は CSV (UTF-8) のみ。
行見出しは「AIによる評定結果:◯◯/50点」。
良好評価でコメント不要なら「特にありません」とする。
各コメントは最大200文字。
余計な文や解説は出力しない。
未解決事項
・ビルドして動作チェックしていない
・学習結果の記録が残せていない
・バリエーションがない
なぜか今更ECGアンプをブレットボード上に起こした。
とりあえずブザー音のBFから変更をしていく。
R-R感覚をブザーにするなり,音の高低で調整するなり。
また,Atomのボタンで制御変更にしたり,web上に呼吸法の呈示をするなどもやらなければ
とりあえずは平均HRで実装かな
ブザー回数「ピピピ」な感じにもできるよね
1,HRのタイミングを音でしらせ,R-R感覚の幅ごとに音の高さを変える
2,HRV
3,RMSSD
あと追加する機能は,内部ボタンで生波形を表示すること
他研究にないのは,HR・RMSSD・RR間隔をwebインターフェースや内部ボタンで切り替えて,任意の測定指標を基にBF訓練を行うこと
23年秋に,永松や津崎が作ったECGアンプを回収。波形を測定した。ブレッドボードの出来が悪い。手直ししてLT1167をAD8226 に入れ替えよう。


ピン配置は・・・ほう・・・。これはブレッドボード上で入れ替えられそうだね。ブレッドボードの配線を入れ替えて測定してみる。


こころなしかLT1167で測ったものよりきれいに感じる。・・・まぁちょっとわからないか。心電図回路の電源をコイン電池に変え,AD変換器を取り外し,コンピュータをnRf52840に入れ替えて測ると,無事に測れました。これで消費電流がどれくらいになってるのかわからないが,とりあえず動作するところまではきた。TLE2426が消費電流が多くコイン電池向きじゃないとのことで,変える必要がある。



nRf52840はちょっとクセがある。一度書き込むとシリアルポートが消失し,書き込めなくなる。これは,書き込んだプログラムがシリアル通信しない場合,「いらないよね?」とシリアル通信をOFFにされてしまうようだ。リセットボタンを二回早押しすると回復する。維持したい場合は,シリアル通信をプログラムに追加すればよいのだが,Adafruit_TinyUSBライブラリを入れないとダメなようだ。
#include <Adafruit_TinyUSB.h> // XIAO nRF52840系でSerialを使うため
// サンプリング間隔(マイクロ秒)
// 1000us = 1kHzサンプリング
const uint32_t SAMPLE_INTERVAL_US = 2000;
const uint32_t threshold = 1900;
uint32_t lastMicros = 0;
void setup() {
// LED(お好みで)
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH); // XIAOはHIGHで消灯のことが多い
// USBシリアル開始
Serial.begin(115200);
// 開発中はPC接続を待ってもよい
while (!Serial) {
delay(10);
}
// ADC分解能を12bitに(0〜4095)
analogReadResolution(12);
}
void loop() {
uint32_t now = micros();
// 一定間隔ごとにサンプリング
if (now - lastMicros >= SAMPLE_INTERVAL_US) {
lastMicros += SAMPLE_INTERVAL_US; // ドリフトを抑える書き方
// ADCチャネル0(A0ピン)の読み取り
int value = analogRead(A0);
// タイムスタンプ[us], ADC値 をCSV形式で送信
//Serial.print(now); // マイクロ秒タイムスタンプ
//Serial.print(",");
Serial.print(3000);
Serial.print(",");
Serial.print(1000);
Serial.print(",");
Serial.print(threshold);
Serial.print(",");
Serial.println(value); // 0〜4095(12bit)
if(value>threshold){digitalWrite(LED_BUILTIN, LOW); }
else{digitalWrite(LED_BUILTIN, HIGH); }
}
}
M5StickCで角度を取得し,振動デバイスに出力する。
// M5StickC 初期型(MPU6886) Pitch / Roll 取得デモ
// 50Hz更新,相補フィルタ(α=0.98)
// 画面表示 + シリアルCSV出力(Pitch,Roll)
#include <M5StickC.h>
const float alpha = 0.98f; // 相補フィルタ係数(0.95〜0.99で調整)
const uint32_t dt_ms = 20; // サンプリング周期 20ms → 50Hz
const float dt = dt_ms / 1000.0f;
float pitch = 0.0f; // 融合後の角度[deg]
float roll = 0.0f;
void setup() {
M5.begin();
M5.IMU.Init(); // MPU6886 初期化
M5.Lcd.setRotation(3); // 横向き
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setTextSize(2);
M5.Lcd.setCursor(0, 0);
M5.Lcd.println("M5StickC IMU");
M5.Lcd.println("Pitch/Roll");
Serial.begin(115200);
while (!Serial) { delay(10); }
// 初期姿勢を加速度ベースで推定して,初期値に採用
float ax, ay, az;
M5.IMU.getAccelData(&ax, &ay, &az); // [g]
float pitchAcc = atan2f(-ax, sqrtf(ay*ay + az*az)) * 180.0f / PI;
float rollAcc = atan2f( ay, az ) * 180.0f / PI;
pitch = pitchAcc;
roll = rollAcc;
delay(500);
}
void loop() {
// センサ取得
float ax, ay, az; // 加速度[g]
float gx, gy, gz; // 角速度[deg/s]
M5.IMU.getAccelData(&ax, &ay, &az);
M5.IMU.getGyroData(&gx, &gy, &gz);
// 加速度からの姿勢角(重力のみ仮定)
float pitchAcc = atan2f(-ax, sqrtf(ay*ay + az*az)) * 180.0f / PI;
float rollAcc = atan2f( ay, az ) * 180.0f / PI;
// ジャイロ積分(軸対応:MPU6886はおおむね gx→Roll, gy→Pitch)
float pitchGyro = pitch + gy * dt;
float rollGyro = roll + gx * dt;
// 相補フィルタ融合
pitch = alpha * pitchGyro + (1.0f - alpha) * pitchAcc;
roll = alpha * rollGyro + (1.0f - alpha) * rollAcc;
// 画面表示
M5.Lcd.fillRect(0, 40, 160, 40, BLACK);
M5.Lcd.setCursor(0, 40);
M5.Lcd.printf("Pitch:%6.2f deg\n", pitch);
M5.Lcd.printf("Roll :%6.2f deg\n", roll);
// シリアルCSV(Pitch,Roll)
Serial.print(pitch, 3);
Serial.print(",");
Serial.println(roll, 3);
delay(dt_ms);
}
// M5StickC 初期型(MPU6886) Pitch / Roll 取得+Pitch>10°でG26出力
// 相補フィルタ(α=0.98) / 50Hz / ヒステリシス: ON 10°, OFF 8°
#include <M5StickC.h>
const int MOTOR_PIN = 26; // G26 にモータードライバの入力を接続(直結は不可)
const float alpha = 0.98f; // 相補フィルタ係数
const uint32_t dt_ms = 20; // 50Hz
const float dt = dt_ms / 1000.0f;
const float PITCH_ON_DEG = 10.0f; // これを超えたらON
const float PITCH_OFF_DEG = 8.0f; // これを下回ったらOFF(ヒステリシス)
float pitch = 0.0f;
float roll = 0.0f;
bool motorOn = false;
void setup() {
M5.begin();
M5.IMU.Init();
M5.Lcd.setRotation(3);
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setTextSize(2);
M5.Lcd.setCursor(0, 0);
M5.Lcd.println("M5StickC IMU");
M5.Lcd.println("Pitch->G26");
Serial.begin(115200);
while (!Serial) delay(10);
// モーターピン初期化
pinMode(MOTOR_PIN, OUTPUT);
digitalWrite(MOTOR_PIN, LOW); // 初期はOFF
// 初期姿勢(加速度ベース)
float ax, ay, az;
M5.IMU.getAccelData(&ax, &ay, &az);
float pitchAcc = atan2f(-ax, sqrtf(ay*ay + az*az)) * 180.0f / PI;
float rollAcc = atan2f( ay, az ) * 180.0f / PI;
pitch = pitchAcc;
roll = rollAcc;
delay(300);
}
void loop() {
// センサ取得
float ax, ay, az; // [g]
float gx, gy, gz; // [deg/s]
M5.IMU.getAccelData(&ax, &ay, &az);
M5.IMU.getGyroData(&gx, &gy, &gz);
// 姿勢角(加速度)
float pitchAcc = atan2f(-ax, sqrtf(ay*ay + az*az)) * 180.0f / PI;
float rollAcc = atan2f( ay, az ) * 180.0f / PI;
// ジャイロ積分
float pitchGyro = pitch + gy * dt; // gy ≈ pitch軸
float rollGyro = roll + gx * dt; // gx ≈ roll軸
// 相補フィルタ融合
pitch = alpha * pitchGyro + (1.0f - alpha) * pitchAcc;
roll = alpha * rollGyro + (1.0f - alpha) * rollAcc;
// —— Pitchしきい値でG26制御(ヒステリシスあり)——
if (!motorOn && pitch > PITCH_ON_DEG) {
motorOn = true;
digitalWrite(MOTOR_PIN, HIGH);
} else if (motorOn && pitch < PITCH_OFF_DEG) {
motorOn = false;
digitalWrite(MOTOR_PIN, LOW);
}
// 表示&ログ
M5.Lcd.fillRect(0, 40, 160, 50, BLACK);
M5.Lcd.setCursor(0, 40);
M5.Lcd.printf("Pitch:%6.2f deg\n", pitch);
M5.Lcd.printf("Roll :%6.2f deg\n", roll);
M5.Lcd.printf("MOTOR:%s \n", motorOn ? "ON " : "OFF");
Serial.print(pitch, 3);
Serial.print(",");
Serial.print(roll, 3);
Serial.print(",");
Serial.println(motorOn ? 1 : 0);
delay(dt_ms);
}
// M5StickC 初期型(MPU6886) Pitch / Roll 取得+角度帯域でG26出力パターン
#include <M5StickC.h>
const int MOTOR_PIN = 26; // モータードライバ入力(直結不可)
const float alpha = 0.98f; // 相補フィルタ係数
const uint32_t dt_ms = 20; // 50Hz
const float dt = dt_ms / 1000.0f;
// 角度しきい値(度):必要に応じて設定してください
float TH_A = 5.0f;
float TH_B = 10.0f;
float TH_C = 15.0f;
float TH_D = 20.0f;
// パターン定義(ONは常に100ms固定)
const uint16_t ON_MS = 100;
const uint16_t OFF_A = 500; // A〜B未満
const uint16_t OFF_B = 300; // B〜C未満
const uint16_t OFF_C = 100; // C〜D未満
float pitch = 0.0f;
float roll = 0.0f;
// -------- サブルーチン:角度に応じて出力を駆動(非ブロッキング)--------
enum Band { BAND_OFF, BAND_A, BAND_B, BAND_C, BAND_ON };
Band currentBand = BAND_OFF;
bool phaseOn = false;
unsigned long phaseStartMs = 0;
Band classifyBand(float ang) {
if (ang < TH_A) return BAND_OFF;
else if (ang < TH_B) return BAND_A;
else if (ang < TH_C) return BAND_B;
else if (ang < TH_D) return BAND_C;
else return BAND_ON;
}
// 指定した角度に従って G26 を点滅/常時ON/OFF させる
void driveOutputByAngle(float angDeg) {
Band band = classifyBand(angDeg);
unsigned long now = millis();
// 帯域が変わったらフェーズをリセット(各帯域は100ms ON から開始)
if (band != currentBand) {
currentBand = band;
phaseOn = true; // まずはON
phaseStartMs = now;
if (band == BAND_OFF) {
digitalWrite(MOTOR_PIN, LOW);
} else if (band == BAND_ON) {
digitalWrite(MOTOR_PIN, HIGH);
} else {
digitalWrite(MOTOR_PIN, HIGH); // 点滅帯域の初回ON
}
}
// 各帯域の動作
switch (currentBand) {
case BAND_OFF:
// ずっとOFF
digitalWrite(MOTOR_PIN, LOW);
break;
case BAND_ON:
// ずっとON
digitalWrite(MOTOR_PIN, HIGH);
break;
case BAND_A: {
// 100ms ON / 500ms OFF
uint16_t offMs = OFF_A;
if (phaseOn && (now - phaseStartMs >= ON_MS)) {
phaseOn = false; phaseStartMs = now; digitalWrite(MOTOR_PIN, LOW);
} else if (!phaseOn && (now - phaseStartMs >= offMs)) {
phaseOn = true; phaseStartMs = now; digitalWrite(MOTOR_PIN, HIGH);
}
} break;
case BAND_B: {
// 100ms ON / 300ms OFF
uint16_t offMs = OFF_B;
if (phaseOn && (now - phaseStartMs >= ON_MS)) {
phaseOn = false; phaseStartMs = now; digitalWrite(MOTOR_PIN, LOW);
} else if (!phaseOn && (now - phaseStartMs >= offMs)) {
phaseOn = true; phaseStartMs = now; digitalWrite(MOTOR_PIN, HIGH);
}
} break;
case BAND_C: {
// 100ms ON / 100ms OFF
uint16_t offMs = OFF_C;
if (phaseOn && (now - phaseStartMs >= ON_MS)) {
phaseOn = false; phaseStartMs = now; digitalWrite(MOTOR_PIN, LOW);
} else if (!phaseOn && (now - phaseStartMs >= offMs)) {
phaseOn = true; phaseStartMs = now; digitalWrite(MOTOR_PIN, HIGH);
}
} break;
}
}
// -------- サブルーチンここまで --------
void setup() {
M5.begin();
M5.IMU.Init();
M5.Lcd.setRotation(3);
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setTextSize(2);
M5.Lcd.setCursor(0, 0);
M5.Lcd.println("M5StickC IMU");
M5.Lcd.println("Angle->G26");
Serial.begin(115200);
while (!Serial) delay(10);
pinMode(MOTOR_PIN, OUTPUT);
digitalWrite(MOTOR_PIN, LOW);
// 初期姿勢(加速度ベース)
float ax, ay, az;
M5.IMU.getAccelData(&ax, &ay, &az);
float pitchAcc = atan2f(-ax, sqrtf(ay*ay + az*az)) * 180.0f / PI;
float rollAcc = atan2f( ay, az ) * 180.0f / PI;
pitch = pitchAcc;
roll = rollAcc;
delay(300);
}
void loop() {
// センサ取得
float ax, ay, az; // [g]
float gx, gy, gz; // [deg/s]
M5.IMU.getAccelData(&ax, &ay, &az);
M5.IMU.getGyroData(&gx, &gy, &gz);
// 姿勢角(加速度)
float pitchAcc = atan2f(-ax, sqrtf(ay*ay + az*az)) * 180.0f / PI;
float rollAcc = atan2f( ay, az ) * 180.0f / PI;
// ジャイロ積分
float pitchGyro = pitch + gy * dt; // gy ≈ pitch軸
float rollGyro = roll + gx * dt; // gx ≈ roll軸
// 相補フィルタ融合
pitch = alpha * pitchGyro + (1.0f - alpha) * pitchAcc;
roll = alpha * rollGyro + (1.0f - alpha) * rollAcc;
// —— ここで角度に応じた出力を実行(Pitchを使用)——
driveOutputByAngle(pitch);
// driveOutputByAngle(roll); // Rollで判定したい場合はこちら
// 画面表示&ログ
M5.Lcd.fillRect(0, 40, 160, 60, BLACK);
M5.Lcd.setCursor(0, 40);
M5.Lcd.printf("Pitch:%6.2f deg\n", pitch);
M5.Lcd.printf("Roll :%6.2f deg\n", roll);
Serial.print(pitch, 3);
Serial.print(",");
Serial.print(roll, 3);
Serial.print(",");
Serial.println((currentBand==BAND_ON) ? 2 : (currentBand==BAND_OFF ? 0 : 1)); // 2=ON連続,1=点滅,0=OFF
delay(dt_ms);
}
高校生用の講座。Arduino開発環境は1.8.19を入れるのが良い。
インストール手順の動画
購入した振動デバイスはこれ↓


PWMは振動の強さで段階を表現。→やってみたがわかりにくい。
Burstは振動の時間で段階を表現。→こちらが無難か。
/*
PWM_shaker.ino
PWM出力を8段階で徐々に強くするスケッチ(シリアル出力付き)
出力ピン: 11番
各段階: 2秒出力 → 1秒休止
シリアル通信: 115200 bps
*/
const int pwmPin = 11;
const int numSteps = 8;
const int maxPWM = 255;
const int delayOn = 2000; // 出力時間(ms)
const int delayOff = 1000; // 休止時間(ms)
void setup() {
pinMode(pwmPin, OUTPUT);
Serial.begin(115200);
Serial.println("PWM gradual output start");
}
void loop() {
for (int i = 0; i < numSteps; i++) {
int pwmValue = map(i, 0, numSteps - 1, 0, maxPWM);
analogWrite(pwmPin, pwmValue);
Serial.print("Step ");
Serial.print(i + 1);
Serial.print(" / ");
Serial.print(numSteps);
Serial.print(" : PWM = ");
Serial.println(pwmValue);
delay(delayOn); // 2秒間出力
analogWrite(pwmPin, 0);
delay(delayOff); // 1秒休止
}
}
/*
Burst_shaker.ino
振動モーター制御:傾き0〜8段階(1〜8でOFFが900→0msに減少)
出力ピン: 11
シリアル: 115200 bps
各段階: 4秒動作 + 1秒休み
ON中のPWMは常に255
*/
const int pwmPin = 11;
const int numLevels = 9; // 0〜8
const int onMs = 100; // ON時間は固定100ms
const unsigned long runWindow = 4000; // 各段階の動作時間(ms)
const unsigned long pauseWindow = 1000; // 段階間の休止(ms)
void setup() {
pinMode(pwmPin, OUTPUT);
analogWrite(pwmPin, 0);
Serial.begin(115200);
Serial.println("Vibration feedback (OFF 900->0ms) start");
}
void loop() {
for (int level = 0; level < numLevels; level++) {
unsigned long start = millis();
if (level == 0) {
// 無振動
Serial.println("Level 0: No vibration (4000ms silence)");
analogWrite(pwmPin, 0);
while (millis() - start < runWindow) delay(10);
} else {
// 1〜8段階:OFF時間 900→0ms
int offMs = map(level, 1, 8, 900, 0);
Serial.print("Level ");
Serial.print(level);
Serial.print(": ");
Serial.print(onMs);
Serial.print("ms ON / ");
Serial.print(offMs);
if (offMs == 0) Serial.print("ms OFF (ほぼ連続)");
Serial.println();
while (millis() - start < runWindow) {
// ON
analogWrite(pwmPin, 255);
delay(onMs);
// OFF(offMs==0のときは極短時間で次のONへ)
analogWrite(pwmPin, 0);
if (offMs > 0) delay(offMs);
}
}
// 段階間休止
analogWrite(pwmPin, 0);
Serial.println("Pause 1000ms\n");
delay(pauseWindow);
}
}
*卒論の導入と考察に使うギャンブル先行研究をメモする。
*チャッピーさんの提案したポジティブ導入案はこちら。
【心理的側面】
de Vries 2008:ポジティブな気分が意思決定を改善 – オランダのde Vriesらの研究では、アイオワギャンブル課題(IGT)を用いて気分が意思決定に与える影響を検討しました。実験の結果、ポジティブな気分状態ではネガティブな気分状態よりも初期段階で有利なデッキを選択する傾向が強まり、意思決定成績が向上しました。これはポジティブ気分が「直感(gut feeling)」に基づく判断を促し、ギャンブル課題の初期学習を助けるためと考察されていますcambridge.orgcambridge.org。
Goldstein 2016:Goldsteinら(2016)は,若年成人ギャンブラーにおいて,気分調整(mood regulation)動機がギャンブル行動に強く関係することを示した。特にオンラインギャンブラーでは,ネガティブ気分や退屈感の対処としてギャンブルが行われやすく,一方で非オンラインギャンブルはポジティブ気分や社交的快楽を高める手段として行われる傾向があった。pmc.ncbi.nlm.nih.govresearchgate.net。
Parke 2019:ギャンブル参加が満たす心理的ニーズ
Parkeら(2019)は,イギリス・スウェーデン・オランダのオンラインギャンブラー1,416名を対象に,ギャンブルが満たす心理的欲求を分析した。回答者は,ギャンブルによって**「挑戦と熟達(challenge & mastery)」「自己肯定(self-affirmation)」「リスクと興奮(risk & excitement)」「気晴らし・現実逃避(detachment)」「社会的つながり(affiliation)」の五つの心理的ニーズがある程度満たされると報告した。
特にポーカー参加者は挑戦・自己肯定・社会的つながりの満足度が高く,スロット遊技者は現実逃避・リラックス(detachment)のニーズが高かった。さらに,スポーツベッティングおよびポーカー参加者はスロット遊技者より幸福度が高い傾向を示したが,ストレス水準はギャンブル形式による差はみられなかった。
これらの結果から,ギャンブルは適度に行われる場合,ストレス解消・刺激提供・社会的交流などの肯定的な心理的機能を果たす可能性**が示唆される。
出典:Parke, J., Williams, R. J., & Schofield, P. (2019). Exploring psychological need satisfaction from gambling participation and the moderating influence of game preferences. International Gambling Studies, 19(3), 508–531. https://doi.org/10.1080/14459795.2019.1633381
Dixon 2010:スロットマシン遊技がもたらす高揚感と幸福感 – Dixonらは施設入所高齢者3名を対象に、模擬スロットマシン遊技中の幸福度を客観指標で測定しました。その結果、3名全員でギャンブル遊技中の「幸福」行動指標の出現率がベースライン時より明らかに増加し、遊技によって一時的に幸福感が高まることが確認されましたpubmed.ncbi.nlm.nih.gov。この効果は介入直後のみで30分後にはベースラインに戻りましたが、スロットマシン遊技が高齢者に即時的なポジティブ情動をもたらすことを示す結果ですpubmed.ncbi.nlm.nih.gov。
APA形式の出典は次のとおりです:
Dixon, M. R., Nastally, B. L., Jackson, J. E., & Habib, R. (2010). The effect of simulated gambling on the happiness of nursing home residents. Journal of Applied Behavior Analysis, 43(3), 531–535. https://doi.org/10.1901/jaba.2010.43-531
Blackman 2019:適度なギャンブルと主観的幸福度 – オーストラリアのBlackmanらは成人約1,500名を調査し、ギャンブル頻度と主観的幸福度の関係を分析しました。その結果、問題ギャンブルでない人ではギャンブル参加頻度が高いほど生活満足度などウェルビーイング指標がむしろ高いことが分かりましたgreo.ca。特に問題を抱えないレクリエーション層のギャンブラーはギャンブル未経験者より幸福度が有意に高くgreo.ca、一方でギャンブル問題が深刻になるにつれて幸福度は低下しましたgreo.ca。適度なギャンブル行動それ自体は生活の質や幸福感を向上させ得ることを示す知見です。
Kim,W 2020:中国系高齢移民における社交的ギャンブルの効用 – Kimの民族誌的研究では、米国在住の中国系高齢者が仲間とマージャンやトランプ賭博を行うことで、孤独感の緩和や文化的なつながりの維持に役立てていることが報告されました。低賭け金の「健康的麻雀」は高齢移民にとって貴重な社交機会と認知刺激の場となっており、適度なギャンブルがコミュニティへの参加意識や心理的安定感を高めるポジティブな側面が描写されています。
cakar,M 2025:レクリエーショナルゲーム介入による幸福感向上 – トルコのCakarらは、高齢者施設の入居者を対象にビンゴを含むレクリエーションゲーム介入を8週間実施しました。介入群では対照群と比べ、幸福度と人生満足度が大幅に上昇しbmcpsychology.biomedcentral.com、孤独感(情緒的・社会的孤独)も有意に減少しましたbmcpsychology.biomedcentral.com。身体症状(体調不良の訴え)には大きな変化がありませんでしたが、これらの結果からゲーム活動による高齢者の心理的福利の向上効果が示唆されます。
ビンゴや語彙ゲームなどの軽度なレクリエーション活動でも,幸福感・人生満足度の改善および孤独感の緩和が見られる。
ゲーム活動が社会的交流と心理的活性化を促すことで,高齢者の精神的健康に寄与する可能性を示唆。
身体的症状には直接的効果は少ないが,心理的ウェルビーイングの向上効果は明確。
Cheng,G 2021:高齢者の遊技活動と精神的安定 – 中国の縦断研究では、趣味として麻雀やチェスなどグループ遊戯に参加する高齢者は、非参加者より認知機能が高く抑うつ傾向が低いことが示されていますbmcgeriatr.biomedcentral.com。例えばある疫学調査では、麻雀を含むグループ活動に参加していた高齢者は認知テスト成績が良好で、うつリスクも低減していました。このように社交的ゲーム参加が高齢者のメンタルヘルスと認知機能の双方に保護的効果を持つ可能性があります。
Xu,S 2019:適度な賭け事とストレス解消効果 – 賭け事が日常のストレスや退屈を紛らわすコーピング手段となり得ることも指摘されています。例えばある研究では、ギャンブル参加者の多くが「気分転換」「現実逃避」を主目的に挙げておりgreo.ca、スロットマシン遊技者はリラックス効果を求めている傾向が示唆されましたgreo.ca。適度なギャンブル行為による興奮や集中は日常生活からの一時的な解放感を与え、心理的ストレスを軽減するポジティブ効果を持ちうると考えられます。
スロットなどのレクリエーション的ギャンブルは,現実逃避・リラックス・退屈解消といった“気分転換機能”を持つ。
一方,ポーカーやスポーツベッティングのような競技的ギャンブルは,挑戦・達成・社会的自己実現の場となっている。
適度な範囲のギャンブル参加は,心理的ストレス軽減やポジティブ情動の喚起に寄与する可能性が示唆される。
【身体的側面ー自律神経など】
Dai 2025:カード・麻雀遊技と死亡リスク低下 – Daiらの中国高齢者約3万人を対象としたコホート研究では、ほぼ毎日トランプや麻雀を楽しむ人は、全く遊ばない人に比べ死亡リスクが12%低下し、週1回程度でも有意なリスク低減がみられました(HR≈0.84)
bmcgeriatr.biomedcentral.com
。追跡期間中一貫して遊技を続けた高齢者では死亡リスクが最も低く(HR=0.67)
bmcgeriatr.biomedcentral.com
、特に80歳以上で保護効果が顕著でした。レジャーとしてのカード・麻雀遊技が高齢者の寿命や健康維持に寄与する可能性が示された重要な疫学的知見です
Dai, X., et al. (2025). Playing cards/mahjong and risk of all-cause mortality among older Chinese adults: Evidence from the Chinese Longitudinal Healthy Longevity Survey. BMC Geriatrics, 25(1).
。
Desai 2004:高齢者のレクリエーション・ギャンブルと健康 – Desaiらの全米調査研究(Yale大学)では、過去1年に娯楽としてギャンブルを楽しんだ65歳以上高齢者は、非ギャンブル高齢者に比べて主観的健康状態が良好で、うつ症状が少なく、社会的支援ネットワークも充実していることが明らかになりましたpmc.ncbi.nlm.nih.gov。著者らは「適度なギャンブル活動に伴う身体的活動、社会交流、認知的刺激が健康な老化に寄与している可能性がある」と述べていますnews.yale.edu。ただし高齢者は依存に陥らない範囲で楽しむことが重要とされています。
【認知的側面】
篠原 2014 :パチスロ訓練による中高年の認知機能向上 – 篠原菊紀らは、中高年者に4週間のパチスロ(スロットマシン)練習を課し、前頭葉・頭頂葉の脳活動の活性化と認知機能の改善を確認しました。ストレス下で活動しやすい右前頭部の活動低下も観察され、低ストレスで脳を鍛える可能性が示唆されていますprovanet.co.jp
Sobel 2001:ビンゴゲームとアルツハイマー患者の認知機能 – Sobelはアルツハイマー病患者を対象に、ビンゴ遊びによる認知刺激効果を検証しました。その結果、ビンゴによる認知的刺激によってBoston Naming Test(呼称課題)や単語リコール課題の成績が有意に向上し、一方で同時間の身体活動では有意な改善がみられませんでしたpubmed.ncbi.nlm.nih.gov。シンプルなゲームであるビンゴがアルツハイマー患者の日常管理に有益となる可能性が示されていますpubmed.ncbi.nlm.nih.gov。
Robeles 2019:認知症高齢者に対するビンゴ介入の効果 – フィリピンのRoblesらは軽度認知症の高齢者15名を対象に7週間のビンゴ介入を実施し、介入前後で認知機能を評価しました。その結果、記憶・思考力・見当識・言語・指示理解といった領域で有意な向上がみられ、継続的なビンゴ遊びはこれら認知機能の改善に効果的でしたstti.confex.comstti.confex.com。ビンゴは参加者に大きな楽しみと交流促進といった心理社会的効果も確認された。施設でのレクリエーション活動として導入が推奨される。stti.confex.com。
Zhu 2024:麻雀ゲームと高齢者の認知機能維持 – Zhuらは、中国の高齢者7,500名超を10年間追跡し、麻雀を定期的に遊ぶ人ほど認知機能検査(MMSE)スコアが高く、年齢による認知低下の進行が緩やかであることを発見しましたopus.lib.uts.edu.auopus.lib.uts.edu.au。麻雀プレイ頻度の低下はMMSEスコア低下と有意に関連し、逆に高頻度で麻雀を楽しむ高齢者は認知機能の維持・向上に寄与する可能性が示されていますopus.lib.uts.edu.auopus.lib.uts.edu.au。
Tse 2024:麻雀ゲームの認知・心理効果に関するレビュー – Tseらは東西の研究53件を包括検討し、麻雀遊技が高齢者にもたらす認知・心理面の影響を整理しました。その結果、観察研究では麻雀経験が豊富なほど認知機能・心理機能・日常動作能力が良好である傾向が示されましたpubmed.ncbi.nlm.nih.gov。さらに介入研究から、定期的な麻雀遊技は全般的な認知能力や短期記憶を高め、うつ症状を軽減しうることが報告されていますpubmed.ncbi.nlm.nih.gov。以上より、麻雀は高齢者の認知症予防や気分改善に有望なレクリエーションとなり得ると結論づけています。
Zhang 2020:軽度認知障害高齢者への麻雀トレーニング – Zhangらは軽度認知障害(MCI)の高齢者56名を対象に、週3回・計12週間の麻雀プログラムを実施しました。介入群は対照群と比較して実行機能(MoCA-Bスコア)や注意力テスト(STT)、日常生活動作(FAQ)に有意な改善を示しpubmed.ncbi.nlm.nih.gov、麻雀訓練によってMCI高齢者の認知低下進行を遅らせ得ることが示唆されましたpubmed.ncbi.nlm.nih.gov。麻雀は安価で手軽な認知レクリエーションであり、脳外傷後の認知リハビリなどへの応用可能性も論じられています。
Verghese 2003:趣味的ギャンブルと認知症リスク低減 – Vergheseらの前向き研究では、読書やボードゲーム(トランプ等)ギャンブル性を含むボードゲームといった知的レジャー活動への定期的参加が高齢者の認知症発症リスクを有意に低下させることが示されましたsemanticscholar.org。週1回以上ゲームを楽しむグループは、何もしないグループに比べ認知症発症率が低く、知的な遊戯による脳の刺激が予防に繋がると考えられますsemanticscholar.org。この研究はギャンブル性のあるゲームも含め、知的娯楽が認知症リスクを下げ得ることを示唆した代表的な報告です。
Akbaraly 2009:積極的な外出遊戯と認知症予防 – Akbaralyらのフランス「3都市研究」では、自宅に閉じこもらず能動的なレジャー(例:麻雀やカードゲーム、外出しての趣味)に積極的な高齢者ほどアルツハイマー型認知症の発症率が低いことが報告されました。日々内容が変わる刺激的な遊びは有酸素運動以上にアミロイドβによる記憶障害を抑制しうる可能性も動物実験で示されており、ワクワクするギャンブルゲームの適度な刺激が脳の健康維持に役立つメカニズムが示唆されています。https://www.neurology.org/doi/abs/10.1212/wnl.0b013e3181b7849b
ここでは過去に提出された卒論をPDF形式で提供します。
2023年度
仮想空間における虚偽検出 20HP232_Takeda
ドローン操作が心身に与える影響 20HP110_Oguri
VR環境でストレス反応は緩和されるか 20HP238_Nagamatsu
性格特性と催眠効果の関係 20HP149_Mitsudome
事前の動物動画視聴が心身へ及ぼす影響 20HP217_Kawada
内受容感覚が皮膚温バイオフィードバック訓練に与える影響 20HP225_Shigeta(抄録)
2022年度
(学部)
ネタバレの有無が映画視聴時の感情状態および生体反応に及ぼす影響 19HP107_udagawa
動物動画の視聴ストレス緩和効果の検討 19HP114_kataoka
VR動画を用いた大学内教室の印象評定 19HP115_kanaya
仮想空間上の自然でストレス緩和は可能か 19HP131_sugaya
エアロバイクゲームが心身に与える影響 19HP160_watanabe
外観デザインが製品印象評価に及ぼす影響について 19HP240_nihei
コンピューターゲームにおいてUIがゲーム体験に及ぼす影響 19HP252_matsui
ギャンブル課題における勝敗が心理・生理反応に与える影響 19HP257_yoshida
VRホラーゲームが心身に与える影響 191P258_yoshida
(修士)
ウェアラブルデバイスを用いた運動介入が心身に与える影響 21MH208_Tokunaga
仮想空間における一過性運動時の探索状況の有無が心臓血管反応と心理指標に与える影響 21MH202_Urushi
2021年度
スマートフォンゲームが人に与える影響 16HP137_yamamoto
PCおよびVRによるホラー動画視聴中の感情変化 17HP101_aida
お菓子の有無と味が映像視聴時の感情と印象に及ぼす影響 18HP101_aihara
人物の有無が広告の好意度と再認に与える影響 18HP113_onota
人物イラストが印象評定と行動に及ぼす影響 18HP122_kuriyama
3Dキャラクターの外見が攻撃者の罪悪感に与える影響 18HP123_kono
ゲームが心理に及ぼす影響と今後の向き合い方 18HP202_abiko
自然環境をテーマとしたデジタル刺激による回復効果の検討 18HP206_ito
リズムパターンが心身に及ぼす影響 18HP210_uchiyama
映像の有無が人物の特性推論に及ぼす影響 18HP221_kinoshita
末梢皮膚温を利用したオンラインカウンセリングの検討 18HP230_sato
ビデオ通話時の抵抗感に対して性格が及ぼす影響 18HP249_baba
2020年度
リモートコミュニケーションにおける映像の有無が課題遂行や心理状態に及ぼす影響 17HP110_omura
色とテンポの組み合わせが映像に対する印象と感情に及ぼす影響 17HP114_kato
ゲームにより生じる感情と性格の関係性について 17HP119_saito
ハーディネス及びソーシャルサポート特性が感情喚起に与える影響 17HP206_urushi
自己意識及び同調行動が大学生の服装選択に及ぼす影響 17HP218_saito
映像と音楽の相互作用によるリラクセーション効果の検討 17HP229_tokunaga
2019年度
レースゲーム中の視点条件の違いによる生体反応への影響 16HP119_chida
音楽とストレス課題の組み合わせおよび音楽の知名度が心身に与える影響の検討 16HP121_tonai
呼吸制御教示によるパター課題のスコアと生理反応の変化 16HP132_hoshi
皮膚温測定装置を使った心身相関教育プログラム 16HP205_ouchi
ストリートダンス動画視聴時における発汗及び視線の動向 16HP219_teshigahara
映像刺激の差異が自律神経活動及び再認識に及ぼす影響の検討 16HP227_hasegawa
学習状況における発汗活動にゲームフィケーションが及ぼす影響 16HP238_yoshida
2018年度
VRエアロバイクが心身に与える影響 15HP202_akiyama
教授方法の違いが参加者の授業体験と覚醒水準に与える影響 15HP211_kasai
アニメーション作品のエンディングの有無が視聴体験に与える影響 15HP244_watanabe
ローコスト心拍計を用いた休息機能の測定 15HP235_hori
塗り絵が心身に及ぼす影響 15HP212_kanai
高校生を対象にした心身相関現象体験プログラムの実施 15HP138_miyata
ラジコンカーを用いた疑似運転体験による身体反応 15HP107_itou
VR空間内でのFB・視野情報の違いがユーザーインターフェースに及ぼす影響の検討15HP230_negishi
プレイヤー数がゲーム時の自律系生体反応にあたえる影響15HP232_hurukawa
2017年度
女性の化粧の有無が視線と生体反応に及ぼす影響14HP115_kadokura
回想における表現の違いが生理・心理指標に与える影響 14HP104_ishii
お菓子の有無が会話中の感情・生体反応におよぼす影響 14HP125_satou
ストレス負荷後の水槽鑑賞が生理・心理指標に及ぼす影響 14HP139_noguchi
仮想空間内において3Dキャラクターの視線や表情が罪悪感に及ぼす影響 14HP127_sugahara
異性画像の魅力度が視線と心拍に与える影響 14HP129_takashima
スマホゲームがもたらすフロー状態における心身反応 14HP154_watanabe
多人数バイオフィードバックが心身に与える影響 14HP205_itakura
私的自意識が評価を伴う課題を行う際に心身に与える影響 14HP249_mori
アイドル画像視聴がもたらす心身の変化 14HP251_yasuda
2016年度
映像視聴における風刺激が感情に及ぼす影響 13HP203_ARAI
人格特性が会話中の皮膚温におよぼす影響 13HP238_TAHARA
同一作品の提示方法の違いが心身に与える影響 13HP150_YOKOI
座禅が自律神経機能および認知課題の成績に与える影響 13HP137_NAGATA
子どもを対象にした心身相関現象体験プログラムの作成と運用 13HP236_SUZUKI
カウントダウンの有無がボール投げ課題中の心拍数に与える影響 13HP109_ISHIKAWA
ダーツを用いた競争課題中の皮膚温変化 13HP201_ADACHI
会話内容が生理・心理指標に与えるストレス負荷の検討 13HP217_KANEKO
パズルゲーム課題時の発話の有無が生体反応および主観感情に及ぼす影響の検討 13HP121_KOZUKI
音楽とストレス課題の組み合わせが心身に及ぼす影響の検討 13HP251_MORI
2015年度
教授場面における緊張について 12hp105_iwamoto
状態自尊心がリラクセーションに及ぼす影響について 12hp116_saigusa
勝敗の有無と対戦相手がゲームプレイ時における主観的楽しさに及ぼす影響の検討 12hp132_hashizaki
ヘッドトラッキング機能の有無が映像の没入感に及ぼす影響の検討 12hp214_kitayama
猫型ペットロボットとのコミュニケーションがもたらすリラックス効果の検討 12hp216_kondo
親密度の違いがゲームプレイ時の生理反応に及ぼす影響 12hp224_soma
ブレイン・マシン・インタフェース使用時における効率の良いトレーニング方法の模索 12hp227_takei
リラックス法が予期不安中の心身反応に及ぼす影響 12hp234_fukushima
スピーチ課題前の読書は心身のストレス反応を抑制するか? 12hp235_hori
Skype通話時における映像の有無が生理・心理指標に及ぼす影響 12hp244_yoshida
2014年度
CMCでの匿名性の操作が自己開示および生理反応に及ぼす影響11HP102_ikarashi
映像呈示条件がゲーム中の心理生理反応に与える影響の検討11HP103_ishikawa
サブリミナル動画がリラックス映像視聴時のαパワー値に与える影響の検討11HP112_kaneko
音声の有無が対戦格闘ゲーム中の心理生理反応に与える影響の検討11HP137_tomioka
フィジカルコンピューティングとデジタルファブリケーションを用いた低コスト皮膚温測定装置の開発とその運用13MH202_taira
13MH202_taira_abst
異性画像に対する魅力度の違いが身体反応に及ぼす影響13MH204_fuseda
13MH204_fuseda_abst
2013年度
レモンの香りがもたらすリラックス効果の心理・生理的検討 10hp105_anma
赤ちゃん映像視聴によりもたらされるポジティブ感情がストレス反応に与える影響 10hp108_imai
心音バイオフィードバックが射撃パフォーマンス・自己効力感・生理指標に及ぼす影響 10hp110_okura
競走場面における対戦形式の違いが生体反応に及ぼす影響 10hp118_saiki
リラックス・恐怖感情喚起映像視聴時の解像度の違いが主観感情及び生体反応に与える影響 10hp127_tanaka
スモールステップ法が作業効率と生体反応に及ぼす影響の検討 10hp133_nemoto
模擬接頭辞の刺激提示手法の違いがポリグラフ検査における自律神経活動に及ぼす影響 10hp142_minemura
感じたストレスを他者に伝えることで生じるストレス緩和効果について 10hp143_miyazawa
模型戦車操作時の視点状況の違いが没入感および生体反応へ及ぼす影響 10hp215_kubo
前腕3DCGモデルの動作遅延が身体感覚の転移および生体反応に及ぼす影響の検討 10hp242_mihara
[山田耕平/加曽利ゼミ]面接場面における面接者の態度が非面接者の生理反応に及ぼす影響 10HP146_yamada
頭部運動と映像の連動によりもたらされる身体感覚の転移とその定量化手法の提案 12mh206_watanabe1 12mh206_watanabe_abst
2012年度
卒論プレゼン
パーソナル・スペース侵害時の視線の有無が生理・心理的反応に与える影響 09HP122_sanoki
同一課題を行う親しい友人によりもたらされる相互サポート効果の心理・生理的検討 09HP124_taira
心拍の虚偽フィードバックが魅力度評定に及ぼす影響 09HP137_fuseda
定位反応に関する選択的注意の解釈と人格特性との関連可能性についての検討 09HP218_sato
対人場面における服装の違いが緊張感及び生理指標に与える影響について 09HP245_wada
2011年度
自己関連話題聴取時の生体反応に公的自意識が及ぼす影響の検討 08HP212_okutomi
人物印象が表情模倣と情動伝染に及ぼす影響の検討 08HP220_kobayashi_
自尊感情の変化が計算課題中の心理・生理反応に与える影響の検討 08HP247_watanabe