工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

スマートアルツハイマー伴侶:Arduinoベースのアラートシステム

必要な部品と材料

Arduino MKR1000 ×1
Infineon Sensor Hub Nano ×1
Nokia 5110 LCD ×1
HC-05 Bluetoothモジュール ×1
ブレッドボード(汎用) ×1
ジャンパワイヤ(汎用) ×1
タクトスイッチ 12mm ×1
ブザー ×1
FT1235 5W送信機 ×1
FT1236 5W受信機 ×1

必要な工具

使用するアプリとオンラインサービス

プロジェクト概要

アルツハイマー協会の統計(2017年9月時点)を見ると、患者と介護者が直面する課題の深刻さがわかります。メイカーとして、患者と介護者の双方を支援するウェアラブルデバイスを開発することにしました。

本システムに求められる機能:

スマートアルツハイマー伴侶:Arduinoベースのアラートシステム

Infineon Sensor Hub Nanoの小型フォームファクタとBLE機能、高精度気圧センサ(DPS310)による転倒検知・階層推定に着目。以下の4点で「ベアボーン(最小構成)」を構成:

  • Infineon Sensor Hub Nano
  • Arduino MKR1000(小型、WiFi内蔵)
  • HC-05 Bluetoothモジュール(Sensor Hubとの橋渡し)
  • Nokia 5110ディスプレイ

仕組み

Sensor Hub NanoのDPS310は気圧・温度・高度をBluetoothで送信。Androidアプリや評価ソフトで確認可能ですが、スマホなしで単体動作させたいのが本プロジェクトの狙いです。Arduino MKR1000を中継役にし、HC-05をマスターモードでSensor Hub Nano(特定MACアドレス)と自動ペアリングするよう設定します。

スマートアルツハイマー伴侶:Arduinoベースのアラートシステム
スマートアルツハイマー伴侶:Arduinoベースのアラートシステム

MKR1000のピンアウト:

スマートアルツハイマー伴侶:Arduinoベースのアラートシステム

HC-05は3.3V動作品を使用し、MKR1000と直接接続(5V品の場合はレベルシフタ必要)。ATコマンドで以下を設定:

  • 既存ペアリング情報削除(AT+RMAAD)
  • 接続モードをマスターに固定(AT+CMODE=0、AT+ROLE=1)
  • Sensor Hub NanoのMACアドレスを指定(AT+BIND=...)
  • ボーレート115200、ストップビット2、イーブンパリティ(AT+UART=115200,0,0)

ペアリング後、Sensor Hubへコマンド送信(例:$start_sensor id=1)でデータストリーム開始。受信フォーマット:

$1,t,36.9299,1154206 // 温度
$1,p,997.6813,1154206 // 気圧
$1,a,130.4305,1154206 // 高度

データパースはシリアル読み取りで文字列処理:

void getSensorValues() {
  String junkVal;
  if (Serial1.available()) {
    junkVal = Serial1.readStringUntil('\n');
    junkVal = Serial1.readStringUntil('t');
    t = Serial1.parseFloat();
    junkVal = Serial1.readStringUntil('p');
    p = Serial1.parseFloat();
    junkVal = Serial1.readStringUntil('a');
    a = Serial1.parseFloat();
    junkVal = Serial1.readStringUntil('\n');
  }
}

取得データをBlynkやCayenne等のIoTプラットフォームへ送信。CayenneはMKR1000でピン選択バグがあったためBlynkを採用(両者似ているため移行容易)。

スマートアルツハイマー伴侶:Arduinoベースのアラートシステム
スマートアルツハイマー伴侶:Arduinoベースのアラートシステム

Bluetoothモジュール設定手順

  1. Sensor Hub Nanoをスマホとペアリングし、InfineonアプリでMACアドレス取得(IFX_NANOHUBとして表示)
  2. HC-05をATモードに入れる(ボタン付きモジュールの場合:電源OFF→ボタン長押し→電源ON→LED点灯でボタン離す)
  3. シリアルモニタ(9600bps、改行コード「NL&CR」)でATコマンド投入
  4. 設定完了後、Arduino電源OFFで通信モード復帰
  5. Sensor Hub Nano電源ON→Arduino電源ONで自動接続確認(LED点滅パターン変化)

※スマホとペアリング済みだと干渉するため解除推奨。

ベアボーン動作テスト

  1. Blynkアプリインストール、QRコードスキャンでウィジェット自動配置
  2. ライブラリ導入:Blynk、U8g2lib
  3. スケッチにBlynk認証トークン、WiFi SSID/パスを記入し書き込み
  4. 回路配線(フリッツィング図参照)、Blynkアプリでプロジェクト再生
  5. Sensor Hub NanoスイッチONで「Connected to Infineon's Sensor Hub Nano」表示、数秒後に温度/気圧/高度がスマホに表示
  6. さらに数秒でインターネット同期の時刻(24時間制)と日付がディスプレイに表示

アルツハイマーアシスタントの個別カスタマイズ

ベアボーン完成後、患者個々のニーズに合わせて機能追加。主な拡張例:

転倒検知

気圧変化(高度差)で転倒を推定。閾値:落差0.7m ± クリアランス0.2m(1秒間隔)。誤検知低減には加速度センサ併用が望ましい(今後の課題)。

スマートアルツハイマー伴侶:Arduinoベースのアラートシステム

位置推定(階層/部屋)

高度差から階層判定、モーションセンサ併用で部屋レベルまで特定可能。BlynkのLEDウィジェットで可視化。

スマートアルツハイマー伴侶:Arduinoベースのアラートシステム

温度異常検知

DPS310の温度値で火災等を検知(例:45℃超でアラート)。センサは肌に直接触れないため厳密な体温ではないが、環境温度上昇の指標になる。

ブザーとタクトスイッチ

ブザーで服薬/運動リマインド音。タクトスイッチを非常ボタンとして、押下時にBlynk経由でメール/SMS/電話通知(IFTTT連携)。割り込み処理で実装。

ディスプレイ表示

Nokia 5110は安価だが解像度低。U8g2ライブラリ使用でOLED等への移行容易。表示内容:

  • デフォルト:インターネット同期時刻/日付(Blynk RTCウィジェット利用)
  • センサ値表示(デバッグ用)
  • 服薬リマインド「Time to take your pills!」
  • 運動リマインド「Time to exercise!」
  • 転倒検知「Fall Detected!」
スマートアルツハイマー伴侶:Arduinoベースのアラートシステム
スマートアルツハイマー伴侶:Arduinoベースのアラートシステム

Blynk Eventorウィジェットでスケジュール管理

コード修正なしでアプリ側のみでリマインド時刻設定可能。BLYNK_WRITE(vEVENTOR_PIN) で検知し、対応表示関数を呼び出し。

Sensor Hub Nanoの動作モード切替

低消費電力/標準/高精度モードをBlynkスイッチで切替可能(コードにコマンド定義済み)。

Blynk + IFTTT Webhook連携

BlynkのWebhookウィジェットからIFTTTへイベント送信し、SMS、電話、Twitter、Facebook等多彩なアクションをトリガー可能。設定手順は本文のスクリーンショット参照。

スマートアルツハイマー伴侶:Arduinoベースのアラートシステム
スマートアルツハイマー伴侶:Arduinoベースのアラートシステム

仕上げと今後の展望

電源と充電

MKR1000はLiPoバッテリー接続端子搭載。今回はFutara Elettronica製ワイヤレス充電(送信機/受信機)を採用。受信側はMicro-B USBケーブルを切ってMKR1000のUSBポートへ接続。

スマートアルツハイマー伴侶:Arduinoベースのアラートシステム
スマートアルツハイマー伴侶:Arduinoベースのアラートシステム

ケース設計

スマートアルツハイマー伴侶:Arduinoベースのアラートシステム

レーザーカッター/3Dプリンタ未所持のためSTLは参考用(非スケール)。

今後の改善項目

  • プロフェッショナルなケース製作
  • Bluetooth 4.0 (BLE) モジュールへの移行、またはDPS310単体使用でコスト削減
  • 加速度センサ/モーションセンサ併用で転倒・位置検知精度向上
  • 脈波センサ追加
  • 高解像度OLEDディスプレイ採用(グラフィック表示対応)
  • MKR1000ディープスリープ活用で電池寿命延長

ご覧いただきありがとうございます。ご意見・アイデアをお寄せください。

コード

ATコマンド設定用スケッチ

// Martyn Currey氏のブログ原典をMKR1000用に改変
char c = ' ';
void setup() {
  Serial.begin(9600);
  Serial.println("Arduino with HC-05 is ready");
  Serial1.begin(38400);
  Serial.println("Serial1 started at 38400");
}
void loop() {
  if (Serial1.available()) { c = Serial1.read(); Serial.write(c); }
  if (Serial.available()) { c = Serial.read(); Serial.write(c); Serial1.write(c); }
}

メインスケッチ(Alzheimer's Assistant)

// 必要ライブラリ
#include <BlynkSimpleMKR1000.h>
#include <WidgetRTC.h>
#include <WiFi101.h>
#include <Arduino.h>
#include <U8g2lib.h>
#include <SPI.h>

char auth[] = ""; // Blynk認証トークン
char ssid[] = ""; char pass[] = ""; // WiFi認証

// Sensor Hub Nanoコマンド定義
#define HELLO "$hello id="
#define INFO "$info id="
#define SENSOR_INFO "$sinfo id=1"
#define LOW_ENERGY "$set_mode sid=1;md=mode;val=bg"
#define STANDARD_MODE "$set_mode sid=1;md=prs_osr;val=16"
#define HIGH_PRECISION "$set_mode sid=1;md=prs_mr;val=32"
#define START "$start_sensor id=1"
#define STOP "$stop id="

// 転倒検知閾値
#define FALL 0.7
#define CLEARANCE 0.2

// Blynk仮想ピン
#define vTEMPERATURE_PIN V0
#define vPRESSURE_PIN V1
#define vALTITUDE_PIN V2
#define vEVENTOR_PIN V3
#define vFALL_PIN V4

float t, p, a, previousA;
boolean fallState;
unsigned long previousMillis = 0;
const long interval = 1000;
boolean BTconnected = false;
int btStatePin = 9;
int backlightPin = 2;

BlynkTimer timer;
WidgetRTC rtc;
// Nokia 5110 (SPI)
U8G2_PCD8544_84X48_F_4W_SW_SPI u8g2(U8G2_R0, 7, 8, 3, 5, 4);

void setup() {
  Serial.begin(115200);
  Serial1.begin(115200);
  timer.setInterval(1000L, sendSensorValues);
  timer.setInterval(3000L, showTimeAndDate);
  pinMode(btStatePin, INPUT);
  pinMode(backlightPin, OUTPUT);
  digitalWrite(backlightPin, LOW);
  u8g2.begin();
  showStartMessage(); delay(2000);
  while (!BTconnected) {
    if (digitalRead(btStatePin) == HIGH) BTconnected = true;
    else showWaitingFor();
  }
  initSensorHub();
  Blynk.begin(auth, ssid, pass);
  rtc.begin();
  setBlynkWidgets();
  showTimeAndDate();
  sendCommand(START);
}

void loop() {
  Blynk.run();
  timer.run();
  getSensorValues();
  checkIfFalling();
}

// 以下、sendCommand, initSensorHub, getSensorValues, sendSensorValues,
// checkIfFalling, showStartMessage, showWaitingFor, showConnectedMessage,
// showErrorMessage, showSensorValues, showFallMessage, showPillReminder,
// showExerciseReminder, showTimeAndDate, BLYNK_WRITE(vEVENTOR_PIN),
// setBlynkWidgets, BLYNK_CONNECTED 等の関数定義が続く...

カスタムパーツとエンクロージャ

最終的なケースデザインのイメージ(非スケール)。

回路図

  • HC-05 ATモード設定時の配線図
  • ベアボーン動作時のFritzing図
  • HC-05 ATコマンド一覧ドキュメント

製造プロセス

  1. TinyML言語検出器:Edge ImpulseとArduino Nano 33 BLE Senseで「はい」を多言語判別
  2. Arduino NanoとMPU-6050で作るリアルタイムジャイロスコープゲーム
  3. Arduinoデジタルダイス: LCD表示の乱数ジェネレーター自作
  4. Arduino Nanoで37LEDルーレットゲームを自作:ヨーロピアンスタイル完全再現
  5. ATtiny85ミニアーケード:スネークゲーム - 手のひらサイズOLEDゲーム機の製作
  6. ポータブル距離検出器:Arduino Nano自作キット(HC-SR04、18650電源、3Dプリントケース付き)
  7. Arduino Nanoで作る音声反応デスクライト:音楽に合わせて光るイルミネーション
  8. Arduino Nano と OpenCV で実現する自律顔追跡ロボットカー
  9. パーソナル・ヘルスケア・アシスタント(PHA):コミュニティ健康見守りIoTソリューション
  10. 銅メッキプロジェクト:Arduino UNOで作るスマート電気メッキシステム
  11. Arduino Nanoで作るNeoPixelマトリックス版Pongゲーム