kuroの覚え書き

96の個人的覚え書き

電気伝導率計を作る



現在、塩水に強いイネの研究を行っている。塩水にイネをつけて死なない品種(もしくは遺伝子組換え体)を探しているのだが、この塩水の濃度を一定に保つのがなかなか難しい。完全密閉状態の瓶の中で栽培して評価を試みてはいるのだが、自然条件とはかなりかけ離れたそんな環境のテストを疑問視する声もある。

そこでもうちょっとオープンな環境で塩濃度をコントロールしたい訳なのだ。

基本的に水耕でないと塩分濃度をコントロールできないので水耕とする。幸いイネは水耕向きなのでその点は問題ないのだけど、オープンな環境で水耕にすると葉からの蒸散や水面からの蒸発によって水かさが下がり、その結果塩濃度が変動してしまうことになる。対策としては塩濃度を測定して上昇していたら水を追加することで補正をかけてやるのが手っ取り早い。厳密には植物体に取り込まれる塩(NaClだけでなく培地中に含まれる塩)が有るだろうから水を足したら元通りとはいかないだろうが、イオン濃度の変化を有る程度抑えることにはなるだろう。

さて、イオン濃度を測定するにはECメーターという物を使うらしい。日本語にすると電気伝導率計(導電率計)。要するには電気の流れやすさを計る訳でそれならば電圧計で良いことになる。

http://ja.wikipedia.org/wiki/電気伝導率

オームの法則 V=IR

f:id:k-kuro:20100626164233j:image

電気伝導率の単位はS/m(ジーメンス毎メートル)実用的には

1 [S/m] = 10 [dS/m] = 10 [mS/cm]

導電率計のキャリブレーションはKClで行うことが多いらしい。

74.246 g/l = 111.34 mS/cm

7.437 g/l = 12.86 mS/cm

0.744 g/l = 1.409 mS/cm

これは25℃での値で1℃あたり2%の温度補償が必要らしい。(温度が下がると導電率は上がる)

さらに12 mS/cmのNaClはおよそ6 g/l(たぶん100mM)

というわけで0.37g/50 mlのKClと0.3g/50 mlのNaClを用意して適当な電極で抵抗値を計ってみることにした。

電極はこんな物を作ってみた。

f:id:k-kuro:20100626173626j:image

本来的には1cm^2の電極を1cm間隔で向かい合わせた物を使うべきなんだけど、単に係数が変わるだけで適当な形状の電極でも良いはず。

実際に電極を溶液に沈めて電圧を測ってみると、KClの抵抗はどんどん上がって行く。これって要するに電気分解がおこっているからじゃないかと思い、電極を揺すってみるとそこそこ安定した数値を示した。しかしこれでは電極をずっと漬け込んで抵抗値を連続的にモニターするのは難しいな・・・

市販のECメーターも1万円そこそこで買えるので、それで良いと言えば良いんだけどせっかくなら抵抗を計って自動で水を継ぎ足してくれるシステムを作りたいなと。なので抵抗値を測定→ACをコントロールしてポンプ作動→抵抗値を測定→・・・というのをArduinoを使ってやりたい。

で、もうちょっと調査したところ、どうやら液体の導電率は交流で計ると良いらしい。

ということは

http://homepage3.nifty.com/sudamiyako/zk/hs15/hs15.htm

このHS-15湿度センサーと同じように使えるんではないかな?

f:id:k-kuro:20100626191010j:image


早速回路を組んでテスト。

f:id:k-kuro:20100626225631j:image

コンデンサは0.1uFのフィルムコンデンサ


int chargePin = 13;

void setup() {
pinMode(chargePin, OUTPUT);
Serial.begin(9600);
}

void loop() {
digitalWrite(chargePin, HIGH); //charge on
delayMicroseconds(10);
int analogValue = analogRead(0); // read the analog input into a variable:
digitalWrite(chargePin, LOW); //charge off
Serial.println(analogValue); // print the result:
delay(10000);
}

こんな感じにプログラミングして12.86mS/cmのKClだと870位、12mS/cmのNaClで855位のA/D変換値が得られた。

ちなみに普通の抵抗でためすと10kオームだと27、1kオームで250位、500オームで430位、333Ωで560位

f:id:k-kuro:20100626232213j:image

つまり12mS/cmあたりの抵抗値は100-150Ωの間くらいということか。

しかしAD変換値にして400-800くらいの範囲で測定しないとグラフにあまりきれいに乗らないな

試行錯誤の結果、コンデンサを2.2uFの電解コンデンサに、充電時間200usecにして、さらに10ビットのAD変換値150から600の間を0から49に丸めて

既知抵抗で変換値をプロットしてみた。実測値以外の間の数値も直線に乗るように埋めて行って、0-49←→600-87オームの変換アレイを作ってみた。

f:id:k-kuro:20100627111108p:image

そのうえで


int chargePin = 13;

void setup() {
pinMode(chargePin, OUTPUT);
Serial.begin(9600);
}

void loop() {
int myarray[50] = {600, 555, 520, 495, 470, 445, 420, 400, 385, 370, 345, 330, 315, 300, 293, 280, 270, 258, 245, 235, 225, 218, 209, 200, 195, 188, 183, 177, 170, 165, 160, 155, 150, 145, 140, 135, 131, 127, 123, 120, 117, 113, 110, 105, 100, 97, 95, 92, 90, 87};
digitalWrite(chargePin, HIGH); //charge on
delayMicroseconds(200);
int analogValue = analogRead(0); // read the analog input into a variable:
digitalWrite(chargePin, LOW); //charge off
int val = map(analogValue, 150, 600, 0, 49);
val = myarray[val];
float EC = 1860/val;
Serial.println(EC); // print the result:
delay(1000);
}

こんなプログラムで試してみると・・・

12mS/cm→12.00

12.86mS/cm→12.00

どっちも同じになってしまう。さすがに50段階では分解能が低すぎるか?