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

オープンソースCOVID-19人工呼吸器: ArduinoベースのDIY呼吸支援システム

必要な部品と材料

部品数量備考
Arduino UNO1Arduino版で使用
Arduino 4リレーシールド1Arduino版で使用
デジタルサーボ MG9951全バージョン共通
LM2596S DC-DC降圧モジュール2全バージョン共通
10kΩ マルチターンポテンショメータ1全バージョン共通
12V 5A 電源 (60W)1全バージョン共通
5mm 赤色LED1全バージョン共通
5mm 緑色LED1全バージョン共通
英数字LCD 20x4 (I2C)1全バージョン共通
スイッチ (220V対応)1全バージョン共通
シュノーケルマスク (フルフェイス)1デカトロン製等
2方向ソレノイドバルブ1空気流路制御用

必要な工具・機器

使用ソフトウェア・サービス

プロジェクト概要

COVID-19パンデミック時に人工呼吸器不足を補うため、オープンソースで開発された非侵襲的換気支援装置です。低コストで製作容易であり、鎮静・挿管が不要な患者向けの緊急用人工呼吸器として設計されています。

このプロジェクトは、元教師で友人のSerafim Pires氏からの挑戦により開始されました。スペインの類似プロジェクトを参考に、非侵襲的換気(NIV)の研究を行い、2つの既存技術を組み合わせて機能するプロトタイプを構築しました。20日以上の連続動作テストで問題なく動作しています。

非侵襲的換気 (NIV) の仕組み

フェイスマスクや鼻マスクを用いて、設定された圧力の空気を肺に送り込みます。これにより疾患で機能不全に陥った肺を補助し、自然呼吸をサポートして感染との闘いを助けます。

デカトロン・シュノーケルマスクの活用

イタリアでの研究を基に、デカトロンのシュノーケルマスクを緊急用人工呼吸器マスクとして改造・活用しました。低コストで容易に改造できるため、世界各地で採用されています。ポルトガルのサンタレン病院でも実際に使用された実績があります。

オープンソースCOVID-19人工呼吸器: ArduinoベースのDIY呼吸支援システム
シュノーケルマスクの改造

参考記事: ポルトガルのニュース記事

オープンソースCOVID-19人工呼吸器: ArduinoベースのDIY呼吸支援システム
ポルトガルの新聞報道

地元ラジオでのインタビューがSNSで拡散されました。

初期動作テスト

少量の空気量で、呼吸頻度とPEEP(呼気末陽圧)を変えながら15回の呼吸サイクルでデモンストレーションを行いました。

⚠ 重要な免責事項
このプロトタイプは公的機関による検証を受けておらず、作者はその使用に関する一切の責任を負いません。
最終手段として、訓練を受けた医療従事者によってのみ使用されることを意図しています。極限的なピーク時の命を救うための装置です。
非営利プロジェクトとして大量複製可能ですが、ポルトガルの関係当局の承認が必要です。

Arduinoスケッチ (Version 2.2)

圧力センサーによる安全機能、ブザー/アラーム出力付きの完全版コードです。

/* 肺人工呼吸器 INOVT COVID-19 Version 2.2
 * 作者: David Pascoal
 * 圧力センサーによるセキュリティ、アラーム出力(ブザー等)付き
 */
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

#define PIN_SERVO 6
#define PIN_FREQ A1      // 呼吸頻度設定用ポテンショメータ
#define PIN_PEEP A0      // PEEP設定用ポテンショメータ
#define PIN_LED 2        // 吸気表示LED
#define PIN_LED2 3       // 呼気表示LED
#define PIN_ALARM_RELAY 8 // アラームリレー
#define PIN_SAFETY_VALVE 9 // 安全弁
#define SENSOR_FLOW A3   // 流量センサー

#define EXPIRING 0
#define INSPIRING 1
#define MIN_ANGLE 92     // サーボ最小角度 (呼気)
#define MAX_ANGLE 139    // サーボ最大角度 (吸気)

int frecuencia = 0;      // 呼吸頻度 (回/分)
int valInspira = 0;      // 吸気時間
int valExpira = 0;       // 呼気時間
int valPeep = 0;         // PEEP値
int aux;
int x = 500;
int y = 1000;
unsigned long timer;
Servo myServo;
int frecuencia_ant;
int valPeep_ant;
int estado;

void logo() { /* 起動ロゴ表示 */ }
void initior() { /* 初期化アニメーション */ }
void maobc() { /* サムアップ/ダウンアニメーション */ }
void thumbdownA() { /* サムダウン表示 */ }
void thumbsup() { /* サムアップ表示 */ }

void setServo() {
  if (millis() > timer) {
    if (estado == EXPIRING) {
      // 吸気フェーズへ
      digitalWrite(PIN_LED2, LOW);
      digitalWrite(PIN_LED, HIGH);
      myServo.write(MIN_ANGLE);
      timer = millis() + (valInspira * 100);
      estado = INSPIRING;
      lcd.setCursor(8, 2);
      lcd.print("EXPIRANDO > ");
    } else if (estado == INSPIRING) {
      // 呼気フェーズへ
      digitalWrite(PIN_LED2, HIGH);
      digitalWrite(PIN_LED, LOW);
      myServo.write(MAX_ANGLE - valPeep);
      timer = millis() + (valExpira * 100);
      estado = EXPIRING;
      lcd.setCursor(8, 2);
      lcd.print("INSPIRANDO < ");
    }
  }
}

void setup() {
  myServo.attach(PIN_SERVO);
  myServo.write(92);
  
  pinMode(PIN_FREQ, INPUT_PULLUP);
  pinMode(PIN_PEEP, INPUT_PULLUP);
  pinMode(SENSOR_FLOW, INPUT);
  pinMode(PIN_LED, OUTPUT);
  pinMode(PIN_LED2, OUTPUT);
  pinMode(PIN_ALARM_RELAY, OUTPUT);
  pinMode(PIN_SAFETY_VALVE, OUTPUT);
  
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  logo();
  lcd.setCursor(4, 2);
  lcd.print("OPEN-SOURCE");
  lcd.setCursor(0, 3);
  lcd.print("Pulmonary Ventilator");
  delay(4000);
  
  lcd.clear();
  lcd.print("....Initializing....");
  initior();
  delay(500);
  lcd.clear();
  maobc();
  lcd.clear();
  
  // 流量センサーチェック
  if (digitalRead(SENSOR_FLOW) == LOW) {
    thumbsup();
    lcd.setCursor(0, 0);
    lcd.print("SYSTEM");
    lcd.setCursor(2, 1);
    lcd.print("OK");
    delay(5000);
    lcd.clear();
  } else {
    myServo.write(139);
    thumbdownA();
    lcd.setCursor(0, 0);
    lcd.print("SYSTEM");
    lcd.setCursor(1, 1);
    lcd.print("FAIL");
    delay(5000);
    lcd.clear();
    Serial.begin(9600);
    timer = millis();
    frecuencia_ant = -1;
    valPeep_ant = -1;
  }
  delay(500);
  estado = EXPIRING;
}

void loop() {
  digitalRead(SENSOR_FLOW);
  
  // 呼吸頻度読み取り (10-60 回/分)
  aux = analogRead(PIN_FREQ);
  frecuencia = map(aux, 0, 1023, 10, 60);
  valInspira = ((1.0 / frecuencia) * 600.0) * (1.0 / 3.0); // 吸気:呼気 = 1:2
  valExpira = ((1.0 / frecuencia) * 600.0) * (2.0 / 3.0);
  
  // PEEP読み取り (0-10)
  aux = analogRead(PIN_PEEP);
  valPeep = map(aux, 0, 1023, 0, 10);
  
  // 設定変更時のみLCD更新
  if ((frecuencia_ant != frecuencia) || (valPeep_ant != valPeep)) {
    Serial.print("Frecuencia: "); Serial.println(frecuencia);
    Serial.print("Inspira: "); Serial.println(valInspira);
    Serial.print("Expira: "); Serial.println(valExpira);
    Serial.print("Peep: "); Serial.println(valPeep);
    
    lcd.setCursor(1, 0); lcd.print("FREQUENCIA: ");
    lcd.setCursor(13, 0); lcd.print(frecuencia);
    lcd.setCursor(1, 1); lcd.print("PEEP: ");
    lcd.setCursor(13, 1); lcd.print(valPeep);
    lcd.setCursor(0, 2); lcd.print("ESTADO: ");
    lcd.setCursor(0, 3); lcd.print("VENTILADOR D.PASCOAL ");
    
    frecuencia_ant = frecuencia;
    valPeep_ant = valPeep;
  }
  
  // 流量異常検知 (エアフロー停止)
  if (digitalRead(SENSOR_FLOW) == HIGH) {
    myServo.write(139); // 安全位置
    digitalWrite(PIN_ALARM_RELAY, HIGH);
    digitalWrite(PIN_SAFETY_VALVE, HIGH);
    lcd.clear();
    thumbdownA();
    lcd.setCursor(0, 0); lcd.print("SYSTEM");
    lcd.setCursor(1, 1); lcd.print("FAIL");
    lcd.setCursor(1, 2); lcd.print("******************");
    lcd.setCursor(3, 3); lcd.print("Check AR flow");
    lcd.setCursor(12, 1); lcd.print("ALARM");
    
    // アラーム点滅
    digitalWrite(PIN_LED, HIGH);
    digitalWrite(PIN_LED2, HIGH);
    delay(500);
    lcd.setCursor(12, 1); lcd.print(" ");
    delay(500);
    lcd.setCursor(12, 1); lcd.print("ALARM");
    digitalWrite(PIN_LED, LOW);
    digitalWrite(PIN_LED2, LOW);
    delay(1000);
    lcd.clear();
  } else {
    digitalWrite(PIN_ALARM_RELAY, LOW);
    digitalWrite(PIN_SAFETY_VALVE, LOW);
    setServo();
    delay(10);
  }
}

3Dプリント部品・エンクロージャ

全パーツは3Dプリンターで出力してください。ある程度の精度が必要です。

回路図

オープンソースCOVID-19人工呼吸器: ArduinoベースのDIY呼吸支援システム オープンソースCOVID-19人工呼吸器: ArduinoベースのDIY呼吸支援システム オープンソースCOVID-19人工呼吸器: ArduinoベースのDIY呼吸支援システム

開発背景と今後の展望

このプロジェクトは、COVID-19の世界的危機に対応するため、オープンソースコミュニティの力で短期間で開発されたものです。医療機器認証を受けていないため、あくまで「最後の手段」として位置づけられていますが、実際の臨床現場で使用された実績があります。

今後は、より安全で信頼性の高いバージョンの開発、医療機器認証取得に向けた取り組み、他の感染症や災害時への応用が期待されています。

製造プロセス

  1. Bluetooth操作のArduinoスパイボットを自作する
  2. FlickMote:ジェスチャー操作のIRリモコンでスマートホームを制御
  3. 自作Arduino TV-B-Gone:全テレビ対応の万能リモコン
  4. 12メートル先から見える大型LEDマスタークロック(アラーム機能付き)を自作しよう
  5. ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
  6. Arduinoプロジェクトのための最適化電源ソリューション
  7. Arduino三目並べ:MAX7219 LEDマトリクスと段ボールケースで自作
  8. スマートArduino四足歩行ロボットの製作:ステップバイステップガイド
  9. ゲーム用カスタムArduinoジョイスティックハンドルの製作
  10. Arduino Nano R3で本格的なCNCマシンを自作する
  11. オープンソース リファレンス ボード、医療用人工呼吸器の迅速開発を加速