はじめに
近年、ArduinoやPythonを用いた低コストなセンサーデバイスが、リハビリテーション分野に革新をもたらしています。各種センサー(圧力、フレックス、IMU、筋電など)を組み合わせ、患者の運動状態をリアルタイムに定量評価するシステムは、上肢・下肢・歩行・姿勢訓練すべてで有用です。本記事では、実際のハードウェア設計、具体的なArduinoおよびPythonコード例、各種データの解析手法、さらに臨床試験での評価方法まで、これだけ見ればすべてがわかる内容を詳述します。
リハビリ機能訓練への応用
センサーの活用とデバイス設計
上肢リハビリでは、フレックスセンサーを指や肘に貼付し、曲げ角度を計測します。加えて、IMUにより腕全体の動作、筋電(EMG)センサーで筋活動を取得することで、運動の質を定量化可能です。たとえば、手指の屈曲を検出するグローブ型デバイスでは、複数のフレックスセンサーを縫い込み、各指の角度をリアルタイムにArduinoで取得します。
Arduinoコード例
// 上肢リハビリデバイス: フレックス&EMGセンサー読み取り例
const int FLEX_PIN = A0; // 肘の曲げ角度測定用
const int EMG_PIN = A1; // 筋活動測定用
void setup() {
Serial.begin(115200);
}
void loop() {
int flexVal = analogRead(FLEX_PIN);
int emgVal = analogRead(EMG_PIN);
Serial.print(flexVal);
Serial.print(",");
Serial.println(emgVal);
delay(10); // 約100Hzサンプリング
}
Pythonによるデータ解析
Arduinoからシリアルで送られるデータは、Python(例:pySerial)で受信し、リアルタイムプロットやCSV保存が可能です。これにより、運動パターンの改善傾向や瞬間的なピーク値を解析でき、セラピストと患者がデータに基づくフィードバックを共有できます。
圧センサー使用した視覚的または聴覚的フィードバック訓練
圧センサーの信号の変化を使用して、それをアイデア次第で様々なフィードバック方法に置換することが可能です。例えば、ペットボトルに圧センサーを貼付して、それを握ると画面上のグラフがリアルタイムに変化する、靴に圧センサーを貼付して荷重がかかると音が鳴る、他様々な練習に応用できます。
Arduinoコード例
// センサーが接続されるアナログ入力ピンを定義
const int sensorPin = A0;
void setup() {
// シリアル通信を9600bpsで開始
Serial.begin(9600);
}
void loop() {
// センサーからの値(0~1023)を読み取る
int sensorValue = analogRead(sensorPin);
// 読み取った値をシリアルモニターに送信(改行付き)
Serial.println(sensorValue);
// 100ミリ秒待つ(サンプリング間隔)
delay(100);
}
上記の写真は実際に使用した物です。圧センサーが感知した値の変化を、音の変化に変換し、対象者にフィードバックします。
Arduinoコードの解説表
コード部分 | 説明 |
---|---|
const int sensorPin = A0; | 圧センサーが接続されるArduinoのアナログ入力ピンを定義しています。 |
Serial.begin(9600); | シリアル通信の初期化を行い、通信速度を9600bpsに設定しています。 |
analogRead(sensorPin); | 指定したアナログピン(A0)からセンサーの値(0~1023の範囲)を取得します。 |
Serial.println(sensorValue); | 読み取った数値をシリアル通信でPCに送信します。改行が付くので、PC側で1行ごとの値として受信できます。 |
delay(100); | 次の読み取りまで100ミリ秒待機します。これにより更新間隔を調整しています。 |
実際患者に使用した視覚的フィードバックのPythonのコードを提示する
import serial
import numpy as np
import matplotlib.pyplot as plt
import pygame
from pygame.locals import *
import sys
# シリアルポートの設定
SerPort = serial.Serial(
port="COM3",
baudrate=9600
)
# matplotlibの図を作成
fig = plt.figure(figsize=(10.0, 6.0), dpi=100,
facecolor='cornflowerblue', linewidth=10, edgecolor='cornflowerblue')
mng = plt.get_current_fig_manager()
mng.window.state('zoomed')
mng.resize(2000, 900)
ax1 = fig.add_subplot(1, 1, 1)
plt.tight_layout()
plt.rcParams["figure.constrained_layout.use"] = True
def handle_close(evt):
evt.canvas.figure.axes[0].has_been_closed = True
fig.close_flg = True
fig.close_flg = False
fig.canvas.mpl_connect("close_event", handle_close)
while True:
plt.cla()
plt.xlim(0, 100)
plt.ylim(0, 1000)
plt.title('Grasp')
plt.grid()
data = SerPort.read_until(size=100).decode("ascii")
if float(data) > 800:
ax1.bar('Power', float(data), width=200, color="red")
else:
ax1.bar('Power', float(data), width=200, color="blue")
plt.pause(0.01)
if fig.close_flg:
break
SerPort.close()
Pythonコードの詳細解説
このコードは、シリアルポートから受信したデータをもとに、matplotlibを使用してリアルタイムで棒グラフを描画するプログラムです。以下に各部分の役割を説明します。
1. ライブラリのインポート
serial
: シリアル通信を行うためのライブラリです。センサーデータの取得に使用します。numpy
: 数値計算ライブラリですが、今回は補助的に使用するためにインポートされています。matplotlib.pyplot
: グラフ描画ライブラリ。リアルタイムでデータを視覚化するために使用します。pygame
およびpygame.locals
: ゲーム開発向けのライブラリですが、今回はウィンドウ管理などの用途でインポートされています。sys
: システム関連の操作を行うための標準ライブラリです。
2. シリアルポートの設定
SerPort = serial.Serial(port="COM3", baudrate=9600)
により、COM3ポートを9600bpsでオープンし、センサーデータの受信準備を行います。
3. matplotlibによるグラフの初期設定
plt.figure()
でグラフウィンドウを作成。サイズ、解像度(dpi)、背景色、枠線の太さと色を指定しています。plt.get_current_fig_manager()
でウィンドウ管理オブジェクトを取得し、ウィンドウを最大化(zoomed)およびリサイズしています。ax1 = fig.add_subplot(1, 1, 1)
で、1×1のグリッドの中に1つのグラフ領域を作成。plt.tight_layout()
およびplt.rcParams["figure.constrained_layout.use"] = True
により、ウィンドウ内のレイアウトを自動調整しています。
4. ウィンドウのクローズイベント処理
handle_close
関数は、グラフウィンドウが閉じられた際に呼ばれ、フラグfig.close_flg
をTrueに設定することで、メインループの終了を制御します。
fig.canvas.mpl_connect("close_event", handle_close)
でこの関数をウィンドウのクローズイベントに接続しています。
5. メインループによるデータ取得と描画
- ループ内で、
plt.cla()
により前回の描画内容をクリアし、軸の範囲(plt.xlim()
、plt.ylim()
)やグリッド、タイトルを設定しています。 SerPort.read_until(size=100)
でシリアルポートからデータを受信し、decode("ascii")
で文字列に変換。受信した値が800を超える場合は赤、そうでない場合は青の棒グラフで表示しています。plt.pause(0.01)
により、描画更新のための短い待機時間を設定しています。- ウィンドウが閉じられた場合、フラグによりループを抜け、シリアルポートを閉じる処理が行われます。
歩行訓練への応用
ウェアラブル歩行解析システム
歩行リハビリでは、インソール型足圧センサーとIMUを組み合わせ、歩行周期や左右対称性、接地タイミングを解析します。たとえば、FSRで足底の接地(ヒールストライク)を検出し、IMUで歩幅や重心の動きを解析することで、歩行リズムの改善や対称性の向上を促します。
Arduinoによる接地検出コード例
// 歩行訓練: 足底FSRによる接地検出例
const int FSR_PIN = A0;
const int THRESHOLD = 50;
bool footOnGround = false;
void setup() {
Serial.begin(115200);
}
void loop() {
int fsrValue = analogRead(FSR_PIN);
if(fsrValue > THRESHOLD && !footOnGround) {
footOnGround = true;
Serial.println("HEEL_STRIKE");
}
if(fsrValue < THRESHOLD) {
footOnGround = false;
}
}
この仕組みを用い、歩行中のステップタイミングに合わせたリズム刺激(音やバイブレーション)を出すことで、患者の歩行パターンを補正するシステムが考案されています。
姿勢訓練への応用
姿勢検知とフィードバック
良好な姿勢は、身体全体の健康に直結します。フレックスセンサーやIMUを用いて背骨の曲率や前傾角度を計測し、姿勢が悪くなった場合にバイブレーションモーターやLEDでフィードバックを行うことで、患者に自動的に姿勢改善を促すデバイスが実現できます。
Arduinoによる姿勢アラートコード例
// 姿勢矯正デバイス: フレックスセンサーと振動モーター
const int FLEX_PIN = A0;
const int VIB_PIN = 9;
const int BEND_THRESHOLD = 300;
void setup() {
pinMode(VIB_PIN, OUTPUT);
}
void loop() {
int sensor = analogRead(FLEX_PIN);
if(sensor > BEND_THRESHOLD) {
digitalWrite(VIB_PIN, HIGH); // 姿勢が悪いと振動アラート
} else {
digitalWrite(VIB_PIN, LOW);
}
delay(100);
}
複数のIMUを背中に配置して各椎間の角度をリアルタイムに解析し、より精密な姿勢評価と個別のフィードバックが可能になる手法も検討されています。これにより、猫背や側弯症の改善プログラムに直結するデータが取得でき、臨床評価の精度向上に寄与します。
臨床試験と効果検証
各種デバイスの有効性を検証するには、以下の評価方法が有効です。
- 定量評価:上肢ならFugl-Meyer Assessment、下肢・歩行なら10m歩行テスト、姿勢なら姿勢評価スケールとの相関を解析。
- 再現性の検証:同一条件下での測定の安定性、異なるセラピスト間での一貫性の評価。
- 比較試験:センサー装置を用いた群と従来のリハビリ群とのRCTやシングルケースデザインによる効果比較。
また、各センサーの出力(角度、荷重、筋電位など)を商用計測機器と比較し、RMSEや相関係数を算出することで、信頼性を検証します。
おわりに
本記事では、ArduinoとPythonを中心に、各種センサーを用いたリハビリテーションシステムの設計、実装、応用事例、そして臨床試験における評価方法を包括的に解説しました。これらの低コストデバイスは、従来は高価な医療機器に頼っていたリハビリ計測を、家庭や地域で簡便に行えるように変革します。
技術者、医療従事者、研究者が連携し、これらのオープンソース技術をさらに発展させることで、個別最適化されたリハビリ支援システムの実現と、超高齢社会における医療課題の解決につながることを期待します。
参考文献(抜粋)
# | 文献情報 |
---|---|
1. | R. Ambar et al., “Arm rehabilitation assistive device,” Journal of Engineering Technology, 2011. |
2. | H. Mad Kaidi et al., “Rehabilitation monitoring prototype: Arduino Nano 33 BLE,” J. Phys.: Conf. Ser. 2250, 012009, 2022. |
3. | Sudhanshu Tripathi et al., “Arm Rehabilitation Assistive Device,” IJSRST, vol.8, issue 1, pp.490-494, 2021. |
4. | Juliette van der Pas, “A DIY Smart Insole to Check Your Pressure Distribution,” Hackster.io, 2018. |
5. | J. Burke, “Posture Awareness Sensor,” Instructables.com, 2017. |
コメント