LoginSignup
5
3

More than 3 years have passed since last update.

[介護ハック]経菅栄養自動加圧送出装置を作った~

Last updated at Posted at 2019-07-13

だれもが通る親の介護が始まりました

うちの父は嚥下がうまく出来なくて、大部分を経菅栄養で補っています。
液状の栄養剤を管に流して胃に送り込むのですが、液体だと下痢になる場合が多く、最近では粘り気のある半固形の栄養剤を使うようになっています。
alt

半固形の栄養剤は液体のようにぶる下げて重力では流せないので、シリンジで注入したり、加圧バッグでポンピングして注入します。
racole.jpg
加圧バッグでの注入動画

安定した排便に向けた調整

うちでは半固形栄養剤だとだんだん便秘になってしまいました。
粘度のある液体は摩擦があり腸内をゆっくり通過するため、栄養や水分が吸収されやすくなります。便を軟らかくするには、粘度を下げて腸通過を早め、食物繊維を増やし大腸まで水分を保てるようにします。
軟らかくなるように食物繊維や水分や液体栄養剤を混ぜています。
alt
栄養の粘度が下がるので、加圧バッグの空気圧の調整を細めにしないと注入速度が速くなりすぎて胃から食道に逆流するリスクが高まります。その為、加圧バッグを秤に載せて微妙な減り具合をみながら手動でポンピングしていました。
チューブを流れる栄養の速さが見えにくく、秤の細かい目盛りを凝視しながら、小まめにポンピングして、十数分間で終了するように調整するのは、高齢の母にはつらい作業でした。
長期にわたるだろう介護の負担をできるだけ軽減できないかと思い、自動加圧装置作成に至りました。

経菅栄養自動加圧送出装置の作成

手動で行っていた重量測定とポンピングを自動化しようと、Arduinoで秤センサーを読み取りエアポンプを制御する事にしました。
66369392_2800103206726738_7158757412009148416_n.jpg
秤センサーとプッシュスイッチがデジタル入力、エアポンプとLEDインジケーターがデジタル出力になります。電源アダプターは、9.5V 900mAのトランスタイプのレギュレータ無しを使いました。

injectorsch.jpg

秤センサー

対象物は700gぐらいなので、1kgぐらいの秤センサーを検索してみるとAmazon発送で販売している中華業者で5kgの物¥1300が見つかりました。分解能24ビットという事で1g未満でも計測できそうなので入手してみました
loadcell
中華部品が翌日届くというのは新鮮な驚きがありました~

Arduino,PowerMOSFET

Arduinoは手持ちの安い中華Uno互換機¥281、エアポンプ駆動用のPowerMOSFET ¥50ヒートシンク¥30は秋月でを入手しました

エアポンプ

どのくらいの空気圧が必要なのかよくわからなかったので、
まずは自動車タイヤの電動空気入れを試してみましたが、騒音が大きくて空気圧が高すぎました。
次にAmazon発送で販売している中華業者の物¥1500が見つかりました。空気圧のスペックが50kpaということで、ちょうどよい空気圧でしたので採用となりました。

空いた菓子箱にマイコンとエアポンプを収めて、上ふたにLEDとスイッチを配置しました。
外付け部品は少ないのでArduinoに部品直付けで配線してしまいました。
inject2.jpg

プログラミング

スケッチは、秤センサーのHX711ライブラリーを利用しています。
以下プログラムの概要です
-スタートスイッチが押されるまで待ちます。
-まず加圧バッグがふくらんで栄養が流れ始めて重量が6g減るまでポンプを回します。
-初期重量から終了重量まで、120ステップ/8秒毎に現在の重量を測って、目標重量より重かった場合にポンプを0.2秒回します。
-5個のLEDインジケーターは、状態毎に点灯パターンを変えています。

HX711_AUTO_PEG_INJECTOR.INO
#include "HX711.h"

// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 13;
const int LOADCELL_SCK_PIN = 12;

const int PUMP_PIN = 11;
const int PUSHSW_PIN = 10;
const int LED3_PIN = 3;

const long fin= 300000;

int i=0;
long total,start,reading;

HX711 scale;

// scale weight function
long weight() {
    while (!scale.is_ready()) {
      Serial.println("HX711 not ready.");
      delay(200);
    }
    long w = scale.read();
    Serial.print("HX711 reading: ");
    Serial.println(w);
    return w;
  }

void setup() {
  Serial.begin(57600);
  pinMode(PUSHSW_PIN, INPUT_PULLUP);

  pinMode(PUMP_PIN, OUTPUT);
  digitalWrite(PUMP_PIN, LOW);

  for(i=LED3_PIN; i<8; i++) {
    pinMode(i, OUTPUT);
    digitalWrite(i, LOW);
  }
  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
}


void loop() {
  // wait for Switch pressed
  while ( digitalRead(PUSHSW_PIN) == LOW) delay(100);

  while ( digitalRead(PUSHSW_PIN) == HIGH) {
    digitalWrite(i-1, LOW);
      if(i==8) i=LED3_PIN;
    digitalWrite(i++, HIGH);    
    delay(100);
  }
//DEBUG  while(1) weight();
// scale 5 times average   
  start=0;
  for(i=0; i<5; i++) start+=weight();
  start /= 5;
  Serial.print("HX711 starting: ");
  Serial.println(start);
// initial pumping
  i=0;
  reading = weight();
  // until 6g decrease
  while(reading>(start-1500)) {
    Serial.println(i);
// turn PUMP on:
    digitalWrite(PUMP_PIN, HIGH);
      delay(500);
    digitalWrite(PUMP_PIN, LOW);
      delay(100);
    reading = weight();
    if( i>27 ) {
  // OVER PRESSURE ERROR 
      while (1) {
      for(i=LED3_PIN; i<8; i++)
        digitalWrite(i, LOW);
      delay(100);
      for(i=LED3_PIN; i<8; i++)
        digitalWrite(i, HIGH);
      delay(100);
      if ( digitalRead(PUSHSW_PIN) == LOW) return;
      }
    }
    i++;
  }

  // turn PUMP off:
  digitalWrite(PUMP_PIN,LOW );
  for(i=LED3_PIN; i<8; i++)
    digitalWrite(i, LOW);
 // Start Injecting     
  for(i=119; i>0; i--) {

     digitalWrite(LED3_PIN+(i/24), HIGH);

    reading = weight();
    Serial.print(i);
    // compare weight with reference
    if( reading > fin+((start-fin) * i / 120)) {
      // turn PUMP on:
      digitalWrite(PUMP_PIN, HIGH);
      delay(200);
      // turn PUMP off:
      digitalWrite(PUMP_PIN,LOW );
    }
    // 8sec * 120 = 16min to complete
   for(int j=0;j<8;j++) {
    // 1000msec * 8 = 8000msec
    // Blink LED with iter period
     digitalWrite(LED3_PIN+(i/24), LOW);
     delay(500+((i%24)*20)); 
     digitalWrite(LED3_PIN+(i/24), HIGH);
     delay(500-((i%24)*20)); 
   }

  }
  // finish work
  while (1) {
  // blink LED
    for(i=LED3_PIN; i<8; i++) {
      digitalWrite(i, LOW);
  // Push switch to restart
      if ( digitalRead(PUSHSW_PIN) == LOW) return;
    }
    delay(1500);
    for(i=LED3_PIN; i<8; i++) {
      digitalWrite(i, HIGH);
      if ( digitalRead(PUSHSW_PIN) == LOW) return;
    }
    delay(1500);
    }

//  Serial.println(digitalRead(PUSHSW_PIN));
  }

運用に向けて

デバッグはシリアルポートに状態を垂れ流して、PCから観測しました。
自分で何度か試して問題が無い事を確認してから、
母親が実際に運用してみると、異常系の対応がいくつか必要になり、
重要な異常系処理コードを追加しました。
運用途中での異常系からの復帰はあきらめ、開始前のチェックポイントをスタートスイッチの上に書いて異常発生を防ぐ事で対応としました。
injector3.jpg
またハード等の異常でポンプが止まらなくなった場合には、空気栓を開いて電源を落とす事を周知しました。


一週間ほど現場で順調に運用できています。経管栄養作業の負担が身体的にも精神的にも軽減されて、母に余裕すら見えてきた今日この頃です

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3