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

比色分析装置の作製

はじめに

比色分析は水質分析において非常にポピュラーな方法です。検体に発色試薬を加えて、色の発色具合(濃淡)で濃度を推定する方法です。通常、発色は専用の分光光度計で測定する場合が多いと思います。

私が過去に培養しているとき、濃度を連続的に比色分析したい場面が二つありました。一つ目はanammoxの培養です。Anammoxの培養では、亜硝酸濃度を高めるほど活性も上がるのですが、亜硝酸自体が毒性を持つため、濃度を高く設定しすぎると菌体が死滅します。そのため、培養液中の亜硝酸濃度を連続的に測定し、亜硝酸濃度が上昇しない範囲で亜硝酸を添加するような運転をしたいと考えました。もう一つの場面は、微生物を培養しているとき、物質生産、消費を連続してモニタリングすることができたら便利だなと思ったときです。

いずれも分光光度計が必要ですが、なかなか高価なものですので、培養する度に占有するわけにもいかず、それなら自作しようということになりました。ここではArduinoにRGBのカラーセンサを接続し、カラーセンサを分光光度計用のキュベットに取り付け、連続して吸光度を測定する装置を作成します。

材料

  1. カラーセンサーモジュール (秋月電子通商: M-08220) (adafruit: TCS34725使用)
  2. Arduino UNO keyestudio UNO R3 開発ボード (amazon, ASIN B01JRFS1QI)
  3. ブレッドボード:例えば、ブレッドボードBB-601 (秋月電子通商 P-05155)。
  4. 収納ケース
    • 100均の食品保存ケース、空きチップケースなど。Arduino類が入ればなんでも構いません。
  5. 収納ケースへ基盤を固定するためのネジ、ナット、スペーサー類
    • M3ネジ;長さ 5 mm(秋月電子通商, P-10358), 8 mm(P-10359), 10 mm (P-03000)があればおよそ用足ります。
    • M3ナット(P-03584)。
    • スペーサー(10mm)セット (秋月電子通商P-01864)
  6. 電線(単芯のワイヤ): 例えば、耐熱通信機器用ビニル電線 2m×10色 (秋月電子通商 P-08996)
  7. ワイヤーストリッパー (例えば、ベッセルワイヤーストリッパー 3500E-1)
  8. 1 cmプラスチックキュベット
  9. プラスチック/ガラス用接着剤: セメダイン ハイスーパー30 (2液式接着剤)
  10. ガラスまたはプラスチック管 (内径2 mm、外径4 mm程度)
  11. ペリスタポンプ 2台以上
    • 採水用、希釈水供給用、発色試薬供給用などで複数台必要です。ペリスタポンプ作製編を参考に準備してください。
  12. ドライバー、電気ドリルとドリルビットなど汎用工具

作製方法

カラーセンサーモジュールにピンヘッダをハンダ付します。メーカーHPに配線からスケッチ、使用方法まで詳しい解説があるので参考にしてください。

IMG_2796.jpg1 cmプラスチックキュベットをフローセル(=連続して液体を供給できるセル)に加工します。プラスチックキュベットの側面上下にガラス/プラ管を通すための穴をドリルで開け、管を設置してください。

キュベットに通した管は接着剤固定します。2液タイプの接着剤を説明書の通り混合し、塗布してください。ヘラで作業が難しい場合、ディスポシリンジ(テルモシリンジなど)に混合した接着剤をヘラで移し入れ、シリンジ先から出しながら接着剤を塗布します。シリンジの先にカットしたピペットチップをつけて作業すると細かい部分でもやりやすいです。固化するまで待ちます。

続いて、キュベットの上部に蓋をします。適当な大きさにカットしたプラスチックシートまたはアクリル板を接着剤で固定します。接着剤が固化するまで待ちます。これでフローセル部分の完成です。

カラーセンサー回路.jpg図のような回路を組みます(イラストには9Vアダプタが含まれていますが、PCにArduinoを接続してシリアルモニタで測定値を確認する場合にはこのアダプタは不要です。後述のPCから切り離して使用する場合には電源として9Vアダプタを接続してください。)。

フローセルとカラーセンサーは収納ケース内に固定します。固定する際、カラーセンサーがフローセルの中央付近で密着する位置で固定してください。カラーセンサーは取り付けているブレッドボードの両面テープ、フローセルは収納ケースの床に接着剤を塗布して固定します。接着剤固化後、収納ケース側面にポンプチューブを配管するための穴を2箇所空け、ポンプチューブを通します。測定中は遮光した方が良いので、収納ケースを黒色のスプレーで塗りつぶすか、アルミホイルで完全にくるむなど対応します。

IMG_2802.jpg流路の途中のコイルは発色時間を確保するため、チューブを長く確保している部分です。発色時間次第で調整します。また、加熱が必要な場合、チューブをニクロム線で巻き、ニクロム線に通電して加熱します。この際、ニクロム線は100℃以上になるので加熱する部分は金属チューブ(アルミパイプなど)を使用します。また、ニクロム線の温度は通電する電圧で調整することができます。この場合、ペリスタポンプを作製するときに使用した電圧コントローラーを配置してください。

採取液量を極力抑えたい場合、チューブの内径ができるだけ細いものを使用するといいです。例えば、ポリエチレン細管(ヒビキ)などをつかいます。ポリエチレン細管のような細いチューブの場合、チューブフィッティングの代用として、口径の細いマスターフレックスチューブ(L/S 13くらい)を短く切ってチューブ同士を繋げることができます。


メーカーHPよりスケッチをダウンロードします。Zip形式でダウンロードし、Arduino IDEでライブラリへ追加します。スケッチ例を開き、tcs34725を開いて、Arduinoへ転送します。このスケッチはready-to-useなので、シリアルモニタを表示させると、すぐに測定値が表示されます。Rは赤、Gは緑、Bが青色波長帯です。発色があるほど、測定値の大きさが減少します。測定値は色の強度を示しており、分光分析で馴染みの深い吸光度(Absorbance)ではありません。吸光度に換算したい場合、ブランク値と検体の測定値の差分を計算してください。
30.jpg31.jpg

32.jpg比色分析である成分の濃度を測定した例を示します。濃度に応じて測定値が変化している様子がわかると思います。

改造例 PCのシリアルモニタを利用せず、測定値をディスプレイ表示、測定値はSDカードへ記録する。

先の装置はカラーセンサの測定値をPCのシリアルモニタに表示・記録させる方法を想定しています。つまり、PCが常時1台必要になります。余剰PCがない場合はPCから切り離してArduinoを稼働させ、測定したカラーセンサーの値を液晶ディスプレイ表示、SDカードへ記録することで用足ります。

以下のように配線します(イラストのArduinoはSDカードシールドを装着した状態と考えてください。)。AC9Vアダプタ、ディスプレイ、SDカードシールド等の部品が必要です。ディスプレイについてはpH、DO、ORPコントローラーの項目を参考にしてください。SDカードシールドについてはこちらを参考にしてください。

カラーセンサー_液晶付き.jpg

以下のようなスケッチで稼働します。赤字で書いた、濃度換算に必要な検量線の傾き(slope)、切片(intercept)、色(ここでは緑g)、測定間隔の部分を個人で変えて使用してください。

//使用ライブラリ
#include <Wire.h>
#include "Adafruit_TCS34725.h"
#include <LiquidCrystal.h>
#include <SPI.h>
#include <SD.h>
// ***************************************************
//初期設定、以下4個のコマンド SDカード、液晶、カラーセンサ、時間格納
const int chipSelect = 4; //SDカード関連
LiquidCrystal lcd(12, 10, 5, 4, 3, 2); //Arduino側液晶用使用ピン
// Adafruit_TCS34725 tcs = Adafruit_TCS34725();
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_700MS, TCS34725_GAIN_1X); //カラーセンサの測定間隔、感度定義
//上のTCS34725_INTEGRATIONTIME_700MSの末尾を変更して測定間隔を変える。現在は700msの設定で、これが最長値
unsigned long time; //"unsigned long"が関数、ここでtimeを時間格納用に定義

// ***************************************************
// You need to change the values of slope and intercept.
float slope = 40; //create global variable for slope
float intercept = 6600; //create global variable for intercept
// 解説:実験したとき、0 mM濃度溶液を測定した際、緑(g)の測定値が6600を示し、
// 1 ppm 上昇するたびに吸光度が40ずつ低下しました。上のslopeとinterceptはその関係を示しています。
int concentration; // 濃度
int linenum = 0;
const int N = 2;

void setup(void) {
Serial.begin(9600);
//液晶の初期化
lcd.begin(16, 2);//16x2行ディスプレイ指定
//SDカードの初期化
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
return;
}
Serial.println("card initialized.");
//カラーセンサ初期設定
if (tcs.begin()) {
Serial.println("Found sensor");
} else {
Serial.println("No TCS34725 found ... check your connections");
while (1);
}
}
// 分析開始
void loop(void) { //以下、loopなので無限回実行する。
//カラーセンサ測定、PCシリアルモニタ表示
uint16_t r, g, b, c, colorTemp, lux;
tcs.getRawData(&r, &g, &b, &c);
colorTemp = tcs.calculateColorTemperature(r, g, b);
lux = tcs.calculateLux(r, g, b);
time = millis(); //millis関数 プログラム実行後からの経過時間をmsecで返す
// 検量線から濃度換算
concentration = abs(g - intercept)/slope; //緑(g)の吸光度から濃度換算する。緑以外ならr(赤)、b(青)を指定する
// シリアルモニタ表示
Serial.print("Time: ");
Serial.print(time / 1000); //単位 sec
Serial.print(" Temp: "); Serial.print(colorTemp, DEC); Serial.print(" K - ");
Serial.print("Lux: "); Serial.print(lux, DEC); Serial.print(" - ");
Serial.print("R: "); Serial.print(r, DEC); Serial.print(" ");
Serial.print("G: "); Serial.print(g, DEC); Serial.print(" ");
Serial.print("B: "); Serial.print(b, DEC); Serial.print(" ");
Serial.print("C: "); Serial.print(c, DEC); Serial.print(" ");
Serial.print("concentration: "); Serial.print(concentration); Serial.print("ppm");
Serial.println(" ");
//SDカード保存
File dataFileSCN = SD.open("colorimetric_measurement.txt", FILE_WRITE);
dataFileSCN.print(time / 1000);
dataFileSCN.print("sec, ");
dataFileSCN.print(colorTemp); //温度データも念のため保存
dataFileSCN.print("oC, ");
dataFileSCN.print(concentration); //濃度換算値をSDカードへ記録
dataFileSCN.println("ppm"); // 単位
dataFileSCN.close();
//液晶表示
lcd.clear();
lcd.setCursor(0, 0);//一行目書き出し
lcd.print(concentration); // 濃度換算値を液晶に表示
lcd.setCursor(0, 1);//二行目書き出し
lcd.print("ppm"); //単位
//次回測定までの待ち時間(msec)の設定
delay (5000);
}