オープンソースCOVID-19人工呼吸器: ArduinoベースのDIY呼吸支援システム
必要な部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino UNO | 1 | Arduino版で使用 |
| Arduino 4リレーシールド | 1 | Arduino版で使用 |
| デジタルサーボ MG995 | 1 | 全バージョン共通 |
| LM2596S DC-DC降圧モジュール | 2 | 全バージョン共通 |
| 10kΩ マルチターンポテンショメータ | 1 | 全バージョン共通 |
| 12V 5A 電源 (60W) | 1 | 全バージョン共通 |
| 5mm 赤色LED | 1 | 全バージョン共通 |
| 5mm 緑色LED | 1 | 全バージョン共通 |
| 英数字LCD 20x4 (I2C) | 1 | 全バージョン共通 |
| スイッチ (220V対応) | 1 | 全バージョン共通 |
| シュノーケルマスク (フルフェイス) | 1 | デカトロン製等 |
| 2方向ソレノイドバルブ | 1 | 空気流路制御用 |
必要な工具・機器
- 3Dプリンター (A8等)
- UV露光装置 (基板製作用)
使用ソフトウェア・サービス
- Arduino IDE
- PCB Elegance (基板設計)
- Autodesk Fusion 360 (3Dモデリング)
プロジェクト概要
COVID-19パンデミック時に人工呼吸器不足を補うため、オープンソースで開発された非侵襲的換気支援装置です。低コストで製作容易であり、鎮静・挿管が不要な患者向けの緊急用人工呼吸器として設計されています。
このプロジェクトは、元教師で友人のSerafim Pires氏からの挑戦により開始されました。スペインの類似プロジェクトを参考に、非侵襲的換気(NIV)の研究を行い、2つの既存技術を組み合わせて機能するプロトタイプを構築しました。20日以上の連続動作テストで問題なく動作しています。
非侵襲的換気 (NIV) の仕組み
フェイスマスクや鼻マスクを用いて、設定された圧力の空気を肺に送り込みます。これにより疾患で機能不全に陥った肺を補助し、自然呼吸をサポートして感染との闘いを助けます。
デカトロン・シュノーケルマスクの活用
イタリアでの研究を基に、デカトロンのシュノーケルマスクを緊急用人工呼吸器マスクとして改造・活用しました。低コストで容易に改造できるため、世界各地で採用されています。ポルトガルのサンタレン病院でも実際に使用された実績があります。
参考記事: ポルトガルのニュース記事
地元ラジオでのインタビューが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プリンターで出力してください。ある程度の精度が必要です。
- シュノーケルマスクを加圧呼吸マスクに改造する手順書
- 高解像度3Dプリンター推奨
- 設計ファイル:
inovt_covid19_version_2_0_david_pascoal_0mbFUa0ce1.rar
回路図
- 自律版 (病院のエア配管不要)
- Version 2.2 - セーフティガードとアラーム出力付き
開発背景と今後の展望
このプロジェクトは、COVID-19の世界的危機に対応するため、オープンソースコミュニティの力で短期間で開発されたものです。医療機器認証を受けていないため、あくまで「最後の手段」として位置づけられていますが、実際の臨床現場で使用された実績があります。
今後は、より安全で信頼性の高いバージョンの開発、医療機器認証取得に向けた取り組み、他の感染症や災害時への応用が期待されています。
製造プロセス
- Bluetooth操作のArduinoスパイボットを自作する
- FlickMote:ジェスチャー操作のIRリモコンでスマートホームを制御
- 自作Arduino TV-B-Gone:全テレビ対応の万能リモコン
- 12メートル先から見える大型LEDマスタークロック(アラーム機能付き)を自作しよう
- ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
- Arduinoプロジェクトのための最適化電源ソリューション
- Arduino三目並べ:MAX7219 LEDマトリクスと段ボールケースで自作
- スマートArduino四足歩行ロボットの製作:ステップバイステップガイド
- ゲーム用カスタムArduinoジョイスティックハンドルの製作
- Arduino Nano R3で本格的なCNCマシンを自作する
- オープンソース リファレンス ボード、医療用人工呼吸器の迅速開発を加速