研究Tips:研究を効率化するためのTipsを紹介しています。

pH, DO, ORPコントローラーの作製

はじめに

培養液中のpH、DO、ORPなどをある一定値に保つ装置です。市販品はセンサー込みで>20万円くらいです。pHコントローラーは熱帯魚飼育用の比較的安価な市販品(例えば、Bluelab pH controller, amazon, ASIN B00O9CBYZ0)もありますが、DO、ORPについては産業プロセス用の装置ばかりになります。

ここではArduinoと各種センサーを使って制御する装置を自作します。例として、Vernier社の蛍光DOプローブをセンサーとして使い、液晶に測定値を表示、DOがある一定値以下になった場合に外部装置(ここではエアーポンプ)を稼働させる装置を作ります。汎用かつ安価な隔膜式DOセンサで構わなかったのですが、手元になかったので蛍光DOプローブを使用しました。なお、ArduinoをPCに接続したまま、シリアルモニタでデータを観察するなら液晶ディスプレイは不要です。

アナログ電圧出力型のセンサーであれば、センサーを変更するだけでなんでも測定・制御できるので応用が利く装置です。使用する前に、センサーの電圧出力の範囲を確認してください。Arduino UNOはアナログピンを使って0〜5Vの電圧を測定できます。ここで例として使用しているVernier社の蛍光DOプローブは0〜5V出力だったので電圧を変更することなく直接接続できます。出力電圧のレンジがより大きいセンサーを使用する場合、抵抗を途中に設置するなどして降圧して測定してください(ここではESPr developerに0〜1V入力させるために0〜5Vのセンサーを約1/5に降圧させる分圧回路を使いました。)。

以下、最初の例では動作中はPCに接続せず、設置したディスプレイに測定値を表示させながら運用することを想定しています。この場合、ディスプレイを付けるので配線がやや複雑です。2番目の例ではPC接続したまま使用する場合で、測定値の確認、記録がPCのシリアルモニタで出来るため、配線はこちらの方がとても簡単です(順番は逆転しますが研究室内で古いPCが余っていたり、PC争奪戦になっていない状況でしたら、まずはこちらを試す方が導入し易いと思います)。3番目の例では1台のArduinoでDO、pHなど複数項目を制御する場合を想定します。

なお、パソコンに接続せずに運転した場合、制御は行いますが、測定値は保管されません。測定値が必要な場合、測定値をSDカードに保管します。測定、SDカードのページを参考にしてください。

例1 測定、制御→測定値を小型ディスプレイに表示させる

材料

  1. センサー
    • 各種メーカーから販売されているものを使います。
    • 例えば、Vernier社は DOセンサー、pH、ORP、イオンセンサーなど多種のセンサーを販売しています。Arduinoと接続する場合、アナログ出力のセンサーであることを確認してください(アナログがデジタル、無線通信のいずれかになります)。アナログ出力のセンサーを接続するボードとしてVernier Analog protoboard adapter (#BTA-ELV)が必要です。
    • Atlas Scientific社はDO、pH、ORP、温度、電気伝導度センサーを販売しています。例えば、DOセンサーと変換ボードのセット(amazon, ASIN: B005GRGPH4)など。ArduinoのサンプルスケッチもHPで公開しているので扱いやすいと思います。Vernier社のセンサーは現在、センサーケーブルを省略したGoDirectシリーズに移行しつつあり、こちらのセンサーは無線通信でデータを測定するものです。無線通信タイプはArduinoにそのまま接続できないので、将来的にはAtlas Scientific社のセンサーを使う機会も増えると思います。
    • その他、種類はあまりありませんが、pHやDOセンサーはより安価なものを提供するメーカーもあります。例えば、GravityシリーズはpH(例えば、スイッチサイエンス DFROBOT-SEN0169)、DO (DFROBOT-SEN0237-A)、電気伝導度のセンサーを提供しています。Arudinoのサンプルスケッチがあるのでこちらも簡単に導入できると思います。
  2. Arduino UNO: keyestudio UNO R3 開発ボード (amazon, ASIN B01JRFS1QI)
  3. ACアダプター 9V 1.3A (秋月電子通商 M-01803)
  4. ディスプレイ: 例えば、LCDキャラクタディスプレイモジュール (秋月電子通商 P-00040)
  5. 半固定ボリューム10kΩ (秋月電子通商: P06110)
  6. 収納ケース(100均の食品保存ケース、空きチップケースなど。Arduino類が入ればなんでも構いません。)
  7. 収納ケースへ基盤を固定するためのネジ、ナット、スペーサー類
    • M3ネジ;長さ 5 mm(秋月電子通商, P-10358), 8 mm(P-10359), 10 mm (P-03000)があればおよそ用足ります。
    • M3ナット(P-03584)。
    • スペーサー(10mm)セット (秋月電子通商P-01864)
  8. ブレッドボード:例えば、ブレッドボードBB-601 (秋月電子通商 P-05155)。
  9. Vernier Optical DO probe (ODO-BTA) (備考: 蛍光プローブ)
  10. Vernier Analog protoboard adapter (BTA-ELV)
  11. ソリッドステートリレー
    • (要組み立て)ソリッド・ステート・リレー(SSR)キット 25A(20A)タイプ (秋月電子通商 K-00203) 250円
    • (完成品) 大容量ソリッドステートリレー(SSR)24V~380V (秋月電子通商 I-08620) 1,000円
  12. 電線: VFFビニル平形コード VFF 1.25SQ 10m
  13. 電工ペンチ(例えば、ロブテックス電装圧着工具FK6および)
  14. 圧着端子 (例えば、ニチフ TMEV 1.25Y-3.5-RED)
  15. 電線(単芯のワイヤ): 例えば、耐熱通信機器用ビニル電線 2m×10色 (秋月電子通商 P-08996)
  16. ワイヤーストリッパー (例えば、ベッセルワイヤーストリッパー 3500E-1)
  17. コンセントプラグ オス・メス1組、(スナップキャップ、平型コネクターボディなど)
  18. ドライバー、電気ドリルとドリルビットなど汎用工具

作製方法

ソリッドステートリレーの組み立てが必要なら組み立て、コンセントプラグとビニルコードでAC100Vをリレー制御する部分を作ります(タイマー作製編に詳しいです。)。
続いて、図のように配線します。 先にも述べましたが、PCにArduinoを接続しながらシリアルモニタで測定値を表示させるのであれば、ディスプレイの部分は不要です(次の例2で紹介しています)。この場合、ディスプレイと半固定ボリュームの部分の配線が不要になるので、全体がかなりシンプルになります。写真はPC接続するのでディスプレイを省略したバージョンになります。空チップケース内に収まるサイズで作製できます。

DOコントローラー回路図.jpgIMG_2798.jpg

センサーの補正用に、飽和DO水、DOゼロ水を用意します。飽和DO水はエアーポンプで20分以上曝気した水、DOゼロ水は亜硫酸Naを水に5 g/100 mLの濃度で溶かした溶液です。飽和DO濃度は温度に依存するので、温度計で水温を測定し、理科年表などでDO濃度を確認しておきます。

以下のようなスケッチをArduinoへ書き込み、稼働させます。液晶に測定値が表示されない/かすれて見づらい場合、半固定ボリュームを回転させてコントラストを調整してください。それでも表示されない場合、配線を確認してください。パソコンと接続して運用するようならシリアルモニタで測定値を確認できます。シリアルモニタを開いて、以下の作業を進めてください。

#include <LiquidCrystal.h>
float rawCount; //create global variable for reading from A/D converter (0-1023)
unsigned long time;
LiquidCrystal lcd(12, 10, 5, 4, 3, 2); //Arduino側液晶用使用ピン

void setup() {
Serial.begin(9600); //setup communication to display
lcd.begin(16, 2);//液晶の初期化、16x2行ディスプレイ指定
}

void loop() {
time = millis();
rawCount=analogRead(A1); //read one data value (0-1023)
//シリアルモニタへの表示
Serial.print(time/1000);//incubation time, unit second
Serial.print("\t"); //print a tab character
Serial.println(rawCount); //print read values and skip to next line
// 測定結果の液晶表示
lcd.clear();
lcd.setCursor(0, 0);//一行目書き出し
lcd.print(rawCount); // 測定値を液晶に表示する。
delay(1000); //wait a second
}

センサーを飽和DO水に浸し、測定値がある程度安定したら、その値をメモします。同様の作業をDOゼロ水でも行います。この測定値から電圧とDO濃度の関係について直線を書き、傾きと切片を計算します。例えば、DO 0 mg/Lのときの測定値が100、DO 6 mg/Lのときの測定値が700だった場合、エクセルでこの2点間の傾きと切片を計算してください(ここでは傾き100、切片100になります)。

続いて、以下の測定・制御用のスケッチをArduinoへ書き込みます。このとき、スケッチ内の傾きと切片、制御したい閾値(赤字の数値の部分です)を変更したものを転送してください。

#include <LiquidCrystal.h>
// You need to change the values of slope and intercept.
float slope = 0.0268693; //create global variable for slope
float intercept = -0.537386; //create global variable for intercept
//

// You don't need to change the following commands.
float rawCount; //create global variable for reading from A/D converter (0-1023)
float sensorValue; //create global variable for sensor value
unsigned long time;
LiquidCrystal lcd(12, 10, 5, 4, 3, 2); //Arduino側液晶用使用ピン

void setup() {
pinMode(8, OUTPUT);//Digital 8 pin is used for relay control of a pump.
Serial.begin(9600); //setup communication to display
lcd.begin(16, 2);//液晶の初期化、16x2行ディスプレイ指定
}

void loop() {
time = millis();
Serial.print(time/1000);//incubation time, unit second
Serial.print("\t"); //print a tab character
rawCount=analogRead(A1); //read one data value (0-1023)
sensorValue=slope*rawCount+intercept; //Calculation of DO concentration from rawCount with linear calibration equation
Serial.print(sensorValue); //print DO concentration
Serial.println("mg_L"); //print units and skip to next line
// 測定結果の液晶表示
lcd.clear();
lcd.setCursor(0, 0);//一行目書き出し
lcd.print(sensorValue); // 測定値を液晶に表示する。
lcd.setCursor(0, 1);//二行目書き出し
lcd.print("mg_L"); // 単位を液晶に表示する。
if (sensorValue < 1.0) { //閾値、ここでは1.0 mg/L
digitalWrite(8, HIGH); //Pump ON when DO decreases below 1.0 mg/L.
delay(120000); //wait for 2 min
} else {
digitalWrite(8, LOW);//Pump OFF when DO is higher than 1.0 mg/L.
delay(1000);
}
}

現在のスケッチではDOが1 mg/Lを下回ると、デジタル8ピンに接続したリレーを稼働させ、エアーポンプを稼働させるプログラムになっています。pH、ORPなど他のセンサーも同様に作製できます、各センサー毎の校正方法を確認して実施してください。

例2 測定、制御をPCに接続したまま行うので、ディスプレイが不要

先の例は液晶が入っているので回路がややこしいですが、PCに接続してシリアルモニタ表示+制御するなら液晶は不要です。液晶の配線を省略する分、配線はとても簡単になります。図のような回路で作動します。上のスケッチはディスプレイ表示のために余計なコマンドがいくつか含まれていますが、そのままでも動作するので、面倒なら編集せずにそのまま転送して構いません。

DOコントローラー回路図液晶なし.jpg

例3 1台のArduinoに複数センサーを接続し、測定、制御する場合

Arduino自体さほど高価なものではないので、各センサー毎に1台用意してもいいかと思いますが、Arduinoの測定用のanalogピン(A0〜A5)は合計6個あるので、6種類のセンサー(=パラメーター)まで同時測定、制御できます。センサーを追加する場合、使用していないanalogピンを信号測定に使ってください。個々の測定値に基づいてリレー制御する場合、リレーで使用するデジタルピンを追加してください(上のスケッチでは8 pinを使用しているので、それ以外のピン)。また、Arduino UNOではなく、MEGAにすると、さらに6個以上のセンサーを接続することが可能です。

なお、複数のセンサーの測定値をディスプレイに表示したいときは次のようにします。今回使用しているディスプレイは16文字×2行まで表示できます。例えば、1行目の1〜8文字までをセンサー1、9〜16文字をセンサー2、2行目の1〜8文字までをセンサー3、9〜16文字をセンサー4のように表示させます。上のスケッチのlcd.setCursor()のコマンドの中身を編集して対応してください。