Arduinoでコンデンサの静電容量測定
こんなこと、やります。
- Arduinoでコンデンサの静電容量を測定
- Arduinoのデジタルピンのしきい値の測定
つかうもの
この記事でつかうものをご紹介します。
Arduino
Arduino Uno Rev3を使用しました。
▼ もちろん、ほかのArduinoをお使いになってもらっても構いません。
もしまだArduinoをお持ちでないようでしたら、 おすすめArduinoどれを選べばいい?Arduinoで電子工作をはじめる方へ をご覧ください。
コンデンサ
0.01uF〜100uF程度のコンデンサが測定しやすいです。
その他の電子部品
LEDには1kΩ、100kΩ、2MΩの固定抵抗を使用します。2MΩがなければ、2つの1MΩを直列にして作ってください。
ブレッドボードやジャンプワイヤをお持ちでない方は揃えてください。
Arduinoで静電容量の測定する方法
Arduinoなどのマイコンボードでコンデンサの静電容量を測定するには、次の2つの方法が考えられます。
- 発振回路と組み合わせる
- コンデンサの時定数を利用する
ここでは❷の「コンデンサの時定数を利用する」方法でコンデンサの静電容量を測定します。ちなみに❶の方法は、 静電容量型の土壌湿度センサを使ってArduinoで土の水分量測定 のセンサ回路にヒントを書いてます。
時定数とは
時定数とは、コンデンサCに、E[V]の電圧を、抵抗R[Ω]の抵抗を介してかけた時、コンデンサCの電圧がEの63.2%まで充電される時間のことです。 つまり、コンデンサの電圧が、電源電圧の63.2%になるまでの時間が「時定数」です。
時定数をτとすると、抵抗値Rと静電容量Cは次の関係になることが知られてます。
$$τ = RC$$時定数の数学的な証明は、 RCローパスフィルタのステップ応答 をご覧ください。
静電容量の算出
アナログ電圧を測れるピンを備えているArduinoでは、時定数を測ることは簡単です。 デジタルピンの5V電圧を、抵抗Rを介してコンデンサCへ充電します。コンデンサの電圧が、5Vの63.2%の電圧3.22Vになるまでの時間を計測すれば時定数が分かりますから、次の計算でコンデンサの静電容量を導き出すことができるはずです。
$$C = \frac{τ}{R}$$Arduinoとコンデンサの配線図
こちらが、Arduinoでコンデンサを測定する配線図です。静電容量が未知なコンデンサCxと、抵抗RおよびArduinoを図のように配線します。
デジタルピンD2をHIGHにした瞬間、2MΩの抵抗を介して電流がコンデンサへ蓄電されていきます。コンデンサの両端の電圧は徐々に上がっていき、アナログ入力ピンのA5地点が、電源電圧の63.2%Vになるまで監視します。この時間を測定して時定数を導き出します。
ちなみに、デジタルピンD3と1kΩの抵抗は、コンデンサの電荷を放電してリセットさせるためのものです。
コンデンサの静電容量を測定するプログラム
コンデンサの静電容量を測定するプログラムがこちらになります。
/*
Created by Toshihiko Arai.
https://101010.fun/iot/arduino-measure-capacitance.html
*/
#include <Arduino.h>
const int PULSE_PIN = 2;
const int DIGITAL_READ_PIN = 3;
const int ANALOG_READ_PIN = 5;
const double E = 5.06; // GPIO電圧実測値
const double R = 2000000.0; // 2MΩ
const double V = E * 0.632;
void setup()
{
Serial.begin(9600);
pinMode(PULSE_PIN, OUTPUT);
digitalWrite(PULSE_PIN, LOW);
}
void discharge() {
pinMode(DIGITAL_READ_PIN, OUTPUT);
digitalWrite(DIGITAL_READ_PIN, LOW);
delay(1000);
pinMode(DIGITAL_READ_PIN, INPUT);
delay(10);
}
unsigned long charge() {
digitalWrite(PULSE_PIN, HIGH);
return micros();
}
void loop() {
discharge();
unsigned long time_start = charge();
double volts = 0;
while (volts < V)
{
volts = double(analogRead(ANALOG_READ_PIN)) / 1023.0 * E;
}
double T = micros() - time_start; // T: 時定数
double c;
char *farad = "uF";
if (T < 2500)
{
c = T / R * 1000000; // pFに対応
farad = "pF";
}
else if (T < 50000)
{
c = T / R * 1000; // nFに対応
farad = "nF";
}
else
{
c = T / R; // uF
}
Serial.print(c);
Serial.print(farad);
Serial.println();
digitalWrite(PULSE_PIN, LOW);
discharge();
}
実験してみた感想
実際、100pF〜10uFまで測定してみました。かなり良い精度でコンデンサの静電容量を測定することができたことに、正直驚きです。
ちなみにコンデンサの静電容量は、もともと10%程度の誤差があります。 ブレッドボードで実験したので、ブレッドボードの寄生容量も含まれます。その大きさは100pFくらいになります。ですから、1000pF以下のコンデンサの静電容量測定では、寄生容量を含まないようにする工夫が必要です。
同様にして抵抗値の測定も可能です。 【Raspberry Pi】ステップ応答による抵抗値の測定 でやってみました。
【おまけ】Arduinoのデジタルピンのしきい値は?
今度は、 Arduinoのデジタル入力のしきい値を測定してみます。やり方は、Arduinoでコンデンサの静電容量を測定する方法によく似てます。
しきい値とは
しきい値(閾値)とは、境目となる値のことです。 ここでは、Arduinoのデジタル入力がLOWからHIGHへ、またはHIGHからLOWと判断される電圧のことを指します。
デジタル入力の電圧しきい値を調べる方法
閾値を調べる方法は次の通りです。
- D2ピンをHIGHに設定し、抵抗100kΩを介してコンデンサへ充電していく
- その間、コンデンサの電圧をA5とD3で監視する
- D3がHIHGになるまでA5で電圧値をシリアルモニターへプロットする
- D3がHIGHになった瞬間ループを抜け、コンデンサに溜まった電荷をリリースする
これを数回繰り返し、しきい値を調べていきます。
配線図
Arduinoのデジタルピンのしきい値を調べる配線図です。コンデンサに溜まった電圧をD3から逃すため、1kΩの保護抵抗を入れてます。
ソースコード
Arduinoのデジタルピンのしきい値を調べるためのソースコードです。
/*
Created by Toshihiko Arai.
https://101010.fun/iot/arduino-threshold-volts.html
*/
const int PULSE_PIN = 2;
const int DIGITAL_READ_PIN = 3;
const int ANALOG_READ_PIN = 5;
void setup()
{
Serial.begin(115200);
pinMode(PULSE_PIN, OUTPUT);
}
void plot() {
float value = float(analogRead(ANALOG_READ_PIN));
float volts = value / 1023.0 * 5.0;
Serial.println(volts);
}
void loop() {
pinMode(DIGITAL_READ_PIN, INPUT);
digitalWrite(PULSE_PIN, LOW);
delay(10);
digitalWrite(PULSE_PIN, HIGH);
while(digitalRead(DIGITAL_READ_PIN)!=true) {
plot();
}
pinMode(DIGITAL_READ_PIN, OUTPUT);
digitalWrite(DIGITAL_READ_PIN, LOW); // コンデンサの電圧を逃す
digitalWrite(PULSE_PIN, LOW);
delay(3000);
}
測定結果
Arduino UNO R3では、デジタル入力のしきい値は2.57Vという結果になりました。つまり、2.57V以上でHIGHになり、それ以下でLOWと判断されます。 ただし、Arduinoボードの種類によっては、デジタルピンのしきい値が異なりますのでご注意ください。