pH測定
2021.09.25

YouTube でも紹介しています。画像をクリックすると再生できます。
今回は、pHメータを使ってみました。pHメーターは液体の酸性・アルカリ性の度合いを測定します。
ガラス電極によるpH測定法は、ガラス電極と比較電極の2本の電極間に生じた電位差を測定することで、測定液のpHを取得します。
pHの異なった液体がガラス薄膜を隔て存在すると、薄膜部分にpHの差に比例した起電力が発生します。この薄膜は「pHガラス応答膜」と呼ばれます。
通常、液温25℃の場合、電極内の液体とガラス薄膜を隔てた外側の液体でpHが1違えば、約59mVの起電力が発生します。

Ref. ガラス電極によるpH測定 (株)堀場アドバンスドテクノ
pHガラス応答膜に生じた起電力を測定するには、pHガラス電極と比較電極が必要です。
比較電極は、電位が極めて安定した電極でなければならず、比較電極には安定した起電力を提供するために、電極内部液に、3.3mol/L KCLが用いられます。
比較電極の先端には、被測定液と電気的接続を保つために、多孔性セラミックの液絡部が設けられており、この微小な流路から内部液が漏れだします。
Ref. pHのはなし:ガラス電極と比較電極 東亜ディーケーケー(株)

複合電極はガラス電極と比較電極、あるいは温度補償電極を含めて一つにまとめた電極です。サンプルに浸すだけで校正や測定ができるため取り扱いが簡単で、洗浄も容易です。
Ref. 比較電極、温度補償電極、複合電極 (株)堀場アドバンスドテクノ
■DFROBOT PH Meter / SKU SEN0161

→ DFROBOT - PH meter SKU SEN0161
写真は、複合電極と計測モジュールから成る DFROBOTのpH Meter です。

表が示すように、電極から受けとる電圧は、酸性側でプラス、アルカリ側でマイナス、中性で0Vになります。

グラフにすると、pH値が上昇するにつれて直線的に電圧が低下していきます。
実際には、pH12以上になると、アルカリ誤差が生じ傾きにずれが生じます。

Arduino などのマイコンでは、負の電圧には対応していないので、測定モジュールでは、すべてがプラスの電圧になるように変換しています。
この際、5V動作のArduino のアナログ端子は0~5Vの入力電圧を10ビット(0~1023)で表現します。
中性のときを中心の2.5Vになるようにして、その上下での電圧が酸性、アルカリ性になるように変換されます。
■pH電極プローブ E201-C-9
DFROBOT製は若干お高いので、実際の測定には廉価版を使用しました。

PH range: 0-14pH
Temperature range: 0-80 °C
Zero-point: 7±0.25pH
Theoretical Percentage Slope: ≥98.5%
Internal Resistance: ≤250MΩ
Response Time: ≤1min
Noise < 0.5mV
Alkali error ≤ 15mV

先に説明したように比較電極内の塩化カリウム(3.3mol/L KCL)溶液は、測定液側に染み出るので、このように補給できる注入口の付いた商品がよいかもしれません。

Arduino Nano と測定モジュールをつなぎ、ラズベリーパイとUSB接続します。
| Arduino Nano | - | 測定モジュール(ACS712) |
| 5V | - | 5V |
| GND | - | GND |
| GND | - | GND |
| A0:14 | - | PO |

pH7.0の電位差0Vの状態を作り出すために、スクリュー端子付きのBNCオスコネクタの2つの端子をショートさせ、pHセンサーモジュールに取り付けます。

この状態で、モジュールのPO出力値を測定します。Arduinoのアナログ入力端子の中央値2.5Vになるように、測定モジュールの可変抵抗で調整します。

次は、実際にArduinoのアナログ端子から取得される値を測定します。
開発環境には、PlatformIOを使用しています。
Ref.Arduino開発環境構築 PlatformIO
$ mkdir ~/pH-Meter
$ cd ~/pH-Meter
$ pio init -b nanoatmega328
$ vi src/analog_value.ino
#define sensorPin A0
unsigned int voltage;
float average;
int cnt = 50;
void setup(){
Serial.begin(9600);
}
void loop() {
average = 0.0;
for(int i=0;i<cnt;i++){
voltage = analogRead(sensorPin);
average += voltage;
delay(10);
}
average /= cnt;
Serial.print("average = ");
Serial.println(average);
delay(1000);
}
このプログラムでは、analogRead()から取得した50回分の測定値を平均したものを1秒間隔で表示しています。
$ pio run -t upload
$ pio device monitor -p /dev/ttyUSB0 -b 9600
average = 562.26
average = 562.28
average = 562.42
average = 562.44
average = 562.14
.....
pH7.0(2.5V)の場合に、Arduino Nanoのアナログ端子から取得される電圧のばらつきは少ないのですが、
10ビット(0~1023)の中央値(512)より高めの値になっています。
これは、出力インピーダンスの大きい回路の電圧を、analogReadで測定したときなどに、誤差が大きくなるようです。
次に実際にpH電極プローブを付けて測定してみます。

同様にアナログ値を測定してみました。
average = 643.98
average = 643.18
average = 643.46
average = 643.58
average = 643.40
.....
pH電極プローブのキャップの中には、ガラス電極が乾燥しないように、KCL保存液がはいっています。
KCLは、強塩基と強酸なので、pH7を示すはずなのですが、BNC端子をショートさせたときの値とはかなり違います。
次に校正液を用いた測定を行ってみました。

校正用粉末を250mlの精製水に溶かして使用します。
pHの異なる2つの校正液を使って、各pH値におけるアナログ値を測定し、pHとの関係を求めます。
校正液は大気中の二酸化炭素が溶け込むことで、pH値が変化してしまうため、粉末を溶かして作った校正液の有効期間は一か月程度です。

温度により校正液を用いて取得される電圧も若干変動します。
次に、校正液に浸けて測定してみました。マニュアルによると電極を校正液に浸して2分程で数値が安定するようです。

pH4.0校正液の場合です。
average = 674.84
average = 674.96
average = 674.90
average = 674.80
average = 674.80
.....
pH6.86の校正液の場合です。
average = 558.64
average = 558.76
average = 558.48
average = 558.42
average = 558.56
.....
pH9.18校正液の場合です。
average = 476.94
average = 477.08
average = 476.94
average = 476.78
average = 477.16
.....
各種校正液におけるアナログ値
| | PH4.0 | pH6.86 | pH9.18 |
| | 674.84 | 558.64 | 476.94 |
| | 674.96 | 558.76 | 477.08 |
| | 674.90 | 558.48 | 476.94 |
| | 674.80 | 558.42 | 476.78 |
| | 674.80 | 558.56 | 477.16 |
| 平均 | 674.86 | 558.57 | 476.98 |
pHとアナログ値の関係
| pH4.0 | pH6.86 | pH9.18 | 傾き |
| 674.86 | 558.57 | | -0.02459 |
| 674.86 | | 476.98 | -0.02618 |
| | 558.57 | 476.98 | -0.02843 |
2種類の校正液とアナログ値から傾きを求めました。
傾きの計算例
(pH4.0 - pH6.86) / (pH4.0のアナログ値 - pH6.86のアナログ値)
= (4.0 - 6.86) / (674.86 - 558.57)
= -0.02459
酸性側(pH4.0-6.86)とアルカリ側(pH6.86-9.18)では、pHとアナログ値の相関関係(傾き)に違いが生じています。
実際に測定する液体の予想されるpHと、使用する校正液のpHが近いものを使用することで、測定精度が上がります。
最初に紹介したDFROBOTのpH Meterの場合においても、より正確なpHを求めるためには校正液を使用することを奨めています。
■pH測定プログラム
#define sensorPin A0
float pH_400 = 4.0;
float pH_686 = 6.86;
float pH_918 = 9.18;
float analog_400 = 674.86;
float analog_686 = 558.57;
float analog_918 = 476.98;
int loopCnt = 50;
float slope_acidic;
float slope_alkaline;
float pH;
float average;
void setup(){
Serial.begin(9600);
slope_acidic = ( pH_400 - pH_686) / (analog_400 - analog_686);
slope_alkaline = ( pH_918 - pH_686) / (analog_918 - analog_686);
}
void loop() {
average = 0.0;
for(int i=0;i<loopCnt;i++){
average += analogRead(sensorPin);
delay(10);
}
average /= loopCnt;
Serial.print( "pH = " );
if (average > analog_686) {
pH = slope_acidic * ( average - analog_686 ) + pH_686;
} else {
pH = slope_alkaline * ( average - analog_686 ) + pH_686;
}
Serial.println(pH);
delay(1000);
}
このプログラムでは測定値が酸性側、アルカリ側で傾きを変えています。
$ pio run -t upload
■The CRAFT COLAを測ってみました
最近発売された、The CRAFT COLA、世界のスパイス10種をブレンド!ドクペが大丈夫な方なら好きかもしれません。
$ pio device monitor -p /dev/ttyUSB0 -b 9600
pH = 3.06
pH = 3.06
pH = 3.06
pH = 3.07
pH = 3.06
.....
■参考文献
・arduinoでpHメーター(動作確認編)
・arduinoでpHメーター(OLED表示編)
・How to use a PH probe and sensor
・Measure pH with a low-cost Arduino pH sensor board
・Ph Sensor OWL2pe or BASIC Stamp interface
・ph-4502c ph meter calibration notes
|