【2025年版】ArduinoとPythonとセンサーを用いたリハビリテーションへの応用|圧センサーを用いた実際の臨床活用まで徹底解説

Arduino 機器制作



 

はじめに

近年、ArduinoPythonを用いた低コストなセンサーデバイスが、リハビリテーション分野に革新をもたらしています。各種センサー(圧力、フレックス、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.

 

特集記事

コメント

この記事へのコメントはありません。

TOP