Arduinoでコンデンサの静電容量測定
こんなこと、やります。
- Arduinoでコンデンサの静電容量を測定
- Arduinoのデジタルピンのしきい値の測定

Arduinoで静電容量の測定する方法

Arduinoなどのマイコンボードでコンデンサの静電容量を測定するには、次の2つの方法が考えられます。 1. 発振回路と組み合わせる 2. コンデンサの時定数を利用する
ここでは❷の「コンデンサの時定数を利用する」方法でコンデンサの静電容量を測定します。ちなみに❶の方法は、 のセンサ回路にヒントを書いてます。
時定数とは
時定数とは、コンデンサCに、E[V]の電圧を、抵抗R[Ω]の抵抗を介してかけた時、コンデンサCの電圧がEの63.2%まで充電される時間のことです。 つまり、コンデンサの電圧が、電源電圧の63.2%になるまでの時間が「時定数」です。
時定数をτとすると、抵抗値Rと静電容量Cは次の関係になることが知られてます。
\[τ = 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()
{
.begin(9600);
Serial(PULSE_PIN, OUTPUT);
pinMode(PULSE_PIN, LOW);
digitalWrite}
void discharge() {
(DIGITAL_READ_PIN, OUTPUT);
pinMode(DIGITAL_READ_PIN, LOW);
digitalWrite(1000);
delay(DIGITAL_READ_PIN, INPUT);
pinMode(10);
delay}
unsigned long charge() {
(PULSE_PIN, HIGH);
digitalWritereturn micros();
}
void loop() {
();
discharge
unsigned long time_start = charge();
double volts = 0;
while (volts < V)
{
= double(analogRead(ANALOG_READ_PIN)) / 1023.0 * E;
volts }
double T = micros() - time_start; // T: 時定数
double c;
char *farad = "uF";
if (T < 2500)
{
= T / R * 1000000; // pFに対応
c = "pF";
farad }
else if (T < 50000)
{
= T / R * 1000; // nFに対応
c = "nF";
farad }
else
{
= T / R; // uF
c }
.print(c);
Serial.print(farad);
Serial
.println();
Serial(PULSE_PIN, LOW);
digitalWrite();
discharge
}
実験してみた感想
実際、100pF〜10uFまで測定してみました。かなり良い精度でコンデンサの静電容量を測定することができたことに、正直驚きです。
ちなみにコンデンサの静電容量は、もともと10%程度の誤差があります。 ブレッドボードで実験したので、ブレッドボードの寄生容量も含まれます。その大きさは100pFくらいになります。ですから、1000pF以下のコンデンサの静電容量測定では、寄生容量を含まないようにする工夫が必要です。
【おまけ】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()
{
.begin(115200);
Serial(PULSE_PIN, OUTPUT);
pinMode}
void plot() {
float value = float(analogRead(ANALOG_READ_PIN));
float volts = value / 1023.0 * 5.0;
.println(volts);
Serial}
void loop() {
(DIGITAL_READ_PIN, INPUT);
pinMode(PULSE_PIN, LOW);
digitalWrite(10);
delay(PULSE_PIN, HIGH);
digitalWritewhile(digitalRead(DIGITAL_READ_PIN)!=true) {
();
plot}
(DIGITAL_READ_PIN, OUTPUT);
pinMode(DIGITAL_READ_PIN, LOW); // コンデンサの電圧を逃す
digitalWrite(PULSE_PIN, LOW);
digitalWrite(3000);
delay}
測定結果
Arduino UNO R3では、デジタル入力のしきい値は2.57Vという結果になりました。つまり、2.57V以上でHIGHになり、それ以下でLOWと判断されます。 ただし、Arduinoボードの種類によっては、デジタルピンのしきい値が異なりますのでご注意ください。
関連記事
- Arduinoと可変抵抗でLEDの明るさ制御
- よく使う電子パーツ・部品の読み方〜初心者のための電子工作
- デジタル信号におけるRCローパスフィルタ
- ArduinoからATtiny85へ書き込んでLチカする
- 静電容量型の土壌湿度センサを使ってArduinoで土の水分量測定