臨床工学技士の皆さんとそうでない方 こんにちは。
もしCEの為のArduino入門を一読されていない場合は先に目を通し、Arduino初心者になっておいてください。
さて、前回はArduinoで作る!!自然滴下流量計の製作をご紹介しましたがどうだったでしょうか?
前々回はArduinoで作る!!ライトガイドケーブルチェッカーの製作でした。CEの方で初めて何か作る方はまずはこちらから作成してみてください。
今回の製作例は輸液シリンジポンプの充電完了を充電電流を監視する事で知る事ができる便利な機器の製作例をご紹介いたします。
たとえばですが、下図のように電源に輸液シリンジポンプの電源を挿した状態で配置しておくだけで、満充電のポンプだけを表示し貸出の可能である事をお知らせする事が可能な貸出棚が作れたりします。
arduinoのプログラムスケッチは↓からダウンロードできます。
ZIPファイルなので解凍後、スケッチをarduinoに書き込みしてご使用ください。
今回もハードウェアの説明とプログラム解説の動画も用意していますので参考にしてください。
それでは今回も頑張って工作・プログラミングしていきましょーー。
とりあえず↓こんなんが作れます。
仕組みについて
充電の動作について
輸液・シリンジポンプに限った事ではないですが、この世に存在する便利な機器にはバッテリーを搭載しているものがあります。
AC電源で動作する機器がAC電源が無い環境でも一定期間動作させる為に、もしくはバッテリーだけでメインの動作をさせるといった具合にバッテリーは使用されます。
今回は特に前者の普段はAC電源で動作させて一定期間だけバッテリー動作させる機器のバッテリー充電について考えます。
輸液・シリンポンプは最近ではどの病院でも中央管理しているところが増えていると思いますが、検査など患者さんの移動時に輸液療法を継続させる為にバッテリー動作が必須です。
もしバッテリーが空であれば移動時に大事な昇圧薬や降圧薬など循環作動薬が投与されないとなると生命にも危機がおとづれます。
そうならない為に輸液・シリンジポンプは普段AC電源に繋いでいる時に使用・不使用かかわらず、バッテリーに充電を行っています。
最近ではリチウム電池を用いた機器が増えてきているのでリチウム電池の充電方法について述べておきます。
リチウム電池の充電方法はCCCV方式という方法をとって充電しています。
簡単に説明すると、電池がある程度容量が減っていると最初の充電方法を定電流充電として、バッテリーの電圧に応じた充電電圧を増減させて一定の電流で充電していきます。
バッテリー電圧が目的の電圧近くに到達しそうになると、定電流充電では過充電となるので(バッテリー電圧が目的の電圧以上になる)、ある時点で定電圧充電として目的の電圧に到達するまで微小な電流で電池電圧が上昇するまで充電するようです。
これが私たちが普段使用している輸液シリンジポンプの充電方法となります。
機器個々で違うバッテリーの充電電流を監視する
輸液・シリンジポンプの充電状態は個々の機器によって様々です。
満充電状態のもの、半分の容量まで減っているもの、空のものなどです。
そんな機器が返却されて、バッテリー残量がわかるインジケータを確認してもだいたいどのくらい充電すれば満充電なのか?がいまいちわかりませんよね?
場合にによっては返却された機器は8時間以上AC電源につないで満充電状態(充電マークやAC電源マークの点滅がきえるまで)になるまで保管してそれから貸出可能にするといった施設まであるようです。
当方の勤務する病院では300台近くポンプがあり、回転率も高い為そんな悠長な事をしていれば必要なポンプが必要な患者様に使用できません。
ですので、充電の為にAC電源につないだケーブルに流れる電流量を監視する事で現在充電中なのか?または満充電を迎えているかを判断し、判断の結果をわかりやすく表示するという機器が作れたら非常に便利です。↓
そうすればほぼ満充電で返却された機器はすぐに貸出可能ですし、減ったバッテリーは充電電流が流れなくなったタイミングで満充電という事が視覚・聴覚的に(これは工作の仕方でどうにでもなります。)確認する事が可能です。
今回はその充電状態を監視する機器をArduinoで実現させていきます。
使用材料
- Arduino UNO R3
- 液晶ディスプレイ KKHMF OLED 128×32 0.91inch
- ACS712モジュール×1
※ACS712はチップ単体のものとモジュール化されたものがあるが後者を選ぶ必要がある。 - オペアンプ NJM2732D×1
※単電源で0V付近まで出力できるものがよい - 抵抗器 10kΩ×1
- 抵抗器 100kΩ ×1
- セラミックコンデンサ 0.01μF ×1
- 可変抵抗 50kΩ ×1
電流を計測するセンサACS712を使う
AC電源に繋いだケーブルから充電電流を計測するにはどうすれば良いか?ですが、世の中には便利なセンサが存在します。
今回選定したセンサはACS712というセンサです。
Allegro社という会社が製造しているセンサで交流と直流の電流が計測できる便利センサです。
普通の電流センサはシャント抵抗を使うセンサがほとんどで、シャント抵抗分の消費電流が消費されますが、このACS712はホール素子を用いる事でその心配は無いし、ArduinoとAC電源は絶縁されているので安心です。
センサは5A、20A、30Aが存在していて交流の電流を計測する場合、電流に応じて2.5Vを中心とした交流で5Vまでの電圧で出力されます。
直流の電流を計測する場合には電流値に応じた電圧が出力される仕組みです。
くわしくはデータシートをご覧ください(英語)→ PDF
センサ単体で購入もできますが、使用するには抵抗やコンデンサなどが必要なのでアマゾン等でセンサーを使用したモジュールとして購入したほうがコスパが良いです。
私が使用したものは5Aのモジュールでアマゾンで二つセットで799円でした。安すぎです。おそらく中国製でサードパーティ製です。
使い方は簡単でセンサのVCCに5VをGNDにGNDを、OUTと書いてあるところから出力電圧がでてきます。
センサで測定する電流値について
5Aまでの電流が計測できるモジュールを選んだ理由はそれ以下の電流を計測できるモジュールが無かったからなんですが、そもそもどのくらいの電流値を計測すればよいのか?を考えてみます。
今回は実際に輸液ポンプはテルモ社の28型とJMS社のOT-808、シリンジポンプはテルモ社のTE-382で実際の充電電流を計測しました。
計測方法はサンワサプライのワットチェッカーを使用してバッテリーが空の状態の輸液シリンジポンプの充電電流を実測しました。↓
実測結果と計測電流範囲
TE28型の充電電流 おおよそ0.13mA
OT−808 おおよそ0.11mA
やはり特徴は一定の電流で充電したあとにあるところで電流値が小さくなりそのまま充電電流が0mAになるという事でしょうか?
鉛蓄電池のように満充電になっても常に一定の電圧で充電を続けるトリクル充電はしていません。
上記の充電電流から考えるにACS712で計測する電流範囲は0から1Aまでの電流を計測できれば良いわけです。
問題点について
ここまででACS712で計測電流範囲は1Aまでで良さそうという事、実際には計測する電流値はおおよそ0.13mA程度で電流が止まればしっかり0mAと判定できなければなりません。
しかしアマゾンで入手できるACS712モジュールの一番電流値の低いモデルは5Aが上限のやや計測範囲の広いものです。データシートをみてみると1Aまで精度よく計測するには下図の赤枠の範囲だけを拡大する必要があります。
グラフは電流値に対するセンサ出力電圧をグラフ化したものです。
AC電源の電流計測ではセンサ出力は電流に応じてAC電圧が2.5Vを中心に出力されます。
1Aで3Vとなっていますね。ですから2.5V=0mAから3V=1Aですから0.5Vしか出力範囲がないので非常に狭い範囲の電圧をArduinoでAD変換しなければならず、精度も悪くなります。
今回は精度よく充電電流を計測する為と電子工作初心者のCEさんの為に少しだけ電子工作メソッドを追加します。
この狭い0.5Vの範囲をオペアンプによって0.5Vを0V〜5Vの範囲に10倍程度拡大します。
このことによってかなり精度の高い電流計測が可能になります。
オペアンプの使い方
精度良く5Aまでの範囲の広いセンサで1A以下の電流を計測する為にオペアンプを使用し、センサ出力電圧を10倍程度増幅します。
どんな回路にすべきか?ですが、CEの教科書である標準テキストにのっているオペアンプの使い方で本当に使用できてしまします。
今回はかなり簡単な反転増幅回路を利用して回路設計しました。
使用したオペアンプは、NJM2732Dというオペアンプを使いました。
オペアンプの必要条件は単電源である事くらいでなんでも使えます。↓
オペアンプの回路図のみかたは上記の通りです。オペアンプについている丸い印から反時計回りで順番に1〜8番まで番号が振られています。
増幅方法は比較的簡単な反転増幅回路を用いています。お勉強されたいかたはこちらがわかりやすいです。
反転増幅回路なので、増幅した信号は反転するのですがACS712からでた出力は交流電圧波形なので反転しても特に問題ないです。必要なのでは出力さてあ交流波形の電圧です。
抵抗の比が増幅率になります。
今回は増幅だけではなく、オペアンプの復帰還にコンデンサを配置する事によってACS712の出力に乗っているノイズも低減しています。
ノイズの遮断周波数はコンデンサの容量と抵抗で決定する事ができ今回は159Hzで設定したローパスフィルター(LPF)としています。
オペアンプの実際の回路図はこちら↓
オペアンプのプラス入力のところに50kΩの可変抵抗を配置しています。
これは出力のレベルを調節する為に配置しています。
ACS712はAC電流を計測する場合2.5Vを中心として0−5Vの交流電圧が出力されますが、輸液シリンジポンプで消費する0mAから1Aまでの電流でかまいません。
できればおおくの電流を計測できるように0mA時の電圧出力(2.5V)を0V付近まで下げてオペアンプから出力させる為に使用します。
ただ、センサからの出力は交流波形なので、下側の波形も存在する為完全に0V付近までレベルシフトするわけにはいきません。
交流でなく直流電流の計測であればオペアンプで増幅した後、0mAの時の出力を0vにレベルシフトすればかなり精度、測定範囲が広がります。
回路図について
仕組みや概要がわかったところで早速電子工作です。
今回はオペアンプが必要なので少し複雑ですが間違いないように配線していきましょう。
今回もわかりやすいように実配線図を用意しています。↓
AC電源はケーブルの一部を離断させ、ACS712の入力に接続します。
まちがってもAC電源と並列に入れてはいけません。
AC電源を使用しますので、配線間違いがないよう注意してください。
AC電源の接続はお近くの電気工事士にご相談いただくか、ご自身が電気工事士2種をとってから配線してください(笑)
私の場合は↓のように圧着端子を用いて結線しました。くれぐれもご注意を感電します。
ACS712との接続↓
ハードの説明(動画)
ハードの説明を動画で説明しています。
プログラムの解説(動画)
ハードウェアを組み立てArduinoにスケッチをインストールしたらすぐに動作します。
プログラム解説
プログラムのダウンロードはコチラから
ハードウェアを組み立てダウンロードしたスケッチを解凍後arduinoに書き込めばすぐに使用できます。
一応プログラム中にコメントアウトでわかりやすくメモ書きしていますが、プログラムのここがわからない、もう少し説明してくれなどあればご連絡ください。
加筆いたします。
基本的にはCEの為のArduino入門を一通りプログラム及び練習していればプログラムの内容も理解できるはずです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
/* 輸液ポンプ充電完了表示棚システムの製作 202305 takase kazunori mail:kazurock0926@gmail.com arduino UNO R3にて制作 ACS712使用 5AVersion 制度を上げる為にACS712から出力をOPアンプにて10倍増幅 OPアンプは単電源タイプであればどれども使用OK ACS712は出力ノイズが大きい為オペアンプにてローパスフィルターも設定 0.91inch OLED使用 */ //OLED有機ディスプレイを使用するライブラリ #include<U8g2lib.h> U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); //使用する変数など const int sensorIn = A0;//ACS712--OPAMPからきた電圧をA/D変換するためのピン double mVperAmp = 185;//185mvで1Aの設定 double Voltage = 0;//電圧の変数 double VRMS = 0;//電圧の実行値 double AmpsRMS = 0;//電流値 char str1[10]; char str2[10]; char str3[10]; void setup() { Serial.begin (9600); Serial.println ("輸液ポンプ充電完了表示棚システム"); //OLEDをとりあえず表示させます。OLEDの表示の方法ははじめのarduinoのHPで説明しています。 u8g2.begin(); u8g2.clearBuffer(); u8g2.setFont(u8g2_font_8x13_tf); u8g2.drawStr(0, 10, "Hello CE"); u8g2.drawStr(0, 20, "clinical"); u8g2.drawStr(10, 30, "Engineering"); u8g2.sendBuffer(); delay(3000); } void loop() { Voltage = getVPP(); VRMS = (Voltage/2.0) *0.707; //実行値が得られたらmvに直して185mvで1Aなので割って電流値を計算します。 AmpsRMS = (VRMS * 1000)/mVperAmp; //シリアル通信でPCに送信します Serial.print ("Voltage:"); Serial.print (Voltage); Serial.print ("VRMS:"); Serial.print (VRMS); Serial.print ("AmpsRMS:"); Serial.println (AmpsRMS); //OLEDにはデータ型を出力できないので数値を一度文字データに変換します。 //strという文字列の入れ物を作成してdtostrfで変換します。 dtostrf(Voltage,3,2,str1); dtostrf(VRMS,3,2,str2); dtostrf(AmpsRMS,5,2,str3); if(AmpsRMS >= 0.09) { //電流値によって表示を変更 //実験では0.11Aで定電流充電なので0.09A以上の電流が流れている時は充電中とします u8g2.begin(); u8g2.clearBuffer(); u8g2.setFont(u8g2_font_8x13_tf); u8g2.drawStr(0, 10,"NG--NG--NG--NG"); u8g2.drawStr(5, 20,"NOW charging"); u8g2.drawStr(55, 32,str3); u8g2.drawStr(100, 32,"A"); u8g2.sendBuffer(); //delay(5); }else{ //上記以外の0.09A以下の電流値の時にはすでに満充電状態と判定 u8g2.begin(); u8g2.clearBuffer(); u8g2.setFont(u8g2_font_8x13_tf); u8g2.drawStr(0, 10, "OK--OK--OK--OK"); u8g2.drawStr(0, 25, "FULL"); u8g2.drawStr(55, 32, str3); u8g2.drawStr(100, 32, "A"); u8g2.sendBuffer(); //delay(5); } } //ACS712は電流に応じた交流電圧を出力するので、交流の高い所と低いところの値を取得します。そうする事で波高値を得ます。 float getVPP() { float result; int readValue; int maxValue = 0; int minValue = 1024; uint32_t start_time = millis(); while((millis()-start_time) < 1000) //1秒間サンプルをとります { readValue = analogRead(sensorIn); // もし読み込み値が最大地を超えたら下記の処理 if (readValue > maxValue) { maxValue = readValue; } //もし読み込み値が最小値を下回ったら下記の処理 if (readValue < minValue) { minValue = readValue; } } //結果をresultに格納してこの関数から戻ります。 result = (((maxValue - minValue)-5) * 0.45)/1024.0; return result; } |